[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".github/workflows/build.yaml",
    "content": "name: Build & Test\n\non:\n  push:\n    branches:\n      - main\n      - dev\n  pull_request:\n    branches:\n      - main\n      - dev\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./src\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup .NET\n        uses: actions/setup-dotnet@v4\n        with:\n          dotnet-version: 8.0.x\n\n      - name: Restore dependencies\n        run: dotnet restore\n      - name: Build\n        run: dotnet build --no-restore -c Release\n      - name: Test\n        run: dotnet test -c Release --no-build --verbosity normal\n"
  },
  {
    "path": ".github/workflows/close-inactive-issues.yaml",
    "content": "# This workflow will close issues that have been inactive for 60 days\nname: Close inactive issues\non:\n  schedule:\n    - cron: \"30 1 * * *\"\n\njobs:\n  # Close issues that have been inactive for 60 days\n  close-issues:\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: write\n    steps:\n      - uses: actions/stale@v5\n        with:\n          days-before-issue-stale: -1\n          days-before-issue-close: 60\n          close-issue-message: \"This issue was closed because it has been open for 60 days with no activity being marked as stale.\"\n          days-before-pr-stale: -1\n          days-before-pr-close: -1\n          repo-token: ${{ secrets.GITHUB_TOKEN }}"
  },
  {
    "path": ".github/workflows/publish.yaml",
    "content": "name: Publish\n\non:\n  release:\n    types: [published]\n  workflow_dispatch:\n\njobs:\n  publish:\n    name: build, pack & publish\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./src\n\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Setup .NET\n        uses: actions/setup-dotnet@v4\n        with:\n          dotnet-version: 8.0.x\n\n      - name: Restore dependencies\n        run: dotnet restore\n      - name: Build\n        run: dotnet build -c Release\n      - name: Test\n        run: dotnet test -c Release --no-build --verbosity normal\n      - name: Pack\n        run: dotnet pack -c Release -o ./nupkgs --no-build\n      - name: Publish\n        env:\n          NUGET_AUTH_TOKEN: ${{ secrets.NUGET_API_TOKEN }}\n        run: dotnet nuget push ./nupkgs/*.nupkg --api-key ${{ env.NUGET_AUTH_TOKEN }} --skip-duplicate -s https://api.nuget.org/v3/index.json\n"
  },
  {
    "path": ".gitignore",
    "content": "# Ignore vscode editor files\n.vscode/*\n# Ignore all folders named publish\n**/publish/*\n# Nuget packages\nnuget.config"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020-2025 Quetzal Rivera\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "| <img src=\"./docs/icon.png\" alt=\"Logo\" width=\"64\"/> | <h1>Telegram.BotAPI</h1> |\n| -------------------------------------------------- | ------------------------ |\n\n[![NuGet version (Telegram.BotAPI)](https://img.shields.io/nuget/v/Telegram.BotAPI?style=flat-square&logo=nuget)](https://www.nuget.org/packages/Telegram.BotAPI/)\n[![Compatible with Bot API v10.0](https://img.shields.io/badge/Bot%20API%20version-v10.0-blue?style=flat-square)](https://core.telegram.org/bots/api#april-3-2026)\n\n**Telegram.BotAPI** is one of the most complete libraries available to interact with the Telegram Bot API in your .NET projects. It contains all the methods and types available in the Bot API 10.0 released on May 8, 2026.\n\n[![Telegram Chat](https://img.shields.io/badge/Telegram.BotAPI%20--%20Chat-Join-blue?style=social&logo=telegram)](https://t.me/TBAPINET)\n\n---\n\n## Features\n\n- Contains pre-defined methods for all Bot API 10.0 methods.\n- Contains classes for each object type used in the Bot API 10.0.\n- Sync and async methods.\n- Uses [System.Text.Json](https://www.nuget.org/packages/System.Text.Json/).\n\n---\n\n## .NET platforms support\n\n- NET Standard >= 2.0\n- NET Core >= 2.0, .NET 6, .NET 8\n- NET Framework >= 4.6.2\n- Universal Windows Platform >= 10.0.16299\n- Unity >= 2018.1\n\n---\n\n## Installation\n\n### Install from the command line\n\n```PowerShell\ndotnet add PROJECT package Telegram.BotAPI\n```\n\n[Get package from Nuget Web Site](https://www.nuget.org/packages/Telegram.BotAPI/)\n\n---\n\n## How to use\n\nFirst, get your **bot token** from [BotFather](https://t.me/BotFather) and use it to create a new instance of `Telegram.BotAPI.TelegramBotClient` as follows.\n\n```CSharp\nusing Telegram.BotAPI;\n\nvar botToken = \"bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\";\n// You need a TelegramBotClient instance if you want access to the Bot API methods.\nvar client = new TelegramBotClient(botToken);\n```\n\nThe methods and types are organized in namespaces according to their corresponding section on the [Official Bot API website](https://core.telegram.org/bots/api). So if you want to use a method or type, you must first include the corresponding namespace.\n\nCurrently the following namespaces are available:\n\n| Name                             | Description                                        |\n| :------------------------------- | :------------------------------------------------- |\n| Telegram.BotAPI                  | Contains the TelegramBotClient and other utilities |\n| Telegram.BotAPI.GettingUpdates   | Contains methods and types for getting updates     |\n| Telegram.BotAPI.AvailableTypes   | Contains available types                           |\n| Telegram.BotAPI.AvailableMethods | Contains available methods                         |\n| Telegram.BotAPI.UpdatingMessages | Contains methods and types for updating messages   |\n| Telegram.BotAPI.Stickers         | Contains methods and types for stickers            |\n| Telegram.BotAPI.InlineMode       | Contains methods and types for inline mode         |\n| Telegram.BotAPI.Payments         | Contains methods and types for payments            |\n| Telegram.BotAPI.TelegramPassport | Contains methods and types for Telegram Passport   |\n| Telegram.BotAPI.Games            | Contains methods and types for games               |\n\nOnce the namespaces are included, you are ready to start managing your bot. For example, you can use the [getMe](https://core.telegram.org/bots/api#getme) method to get basic information about your bot.\n\n```CSharp\nusing Telegram.BotAPI.AvailableMethods;\n\nvar me = client.GetMe();\nConsole.WriteLine(\"My name is {0}.\", me.FirstName);\n```\n\n## Getting updates\n\nEvery time a user interacts with a bot, bot will receive a new update. Updates contain information about user events, such as a new message or when a button is clicked. If you want your bot to reply to a message, then your bot must be able to get updates first.\n\nCurrently, there are two ways to get updates: [Long Polling](#long-polling) and [webhooks](#webhooks).\n\n### Long Polling\n\nTo get updates using **Long Polling**, you must create a perpetual loop and check for updates using the getUpdates method. After all updates have been processed, you must mark them as read by setting the offset parameter to a value greater than the id of the last update. See the follow example:\n\n```CSharp\nusing System.Linq;\nusing Telegram.BotAPI.GettingUpdates;\n\nvar updates = client.GetUpdates();\nwhile (true)\n{\n    if (updates.Any())\n    {\n        foreach (var update in updates)\n        {\n            // Process update\n        }\n        var offset = updates.Last().UpdateId + 1;\n        updates = client.GetUpdates(offset);\n    }\n    else\n    {\n        updates = client.GetUpdates();\n    }\n}\n```\n\n### Webhooks\n\nTo receive updates through webhook, you must create a web application. In your ASP NET application, create a new api controller for your bot and define a function to receive the update as shown below.\n\n```CSharp\nusing Telegram.BotAPI.GettingUpdates;\n\n[HttpPost]\npublic IActionResult Post(\n    // The secret token is optional, but it's highly recommended to use it.\n    [FromHeader(Name = \"X-Telegram-Bot-Api-Secret-Token\")] string secretToken,\n    [FromBody] Update update)\n{\n    if (update is null)\n    {\n        return BadRequest();\n    }\n    // Check if the secret token is valid\n    // Process your update\n    return Ok();\n}\n```\n\nAt the beginning of your application, you need to register your webhook using the API. In this way, Telegram will send new updates to your API controller. See the example below:\n\n```CSharp\napi.DeleteWebhook(true); // Delete old webhook\napi.SetWebhook(\"https://example.com/<controller path>\"); // Set new webhook\n```\n\n> It's high recommended to configurate a secret token to access the api controller through the setWebhook method. This will prevent third parties from accessing your api controller.\n> Using a webhook will disable the `getUpdates` method. Use `deleteWebhook` to enable it again.\n\n## Sending messages\n\nSending messages is the simplest and most important task of a bot. See the following example for sending text messages.\n\n```CSharp\nusing Telegram.BotAPI.AvailableMethods;\n\nlong chatId = update.Message.Chat.Id; // Target chat Id\napi.SendMessage(chatId, \"Hello World!\"); // Send a message\n```\n\nYour bot can also send multimedia messages like photos, gifs, videos, and others. See [Available methods](https://core.telegram.org/bots/api#available-methods) for learn more.\n\n## Uploading files\n\nYou can also send attached files using InputFile objects. You have two ways to do it: By using an InputFile object directly or by using a dictionary of InputFile objects.\n\n### Option 1\n\n```CSharp\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.AvailableMethods;\n\nvar file = new InputFile(filebytes, \"file.zip\");\n// Upload document\napi.SendDocument(chatId, file);\n```\n\n### Option 2\n\n```CSharp\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.AvailableMethods;\n\nvar file = new InputFile(filebytes, \"file.zip\");\nvar files = new Dictionary<string, InputFile>() {\n    { \"file56\", file }\n};\n// Upload document\napi.SendDocument(chatId, \"attach://file56\", files: files);\n```\n\n## Making custom requests\n\nThe library already includes all types and methods available in the Bot API. However, if you want to use your own types or if you want to be the first one to use new features when they are released, you can use the `CallMethod` and/or `CallMethodDirect` methods defined in the ITelegramBotClient instance.\n\n```CSharp\nvar args = new Dictionary<string, object>() {\n    { \"chat_id\", 123456789 },\n    { \"text\", \"Hello World!\" }\n};\n// Message is the type you want to use to deserialize the response result. It can be an in-built type or a custom type created by you.\nvar message = client.CallMethod<Message>(\"sendMessage\", args);\n```\n\nThe previous method is used by all extension methods defined in the library. You can also create your own extension methods to make custom requests if you want.\n\n```CSharp\npublic static class TelegramBotClientExtensions\n{\n    public static Message SendHelloWorld(this ITelegramBotClient client, long chatId)\n    {\n        var args = new Dictionary<string, object>() {\n            { \"chat_id\", chatId },\n            { \"text\", \"Hello World!\" }\n        };\n        return client.CallMethod<Message>(\"sendMessage\", args);\n    }\n}\n```\n\nThe library also includes the classes `MethodNames` and `PropertyNames` that contain the names of all methods and properties.\n\nThe `CallMethod` will trigger an exception if the response status code is not OK. If you don't like this behavior, you can use the `CallMethodDirect` method instead.\n\n```CSharp\nvar args = new Dictionary<string, object>() {\n    { \"chat_id\", 123456789 },\n    { \"text\", \"Hello World!\" }\n};\n// BotResponse<Message>\nvar response = client.CallMethodDirect<Message>(\"sendMessage\", args);\n```\n\nYou'll get a `BotResponse<T>` object as a response. This object contains the status code, the deserialized result or null (if error), the error description and also some error parameters if available.\n\n---\n\n## Examples\n\nYou can see more examples [here](https://github.com/Eptagone/Telegram.BotAPI/tree/main/src/Telegram.BotAPI.Examples).\n\n## License\n\n[MIT](https://github.com/Eptagone/Telegram.BotAPI/blob/main/LICENSE)\n\n## Release notes\n\n[See release notes](https://github.com/Eptagone/Telegram.BotAPI/releases)\n\n# Support this project\n\nIf you wish, you can donate through the following methods:\n\n- [Buy me a cookie](https://www.buymeacoffee.com/eptagone)\n- TON: [UQBRpyQ2pUOngdVr5HW8KQ7G8CToGS4o0WFAtUb3bQx4lt_0](ton://transfer/UQBRpyQ2pUOngdVr5HW8KQ7G8CToGS4o0WFAtUb3bQx4lt_0)\n"
  },
  {
    "path": "src/.editorconfig",
    "content": "[*.cs]\ncsharp_indent_braces = false\ninsert_final_newline = true\ndotnet_diagnostic.ca1200.severity = suggestion\ndotnet_diagnostic.ca1805.severity = suggestion\n\ndotnet_diagnostic.cs8766.severity = silent\ncsharp_using_directive_placement = outside_namespace:silent\ncsharp_prefer_simple_using_statement = true:suggestion\ncsharp_prefer_braces = true:silent\ncsharp_style_namespace_declarations = file_scoped:suggestion\ncsharp_style_prefer_method_group_conversion = true:silent\ncsharp_style_prefer_top_level_statements = true:silent\ncsharp_style_expression_bodied_methods = true:none\ncsharp_style_expression_bodied_constructors = true:none\ncsharp_style_expression_bodied_operators = false:silent\ncsharp_style_expression_bodied_properties = true:silent\ncsharp_style_expression_bodied_indexers = true:silent\ncsharp_style_expression_bodied_accessors = true:silent\ncsharp_style_expression_bodied_lambdas = true:silent\ncsharp_style_expression_bodied_local_functions = false:silent\ncsharp_indent_labels = one_less_than_current\ncsharp_style_throw_expression = true:suggestion\ncsharp_style_prefer_null_check_over_type_check = true:suggestion\ncsharp_prefer_simple_default_expression = true:suggestion\ncsharp_style_prefer_local_over_anonymous_function = true:suggestion\ncsharp_style_prefer_index_operator = true:suggestion\ncsharp_style_prefer_range_operator = true:suggestion\ncsharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion\ncsharp_style_prefer_tuple_swap = true:suggestion\ncsharp_style_prefer_utf8_string_literals = true:suggestion\ncsharp_style_inlined_variable_declaration = true:suggestion\ncsharp_style_deconstructed_variable_declaration = true:suggestion\ncsharp_style_unused_value_assignment_preference = discard_variable:suggestion\ncsharp_style_unused_value_expression_statement_preference = discard_variable:silent\ncsharp_space_around_binary_operators = before_and_after\ncsharp_prefer_static_local_function = true:suggestion\ncsharp_style_prefer_readonly_struct = true:suggestion\ncsharp_style_allow_embedded_statements_on_same_line_experimental = true:silent\ncsharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent\ncsharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent\ncsharp_style_conditional_delegate_call = true:suggestion\ncsharp_style_pattern_matching_over_is_with_cast_check = true:suggestion\ncsharp_style_prefer_pattern_matching = true:silent\ncsharp_style_prefer_switch_expression = true:suggestion\ncsharp_style_var_for_built_in_types = false:silent\ncsharp_style_prefer_extended_property_pattern = true:suggestion\ncsharp_style_prefer_not_pattern = true:suggestion\ncsharp_style_pattern_matching_over_as_with_null_check = true:suggestion\ncsharp_style_var_when_type_is_apparent = false:silent\ncsharp_style_var_elsewhere = false:silent\ncsharp_style_prefer_primary_constructors = true:suggestion\ncsharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent\ncsharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent\n\n# ReSharper properties\nresharper_local_function_body = expression_body\n\n[*.{cs,vb}]\ndotnet_diagnostic.ca1707.severity = suggestion\ndotnet_diagnostic.ca1710.severity = silent\ndotnet_diagnostic.ca1713.severity = suggestion\ndotnet_diagnostic.ca1727.severity = warning\n\n[*.{cs,vb}]\n#### Naming styles ####\n\n# Naming rules\n\ndotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion\ndotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface\ndotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i\n\ndotnet_naming_rule.types_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.types_should_be_pascal_case.symbols = types\ndotnet_naming_rule.types_should_be_pascal_case.style = pascal_case\n\ndotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members\ndotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case\n\n# Symbol specifications\n\ndotnet_naming_symbols.interface.applicable_kinds = interface\ndotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.interface.required_modifiers =\n\ndotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum\ndotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.types.required_modifiers =\n\ndotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method\ndotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.non_field_members.required_modifiers =\n\n# Naming styles\n\ndotnet_naming_style.begins_with_i.required_prefix = I\ndotnet_naming_style.begins_with_i.required_suffix =\ndotnet_naming_style.begins_with_i.word_separator =\ndotnet_naming_style.begins_with_i.capitalization = pascal_case\n\ndotnet_naming_style.pascal_case.required_prefix =\ndotnet_naming_style.pascal_case.required_suffix =\ndotnet_naming_style.pascal_case.word_separator =\ndotnet_naming_style.pascal_case.capitalization = pascal_case\n\ndotnet_naming_style.pascal_case.required_prefix =\ndotnet_naming_style.pascal_case.required_suffix =\ndotnet_naming_style.pascal_case.word_separator =\ndotnet_naming_style.pascal_case.capitalization = pascal_case\ndotnet_style_coalesce_expression = true:suggestion\ndotnet_style_null_propagation = true:suggestion\ndotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion\ndotnet_style_prefer_auto_properties = true:silent\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_operator_placement_when_wrapping = beginning_of_line\ntab_width = 4\nindent_size = 4\nend_of_line = lf\ndotnet_style_collection_initializer = true:suggestion\ndotnet_style_qualification_for_field = true:suggestion\ndotnet_style_qualification_for_property = true:suggestion\ndotnet_style_qualification_for_method = true:suggestion\ndotnet_style_qualification_for_event = true:suggestion\ndotnet_style_prefer_simplified_boolean_expressions = true:suggestion\ndotnet_style_prefer_conditional_expression_over_assignment = true:silent\ndotnet_style_prefer_conditional_expression_over_return = true:silent\ndotnet_style_explicit_tuple_names = true:suggestion\ndotnet_style_prefer_inferred_tuple_names = true:suggestion\ndotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion\ndotnet_style_prefer_compound_assignment = true:suggestion\ndotnet_style_prefer_simplified_interpolation = true:suggestion\ndotnet_style_namespace_match_folder = true:suggestion\ndotnet_style_readonly_field = true:suggestion\ndotnet_style_predefined_type_for_locals_parameters_members = true:silent\ndotnet_style_predefined_type_for_member_access = true:silent\ndotnet_style_require_accessibility_modifiers = for_non_interface_members:silent\ndotnet_style_allow_multiple_blank_lines_experimental = true:silent\ndotnet_style_allow_statement_immediately_after_block_experimental = true:silent\ndotnet_code_quality_unused_parameters = all:suggestion\ndotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent\ndotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent\ndotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent\ndotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent\n\n# Extra rules\nfile_header_template = Copyright (c) 2026 Quetzal Rivera.\\nLicensed under the MIT License, See LICENCE in the project root for license information.\nindent_style = space\n"
  },
  {
    "path": "src/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Ww][Ii][Nn]32/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n[Ll]ogs/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# ASP.NET Scaffolding\nScaffoldingReadMe.txt\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.tlog\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Coverlet is a free, cross platform Code Coverage Tool\ncoverage*.json\ncoverage*.xml\ncoverage*.info\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio 6 auto-generated project file (contains which files were open etc.)\n*.vbp\n\n# Visual Studio 6 workspace and project file (working project files containing files to include in project)\n*.dsw\n*.dsp\n\n# Visual Studio 6 technical files\n*.ncb\n*.aps\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# Visual Studio History (VSHistory) files\n.vshistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# Ionide (cross platform F# VS Code tools) working folder\n.ionide/\n\n# Fody - auto-generated XML schema\nFodyWeavers.xsd\n\n# VS Code files for those working on multiple tools\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n*.code-workspace\n\n# Local History for Visual Studio Code\n.history/\n\n# Windows Installer files from build outputs\n*.cab\n*.msi\n*.msix\n*.msm\n*.msp\n\n# JetBrains Rider\n*.sln.iml\n.idea\n"
  },
  {
    "path": "src/Telegram.BotAPI.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.32014.148\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Telegram.BotAPI\", \"library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\", \"{333CEF37-B947-47CA-A339-9B14D4D7E20A}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Library\", \"Library\", \"{E90CDF4A-2731-4F91-9BD7-4A40E04DF290}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tests\", \"Tests\", \"{576E0D2C-631B-4C68-9AF4-0D99DC4E5951}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Telegram.BotAPI.Tests\", \"tests\\Telegram.BotAPI.Tests\\Telegram.BotAPI.Tests.csproj\", \"{14B3773F-CA9B-4AB7-A799-4CAD7A43D927}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{EEFA3271-1A58-4067-B29D-C1B1770C6082}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t.editorconfig = .editorconfig\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Telegram.BotAPI.Extensions\", \"library\\Telegram.BotAPI.Extensions\\Telegram.BotAPI.Extensions.csproj\", \"{BA0FF392-07D4-4C31-866B-93865F4E1FF2}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{333CEF37-B947-47CA-A339-9B14D4D7E20A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{333CEF37-B947-47CA-A339-9B14D4D7E20A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{333CEF37-B947-47CA-A339-9B14D4D7E20A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{333CEF37-B947-47CA-A339-9B14D4D7E20A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{14B3773F-CA9B-4AB7-A799-4CAD7A43D927}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{14B3773F-CA9B-4AB7-A799-4CAD7A43D927}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{14B3773F-CA9B-4AB7-A799-4CAD7A43D927}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{14B3773F-CA9B-4AB7-A799-4CAD7A43D927}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BA0FF392-07D4-4C31-866B-93865F4E1FF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BA0FF392-07D4-4C31-866B-93865F4E1FF2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BA0FF392-07D4-4C31-866B-93865F4E1FF2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BA0FF392-07D4-4C31-866B-93865F4E1FF2}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{333CEF37-B947-47CA-A339-9B14D4D7E20A} = {E90CDF4A-2731-4F91-9BD7-4A40E04DF290}\n\t\t{14B3773F-CA9B-4AB7-A799-4CAD7A43D927} = {576E0D2C-631B-4C68-9AF4-0D99DC4E5951}\n\t\t{BA0FF392-07D4-4C31-866B-93865F4E1FF2} = {E90CDF4A-2731-4F91-9BD7-4A40E04DF290}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {85BE005E-491E-437E-BA2C-2202816F73AF}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/examples/.dockerignore",
    "content": "**/.classpath\n**/.dockerignore\n**/.env\n**/.git\n**/.gitignore\n**/.project\n**/.settings\n**/.toolstarget\n**/.vs\n**/.vscode\n**/*.*proj.user\n**/*.dbmdl\n**/*.jfm\n**/azds.yaml\n**/bin\n**/charts\n**/docker-compose*\n**/Dockerfile*\n**/node_modules\n**/npm-debug.log\n**/obj\n**/secrets.dev.yaml\n**/values.dev.yaml\nLICENSE\nREADME.md"
  },
  {
    "path": "src/examples/BotTemplate/BotTemplateSample.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <RootNamespace>BotTemplateSample</RootNamespace>\n    <Nullable>annotations</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI.Extensions\\Telegram.BotAPI.Extensions.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/examples/BotTemplate/MyBot.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.Extensions;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace BotTemplateSample\n{\n    public sealed class MyBot : SimpleUpdateHandlerBase\n    {\n        public static readonly TelegramBotClient Bot = new(\"<BOT TOKEN>\");\n        private static readonly User Me = Bot.GetMe();\n\n        public MyBot()\n        {\n            // Provides a better way to extract commands using regular expressions.\n            this.SetCommandExtractor(Me.Username!);\n        }\n\n        public override void OnUpdate(Update update)\n        {\n            Console.WriteLine(\n                \"New update with id: {0}. Type: {1}\",\n                update.UpdateId,\n                update.GetUpdateType()\n            );\n            base.OnUpdate(update);\n        }\n\n        protected override void OnMessage(Message message)\n        {\n            // Ignore user 777000 (Telegram)\n            if (message.From?.Id == TelegramConstants.TelegramId)\n            {\n                return;\n            }\n\n            Console.WriteLine(\"New message from chat id: {0}\", message.Chat.Id);\n            Console.WriteLine(\"Message Text: {0}\", message.Text ?? \"|:O\");\n\n            if (message.Chat.Type == ChatTypes.Private) // Private Chats\n            {\n                // Make something\n            }\n\n            // Group chats\n            // Check if the message contains a command\n            if (message.Entities?.Any(e => e.Type == \"bot_command\") is not true)\n            {\n                return;\n            }\n\n            // If the command includes a mention, you should verify that it is for your bot, otherwise you will need to ignore the command.\n            string? pattern = $@\"^\\/(?<COMMAND>\\w*)(?:|@{Me.Username})(?:$|\\s(?<PARAMETERS>.*))\";\n            Match? match = Regex.Match(message.Text!, pattern, RegexOptions.IgnoreCase);\n            if (!match.Success)\n            {\n                return;\n            }\n\n            string? command = match.Groups.Values.Single(v => v.Name == \"COMMAND\").Value; // Get command name\n            string? @params =\n                match.Groups.Values.SingleOrDefault(v => v.Name == \"PARAMETERS\")?.Value\n                ?? string.Empty;\n\n            Console.WriteLine(\"New command: {0}\", command);\n            this.OnCommand(message, command, @params);\n        }\n\n        protected override void OnCommand(Message message, string cmd, string parameters)\n        {\n            string[]? args = parameters.Split(' ', StringSplitOptions.RemoveEmptyEntries);\n            Console.WriteLine(\"Params: {0}\", args.Length);\n            switch (cmd)\n            {\n                case \"hello\":\n                    string? hello = $\"Hello World, {message.From?.FirstName}!\";\n                    Bot.SendMessage(message.Chat.Id, hello);\n                    break;\n            }\n        }\n\n        protected override void OnException(Exception exp)\n        {\n            if (exp is BotRequestException botException)\n            {\n                Console.WriteLine(\"New BotException: {0}\", botException.Message);\n                Console.WriteLine(\"Error Code: {0}\", botException.ErrorCode);\n            }\n            else\n            {\n                Console.WriteLine(\"New Exception: {0}\", exp.Message);\n            }\n            Console.WriteLine();\n        }\n    }\n}\n"
  },
  {
    "path": "src/examples/BotTemplate/Program.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing System.Linq;\nusing BotTemplateSample;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\n\nConsole.WriteLine(\"Start!\");\n\nMyBot.Bot.SetMyCommands([new BotCommand(\"hello\", \"Hello World!!\")]);\nMyBot.Bot.DeleteWebhook();\n\n// Long Polling: Start\nvar updates = MyBot.Bot.GetUpdates();\nwhile (true)\n{\n    if (updates.Any())\n    {\n        foreach (var update in updates)\n        {\n            var botInstance = new MyBot();\n            botInstance.OnUpdate(update);\n        }\n        var offset = updates.Last().UpdateId + 1;\n        updates = MyBot.Bot.GetUpdates(offset);\n    }\n    else\n    {\n        updates = MyBot.Bot.GetUpdates();\n    }\n}\n// Long Polling: End\n"
  },
  {
    "path": "src/examples/BotTemplate/readme.md",
    "content": "# Bot Templace - Sample\n\n## Description\n.NET Core console app\n\nThe bot sends \"Hello World!\" when it receives a message using TelegramBot base class.\n\n## Preview\n![hello world gif](/docs/media/samples/BotTemplate.gif)\n\n## Source Code\n```CSharp\nusing System;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.GettingUpdates;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.InlineMode;\nusing Telegram.BotAPI.Payments;\n\nnamespace BotTemplateSample\n{\n    class Program\n    {\n\n        static void Main()\n        {\n            Console.WriteLine(\"Start!\");\n            MyBot.Bot.SetMyCommands(new BotCommand(\"hello\", \"Hello World!!\"));\n            MyBot.StartPolling();\n            Console.Read();\n        }\n    }\n    public sealed class MyBot : TelegramBot\n    {\n        public static TelegramBotClient Bot = new TelegramBotClient(\"<your bot token>\");\n        public static User Me = Bot.GetMe();\n        public static void StartPolling()\n        {\n            var updates = Bot.GetUpdates<IEnumerable<Update>>();\n            while (true)\n            {\n                if (updates.Any())\n                {\n                    foreach (var update in updates)\n                    {\n                        var botInstance = new MyBot();\n                        botInstance.OnUpdate(update);\n                    }\n                    var offset = updates.Last().UpdateId + 1;\n                    updates = Bot.GetUpdates<IEnumerable<Update>>(offset);\n                }\n                else\n                {\n                    updates = Bot.GetUpdates<IEnumerable<Update>>();\n                }\n            }\n        }\n\n        //\n        private Message message;\n        private bool hasText;\n        private User appUser;\n\n        public override void OnMessage(Message message)\n        {\n            // Ignore user 777000 (Telegram)\n            if (message.From.Id == 777000)\n            {\n                return;\n            }\n            Console.WriteLine(\"New message from chat id: {0}\", message.Chat.Id);\n\n            appUser = message.From; // Save current user;\n            this.message = message; // Save current message;\n            hasText = !string.IsNullOrEmpty(message.Text); // True if message has text;\n\n            Console.WriteLine(\"Message Text: {0}\", hasText ? message.Text : \"|:O\");\n\n            if (message.Chat.Type == ChatType.Private) // Private Chats\n            {\n            }\n            else // Group chats\n            {\n\n            }\n            if (hasText)\n            {\n                if (message.Text.StartsWith('/')) // New commands\n                {\n                    var splitText = message.Text.Split(' ');\n                    var command = splitText.First();\n                    var parameters = splitText.Skip(1).ToArray();\n                    // If the command includes a mention, you should verify that it is for your bot, otherwise you will need to ignore the command.\n                    var pattern = string.Format(@\"^\\/(?<cmd>\\w*)(?:$|@{0}$)\", Me.Username);\n                    var match = Regex.Match(command, pattern, RegexOptions.IgnoreCase);\n                    if (match.Success)\n                    {\n                        command = match.Groups.Values.Last().Value; // Get command name\n                        Console.WriteLine(\"New command: {0}\", command);\n                        OnCommand(command, parameters);\n                    }\n                }\n            }\n        }\n\n        private void OnCommand(string cmd, string[] args)\n        {\n            Console.WriteLine(\"Params: {0}\", args.Length);\n            switch (cmd)\n            {\n                case \"hello\":\n                    var hello = string.Format(\"Hello World, {0}!\", appUser.FirstName);\n                    Bot.SendMessage(message.Chat.Id, hello);\n                    break;\n            }\n        }\n\n        public override void OnBotException(BotRequestException exp)\n        {\n            Console.WriteLine(\"New BotException: {0}\", exp.Message);\n            Console.WriteLine(\"Error Code: {0}\", exp.ErrorCode);\n            Console.WriteLine();\n        }\n\n        public override void OnException(Exception exp)\n        {\n            Console.WriteLine(\"New Exception: {0}\", exp.Message);\n            Console.WriteLine();\n        }\n    }\n}\n```\n"
  },
  {
    "path": "src/examples/Callback query button 01/Callback query button 01.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <RootNamespace>CallbackQueryButton01</RootNamespace>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/examples/Callback query button 01/Program.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\nusing Telegram.BotAPI.UpdatingMessages;\n\nConsole.WriteLine(\"Start!\");\n\nTelegramBotClient bot = new(\"<your bot token>\");\nbot.SetMyCommands([new BotCommand(\"callback\", \"new callback\")]);\n\n// Long Polling\nIEnumerable<Update> updates = bot.GetUpdates();\nwhile (true)\n{\n    if (updates.Any())\n    {\n        foreach (Update update in updates)\n        {\n            if (update.Message?.Chat is not null && !string.IsNullOrEmpty(update.Message.Text))\n            {\n                if (!update.Message.Text.Contains(\"/callback\"))\n                {\n                    continue;\n                }\n\n                InlineKeyboardMarkup replyMarkup = new(\n                    new InlineKeyboardButton[][]\n                    {\n                        [new InlineKeyboardButton(\"Callback\") { CallbackData = \"callback_data\" }],\n                    }\n                );\n                bot.SendMessage(\n                    update.Message.Chat.Id,\n                    \"Message with callback data\",\n                    replyMarkup: replyMarkup\n                );\n            }\n            else if (update.CallbackQuery?.Message is not null)\n            {\n                bot.AnswerCallbackQuery(update.CallbackQuery.Id, \"HELLO\");\n                bot.EditMessageText(\n                    update.CallbackQuery.Message.Chat.Id,\n                    update.CallbackQuery.Message.MessageId,\n                    $\"Click!\\n\\n{update.CallbackQuery.Data}\"\n                );\n            }\n        }\n\n        updates = updates = bot.GetUpdates(updates.Max(u => u.UpdateId) + 1);\n    }\n    else\n    {\n        updates = bot.GetUpdates();\n    }\n}\n"
  },
  {
    "path": "src/examples/Callback query button 01/readme.md",
    "content": "# Callback query button - Sample 01\n\n## Description\n.NET Core console app\n\nCreate a button with the /callback command\nPressing it edits the message, removing the button and typing new text.\n\n## Preview\n![callbacks gif](/docs/media/samples/CallbackButton.gif)\n\n## Source Code\n```CSharp\nusing System;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.GettingUpdates;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.UpdatingMessages;\n\nnamespace CallbackQueryButton01\n{\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(\"Start!\");\n            var bot = new TelegramBotClient(\"<your bot token>\");\n            bot.SetMyCommands(new BotCommand(\"callback\", \"new callback\"));\n            var updates = bot.GetUpdates();\n            while (true)\n            {\n                if (updates.Length > 0)\n                {\n                    foreach (var update in updates)\n                    {\n                        switch (update.Type)\n                        {\n                            case UpdateType.Message:\n                                var message = update.Message;\n                                if (message.Text.Contains(\"/callback\"))\n                                {\n                                    var replyMarkup = new InlineKeyboardMarkup\n                                    {\n                                        InlineKeyboard = new InlineKeyboardButton[][]{\n                                        new InlineKeyboardButton[]{\n                                            InlineKeyboardButton.SetCallbackData(\"Callback\", \"callback_data\")\n                                            }\n                                        }\n                                    };\n                                    bot.SendMessage(message.Chat.Id, \"Message with callback data\", replyMarkup: replyMarkup);\n                                }\n                                break;\n                            case UpdateType.CallbackQuery:\n                                var query = update.CallbackQuery;\n                                bot.AnswerCallbackQuery(query.Id, \"HELLO\");\n                                bot.EditMessageText(new EditMessageTextArgs\n                                {\n                                    ChatId = query.Message.Chat.Id,\n                                    MessageId = query.Message.MessageId,\n                                    Text = $\"Click!\\n\\n{query.Data}\"\n                                });\n                                break;\n                        }\n                    }\n                    updates = updates = bot.GetUpdates(offset: updates.Max(u => u.UpdateId) + 1);\n                }\n                else\n                {\n                    updates = bot.GetUpdates();\n                }\n            }\n        }\n    }\n}\n```"
  },
  {
    "path": "src/examples/Examples.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.2.32519.379\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BotTemplateSample\", \"BotTemplate\\BotTemplateSample.csproj\", \"{90EBAC9A-9A49-4A4B-A863-246EC41F5D59}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Callback query button 01\", \"Callback query button 01\\Callback query button 01.csproj\", \"{0292D292-A156-4619-959F-70DB6F45440B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Hello World\", \"Hello World\\Hello World.csproj\", \"{2FBF087D-A1E6-47A7-9344-C17AA494150A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Poll Quiz 01\", \"Poll Quiz 01\\Poll Quiz 01.csproj\", \"{CD140BB0-8F69-4A38-ABC0-49DEF01D4615}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ReplyKeyboardMarkup 01\", \"ReplyKeyboardMarkup 01\\ReplyKeyboardMarkup 01.csproj\", \"{295293AC-04D4-432F-BBA0-5A5F9A4F22F3}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Telegram Calendar\", \"Telegram Calendar\\Telegram Calendar.csproj\", \"{CB877447-C492-43E4-B7A9-3534B7619039}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"HelloBotNET.Webhook\", \"HelloBotNET.Webhook\\HelloBotNET.Webhook.csproj\", \"{4A7EC7DA-03F3-40B5-8993-DA90C5CC589C}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Examples\", \"Examples\", \"{7A82B466-5509-490E-A490-D64D871CBA06}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Library\", \"Library\", \"{ADD476C3-7C77-421E-8A5F-F5DC41886727}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Telegram.BotAPI\", \"..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\", \"{7885DD73-1782-4D0E-826E-C60C27C7648D}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"HelloBotNET.AppService\", \"HelloBotNET.AppService\\HelloBotNET.AppService.csproj\", \"{40F07F65-6DF5-48D2-9C11-0D970BFA31A0}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Telegram.BotAPI.Extensions\", \"..\\library\\Telegram.BotAPI.Extensions\\Telegram.BotAPI.Extensions.csproj\", \"{5E7D52AF-3914-47AA-9136-A87520D8119D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{90EBAC9A-9A49-4A4B-A863-246EC41F5D59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{90EBAC9A-9A49-4A4B-A863-246EC41F5D59}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{90EBAC9A-9A49-4A4B-A863-246EC41F5D59}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{90EBAC9A-9A49-4A4B-A863-246EC41F5D59}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0292D292-A156-4619-959F-70DB6F45440B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0292D292-A156-4619-959F-70DB6F45440B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0292D292-A156-4619-959F-70DB6F45440B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0292D292-A156-4619-959F-70DB6F45440B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2FBF087D-A1E6-47A7-9344-C17AA494150A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2FBF087D-A1E6-47A7-9344-C17AA494150A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2FBF087D-A1E6-47A7-9344-C17AA494150A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2FBF087D-A1E6-47A7-9344-C17AA494150A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CD140BB0-8F69-4A38-ABC0-49DEF01D4615}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CD140BB0-8F69-4A38-ABC0-49DEF01D4615}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CD140BB0-8F69-4A38-ABC0-49DEF01D4615}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CD140BB0-8F69-4A38-ABC0-49DEF01D4615}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{295293AC-04D4-432F-BBA0-5A5F9A4F22F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{295293AC-04D4-432F-BBA0-5A5F9A4F22F3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{295293AC-04D4-432F-BBA0-5A5F9A4F22F3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{295293AC-04D4-432F-BBA0-5A5F9A4F22F3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CB877447-C492-43E4-B7A9-3534B7619039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CB877447-C492-43E4-B7A9-3534B7619039}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CB877447-C492-43E4-B7A9-3534B7619039}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CB877447-C492-43E4-B7A9-3534B7619039}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4A7EC7DA-03F3-40B5-8993-DA90C5CC589C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4A7EC7DA-03F3-40B5-8993-DA90C5CC589C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4A7EC7DA-03F3-40B5-8993-DA90C5CC589C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4A7EC7DA-03F3-40B5-8993-DA90C5CC589C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7885DD73-1782-4D0E-826E-C60C27C7648D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7885DD73-1782-4D0E-826E-C60C27C7648D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7885DD73-1782-4D0E-826E-C60C27C7648D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7885DD73-1782-4D0E-826E-C60C27C7648D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{40F07F65-6DF5-48D2-9C11-0D970BFA31A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{40F07F65-6DF5-48D2-9C11-0D970BFA31A0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{40F07F65-6DF5-48D2-9C11-0D970BFA31A0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{40F07F65-6DF5-48D2-9C11-0D970BFA31A0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5E7D52AF-3914-47AA-9136-A87520D8119D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5E7D52AF-3914-47AA-9136-A87520D8119D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5E7D52AF-3914-47AA-9136-A87520D8119D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5E7D52AF-3914-47AA-9136-A87520D8119D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{90EBAC9A-9A49-4A4B-A863-246EC41F5D59} = {7A82B466-5509-490E-A490-D64D871CBA06}\n\t\t{0292D292-A156-4619-959F-70DB6F45440B} = {7A82B466-5509-490E-A490-D64D871CBA06}\n\t\t{2FBF087D-A1E6-47A7-9344-C17AA494150A} = {7A82B466-5509-490E-A490-D64D871CBA06}\n\t\t{CD140BB0-8F69-4A38-ABC0-49DEF01D4615} = {7A82B466-5509-490E-A490-D64D871CBA06}\n\t\t{295293AC-04D4-432F-BBA0-5A5F9A4F22F3} = {7A82B466-5509-490E-A490-D64D871CBA06}\n\t\t{CB877447-C492-43E4-B7A9-3534B7619039} = {7A82B466-5509-490E-A490-D64D871CBA06}\n\t\t{4A7EC7DA-03F3-40B5-8993-DA90C5CC589C} = {7A82B466-5509-490E-A490-D64D871CBA06}\n\t\t{7885DD73-1782-4D0E-826E-C60C27C7648D} = {ADD476C3-7C77-421E-8A5F-F5DC41886727}\n\t\t{40F07F65-6DF5-48D2-9C11-0D970BFA31A0} = {7A82B466-5509-490E-A490-D64D871CBA06}\n\t\t{5E7D52AF-3914-47AA-9136-A87520D8119D} = {ADD476C3-7C77-421E-8A5F-F5DC41886727}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {936E7344-448B-4497-970E-1AC2EC609933}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/examples/Hello World/Hello World.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <RootNamespace>HelloWorld</RootNamespace>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/examples/Hello World/Program.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\n\nConsole.WriteLine(\"Start!\");\n\nTelegramBotClient bot = new(\"<your bot token>\");\n\n// Long Polling\nIEnumerable<Update> updates = bot.GetUpdates();\nwhile (true)\n{\n    if (updates.Any())\n    {\n        foreach (Update update in updates)\n        {\n            if (update.Message != null)\n            {\n                Message message = update.Message;\n                //bot.SendChatAction(message.Chat.Id, ChatAction.Typing);\n                bot.SendMessage(message.Chat.Id, \"Hello World!\");\n            }\n        }\n\n        updates = bot.GetUpdates(updates.Max(u => u.UpdateId) + 1);\n    }\n    else\n    {\n        updates = bot.GetUpdates();\n    }\n}\n"
  },
  {
    "path": "src/examples/Hello World/readme.md",
    "content": "# Hello World - Sample\n\n## Description\n.NET Core console app\n\nThe bot sends \"Hello World!\" when it receives a message\n\n## Preview\n![hello world gif](/docs/media/samples/HelloWorld.gif)\n\n## Source Code\n```CSharp\nusing System;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace HelloWorld\n{\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(\"Start!\");\n            var bot = new TelegramBotClient(\"<your bot token>\");\n            var updates = bot.GetUpdates();\n            while (true)\n            {\n                if (updates.Length > 0)\n                {\n                    foreach (var update in updates)\n                    {\n                        if (update.Type == UpdateType.Message)\n                        {\n                            var message = update.Message;\n                            //bot.SendChatAction(message.Chat.Id, ChatAction.Typing);\n                            bot.SendMessage(message.Chat.Id, \"Hello World!\");\n                        }\n                    }\n                    updates = bot.GetUpdates(offset: updates.Max(u => u.UpdateId) + 1);\n                }\n                else\n                {\n                    updates = bot.GetUpdates();\n                }\n            }\n        }\n    }\n}\n```"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/HelloBotNET.AppService.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Worker\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <UserSecretsId>dotnet-HelloBotNET-51BA3BFF-ACF3-4D96-B57C-8CFDD2B87F9E</UserSecretsId>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Extensions.Configuration.UserSecrets\" Version=\"6.0.1\" />\n    <PackageReference Include=\"Microsoft.Extensions.Hosting\" Version=\"6.0.1\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Azure.Containers.Tools.Targets\" Version=\"1.15.1\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI.Extensions\\Telegram.BotAPI.Extensions.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Program.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing HelloBotNET.AppService;\nusing HelloBotNET.AppService.Services;\n\nIHost host = Host.CreateDefaultBuilder(args)\n    .ConfigureServices(\n        (_, services) =>\n        {\n            // Add bot service.\n            services.AddSingleton<HelloBot>();\n\n            // Add long polling service\n            services.AddHostedService<Worker>();\n        }\n    )\n    .Build();\n\nawait host.RunAsync();\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Properties/launchSettings.json",
    "content": "{\n  \"profiles\": {\n    \"HelloBotNET.AppService\": {\n      \"commandName\": \"Project\",\n      \"environmentVariables\": {\n        \"DOTNET_ENVIRONMENT\": \"Development\"\n      },\n      \"dotnetRunMessages\": true\n    },\n    \"Docker\": {\n      \"commandName\": \"Docker\"\n    }\n  }\n}"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Properties/serviceDependencies.json",
    "content": "{\n  \"dependencies\": {\n    \"secrets1\": {\n      \"type\": \"secrets\"\n    }\n  }\n}"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Properties/serviceDependencies.local.json",
    "content": "{\n  \"dependencies\": {\n    \"secrets1\": {\n      \"type\": \"secrets.user\"\n    }\n  }\n}"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Services/HelloBot.CommandHandler.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace HelloBotNET.AppService.Services;\n\n/// <summary>\n///     It contains the main functionality of the telegram bot. <br />\n///     The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot\n{\n    protected override void OnCommand(Message message, string commandName, string commandParameters)\n    {\n        string[] args = commandParameters.Split(' ');\n#if DEBUG\n        this.logger.LogInformation(\"Params: {ArgsLenght}\", args.Length);\n#endif\n\n        switch (commandName)\n        {\n            case \"hello\": // Reply to /hello command\n                string hello = $\"Hello World, {message.From!.FirstName}!\";\n                this.Client.SendMessage(message.Chat.Id, hello);\n                break;\n            /*\n        case \"command1\":\n            // ...\n            break;\n        case \"command2\":\n            // ...\n            break;\n        */\n            default:\n                if (message.Chat.Type == ChatTypes.Private)\n                {\n                    this.Client.SendMessage(message.Chat.Id, \"Unrecognized command.\");\n                }\n\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Services/HelloBot.ErrorHandler.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI;\n\nnamespace HelloBotNET.AppService.Services;\n\n/// <summary>\n///     It contains the main functionality of the telegram bot. <br />\n///     The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot\n{\n    protected override void OnBotException(BotRequestException exp) =>\n        this.logger.LogError(\"BotRequestException: {Message}\", exp.Message);\n\n    protected override void OnException(Exception exp) =>\n        this.logger.LogError(\"Exception: {Message}\", exp.Message);\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Services/HelloBot.MessageHandler.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace HelloBotNET.AppService.Services;\n\n/// <summary>\n///     It contains the main functionality of the telegram bot. <br />\n///     The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot\n{\n    protected override void OnMessage(Message message)\n    {\n        // Ignore user 777000 (Telegram)\n        if (message.From?.Id == TelegramConstants.TelegramId)\n        {\n            return;\n        }\n\n        bool hasText = !string.IsNullOrEmpty(message.Text); // True if message has text;\n#if DEBUG\n        this.logger.LogInformation(\"New message from chat id: {ChatId}\", message.Chat.Id);\n        this.logger.LogInformation(\"Message: {MessageContent}\", hasText ? message.Text : \"No text\");\n#endif\n\n        base.OnMessage(message);\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Services/HelloBot.UpdateHandler.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.Extensions;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace HelloBotNET.AppService.Services;\n\n/// <summary>\n/// It contains the main functionality of the telegram bot. <br />\n/// The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot\n{\n    public override void OnUpdate(Update update)\n    {\n#if DEBUG\n        this.logger.LogInformation(\n            \"New update with id: {UpdateId}. Type: {UpdateType}\",\n            update.UpdateId,\n            update.GetUpdateType()\n        );\n#endif\n\n        base.OnUpdate(update);\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Services/HelloBot.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.Extensions;\n\nnamespace HelloBotNET.AppService.Services\n{\n    /// <summary>\n    ///     It contains the main functionality of the telegram bot. <br />\n    ///     The application creates a new instance of this class to process each update received.\n    /// </summary>\n    public partial class HelloBot : SimpleUpdateHandlerBase\n    {\n        private readonly ILogger<HelloBot> logger;\n\n        public HelloBot(ILogger<HelloBot> logger, IConfiguration configuration)\n        {\n            this.logger = logger;\n\n            string? botToken = configuration.GetValue<string>(\"Telegram:BotToken\");\n            this.Client = new TelegramBotClient(botToken);\n\n            string? myUsername = this.Client.GetMe().Username!;\n            // This will provide a better command filtering.\n            this.SetCommandExtractor(myUsername);\n        }\n\n        public ITelegramBotClient Client { get; }\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/Worker.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing HelloBotNET.AppService.Services;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace HelloBotNET.AppService;\n\npublic class Worker(ILogger<Worker> logger, HelloBot bot) : BackgroundService\n{\n    protected override async Task ExecuteAsync(CancellationToken stoppingToken)\n    {\n        logger.LogInformation(\"Worker running at: {Time}\", DateTimeOffset.Now);\n\n        ITelegramBotClient client = bot.Client;\n\n        // Long Polling\n        IEnumerable<Update> updates = await client.GetUpdatesAsync(\n            cancellationToken: stoppingToken\n        );\n        while (!stoppingToken.IsCancellationRequested)\n        {\n            if (updates.Any())\n            {\n                Parallel.ForEach(updates, this.ProcessUpdate);\n\n                updates = await client\n                    .GetUpdatesAsync(updates.Last().UpdateId + 1, cancellationToken: stoppingToken)\n                    .ConfigureAwait(false);\n            }\n            else\n            {\n                updates = await client\n                    .GetUpdatesAsync(cancellationToken: stoppingToken)\n                    .ConfigureAwait(false);\n            }\n        }\n    }\n\n    private void ProcessUpdate(Update update) => bot.OnUpdate(update);\n\n    public override Task StopAsync(CancellationToken cancellationToken)\n    {\n        logger.LogInformation(\"Worker stopping at: {Time}\", DateTimeOffset.Now);\n        return base.StopAsync(cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.AppService/readme.md",
    "content": "# HelloBotNET\n\nThis is a Hello World telegram bot made with NET 6 using Long Polling.\n\n## How to Run\n\nYou just need to specify your **bot token** in the `HelloBotNET.AppService` project.\n\nYour `secrets.json` or `appsettings.json` should look like the following code:\n\n```JSON\n{\n\"Telegram\": {\n    \"BotToken\": \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\"\n  }\n}\n```\n\nYou can also use enviroment variables instead:\n\n| Env                               | Description                                                      |\n| :-------------------------------- | :--------------------------------------------------------------- |\n| Telegram__BotToken                | Your bot token provided by [@BotFather](https://t.me/BotFather). |\n\nFinally, run `HelloBotNET.AppService` and see the magic.\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Controllers/BotController.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing HelloBotNET.Webhook.Services;\nusing Microsoft.AspNetCore.Mvc;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace HelloBotNET.Webhook.Controllers;\n\n[ApiController]\n[Route(\"[controller]\")]\npublic class BotController : ControllerBase\n{\n    private readonly HelloBot bot;\n    private readonly IConfiguration configuration;\n    private readonly ILogger<BotController> logger;\n\n    public BotController(ILogger<BotController> logger, IConfiguration configuration, HelloBot bot)\n    {\n        this.logger = logger;\n        this.configuration = configuration;\n        this.bot = bot;\n    }\n\n    [HttpPost]\n    public async Task<IActionResult> PostAsync(\n        [FromHeader(Name = \"X-Telegram-Bot-Api-Secret-Token\")] string webhookToken,\n        [FromBody] Update update,\n        CancellationToken cancellationToken\n    )\n    {\n        if (this.configuration[\"Telegram:WebhookToken\"] != webhookToken)\n        {\n#if DEBUG\n            this.logger.LogWarning(\"Failed access\");\n#endif\n            this.Unauthorized();\n        }\n\n        if (update == default)\n        {\n#if DEBUG\n            this.logger.LogWarning(\"Invalid update detected\");\n#endif\n            return this.BadRequest();\n        }\n\n        this.bot.OnUpdate(update);\n\n        return await Task.FromResult(this.Ok());\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Extensions/ApplicationBuilderExtensions.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing HelloBotNET.Webhook.Services;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace HelloBotNET.Webhook.Extensions;\n\n/// <summary>\n/// Extension methods for <see cref=\"IApplicationBuilder\"/>.\n/// </summary>\npublic static class ApplicationBuilderExtensions\n{\n    /// <summary>\n    /// Registers the Telegram Webhook.\n    /// </summary>\n    /// <param name=\"app\">The <see cref=\"IApplicationBuilder\"/> instance this method extends.</param>\n    /// <returns>The <see cref=\"IApplicationBuilder\"/> instance this method extends.</returns>\n    /// <exception cref=\"ArgumentNullException\"></exception>\n    public static IApplicationBuilder UseTelegramWebhook(this IApplicationBuilder app)\n    {\n        if (app is null)\n        {\n            throw new ArgumentNullException(nameof(app));\n        }\n\n        var configuration = app.ApplicationServices.GetRequiredService<IConfiguration>();\n        var bot = app.ApplicationServices.GetRequiredService<HelloBot>();\n\n        var webhookToken = configuration[\"Telegram:WebhookToken\"]; // ENV: Telegram__WebhookToken, JSON: \"Telegram:WebhookToken\"\n        var webhookUrl = configuration[\"Telegram:WebhookUrl\"]; // ENV: Telegram__WebhookUrl, JSON: \"Telegram:WebhookUrl\"\n\n        // Delete my old commands\n        bot.Client.DeleteMyCommands();\n        // Set my commands\n        bot.Client.SetMyCommands([new BotCommand(\"hello\", \"Hello world!\")]);\n\n        // Delete webhook\n        bot.Client.DeleteWebhook();\n\n        // Set webhook\n        bot.Client.SetWebhook(webhookUrl + \"/bot\", secretToken: webhookToken);\n\n        return app;\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/HelloBotNET.Webhook.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n\t<PropertyGroup>\n\t\t<TargetFramework>net8.0</TargetFramework>\n\t\t<Nullable>enable</Nullable>\n\t\t<ImplicitUsings>enable</ImplicitUsings>\n\t\t<RootNamespace>HelloBotNET.Webhook</RootNamespace>\n\t\t<UserSecretsId>d0d5de81-a20b-4e69-8762-ebf03c089384</UserSecretsId>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n\t\t<ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI.Extensions\\Telegram.BotAPI.Extensions.csproj\" />\n\t</ItemGroup>\n\n\n</Project>\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Program.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing HelloBotNET.Webhook.Extensions;\nusing HelloBotNET.Webhook.Services;\n\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddControllers();\n\n// Add bot service.\nbuilder.Services.AddSingleton<HelloBot>();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\n\napp.UseHttpsRedirection();\n\napp.MapControllers();\n\n// Register que webhook\napp.UseTelegramWebhook();\n\napp.Run();\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Properties/launchSettings.json",
    "content": "﻿{\n  \"$schema\": \"http://json.schemastore.org/launchsettings.json\",\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:4756\",\n      \"sslPort\": 44311\n    }\n  },\n  \"profiles\": {\n    \"HelloBotNET.Webhook\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"applicationUrl\": \"https://localhost:7001;http://localhost:7000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Services/HelloBot.CommandHandler.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace HelloBotNET.Webhook.Services;\n\n/// <summary>\n///     It contains the main functionality of the telegram bot. <br />\n///     The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot\n{\n    protected override void OnCommand(Message message, string commandName, string commandParameters)\n    {\n        string[] args = commandParameters.Split(' ');\n#if DEBUG\n        this.logger.LogInformation(\"Params: {ArgsLenght}\", args.Length);\n#endif\n\n        switch (commandName)\n        {\n            case \"hello\": // Reply to /hello command\n                string hello = $\"Hello World, {message.From!.FirstName}!\";\n                this.Client.SendMessage(message.Chat.Id, hello);\n                break;\n            /*\n            case \"command1\":\n                // ...\n                break;\n            case \"command2\":\n                // ...\n                break;\n            */\n            default:\n                if (message.Chat.Type == ChatTypes.Private)\n                {\n                    this.Client.SendMessage(message.Chat.Id, \"Unrecognized command.\");\n                }\n\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Services/HelloBot.ErrorHandler.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI;\n\nnamespace HelloBotNET.Webhook.Services;\n\n/// <summary>\n///     It contains the main functionality of the telegram bot. <br />\n///     The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot\n{\n    protected override void OnBotException(BotRequestException exp) =>\n        this.logger.LogError(\"BotRequestException: {Message}\", exp.Message);\n\n    protected override void OnException(Exception exp) =>\n        this.logger.LogError(\"Exception: {Message}\", exp.Message);\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Services/HelloBot.MessageHandler.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace HelloBotNET.Webhook.Services;\n\n/// <summary>\n///     It contains the main functionality of the telegram bot. <br />\n///     The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot\n{\n    protected override void OnMessage(Message message)\n    {\n        // Ignore user 777000 (Telegram)\n        if (message.From?.Id == TelegramConstants.TelegramId)\n        {\n            return;\n        }\n\n        bool hasText = !string.IsNullOrEmpty(message.Text); // True if message has text;\n#if DEBUG\n        this.logger.LogInformation(\"New message from chat id: {ChatId}\", message.Chat.Id);\n        this.logger.LogInformation(\"Message: {MessageContent}\", hasText ? message.Text : \"No text\");\n#endif\n\n        base.OnMessage(message);\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Services/HelloBot.UpdateHandler.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.Extensions;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace HelloBotNET.Webhook.Services;\n\n/// <summary>\n///     It contains the main functionality of the telegram bot. <br />\n///     The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot\n{\n    public override void OnUpdate(Update update)\n    {\n#if DEBUG\n        this.logger.LogInformation(\n            \"New update with id: {UpdateId}. Type: {UpdateType}\",\n            update.UpdateId,\n            update.GetUpdateType()\n        );\n#endif\n\n        base.OnUpdate(update);\n    }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/Services/HelloBot.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.Extensions;\n\nnamespace HelloBotNET.Webhook.Services;\n\n/// <summary>\n///     It contains the main functionality of the telegram bot. <br />\n///     The application creates a new instance of this class to process each update received.\n/// </summary>\npublic partial class HelloBot : SimpleUpdateHandlerBase\n{\n    private readonly ILogger<HelloBot> logger;\n\n    public HelloBot(ILogger<HelloBot> logger, IConfiguration configuration)\n    {\n        this.logger = logger;\n\n        string botToken =\n            configuration.GetValue<string>(\"Telegram:BotToken\")\n            ?? throw new ArgumentNullException(\"Telegram:BotToken\");\n        this.Client = new TelegramBotClient(botToken);\n\n        string myUsername = this.Client.GetMe().Username!;\n        // This will provide a better command filtering.\n        this.SetCommandExtractor(myUsername);\n    }\n\n    public ITelegramBotClient Client { get; }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "src/examples/HelloBotNET.Webhook/readme.md",
    "content": "# HelloBotNET\n\nThis is a Hello World telegram bot made with NET 6 using a webhook.\n\n## How to Run\n\nIf you want to run this bot you need to specify your **bot token**, the **application url** and a **secret token** in the `HelloBotNET.Webhook` project. Optionally, you can specify the **certificate** path to use with your webhook.\n\nYour `secrets.json` or `appsettings.json` should look like the following code:\n\n```JSON\n{\n  //\"Certificate\": \"/etc/ssl/certs/custom_cert.pem\",\n  \"Telegram\": {\n    \"BotToken\": \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\",\n    \"WebhookUrl\": \"https://www.example.com\",\n    \"WebhookToken\": \"SUPERSECRETPATH\"\n  }\n}\n```\n\nYou can also use enviroment variables instead:\n\n| Env                               | Description                                                      |\n| :-------------------------------- | :--------------------------------------------------------------- |\n| Certificate                       | Optional. Certificate Path.                                      |\n| Telegram__BotToken                | Your bot token provided by [@BotFather](https://t.me/BotFather). |\n| Telegram__WebhookUrl              | Your application url. Ex: <https://example.com>                  |\n| Telegram__WebhookToken            | Your secret token. It must be specified by yourself.             |\n\nFinally, run `HelloBotNET.Webhook` and see the magic.\n"
  },
  {
    "path": "src/examples/Poll Quiz 01/Poll Quiz 01.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <RootNamespace>Poll_Quiz_01</RootNamespace>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/examples/Poll Quiz 01/Program.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\n\nConsole.WriteLine(\"Start!\");\n\nTelegramBotClient bot = new(\"<BOT TOKEN>\");\nbot.SetMyCommands([new BotCommand(\"quiz\", \"New quiz\")]);\n\n// Long Polling\nIEnumerable<Update> updates = bot.GetUpdates();\nwhile (true)\n{\n    if (updates.Any())\n    {\n        foreach (Update update in updates)\n        {\n            if (update.Message?.Text?.Contains(\"/quiz\") is true)\n            {\n                bot.SendPoll(\n                    new SendPollArgs(\n                        update.Message.Chat.Id,\n                        \"¿5 + 5?\",\n                        [\n                            new InputPollOption(\"56\"),\n                            new InputPollOption(\"7\"),\n                            new InputPollOption(\"10\"),\n                            new InputPollOption(\"-4\"),\n                        ]\n                    )\n                    {\n                        Type = \"quiz\",\n                        CorrectOptionId = 2,\n                    }\n                );\n            }\n        }\n\n        updates = bot.GetUpdates(updates.Max(u => u.UpdateId) + 1);\n    }\n    else\n    {\n        updates = bot.GetUpdates();\n    }\n}\n"
  },
  {
    "path": "src/examples/Poll Quiz 01/readme.md",
    "content": "# Poll Quiz - Sample 01\n\n## Description\n.NET Core console app\n\nCreate a quiz from the new polls 2.0\n\n## Preview\n![quiz gif](/docs/media/samples/Quiz.gif)\n\n## Source Code\n```CSharp\nusing System;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Poll_Quiz_01\n{\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(\"Start!\");\n            var bot = new TelegramBotClient(\"<your bot token>\");\n            bot.SetMyCommands(new BotCommand(\"quiz\", \"New quiz\"));\n            var updates = bot.GetUpdates();\n            while (true)\n            {\n                if (updates.Length > 0)\n                {\n                    foreach (var update in updates)\n                    {\n                        switch (update.Type)\n                        {\n                            case UpdateType.Message:\n                                if (update.Message.Text.Contains(\"/quiz\"))\n                                {\n                                    bot.SendPoll(new SendPollArgs\n                                    {\n                                        ChatId = update.Message.Chat.Id,\n                                        Question = \"¿5 + 5?\",\n                                        Options = new string[]{\n                                            \"56\", \"7\", \"10\", \"-4\"\n                                        },\n                                        Type = \"quiz\",\n                                        CorrectOptionId = 2\n                                    });\n                                }\n                                break;\n                        }\n                    }\n                    updates = bot.GetUpdates(offset: updates.Max(u => u.UpdateId) + 1);\n                }\n                else\n                {\n                    updates = bot.GetUpdates();\n                }\n            }\n        }\n    }\n}\n```"
  },
  {
    "path": "src/examples/ReplyKeyboardMarkup 01/Program.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\n\nConsole.WriteLine(\"Start!\");\n\nTelegramBotClient client = new(\"<your bot token>\");\nclient.SetMyCommands([new BotCommand(\"reply\", \"ReplyMarkup\"), new BotCommand(\"del\", \"Delete\")]);\n\n// Long Polling\nIEnumerable<Update> updates = client.GetUpdates();\nwhile (true)\n{\n    if (updates.Any())\n    {\n        foreach (Update update in updates)\n        {\n            if (!string.IsNullOrEmpty(update.Message?.Text))\n            {\n                if (update.Message.Text.Contains(\"/reply\"))\n                {\n                    ReplyKeyboardMarkup keyboard = new(\n                        [\n                            [\n                                new KeyboardButton(\"Button 1\"), //column 1 row 1\n                                new KeyboardButton(\n                                    \"Button 2\"\n                                ) //column 1 row 2\n                                ,\n                            ], // column 1\n                            [\n                                new KeyboardButton(\n                                    \"Button 3\"\n                                ) //col 2 row 1\n                                ,\n                            ] // column 2\n                            ,\n                        ]\n                    )\n                    {\n                        ResizeKeyboard = true,\n                    };\n                    client.SendMessage(\n                        update.Message.Chat.Id,\n                        \"new keyboard\",\n                        replyMarkup: keyboard\n                    );\n                }\n\n                if (update.Message.Text.Contains(\"/del\"))\n                {\n                    client.SendMessage(\n                        update.Message.Chat.Id,\n                        \"remove reply keyboard\",\n                        replyMarkup: new ReplyKeyboardRemove()\n                    );\n                }\n            }\n        }\n\n        updates = client.GetUpdates(updates.Max(u => u.UpdateId) + 1);\n    }\n    else\n    {\n        updates = client.GetUpdates();\n    }\n}\n"
  },
  {
    "path": "src/examples/ReplyKeyboardMarkup 01/ReplyKeyboardMarkup 01.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <RootNamespace>ReplyKeyboardMarkup_01</RootNamespace>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/examples/ReplyKeyboardMarkup 01/readme.md",
    "content": "# Reply keyboard markup - Sample 01\n\n## Description\n.NET Core console app\n\nCreate a reply keyboard\n\n## Preview\n![keyboard gif](/docs/media/samples/ReplyKeyboard.gif)\n\n## Source Code\n```CSharp\nusing System;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace ReplyKeyboardMarkup_01\n{\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(\"Start!\");\n            var bot = new TelegramBotClient(\"<your bot token>\");\n            var updates = bot.GetUpdates();\n            bot.SetMyCommands(new BotCommand(\"reply\", \"ReplyMarkup\"), new BotCommand(\"del\", \"Delete\"));\n            while (true)\n            {\n                if (updates.Length > 0)\n                {\n                    foreach (var update in updates)\n                    {\n                        switch (update.Type)\n                        {\n                            case UpdateType.Message:\n                                if (update.Message.Text.Contains(\"/reply\"))\n                                {\n                                    var keyboard = new ReplyKeyboardMarkup\n                                    {\n                                        Keyboard = new KeyboardButton[][]{\n                                            new KeyboardButton[]{\n                                                new KeyboardButton(\"Button 1\"), //column 1 row 1\n                                                new KeyboardButton(\"Button 2\") //column 1 row 2\n                                                },// column 1\n                                            new KeyboardButton[]{\n                                                new KeyboardButton(\"Button 3\") //col 2 row 1\n                                                } // column 2\n                                        },\n                                        ResizeKeyboard = true\n                                    }; ;\n                                    bot.SendMessage(update.Message.Chat.Id, \"new keyboard\", replyMarkup: keyboard);\n                                }\n                                if (update.Message.Text.Contains(\"/del\"))\n                                {\n                                    bot.SendMessage(update.Message.Chat.Id, \"remove reply keyboard\", replyMarkup: new ReplyKeyboardRemove());\n                                }\n                                break;\n                        }\n                    }\n                    updates = bot.GetUpdates(offset: updates.Max(u => u.UpdateId) + 1);\n                }\n                else\n                {\n                    updates = bot.GetUpdates();\n                }\n            }\n        }\n    }\n}\n```"
  },
  {
    "path": "src/examples/Telegram Calendar/Calendar.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing IKB = Telegram.BotAPI.AvailableTypes.InlineKeyboardButton;\n\nnamespace TelegramCalendar;\n\npublic static class Calendar\n{\n    public static IKB[][] New(DateTime dateTime)\n    {\n        var year = dateTime.Year;\n        var keyboard = new IKB[6][];\n        keyboard[0] = [new IKB($\"{year}\") { CallbackData = $\"Year {year}\" }];\n        for (int i = 1, n = 0; i < 5; i++)\n        {\n            keyboard[i] = new IKB[3];\n            for (int j = 0; j < 3; j++, n++)\n            {\n                var month = (MonthName)n;\n                keyboard[i][j] = new IKB($\"{month}\") { CallbackData = $\"month {year} {n}\" };\n            }\n        }\n        keyboard[5] =\n        [\n            new IKB($\"{year - 1}\") { CallbackData = $\"year {year - 1}\" },\n            new IKB($\"{year + 1}\") { CallbackData = $\"year {year + 1}\" },\n        ];\n        return keyboard;\n    }\n\n    public static IKB[][] New(Month mon)\n    {\n        var calendar = new IKB[mon.Weeks + 3][];\n        var pos = 0;\n        calendar[0] = [new IKB($\"{mon.Name} {mon.Year}\") { CallbackData = $\"year {mon.Year}\" }];\n        var days = new[] { \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" };\n        calendar[1] = new IKB[7];\n        for (int i = 0; i < 7; i++)\n        {\n            calendar[1][i] = new IKB(days[i]) { CallbackData = $\"{((DayOfWeek)i)}\" };\n        }\n        for (int i = 2; i < mon.Weeks + 2; i++)\n        {\n            calendar[i] = new IKB[7];\n            for (int j = 0; j < 7; j++)\n            {\n                if (pos < mon.Days.Length)\n                {\n                    if ((int)mon.Days[pos].Name == j)\n                    {\n                        calendar[i][j] = new IKB($\"{mon.Days[pos].Number}\")\n                        {\n                            CallbackData =\n                                $\"{mon.Days[pos].Name}, {mon.Name} {mon.Days[pos].Number}\",\n                        };\n                        pos++;\n                    }\n                    else\n                    {\n                        calendar[i][j] = new IKB(\"*\") { CallbackData = \"Empty day\" };\n                    }\n                }\n                else\n                {\n                    calendar[i][j] = new IKB(\"*\") { CallbackData = \"Empty day\" };\n                }\n            }\n        }\n        calendar[^1] = new IKB[2];\n        var previousMonth = mon.Name == MonthName.January ? MonthName.December : mon.Name - 1;\n        var nextMonth = mon.Name == MonthName.December ? MonthName.January : mon.Name + 1;\n        var previousYear = previousMonth == MonthName.December ? mon.Year - 1 : mon.Year;\n        var nextYear = nextMonth == MonthName.January ? mon.Year + 1 : mon.Year;\n        calendar[^1][0] = new IKB($\"{previousMonth}\")\n        {\n            CallbackData = $\"month {previousYear} {(ushort)previousMonth}\",\n        };\n        calendar[^1][1] = new IKB($\"{nextMonth}\")\n        {\n            CallbackData = $\"month {nextYear} {(ushort)nextMonth}\",\n        };\n        return calendar;\n    }\n\n    public static IKB[][] New(uint year)\n    {\n        var keyboard = new IKB[6][];\n        keyboard[0] = [new IKB($\"{year}\") { CallbackData = $\"Year {year}\" }];\n        for (int i = 1, n = 0; i < 5; i++)\n        {\n            keyboard[i] = new IKB[3];\n            for (int j = 0; j < 3; j++, n++)\n            {\n                var month = (MonthName)n;\n                keyboard[i][j] = new IKB($\"{month}\") { CallbackData = $\"month {year} {n}\" };\n            }\n        }\n        keyboard[5] =\n        [\n            new IKB($\"{year - 1}\") { CallbackData = $\"year {year - 1}\" },\n            new IKB($\"{year + 1}\") { CallbackData = $\"year {year + 1}\" },\n        ];\n        return keyboard;\n    }\n}\n"
  },
  {
    "path": "src/examples/Telegram Calendar/CalendarBot.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.Extensions;\nusing Telegram.BotAPI.UpdatingMessages;\n\nnamespace TelegramCalendar;\n\npublic sealed class CalendarBot : SimpleUpdateHandlerBase\n{\n    public TelegramBotClient Client { get; } = new(\"<your bot token>\");\n\n    protected override void OnMessage(Message message)\n    {\n        var text = message.Text;\n        if (string.IsNullOrEmpty(text) || !text.Contains(\"/calendar\"))\n        {\n            return;\n        }\n\n        var rm = new InlineKeyboardMarkup(Calendar.New(DateTime.Now));\n        this.Client.SendMessage(\n            message.Chat.Id,\n            \"🗓 <b>Telegram Bot Calendar</b> 🗓\",\n            parseMode: FormatStyles.HTML,\n            replyMarkup: rm\n        );\n    }\n\n    protected override void OnCallbackQuery(CallbackQuery query)\n    {\n        if (query.Message is null || string.IsNullOrEmpty(query.Data))\n        {\n            return;\n        }\n        var queryArgs = query.Data.Split(' ');\n        switch (queryArgs.ElementAt(0))\n        {\n            case \"month\":\n                var month = new Month(\n                    (MonthName)Enum.Parse(typeof(MonthName), queryArgs[2]),\n                    uint.Parse(queryArgs[1])\n                );\n                this.Client.EditMessageReplyMarkup(\n                    query.Message.Chat.Id,\n                    query.Message.MessageId,\n                    replyMarkup: new InlineKeyboardMarkup(Calendar.New(month))\n                );\n                break;\n            case \"year\":\n                this.Client.EditMessageReplyMarkup(\n                    query.Message.Chat.Id,\n                    query.Message.MessageId,\n                    replyMarkup: new InlineKeyboardMarkup(Calendar.New(uint.Parse(queryArgs[1])))\n                );\n                break;\n            default:\n                this.Client.AnswerCallbackQuery(query.Id, query.Data, true);\n                break;\n        }\n    }\n\n    protected override void OnException(Exception exp)\n    {\n        if (exp is BotRequestException)\n        {\n            Console.WriteLine(\"Bot Exception: {0}.\", exp.Message);\n        }\n        else\n        {\n            Console.WriteLine(\"Exception: {0}.\", exp.Message);\n        }\n    }\n}\n"
  },
  {
    "path": "src/examples/Telegram Calendar/Models/Day.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\n\nnamespace TelegramCalendar;\n\npublic sealed class Day(DayOfWeek name, ushort number)\n{\n    public DayOfWeek Name { get; set; } = name;\n    public ushort Number { get; set; } = number;\n}\n"
  },
  {
    "path": "src/examples/Telegram Calendar/Models/Month.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\n\nnamespace TelegramCalendar;\n\npublic sealed class Month\n{\n    public Month(MonthName monthName, uint year)\n    {\n        this.Name = monthName;\n        this.Year = year;\n        bool leapYear = this.Year % 4 == 0;\n        int days = this.Name switch\n        {\n            MonthName.February => leapYear ? 29 : 28,\n            MonthName.April => 30,\n            MonthName.June => 30,\n            MonthName.September => 30,\n            MonthName.November => 30,\n            _ => 31,\n        };\n        this.Days = new Day[days];\n        long firstDay =\n            (year * 365)\n            + (leapYear ? -1 : 0)\n            + ((year - (year % 4)) / 4)\n            - ((year - (year % 400)) / 400)\n            + 4;\n        int month = (int)monthName;\n        firstDay += month < 1 ? 0 : 31;\n        firstDay +=\n            month < 2 ? 0\n            : leapYear ? 29\n            : 28;\n        firstDay += month < 3 ? 0 : 31;\n        firstDay += month < 4 ? 0 : 30;\n        firstDay += month < 5 ? 0 : 31;\n        firstDay += month < 6 ? 0 : 30;\n        firstDay += month < 7 ? 0 : 31;\n        firstDay += month < 8 ? 0 : 31;\n        firstDay += month < 9 ? 0 : 30;\n        firstDay += month < 10 ? 0 : 31;\n        firstDay += month < 11 ? 0 : 30;\n        firstDay %= 7;\n        for (int i = 0; i < this.Days.Length; i++)\n        {\n            this.Days[i] = new Day((DayOfWeek)((i + firstDay) % 7), (ushort)(i + 1));\n        }\n    }\n\n    public uint Year { get; set; }\n    public MonthName Name { get; set; }\n    public Day[] Days { get; set; }\n\n    public ushort Weeks\n    {\n        get\n        {\n            int days = (int)this.Days[0].Name + this.Days.Length - 1;\n            return (ushort)(((days - (days % 7)) / 7) + (days % 7 > 0 ? 1 : 0));\n        }\n    }\n}\n"
  },
  {
    "path": "src/examples/Telegram Calendar/Models/MonthName.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace TelegramCalendar;\n\npublic enum MonthName\n{\n    January,\n    February,\n    March,\n    April,\n    May,\n    June,\n    July,\n    August,\n    September,\n    October,\n    November,\n    December,\n}\n"
  },
  {
    "path": "src/examples/Telegram Calendar/Program.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\nusing TelegramCalendar;\n\nConsole.WriteLine(\"Start!\");\nCalendarBot bot = new();\nbot.Client.SetMyCommands([new BotCommand(\"calendar\", \"Telegram Calendar\")]);\n\n// Long Polling\nIEnumerable<Update> updates = bot.Client.GetUpdates(\n    allowedUpdates: [UpdateTypes.Message, UpdateTypes.CallbackQuery]\n);\nwhile (true)\n{\n    if (updates.Any())\n    {\n        foreach (Update update in updates)\n        {\n            bot.OnUpdate(update);\n        }\n\n        updates = bot.Client.GetUpdates(updates.Max(u => u.UpdateId) + 1);\n    }\n    else\n    {\n        updates = bot.Client.GetUpdates();\n    }\n}\n"
  },
  {
    "path": "src/examples/Telegram Calendar/Telegram Calendar.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <RootNamespace>TelegramCalendar</RootNamespace>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI.Extensions\\Telegram.BotAPI.Extensions.csproj\" />\n  </ItemGroup>\n  \n</Project>\n"
  },
  {
    "path": "src/examples/Telegram Calendar/readme.md",
    "content": "# Telegram Bot Calendar\n\n## Description\n.NET Core console app\n\nA simple calendar with inline buttons and callback queries.\n\n## Preview\n![calendar gif](/docs/media/samples/Calendar.gif)\n\n## Source Code\n```CSharp\n// By Quetzal Rivera\n\nusing System;\nusing System.Linq;\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableMethods;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.GettingUpdates;\nusing Telegram.BotAPI.UpdatingMessages;\n\nnamespace TelegramCalendar\n{\n    class Program\n    {\n        private static TelegramBotClient bot = new TelegramBotClient(\"<your bot token>\");\n        static void Main()\n        {\n            Console.WriteLine(\"Start!\");\n            bot.SetMyCommands(new BotCommand(\"calendar\", \"Telegram Calendar\"));\n            var updates = bot.GetUpdates();\n            while (true)\n            {\n                if (updates.Length > 0)\n                {\n                    foreach (var update in updates)\n                    {\n                        switch (update.Type)\n                        {\n                            case UpdateType.Message:\n                                OnMessage(update.Message);\n                                break;\n                            case UpdateType.CallbackQuery:\n                                OnCallbackQuery(update.CallbackQuery);\n                                break;\n                        }\n                    }\n                    updates = bot.GetUpdates(offset: updates.Max(u => u.UpdateId) + 1);\n                }\n                else\n                {\n                    updates = bot.GetUpdates();\n                }\n            }\n        }\n        private static void OnMessage(Message message)\n        {\n            if (message.Text.Contains(\"/calendar\"))\n            {\n                var rm = new InlineKeyboardMarkup\n                {\n                    InlineKeyboard = CreateCalendar(2021)\n                };\n                bot.SendMessage(message.Chat.Id, \"🗓 <b>Telegram Bot Calendar</b> 🗓\", parseMode: ParseMode.HTML, replyMarkup: rm);\n            }\n        }\n        private static void OnCallbackQuery(CallbackQuery query)\n        {\n            var cbargs = query.Data.Split(' ');\n            switch (cbargs[0])\n            {\n                case \"month\":\n                    var month = new Month((MonthName)Enum.Parse(typeof(MonthName), cbargs[2]), uint.Parse(cbargs[1]));\n                    var mkeyboard = new InlineKeyboardMarkup\n                    {\n                        InlineKeyboard = CreateCalendar(month)\n                    };\n                    bot.EditMessageReplyMarkup<Message>(new EditMessageReplyMarkup\n                    {\n                        ChatId = query.Message.Chat.Id,\n                        MessageId = query.Message.MessageId,\n                        ReplyMarkup = mkeyboard\n                    });\n                    break;\n                case \"year\":\n                    var ykeyboard = new InlineKeyboardMarkup\n                    {\n                        InlineKeyboard = CreateCalendar(uint.Parse(cbargs[1]))\n                    };\n                    bot.EditMessageReplyMarkup<Message>(new EditMessageReplyMarkup\n                    {\n                        ChatId = query.Message.Chat.Id,\n                        MessageId = query.Message.MessageId,\n                        ReplyMarkup = ykeyboard\n                    });\n                    break;\n                default:\n                    bot.AnswerCallbackQuery(new AnswerCallbackQueryArgs\n                    {\n                        CallbackQueryId = query.Id,\n                        Text = query.Data,\n                        ShowAlert = true\n                    });\n                    break;\n            }\n\n        }\n        public static InlineKeyboardButton[][] CreateCalendar(Month mon)\n        {\n            var calendar = new InlineKeyboardButton[mon.Weeks + 3][];\n            var pos = 0;\n            calendar[0] = new InlineKeyboardButton[1]\n            {\n                InlineKeyboardButton.SetCallbackData($\"{mon.Name} {mon.Year}\", $\"year {mon.Year}\")\n            };\n            var days = new[] { \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\" };\n            calendar[1] = new InlineKeyboardButton[7];\n            for (int i = 0; i < 7; i++)\n            {\n                calendar[1][i] = InlineKeyboardButton.SetCallbackData(days[i], $\"{((DayName)i)}\");\n            }\n            for (int i = 2; i < mon.Weeks + 2; i++)\n            {\n                calendar[i] = new InlineKeyboardButton[7];\n                for (int j = 0; j < 7; j++)\n                {\n                    if (pos < mon.Days.Length)\n                    {\n                        if ((int)mon.Days[pos].Name == j)\n                        {\n                            calendar[i][j] = InlineKeyboardButton.SetCallbackData($\"{mon.Days[pos].Number}\", $\"{mon.Days[pos].Name}, {mon.Name} {mon.Days[pos].Number}\");\n                            pos++;\n                        }\n                        else\n                        {\n                            calendar[i][j] = InlineKeyboardButton.SetCallbackData(\"*\", \"Empty day\");\n                        }\n                    }\n                    else\n                    {\n                        calendar[i][j] = InlineKeyboardButton.SetCallbackData(\"*\", \"Empty day\");\n                    }\n                }\n            }\n            calendar[calendar.Length - 1] = new InlineKeyboardButton[2];\n            var previousmonth = mon.Name == MonthName.January ? MonthName.December : mon.Name - 1;\n            var nextmonth = mon.Name == MonthName.December ? MonthName.January : mon.Name + 1;\n            var previousyear = previousmonth == MonthName.December ? mon.Year - 1 : mon.Year;\n            var nextyear = nextmonth == MonthName.January ? mon.Year + 1 : mon.Year;\n            calendar[calendar.Length - 1][0] = InlineKeyboardButton.SetCallbackData($\"{previousmonth}\", $\"month {previousyear} {((ushort)previousmonth)}\");\n            calendar[calendar.Length - 1][1] = InlineKeyboardButton.SetCallbackData($\"{nextmonth}\", $\"month {nextyear} {((ushort)nextmonth)}\");\n            return calendar;\n        }\n        public static InlineKeyboardButton[][] CreateCalendar(uint year)\n        {\n            var keyboard = new InlineKeyboardButton[6][];\n            keyboard[0] = new InlineKeyboardButton[1]{\n                InlineKeyboardButton.SetCallbackData($\"{year}\", $\"Year {year}\")\n            };\n            for (int i = 1, n = 0; i < 5; i++)\n            {\n                keyboard[i] = new InlineKeyboardButton[3];\n                for (int j = 0; j < 3; j++, n++)\n                {\n                    var month = (MonthName)n;\n                    keyboard[i][j] = new InlineKeyboardButton\n                    {\n                        Text = $\"{month}\",\n                        CallbackData = $\"month {year} {n}\"\n                    };\n                }\n            }\n            keyboard[5] = new InlineKeyboardButton[2]{\n                InlineKeyboardButton.SetCallbackData($\"{year - 1}\",$\"year {year - 1}\"),\n                InlineKeyboardButton.SetCallbackData($\"{year + 1}\",$\"year {year + 1}\")\n            };\n            return keyboard;\n        }\n    }\n    public enum DayName\n    {\n        Monday,\n        Tuesday,\n        Wednesday,\n        Thursday,\n        Friday,\n        Saturday,\n        Sunday\n    }\n    public class Day\n    {\n        public Day(DayName name, ushort number)\n        {\n            Name = name; Number = number;\n        }\n        public DayName Name { get; set; }\n        public ushort Number { get; set; }\n    }\n    public enum MonthName\n    {\n        January,\n        February,\n        March,\n        April,\n        May,\n        June,\n        July,\n        August,\n        September,\n        October,\n        November,\n        December\n    }\n    public Month(MonthName monthName, uint year)\n        {\n            Name = monthName;\n            Year = year;\n            var leapyear = Year % 4 == 0;\n            var days = Name == MonthName.February ? (leapyear ? 29 : 28) : (Name == MonthName.April || Name == MonthName.June || Name == MonthName.September || Name == MonthName.November ? 30 : 31);\n            Days = new Day[days];\n            var firstday = year * 365 + (leapyear ? -1 : 0) + (((year - (year % 4)) / 4)) - (((year - (year % 400)) / 400)) + 3;\n            var month = (int)monthName;\n            firstday += month < 1 ? 0 : 31;\n            firstday += month < 2 ? 0 : (leapyear ? 29 : 28);\n            firstday += month < 3 ? 0 : 31;\n            firstday += month < 4 ? 0 : 30;\n            firstday += month < 5 ? 0 : 31;\n            firstday += month < 6 ? 0 : 30;\n            firstday += month < 7 ? 0 : 31;\n            firstday += month < 8 ? 0 : 31;\n            firstday += month < 9 ? 0 : 30;\n            firstday += month < 10 ? 0 : 31;\n            firstday += month < 11 ? 0 : 30;\n            firstday = firstday % 7;\n            for (int i = 0; i < Days.Length; i++)\n                Days[i] = new Day((DayName)((i + firstday) % 7), (ushort)(i + 1));\n        }\n        public uint Year { get; set; }\n        public MonthName Name { get; set; }\n        public Day[] Days { get; set; }\n        public ushort Weeks\n        {\n            get\n            {\n                var days = (int)Days[0].Name + Days.Length - 1;\n                return (ushort)(((days - (days % 7)) / 7) + (days % 7 > 0 ? 1 : 0));\n            }\n        }\n    }\n}\n```"
  },
  {
    "path": "src/examples/readme.md",
    "content": "# Telegram.BotAPI NET Examples\n\n[![NuGet version (Telegram.BotAPI)](https://img.shields.io/nuget/v/Telegram.BotAPI?style=flat-square&logo=nuget)](https://www.nuget.org/packages/Telegram.BotAPI/)\n[![Compatible with Bot API v10.0](https://img.shields.io/badge/Bot%20API%20version-v10.0-blue?style=flat-square)](https://core.telegram.org/bots/api#april-3-2026)\n\n## Sample list\n\n- [HelloBotNET.AppService](HelloBotNET.AppService) \\[Recommended] \\[Long Polling] \\[Service]\n- [HelloBotNET.Webhook](HelloBotNET.Webhook) \\[Recommended] \\[Webhook]\n- [ShopBot](https://github.com/Eptagone/ShopBot) \\[Recommended]\n- [Hello World](Hello%20World/readme.md)\n- [BotTemplate](BotTemplate/readme.md)\n- [Poll Quiz](Poll%20Quiz%2001/readme.md)\n- [Callback query 01](Callback%20query%20button%2001/readme.md)\n- [Reply keyboard markup 01](ReplyKeyboardMarkup%2001/readme.md)\n- [Telegram Bot Calendar](Telegram%20Calendar/readme.md)\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Abstractions/ITelegramBot.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Represents a Telegram Bot.\n/// Defines methods for receiving and processing incoming updates.\n/// </summary>\n[Obsolete(\n    \"Use IUpdateHandler or IAsyncUpdateHandler instead from Telegram.BotAPI.Extensions package. This interface will be removed in a future version.\"\n)]\npublic interface ITelegramBot\n{\n    /// <summary>\n    /// Receives and processes an incoming update.\n    /// </summary>\n    /// <param name=\"update\">The incoming update.</param>\n    void OnUpdate(Update update);\n\n    /// <summary>\n    /// Receives and processes an incoming update.\n    /// </summary>\n    /// <param name=\"update\">The incoming update.</param>\n    /// <param name=\"cancellationToken\">A cancellation token.</param>\n    /// <returns>A task that represents the asynchronous operation.</returns>\n    /// <exception cref=\"OperationCanceledException\"></exception>\n    Task OnUpdateAsync(Update update, CancellationToken cancellationToken = default);\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Abstractions/ITelegramBotClient.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Net.Http;\nusing System.Text.Json;\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines methods to make requests to the Telegram Bot API.\n/// </summary>\npublic interface ITelegramBotClient\n{\n    /// <summary>\n    /// Options used to configure the client.\n    /// </summary>\n    TelegramBotClientOptions Options { get; }\n\n    /// <summary>\n    /// Calls a method of the Telegram Bot API and returns the result.\n    /// </summary>\n    /// <typeparam name=\"TResult\">Result type.</typeparam>\n    /// <param name=\"method\">Method name.</param>\n    /// <param name=\"args\">Method arguments.</param>\n    /// <returns>An object containing the result of the API call.</returns>\n    /// <exception cref=\"ArgumentException\">The method arguments are invalid.</exception>\n    /// <exception cref=\"BotRequestException\">The request failed and the Bot API returned an error.</exception>\n    /// <exception cref=\"HttpRequestException\">The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout.</exception>\n    /// <exception cref=\"JsonException\">The response could not be deserialized.</exception>\n    TResult CallMethod<TResult>(string method, object? args = null);\n\n    /// <summary>\n    /// Calls a method of the Telegram Bot API and returns the result.\n    /// </summary>\n    /// <typeparam name=\"TResult\">Result type.</typeparam>\n    /// <param name=\"method\">Method name.</param>\n    /// <param name=\"args\">Method arguments.</param>\n    /// <param name=\"cancellationToken\">A <see cref=\"CancellationToken\"/> to cancel the request.</param>\n    /// <returns>An object containing the result of the API call.</returns>\n    /// <exception cref=\"ArgumentException\">The method arguments are invalid.</exception>\n    /// <exception cref=\"BotRequestException\">The request failed and the Bot API returned an error.</exception>\n    /// <exception cref=\"HttpRequestException\">The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout.</exception>\n    /// <exception cref=\"JsonException\">The response could not be deserialized.</exception>\n    /// <exception cref=\"OperationCanceledException\">The request was canceled.</exception>\n    Task<TResult> CallMethodAsync<TResult>(\n        string method,\n        object? args = null,\n        CancellationToken cancellationToken = default\n    );\n\n    /// <summary>\n    /// Calls a method of the Telegram Bot API and returns the response.\n    /// </summary>\n    /// <typeparam name=\"TReturn\">Response type.</typeparam>\n    /// <param name=\"method\">Method name.</param>\n    /// <param name=\"args\">Method arguments.</param>\n    /// <returns>A <see cref=\"BotResponse{T}\"/> object containing the response.</returns>\n    /// <exception cref=\"ArgumentException\">The method arguments are invalid.</exception>\n    /// <exception cref=\"BotRequestException\">The request failed and the Bot API returned an error.</exception>\n    /// <exception cref=\"HttpRequestException\">The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout.</exception>\n    /// <exception cref=\"JsonException\">The response could not be deserialized.</exception>\n    BotResponse<TReturn> CallMethodDirect<TReturn>(string method, object? args = null);\n\n    /// <summary>\n    /// Calls a method of the Telegram Bot API and returns the response.\n    /// </summary>\n    /// <typeparam name=\"TReturn\">Response type.</typeparam>\n    /// <param name=\"method\">Method name.</param>\n    /// <param name=\"args\">Method arguments.</param>\n    /// <param name=\"cancellationToken\">A <see cref=\"CancellationToken\"/> to cancel the request.</param>\n    /// <returns>A <see cref=\"BotResponse{T}\"/> object containing the response.</returns>\n    /// <exception cref=\"ArgumentException\">The method arguments are invalid.</exception>\n    /// <exception cref=\"BotRequestException\">The request failed and the Bot API returned an error.</exception>\n    /// <exception cref=\"HttpRequestException\">The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout.</exception>\n    /// <exception cref=\"JsonException\">The response could not be deserialized.</exception>\n    /// <exception cref=\"OperationCanceledException\">The request was canceled.</exception>\n    Task<BotResponse<TReturn>> CallMethodDirectAsync<TReturn>(\n        string method,\n        object? args = null,\n        CancellationToken cancellationToken = default\n    );\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Abstractions/SendAttachedFilesArgsBase.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines a property to send attached files through multipart/form-data.\n/// </summary>\npublic abstract class AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Files to send.\n    /// </summary>\n    [JsonIgnore]\n    public IDictionary<string, InputFile> Files { get; set; } = new Dictionary<string, InputFile>();\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/AnswerCallbackQueryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Games;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"AnswerCallbackQuery\" method.\n/// </summary>\npublic class AnswerCallbackQueryArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"AnswerCallbackQueryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"callbackQueryId\">Unique identifier for the query to be answered</param>\n    public AnswerCallbackQueryArgs(string callbackQueryId)\n    {\n        this.CallbackQueryId =\n            callbackQueryId ?? throw new ArgumentNullException(nameof(callbackQueryId));\n    }\n\n    /// <summary>\n    /// Unique identifier for the query to be answered\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CallbackQueryId)]\n    public string CallbackQueryId { get; set; }\n\n    /// <summary>\n    /// Text of the notification. If not specified, nothing will be shown to the user, 0-200 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// If <em>True</em>, an alert will be shown by the client instead of a notification at the top of the chat screen. Defaults to <em>false</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowAlert)]\n    public bool? ShowAlert { get; set; }\n\n    /// <summary>\n    /// URL that will be opened by the user's client. If you have created a <see cref=\"Game\"/> and accepted the conditions via <a href=\"https://t.me/botfather\">@BotFather</a>, specify the URL that opens your game - note that this will only work if the query comes from a <a href=\"https://core.telegram.org/bots/api#inlinekeyboardbutton\">callback_game</a> button.<br /><br />Otherwise, you may use links like <em>t.me/your_bot?start=XXXX</em> that open your bot with a parameter.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string? Url { get; set; }\n\n    /// <summary>\n    /// The maximum amount of time in seconds that the result of the callback query may be cached client-side. Telegram apps will support caching starting in version 3.14. Defaults to 0.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CacheTime)]\n    public int? CacheTime { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/AnswerGuestQueryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.InlineMode;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"AnswerGuestQuery\" method.\n/// </summary>\npublic class AnswerGuestQueryArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"AnswerGuestQueryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"guestQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    public AnswerGuestQueryArgs(string guestQueryId, InlineQueryResult result)\n    {\n        this.GuestQueryId = guestQueryId ?? throw new ArgumentNullException(nameof(guestQueryId));\n        this.Result = result ?? throw new ArgumentNullException(nameof(result));\n    }\n\n    /// <summary>\n    /// Unique identifier for the query to be answered\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GuestQueryId)]\n    public string GuestQueryId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object describing the message to be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Result)]\n    public InlineQueryResult Result { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/AnswerWebAppQueryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.InlineMode;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"AnswerWebAppQuery\" method.\n/// </summary>\npublic class AnswerWebAppQueryArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"AnswerWebAppQueryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"webAppQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    public AnswerWebAppQueryArgs(string webAppQueryId, InlineQueryResult result)\n    {\n        this.WebAppQueryId =\n            webAppQueryId ?? throw new ArgumentNullException(nameof(webAppQueryId));\n        this.Result = result ?? throw new ArgumentNullException(nameof(result));\n    }\n\n    /// <summary>\n    /// Unique identifier for the query to be answered\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WebAppQueryId)]\n    public string WebAppQueryId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object describing the message to be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Result)]\n    public InlineQueryResult Result { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/CopyMessageArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"CopyMessage\" method.\n/// </summary>\npublic class CopyMessageArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    public CopyMessageArgs(long chatId, long fromChatId, int messageId)\n    {\n        this.ChatId = chatId;\n        this.FromChatId = fromChatId;\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    public CopyMessageArgs(long chatId, string fromChatId, int messageId)\n    {\n        this.ChatId = chatId;\n        this.FromChatId = fromChatId ?? throw new ArgumentNullException(nameof(fromChatId));\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    public CopyMessageArgs(string chatId, long fromChatId, int messageId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.FromChatId = fromChatId;\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    public CopyMessageArgs(string chatId, string fromChatId, int messageId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.FromChatId = fromChatId ?? throw new ArgumentNullException(nameof(fromChatId));\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FromChatId)]\n    public object FromChatId { get; set; }\n\n    /// <summary>\n    /// Message identifier in the chat specified in <em>from_chat_id</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n\n    /// <summary>\n    /// New start timestamp for the copied video in the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoStartTimestamp)]\n    public int? VideoStartTimestamp { get; set; }\n\n    /// <summary>\n    /// New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; only available when copying to private chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/CopyMessagesArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"CopyMessages\" method.\n/// </summary>\npublic class CopyMessagesArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    public CopyMessagesArgs(long chatId, long fromChatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId;\n        this.FromChatId = fromChatId;\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    public CopyMessagesArgs(long chatId, string fromChatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId;\n        this.FromChatId = fromChatId ?? throw new ArgumentNullException(nameof(fromChatId));\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    public CopyMessagesArgs(string chatId, long fromChatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.FromChatId = fromChatId;\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    public CopyMessagesArgs(string chatId, string fromChatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.FromChatId = fromChatId ?? throw new ArgumentNullException(nameof(fromChatId));\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FromChatId)]\n    public object FromChatId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageIds)]\n    public IEnumerable<int> MessageIds { get; set; }\n\n    /// <summary>\n    /// Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent messages from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to copy the messages without their captions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RemoveCaption)]\n    public bool? RemoveCaption { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/CreateChatInviteLinkArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"CreateChatInviteLink\" method.\n/// </summary>\npublic class CreateChatInviteLinkArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CreateChatInviteLinkArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    public CreateChatInviteLinkArgs(long chatId)\n    {\n        this.ChatId = chatId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CreateChatInviteLinkArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    public CreateChatInviteLinkArgs(string chatId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Invite link name; 0-32 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string? Name { get; set; }\n\n    /// <summary>\n    /// Point in time (Unix timestamp) when the link will expire\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExpireDate)]\n    public int? ExpireDate { get; set; }\n\n    /// <summary>\n    /// The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MemberLimit)]\n    public int? MemberLimit { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CreatesJoinRequest)]\n    public bool? CreatesJoinRequest { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/DeleteBusinessMessagesArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"DeleteBusinessMessages\" method.\n/// </summary>\npublic class DeleteBusinessMessagesArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"DeleteBusinessMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to delete the messages</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must be from the same chat. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    public DeleteBusinessMessagesArgs(string businessConnectionId, IEnumerable<int> messageIds)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which to delete the messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must be from the same chat. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageIds)]\n    public IEnumerable<int> MessageIds { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/DeleteMyCommandsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"DeleteMyCommands\" method.\n/// </summary>\npublic class DeleteMyCommandsArgs\n{\n    /// <summary>\n    /// A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to <see cref=\"BotCommandScopeDefault\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Scope)]\n    public BotCommandScope? Scope { get; set; }\n\n    /// <summary>\n    /// A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LanguageCode)]\n    public string? LanguageCode { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/EditChatInviteLinkArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"EditChatInviteLink\" method.\n/// </summary>\npublic class EditChatInviteLinkArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditChatInviteLinkArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    public EditChatInviteLinkArgs(long chatId, string inviteLink)\n    {\n        this.ChatId = chatId;\n        this.InviteLink = inviteLink ?? throw new ArgumentNullException(nameof(inviteLink));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditChatInviteLinkArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    public EditChatInviteLinkArgs(string chatId, string inviteLink)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.InviteLink = inviteLink ?? throw new ArgumentNullException(nameof(inviteLink));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// The invite link to edit\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InviteLink)]\n    public string InviteLink { get; set; }\n\n    /// <summary>\n    /// Invite link name; 0-32 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string? Name { get; set; }\n\n    /// <summary>\n    /// Point in time (Unix timestamp) when the link will expire\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExpireDate)]\n    public int? ExpireDate { get; set; }\n\n    /// <summary>\n    /// The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MemberLimit)]\n    public int? MemberLimit { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CreatesJoinRequest)]\n    public bool? CreatesJoinRequest { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/EditStoryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"EditStory\" method.\n/// </summary>\npublic class EditStoryArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditStoryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to edit</param>\n    /// <param name=\"content\">Content of the story</param>\n    public EditStoryArgs(string businessConnectionId, int storyId, InputStoryContent content)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.StoryId = storyId;\n        this.Content = content ?? throw new ArgumentNullException(nameof(content));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the story to edit\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StoryId)]\n    public int StoryId { get; set; }\n\n    /// <summary>\n    /// Content of the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Content)]\n    public InputStoryContent Content { get; set; }\n\n    /// <summary>\n    /// Caption of the story, 0-2048 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of clickable areas to be shown on the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Areas)]\n    public IEnumerable<StoryArea>? Areas { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/ForwardMessageArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"ForwardMessage\" method.\n/// </summary>\npublic class ForwardMessageArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ForwardMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    public ForwardMessageArgs(long chatId, long fromChatId, int messageId)\n    {\n        this.ChatId = chatId;\n        this.FromChatId = fromChatId;\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ForwardMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    public ForwardMessageArgs(long chatId, string fromChatId, int messageId)\n    {\n        this.ChatId = chatId;\n        this.FromChatId = fromChatId ?? throw new ArgumentNullException(nameof(fromChatId));\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ForwardMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    public ForwardMessageArgs(string chatId, long fromChatId, int messageId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.FromChatId = fromChatId;\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ForwardMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    public ForwardMessageArgs(string chatId, string fromChatId, int messageId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.FromChatId = fromChatId ?? throw new ArgumentNullException(nameof(fromChatId));\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FromChatId)]\n    public object FromChatId { get; set; }\n\n    /// <summary>\n    /// New start timestamp for the forwarded video in the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoStartTimestamp)]\n    public int? VideoStartTimestamp { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the forwarded message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; only available when forwarding to private chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Message identifier in the chat specified in <em>from_chat_id</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/ForwardMessagesArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"ForwardMessages\" method.\n/// </summary>\npublic class ForwardMessagesArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ForwardMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    public ForwardMessagesArgs(long chatId, long fromChatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId;\n        this.FromChatId = fromChatId;\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ForwardMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    public ForwardMessagesArgs(long chatId, string fromChatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId;\n        this.FromChatId = fromChatId ?? throw new ArgumentNullException(nameof(fromChatId));\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ForwardMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    public ForwardMessagesArgs(string chatId, long fromChatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.FromChatId = fromChatId;\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ForwardMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    public ForwardMessagesArgs(string chatId, string fromChatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.FromChatId = fromChatId ?? throw new ArgumentNullException(nameof(fromChatId));\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FromChatId)]\n    public object FromChatId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageIds)]\n    public IEnumerable<int> MessageIds { get; set; }\n\n    /// <summary>\n    /// Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the forwarded messages from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/GetBusinessAccountGiftsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"GetBusinessAccountGifts\" method.\n/// </summary>\npublic class GetBusinessAccountGiftsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"GetBusinessAccountGiftsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    public GetBusinessAccountGiftsArgs(string businessConnectionId)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that aren't saved to the account's profile page\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnsaved)]\n    public bool? ExcludeUnsaved { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that are saved to the account's profile page\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeSaved)]\n    public bool? ExcludeSaved { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnlimited)]\n    public bool? ExcludeUnlimited { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeLimitedUpgradable)]\n    public bool? ExcludeLimitedUpgradable { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeLimitedNonUpgradable)]\n    public bool? ExcludeLimitedNonUpgradable { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude unique gifts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnique)]\n    public bool? ExcludeUnique { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeFromBlockchain)]\n    public bool? ExcludeFromBlockchain { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SortByPrice)]\n    public bool? SortByPrice { get; set; }\n\n    /// <summary>\n    /// Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Offset)]\n    public string? Offset { get; set; }\n\n    /// <summary>\n    /// The maximum number of gifts to be returned; 1-100. Defaults to 100\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Limit)]\n    public int? Limit { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/GetChatGiftsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"GetChatGifts\" method.\n/// </summary>\npublic class GetChatGiftsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"GetChatGiftsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    public GetChatGiftsArgs(long chatId)\n    {\n        this.ChatId = chatId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"GetChatGiftsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    public GetChatGiftsArgs(string chatId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that aren't saved to the chat's profile page. Always <em>True</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnsaved)]\n    public bool? ExcludeUnsaved { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that are saved to the chat's profile page. Always <em>False</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeSaved)]\n    public bool? ExcludeSaved { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnlimited)]\n    public bool? ExcludeUnlimited { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeLimitedUpgradable)]\n    public bool? ExcludeLimitedUpgradable { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeLimitedNonUpgradable)]\n    public bool? ExcludeLimitedNonUpgradable { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeFromBlockchain)]\n    public bool? ExcludeFromBlockchain { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude unique gifts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnique)]\n    public bool? ExcludeUnique { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SortByPrice)]\n    public bool? SortByPrice { get; set; }\n\n    /// <summary>\n    /// Offset of the first entry to return as received from the previous request; use an empty string to get the first chunk of results\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Offset)]\n    public string? Offset { get; set; }\n\n    /// <summary>\n    /// The maximum number of gifts to be returned; 1-100. Defaults to 100\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Limit)]\n    public int? Limit { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/GetMyCommandsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"GetMyCommands\" method.\n/// </summary>\npublic class GetMyCommandsArgs\n{\n    /// <summary>\n    /// A JSON-serialized object, describing scope of users. Defaults to <see cref=\"BotCommandScopeDefault\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Scope)]\n    public BotCommandScope? Scope { get; set; }\n\n    /// <summary>\n    /// A two-letter ISO 639-1 language code or an empty string\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LanguageCode)]\n    public string? LanguageCode { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/GetUserGiftsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"GetUserGifts\" method.\n/// </summary>\npublic class GetUserGiftsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"GetUserGiftsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">Unique identifier of the user</param>\n    public GetUserGiftsArgs(long userId)\n    {\n        this.UserId = userId;\n    }\n\n    /// <summary>\n    /// Unique identifier of the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnlimited)]\n    public bool? ExcludeUnlimited { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeLimitedUpgradable)]\n    public bool? ExcludeLimitedUpgradable { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeLimitedNonUpgradable)]\n    public bool? ExcludeLimitedNonUpgradable { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeFromBlockchain)]\n    public bool? ExcludeFromBlockchain { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude unique gifts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnique)]\n    public bool? ExcludeUnique { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SortByPrice)]\n    public bool? SortByPrice { get; set; }\n\n    /// <summary>\n    /// Offset of the first entry to return as received from the previous request; use an empty string to get the first chunk of results\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Offset)]\n    public string? Offset { get; set; }\n\n    /// <summary>\n    /// The maximum number of gifts to be returned; 1-100. Defaults to 100\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Limit)]\n    public int? Limit { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/GiftPremiumSubscriptionArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"GiftPremiumSubscription\" method.\n/// </summary>\npublic class GiftPremiumSubscriptionArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"GiftPremiumSubscriptionArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">Unique identifier of the target user who will receive a Telegram Premium subscription</param>\n    /// <param name=\"monthCount\">Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months</param>\n    public GiftPremiumSubscriptionArgs(long userId, int monthCount, int starCount)\n    {\n        this.UserId = userId;\n        this.MonthCount = monthCount;\n        this.StarCount = starCount;\n    }\n\n    /// <summary>\n    /// Unique identifier of the target user who will receive a Telegram Premium subscription\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MonthCount)]\n    public int MonthCount { get; set; }\n\n    /// <summary>\n    /// Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StarCount)]\n    public int StarCount { get; set; }\n\n    /// <summary>\n    /// Text that will be shown along with the service message about the subscription; 0-128 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextParseMode)]\n    public string? TextParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/PostStoryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"PostStory\" method.\n/// </summary>\npublic class PostStoryArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"PostStoryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    public PostStoryArgs(string businessConnectionId, InputStoryContent content, int activePeriod)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.Content = content ?? throw new ArgumentNullException(nameof(content));\n        this.ActivePeriod = activePeriod;\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Content of the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Content)]\n    public InputStoryContent Content { get; set; }\n\n    /// <summary>\n    /// Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ActivePeriod)]\n    public int ActivePeriod { get; set; }\n\n    /// <summary>\n    /// Caption of the story, 0-2048 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of clickable areas to be shown on the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Areas)]\n    public IEnumerable<StoryArea>? Areas { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to keep the story accessible after it expires\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PostToChatPage)]\n    public bool? PostToChatPage { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/PromoteChatMemberArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"PromoteChatMember\" method.\n/// </summary>\npublic class PromoteChatMemberArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"PromoteChatMemberArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    public PromoteChatMemberArgs(long chatId, long userId)\n    {\n        this.ChatId = chatId;\n        this.UserId = userId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"PromoteChatMemberArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    public PromoteChatMemberArgs(string chatId, long userId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.UserId = userId;\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the target user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator's presence in the chat is hidden\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAnonymous)]\n    public bool? IsAnonymous { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other administrator privilege.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageChat)]\n    public bool? CanManageChat { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can delete messages of other users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanDeleteMessages)]\n    public bool? CanDeleteMessages { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can manage video chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageVideoChats)]\n    public bool? CanManageVideoChats { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can restrict, ban or unban chat members, or access supergroup statistics. For backward compatibility, defaults to <em>True</em> for promotions of channel administrators\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanRestrictMembers)]\n    public bool? CanRestrictMembers { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by him)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPromoteMembers)]\n    public bool? CanPromoteMembers { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can change chat title, photo and other settings\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanChangeInfo)]\n    public bool? CanChangeInfo { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can invite new users to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanInviteUsers)]\n    public bool? CanInviteUsers { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can post stories to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPostStories)]\n    public bool? CanPostStories { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditStories)]\n    public bool? CanEditStories { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can delete stories posted by other users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanDeleteStories)]\n    public bool? CanDeleteStories { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can post messages in the channel, approve suggested posts, or access channel statistics; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPostMessages)]\n    public bool? CanPostMessages { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can edit messages of other users and can pin messages; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditMessages)]\n    public bool? CanEditMessages { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can pin messages; for supergroups only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPinMessages)]\n    public bool? CanPinMessages { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageTopics)]\n    public bool? CanManageTopics { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can manage direct messages within the channel and decline suggested posts; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageDirectMessages)]\n    public bool? CanManageDirectMessages { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the administrator can edit the tags of regular members; for groups and supergroups only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageTags)]\n    public bool? CanManageTags { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/RepostStoryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"RepostStory\" method.\n/// </summary>\npublic class RepostStoryArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"RepostStoryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"fromChatId\">Unique identifier of the chat which posted the story that should be reposted</param>\n    /// <param name=\"fromStoryId\">Unique identifier of the story that should be reposted</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    public RepostStoryArgs(\n        string businessConnectionId,\n        long fromChatId,\n        int fromStoryId,\n        int activePeriod\n    )\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.FromChatId = fromChatId;\n        this.FromStoryId = fromStoryId;\n        this.ActivePeriod = activePeriod;\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the chat which posted the story that should be reposted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FromChatId)]\n    public long FromChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the story that should be reposted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FromStoryId)]\n    public int FromStoryId { get; set; }\n\n    /// <summary>\n    /// Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ActivePeriod)]\n    public int ActivePeriod { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to keep the story accessible after it expires\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PostToChatPage)]\n    public bool? PostToChatPage { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/RestrictChatMemberArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"RestrictChatMember\" method.\n/// </summary>\npublic class RestrictChatMemberArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"RestrictChatMemberArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"permissions\">A JSON-serialized object for new user permissions</param>\n    public RestrictChatMemberArgs(long chatId, long userId, ChatPermissions permissions)\n    {\n        this.ChatId = chatId;\n        this.UserId = userId;\n        this.Permissions = permissions ?? throw new ArgumentNullException(nameof(permissions));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"RestrictChatMemberArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"permissions\">A JSON-serialized object for new user permissions</param>\n    public RestrictChatMemberArgs(string chatId, long userId, ChatPermissions permissions)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.UserId = userId;\n        this.Permissions = permissions ?? throw new ArgumentNullException(nameof(permissions));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the target user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for new user permissions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Permissions)]\n    public ChatPermissions Permissions { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UseIndependentChatPermissions)]\n    public bool? UseIndependentChatPermissions { get; set; }\n\n    /// <summary>\n    /// Date when restrictions will be lifted for the user; Unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UntilDate)]\n    public int? UntilDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SavePreparedInlineMessageArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.InlineMode;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SavePreparedInlineMessage\" method.\n/// </summary>\npublic class SavePreparedInlineMessageArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SavePreparedInlineMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">Unique identifier of the target user that can use the prepared message</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    public SavePreparedInlineMessageArgs(long userId, InlineQueryResult result)\n    {\n        this.UserId = userId;\n        this.Result = result ?? throw new ArgumentNullException(nameof(result));\n    }\n\n    /// <summary>\n    /// Unique identifier of the target user that can use the prepared message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object describing the message to be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Result)]\n    public InlineQueryResult Result { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the message can be sent to private chats with users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowUserChats)]\n    public bool? AllowUserChats { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the message can be sent to private chats with bots\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowBotChats)]\n    public bool? AllowBotChats { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the message can be sent to group and supergroup chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowGroupChats)]\n    public bool? AllowGroupChats { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the message can be sent to channel chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowChannelChats)]\n    public bool? AllowChannelChats { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SavePreparedKeyboardButtonArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SavePreparedKeyboardButton\" method.\n/// </summary>\npublic class SavePreparedKeyboardButtonArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SavePreparedKeyboardButtonArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">Unique identifier of the target user that can use the button</param>\n    /// <param name=\"button\">A JSON-serialized object describing the button to be saved. The button must be of the type <em>request_users</em>, <em>request_chat</em>, or <em>request_managed_bot</em></param>\n    public SavePreparedKeyboardButtonArgs(long userId, KeyboardButton button)\n    {\n        this.UserId = userId;\n        this.Button = button ?? throw new ArgumentNullException(nameof(button));\n    }\n\n    /// <summary>\n    /// Unique identifier of the target user that can use the button\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object describing the button to be saved. The button must be of the type <em>request_users</em>, <em>request_chat</em>, or <em>request_managed_bot</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Button)]\n    public KeyboardButton Button { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendAnimationArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendAnimation\" method.\n/// </summary>\npublic class SendAnimationArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendAnimationArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendAnimationArgs(long chatId, InputFile animation)\n    {\n        this.ChatId = chatId;\n        this.Animation = animation ?? throw new ArgumentNullException(nameof(animation));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendAnimationArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendAnimationArgs(long chatId, string animation)\n    {\n        this.ChatId = chatId;\n        this.Animation = animation ?? throw new ArgumentNullException(nameof(animation));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendAnimationArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendAnimationArgs(string chatId, InputFile animation)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Animation = animation ?? throw new ArgumentNullException(nameof(animation));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendAnimationArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendAnimationArgs(string chatId, string animation)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Animation = animation ?? throw new ArgumentNullException(nameof(animation));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Animation)]\n    public object Animation { get; set; }\n\n    /// <summary>\n    /// Duration of sent animation in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Animation width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int? Width { get; set; }\n\n    /// <summary>\n    /// Animation height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int? Height { get; set; }\n\n    /// <summary>\n    /// Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public object? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the animation needs to be covered with a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasSpoiler)]\n    public bool? HasSpoiler { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendAudioArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendAudio\" method.\n/// </summary>\npublic class SendAudioArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendAudioArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendAudioArgs(long chatId, InputFile audio)\n    {\n        this.ChatId = chatId;\n        this.Audio = audio ?? throw new ArgumentNullException(nameof(audio));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendAudioArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendAudioArgs(long chatId, string audio)\n    {\n        this.ChatId = chatId;\n        this.Audio = audio ?? throw new ArgumentNullException(nameof(audio));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendAudioArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendAudioArgs(string chatId, InputFile audio)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Audio = audio ?? throw new ArgumentNullException(nameof(audio));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendAudioArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendAudioArgs(string chatId, string audio)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Audio = audio ?? throw new ArgumentNullException(nameof(audio));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Audio)]\n    public object Audio { get; set; }\n\n    /// <summary>\n    /// Audio caption, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Duration of the audio in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Performer\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Performer)]\n    public string? Performer { get; set; }\n\n    /// <summary>\n    /// Track name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public object? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendChecklistArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendChecklist\" method.\n/// </summary>\npublic class SendChecklistArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendChecklistArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"checklist\">A JSON-serialized object for the checklist to send</param>\n    public SendChecklistArgs(string businessConnectionId, long chatId, InputChecklist checklist)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.ChatId = chatId;\n        this.Checklist = checklist ?? throw new ArgumentNullException(nameof(checklist));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendChecklistArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"checklist\">A JSON-serialized object for the checklist to send</param>\n    public SendChecklistArgs(string businessConnectionId, string chatId, InputChecklist checklist)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Checklist = checklist ?? throw new ArgumentNullException(nameof(checklist));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for the checklist to send\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Checklist)]\n    public InputChecklist Checklist { get; set; }\n\n    /// <summary>\n    /// Sends the message silently. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendContactArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendContact\" method.\n/// </summary>\npublic class SendContactArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendContactArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"phoneNumber\">Contact's phone number</param>\n    /// <param name=\"firstName\">Contact's first name</param>\n    public SendContactArgs(long chatId, string phoneNumber, string firstName)\n    {\n        this.ChatId = chatId;\n        this.PhoneNumber = phoneNumber ?? throw new ArgumentNullException(nameof(phoneNumber));\n        this.FirstName = firstName ?? throw new ArgumentNullException(nameof(firstName));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendContactArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"phoneNumber\">Contact's phone number</param>\n    /// <param name=\"firstName\">Contact's first name</param>\n    public SendContactArgs(string chatId, string phoneNumber, string firstName)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.PhoneNumber = phoneNumber ?? throw new ArgumentNullException(nameof(phoneNumber));\n        this.FirstName = firstName ?? throw new ArgumentNullException(nameof(firstName));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Contact's phone number\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhoneNumber)]\n    public string PhoneNumber { get; set; }\n\n    /// <summary>\n    /// Contact's first name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FirstName)]\n    public string FirstName { get; set; }\n\n    /// <summary>\n    /// Contact's last name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastName)]\n    public string? LastName { get; set; }\n\n    /// <summary>\n    /// Additional data about the contact in the form of a <a href=\"https://en.wikipedia.org/wiki/VCard\">vCard</a>, 0-2048 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Vcard)]\n    public string? Vcard { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendDiceArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendDice\" method.\n/// </summary>\npublic class SendDiceArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendDiceArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    public SendDiceArgs(long chatId)\n    {\n        this.ChatId = chatId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendDiceArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    public SendDiceArgs(string chatId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Emoji on which the dice throw animation is based. Currently, must be one of “🎲”, “🎯”, “🏀”, “⚽”, “🎳”, or “🎰”. Dice can have values 1-6 for “🎲”, “🎯” and “🎳”, values 1-5 for “🏀” and “⚽”, and values 1-64 for “🎰”. Defaults to “🎲”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Emoji)]\n    public string? Emoji { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendDocumentArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendDocument\" method.\n/// </summary>\npublic class SendDocumentArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendDocumentArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendDocumentArgs(long chatId, InputFile document)\n    {\n        this.ChatId = chatId;\n        this.Document = document ?? throw new ArgumentNullException(nameof(document));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendDocumentArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendDocumentArgs(long chatId, string document)\n    {\n        this.ChatId = chatId;\n        this.Document = document ?? throw new ArgumentNullException(nameof(document));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendDocumentArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendDocumentArgs(string chatId, InputFile document)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Document = document ?? throw new ArgumentNullException(nameof(document));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendDocumentArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendDocumentArgs(string chatId, string document)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Document = document ?? throw new ArgumentNullException(nameof(document));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Document)]\n    public object Document { get; set; }\n\n    /// <summary>\n    /// Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public object? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Disables automatic server-side content type detection for files uploaded using multipart/form-data\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableContentTypeDetection)]\n    public bool? DisableContentTypeDetection { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendGiftArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendGift\" method.\n/// </summary>\npublic class SendGiftArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendGiftArgs\"/> class.\n    /// </summary>\n    /// <param name=\"giftId\">Identifier of the gift; limited gifts can't be sent to channel chats</param>\n    public SendGiftArgs(string giftId)\n    {\n        this.GiftId = giftId ?? throw new ArgumentNullException(nameof(giftId));\n    }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long? UserId { get; set; }\n\n    /// <summary>\n    /// Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@username</em>) that will receive the gift.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Identifier of the gift; limited gifts can't be sent to channel chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiftId)]\n    public string GiftId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PayForUpgrade)]\n    public bool? PayForUpgrade { get; set; }\n\n    /// <summary>\n    /// Text that will be shown along with the gift; 0-128 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextParseMode)]\n    public string? TextParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendLivePhotoArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendLivePhoto\" method.\n/// </summary>\npublic class SendLivePhotoArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLivePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public SendLivePhotoArgs(long chatId, InputFile livePhoto, InputFile photo)\n    {\n        this.ChatId = chatId;\n        this.LivePhoto = livePhoto ?? throw new ArgumentNullException(nameof(livePhoto));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLivePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public SendLivePhotoArgs(long chatId, InputFile livePhoto, string photo)\n    {\n        this.ChatId = chatId;\n        this.LivePhoto = livePhoto ?? throw new ArgumentNullException(nameof(livePhoto));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLivePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public SendLivePhotoArgs(long chatId, string livePhoto, InputFile photo)\n    {\n        this.ChatId = chatId;\n        this.LivePhoto = livePhoto ?? throw new ArgumentNullException(nameof(livePhoto));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLivePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public SendLivePhotoArgs(long chatId, string livePhoto, string photo)\n    {\n        this.ChatId = chatId;\n        this.LivePhoto = livePhoto ?? throw new ArgumentNullException(nameof(livePhoto));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLivePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public SendLivePhotoArgs(string chatId, InputFile livePhoto, InputFile photo)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.LivePhoto = livePhoto ?? throw new ArgumentNullException(nameof(livePhoto));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLivePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public SendLivePhotoArgs(string chatId, InputFile livePhoto, string photo)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.LivePhoto = livePhoto ?? throw new ArgumentNullException(nameof(livePhoto));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLivePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public SendLivePhotoArgs(string chatId, string livePhoto, InputFile photo)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.LivePhoto = livePhoto ?? throw new ArgumentNullException(nameof(livePhoto));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLivePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public SendLivePhotoArgs(string chatId, string livePhoto, string photo)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.LivePhoto = livePhoto ?? throw new ArgumentNullException(nameof(livePhoto));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePhoto)]\n    public object LivePhoto { get; set; }\n\n    /// <summary>\n    /// The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public object Photo { get; set; }\n\n    /// <summary>\n    /// Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the video needs to be covered with a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasSpoiler)]\n    public bool? HasSpoiler { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendLocationArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendLocation\" method.\n/// </summary>\npublic class SendLocationArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLocationArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the location</param>\n    /// <param name=\"longitude\">Longitude of the location</param>\n    public SendLocationArgs(long chatId, float latitude, float longitude)\n    {\n        this.ChatId = chatId;\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendLocationArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the location</param>\n    /// <param name=\"longitude\">Longitude of the location</param>\n    public SendLocationArgs(string chatId, float latitude, float longitude)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Latitude of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// The radius of uncertainty for the location, measured in meters; 0-1500\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HorizontalAccuracy)]\n    public float? HorizontalAccuracy { get; set; }\n\n    /// <summary>\n    /// Period in seconds during which the location will be updated (see <a href=\"https://telegram.org/blog/live-locations\">Live Locations</a>, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePeriod)]\n    public int? LivePeriod { get; set; }\n\n    /// <summary>\n    /// For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Heading)]\n    public int? Heading { get; set; }\n\n    /// <summary>\n    /// For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProximityAlertRadius)]\n    public int? ProximityAlertRadius { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendMediaGroupArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendMediaGroup\" method.\n/// </summary>\npublic class SendMediaGroupArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(long chatId, IEnumerable<InputMediaAudio> media)\n    {\n        this.ChatId = chatId;\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(long chatId, IEnumerable<InputMediaDocument> media)\n    {\n        this.ChatId = chatId;\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(long chatId, IEnumerable<InputMediaLivePhoto> media)\n    {\n        this.ChatId = chatId;\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(long chatId, IEnumerable<InputMediaPhoto> media)\n    {\n        this.ChatId = chatId;\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(long chatId, IEnumerable<InputMediaVideo> media)\n    {\n        this.ChatId = chatId;\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(string chatId, IEnumerable<InputMediaAudio> media)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(string chatId, IEnumerable<InputMediaDocument> media)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(string chatId, IEnumerable<InputMediaLivePhoto> media)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(string chatId, IEnumerable<InputMediaPhoto> media)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMediaGroupArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    public SendMediaGroupArgs(string chatId, IEnumerable<InputMediaVideo> media)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized array describing messages to be sent, must include 2-10 items\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public object Media { get; set; }\n\n    /// <summary>\n    /// Sends messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent messages from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendMessageArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendMessage\" method.\n/// </summary>\npublic class SendMessageArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"text\">Text of the message to be sent, 1-4096 characters after entities parsing</param>\n    public SendMessageArgs(long chatId, string text)\n    {\n        this.ChatId = chatId;\n        this.Text = text ?? throw new ArgumentNullException(nameof(text));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMessageArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"text\">Text of the message to be sent, 1-4096 characters after entities parsing</param>\n    public SendMessageArgs(string chatId, string text)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Text = text ?? throw new ArgumentNullException(nameof(text));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Text of the message to be sent, 1-4096 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Entities)]\n    public IEnumerable<MessageEntity>? Entities { get; set; }\n\n    /// <summary>\n    /// Link preview generation options for the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LinkPreviewOptions)]\n    public LinkPreviewOptions? LinkPreviewOptions { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendMessageDraftArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendMessageDraft\" method.\n/// </summary>\npublic class SendMessageDraftArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendMessageDraftArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target private chat</param>\n    /// <param name=\"draftId\">Unique identifier of the message draft; must be non-zero. Changes of drafts with the same identifier are animated.</param>\n    public SendMessageDraftArgs(long chatId, int draftId)\n    {\n        this.ChatId = chatId;\n        this.DraftId = draftId;\n    }\n\n    /// <summary>\n    /// Unique identifier for the target private chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public long ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message draft; must be non-zero. Changes of drafts with the same identifier are animated.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DraftId)]\n    public int DraftId { get; set; }\n\n    /// <summary>\n    /// Text of the message to be sent, 0-4096 characters after entities parsing. Pass an empty text to show a “Thinking…” placeholder.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Entities)]\n    public IEnumerable<MessageEntity>? Entities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendPaidMediaArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendPaidMedia\" method.\n/// </summary>\npublic class SendPaidMediaArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendPaidMediaArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.</param>\n    /// <param name=\"starCount\">The number of Telegram Stars that must be paid to buy access to the media; 1-25000</param>\n    /// <param name=\"media\">A JSON-serialized array describing the media to be sent; up to 10 items</param>\n    public SendPaidMediaArgs(long chatId, int starCount, IEnumerable<InputPaidMedia> media)\n    {\n        this.ChatId = chatId;\n        this.StarCount = starCount;\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendPaidMediaArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.</param>\n    /// <param name=\"starCount\">The number of Telegram Stars that must be paid to buy access to the media; 1-25000</param>\n    /// <param name=\"media\">A JSON-serialized array describing the media to be sent; up to 10 items</param>\n    public SendPaidMediaArgs(string chatId, int starCount, IEnumerable<InputPaidMedia> media)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.StarCount = starCount;\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// The number of Telegram Stars that must be paid to buy access to the media; 1-25000\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StarCount)]\n    public int StarCount { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized array describing the media to be sent; up to 10 items\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public IEnumerable<InputPaidMedia> Media { get; set; }\n\n    /// <summary>\n    /// Bot-defined paid media payload, 0-128 bytes. This will not be displayed to the user, use it for your internal processes.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Payload)]\n    public string? Payload { get; set; }\n\n    /// <summary>\n    /// Media caption, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the media caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendPhotoArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendPhoto\" method.\n/// </summary>\npublic class SendPhotoArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendPhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendPhotoArgs(long chatId, InputFile photo)\n    {\n        this.ChatId = chatId;\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendPhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendPhotoArgs(long chatId, string photo)\n    {\n        this.ChatId = chatId;\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendPhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendPhotoArgs(string chatId, InputFile photo)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendPhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendPhotoArgs(string chatId, string photo)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public object Photo { get; set; }\n\n    /// <summary>\n    /// Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the photo needs to be covered with a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasSpoiler)]\n    public bool? HasSpoiler { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendPollArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\nusing InputPollMedia = Telegram.BotAPI.AvailableTypes.InputMedia;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendPoll\" method.\n/// </summary>\npublic class SendPollArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendPollArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Polls can't be sent to channel direct messages chats.</param>\n    /// <param name=\"question\">Poll question, 1-300 characters</param>\n    /// <param name=\"options\">A JSON-serialized list of 1-12 answer options</param>\n    public SendPollArgs(long chatId, string question, IEnumerable<InputPollOption> options)\n    {\n        this.ChatId = chatId;\n        this.Question = question ?? throw new ArgumentNullException(nameof(question));\n        this.Options = options ?? throw new ArgumentNullException(nameof(options));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendPollArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Polls can't be sent to channel direct messages chats.</param>\n    /// <param name=\"question\">Poll question, 1-300 characters</param>\n    /// <param name=\"options\">A JSON-serialized list of 1-12 answer options</param>\n    public SendPollArgs(string chatId, string question, IEnumerable<InputPollOption> options)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Question = question ?? throw new ArgumentNullException(nameof(question));\n        this.Options = options ?? throw new ArgumentNullException(nameof(options));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Polls can't be sent to channel direct messages chats.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Poll question, 1-300 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Question)]\n    public string Question { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the question. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Currently, only custom emoji entities are allowed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.QuestionParseMode)]\n    public string? QuestionParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of <em>question_parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.QuestionEntities)]\n    public IEnumerable<MessageEntity>? QuestionEntities { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 1-12 answer options\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Options)]\n    public IEnumerable<InputPollOption> Options { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the poll needs to be anonymous, defaults to <em>True</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAnonymous)]\n    public bool? IsAnonymous { get; set; }\n\n    /// <summary>\n    /// Poll type, “quiz” or “regular”, defaults to “regular”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public string? Type { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the poll allows multiple answers, defaults to <em>False</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowsMultipleAnswers)]\n    public bool? AllowsMultipleAnswers { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the poll allows to change chosen answer options, defaults to <em>False</em> for quizzes and to <em>True</em> for regular polls\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowsRevoting)]\n    public bool? AllowsRevoting { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the poll options must be shown in random order\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShuffleOptions)]\n    public bool? ShuffleOptions { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowAddingOptions)]\n    public bool? AllowAddingOptions { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if poll results must be shown only after the poll closes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HideResultsUntilCloses)]\n    public bool? HideResultsUntilCloses { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if voting is limited to users who have been members of the chat where the poll is being sent for more than 24 hours; for channel chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MembersOnly)]\n    public bool? MembersOnly { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 0-12 two-letter <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\">ISO 3166-1 alpha-2</a> country codes indicating the countries from which users can vote in the poll; for channel chats only. If omitted or empty, then users from any country can participate in the poll.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CountryCodes)]\n    public IEnumerable<string>? CountryCodes { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CorrectOptionIds)]\n    public IEnumerable<int>? CorrectOptionIds { get; set; }\n\n    /// <summary>\n    /// Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Explanation)]\n    public string? Explanation { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the explanation. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExplanationParseMode)]\n    public string? ExplanationParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of <em>explanation_parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExplanationEntities)]\n    public IEnumerable<MessageEntity>? ExplanationEntities { get; set; }\n\n    /// <summary>\n    /// Media added to the quiz explanation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExplanationMedia)]\n    public InputPollMedia? ExplanationMedia { get; set; }\n\n    /// <summary>\n    /// Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with <em>close_date</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OpenPeriod)]\n    public int? OpenPeriod { get; set; }\n\n    /// <summary>\n    /// Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with <em>open_period</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CloseDate)]\n    public int? CloseDate { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the poll needs to be immediately closed. This can be useful for poll preview.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsClosed)]\n    public bool? IsClosed { get; set; }\n\n    /// <summary>\n    /// Description of the poll to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the poll description. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DescriptionParseMode)]\n    public string? DescriptionParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of <em>description_parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DescriptionEntities)]\n    public IEnumerable<MessageEntity>? DescriptionEntities { get; set; }\n\n    /// <summary>\n    /// Media added to the poll description\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public InputPollMedia? Media { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendVenueArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendVenue\" method.\n/// </summary>\npublic class SendVenueArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVenueArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the venue</param>\n    /// <param name=\"longitude\">Longitude of the venue</param>\n    /// <param name=\"title\">Name of the venue</param>\n    /// <param name=\"address\">Address of the venue</param>\n    public SendVenueArgs(long chatId, float latitude, float longitude, string title, string address)\n    {\n        this.ChatId = chatId;\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Address = address ?? throw new ArgumentNullException(nameof(address));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVenueArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the venue</param>\n    /// <param name=\"longitude\">Longitude of the venue</param>\n    /// <param name=\"title\">Name of the venue</param>\n    /// <param name=\"address\">Address of the venue</param>\n    public SendVenueArgs(\n        string chatId,\n        float latitude,\n        float longitude,\n        string title,\n        string address\n    )\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Address = address ?? throw new ArgumentNullException(nameof(address));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Latitude of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Name of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; }\n\n    /// <summary>\n    /// Address of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Address)]\n    public string Address { get; set; }\n\n    /// <summary>\n    /// Foursquare identifier of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareId)]\n    public string? FoursquareId { get; set; }\n\n    /// <summary>\n    /// Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareType)]\n    public string? FoursquareType { get; set; }\n\n    /// <summary>\n    /// Google Places identifier of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceId)]\n    public string? GooglePlaceId { get; set; }\n\n    /// <summary>\n    /// Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceType)]\n    public string? GooglePlaceType { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendVideoArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendVideo\" method.\n/// </summary>\npublic class SendVideoArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVideoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendVideoArgs(long chatId, InputFile video)\n    {\n        this.ChatId = chatId;\n        this.Video = video ?? throw new ArgumentNullException(nameof(video));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVideoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendVideoArgs(long chatId, string video)\n    {\n        this.ChatId = chatId;\n        this.Video = video ?? throw new ArgumentNullException(nameof(video));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVideoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendVideoArgs(string chatId, InputFile video)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Video = video ?? throw new ArgumentNullException(nameof(video));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVideoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendVideoArgs(string chatId, string video)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Video = video ?? throw new ArgumentNullException(nameof(video));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Video)]\n    public object Video { get; set; }\n\n    /// <summary>\n    /// Duration of sent video in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Video width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int? Width { get; set; }\n\n    /// <summary>\n    /// Video height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int? Height { get; set; }\n\n    /// <summary>\n    /// Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public object? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Cover)]\n    public object? Cover { get; set; }\n\n    /// <summary>\n    /// Start timestamp for the video in the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StartTimestamp)]\n    public int? StartTimestamp { get; set; }\n\n    /// <summary>\n    /// Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the video needs to be covered with a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasSpoiler)]\n    public bool? HasSpoiler { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the uploaded video is suitable for streaming\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SupportsStreaming)]\n    public bool? SupportsStreaming { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendVideoNoteArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendVideoNote\" method.\n/// </summary>\npublic class SendVideoNoteArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVideoNoteArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    public SendVideoNoteArgs(long chatId, InputFile videoNote)\n    {\n        this.ChatId = chatId;\n        this.VideoNote = videoNote ?? throw new ArgumentNullException(nameof(videoNote));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVideoNoteArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    public SendVideoNoteArgs(long chatId, string videoNote)\n    {\n        this.ChatId = chatId;\n        this.VideoNote = videoNote ?? throw new ArgumentNullException(nameof(videoNote));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVideoNoteArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    public SendVideoNoteArgs(string chatId, InputFile videoNote)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.VideoNote = videoNote ?? throw new ArgumentNullException(nameof(videoNote));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVideoNoteArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    public SendVideoNoteArgs(string chatId, string videoNote)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.VideoNote = videoNote ?? throw new ArgumentNullException(nameof(videoNote));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoNote)]\n    public object VideoNote { get; set; }\n\n    /// <summary>\n    /// Duration of sent video in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Video width and height, i.e. diameter of the video message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Length)]\n    public int? Length { get; set; }\n\n    /// <summary>\n    /// Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public object? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SendVoiceArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SendVoice\" method.\n/// </summary>\npublic class SendVoiceArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVoiceArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendVoiceArgs(long chatId, InputFile voice)\n    {\n        this.ChatId = chatId;\n        this.Voice = voice ?? throw new ArgumentNullException(nameof(voice));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVoiceArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendVoiceArgs(long chatId, string voice)\n    {\n        this.ChatId = chatId;\n        this.Voice = voice ?? throw new ArgumentNullException(nameof(voice));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVoiceArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendVoiceArgs(string chatId, InputFile voice)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Voice = voice ?? throw new ArgumentNullException(nameof(voice));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendVoiceArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public SendVoiceArgs(string chatId, string voice)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Voice = voice ?? throw new ArgumentNullException(nameof(voice));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Voice)]\n    public object Voice { get; set; }\n\n    /// <summary>\n    /// Voice message caption, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Duration of the voice message in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetBusinessAccountGiftSettingsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetBusinessAccountGiftSettings\" method.\n/// </summary>\npublic class SetBusinessAccountGiftSettingsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetBusinessAccountGiftSettingsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"showGiftButton\">Pass <em>True</em>, if a button for sending a gift to the user or by the business account must always be shown in the input field</param>\n    /// <param name=\"acceptedGiftTypes\">Types of gifts accepted by the business account</param>\n    public SetBusinessAccountGiftSettingsArgs(\n        string businessConnectionId,\n        bool showGiftButton,\n        AcceptedGiftTypes acceptedGiftTypes\n    )\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.ShowGiftButton = showGiftButton;\n        this.AcceptedGiftTypes =\n            acceptedGiftTypes ?? throw new ArgumentNullException(nameof(acceptedGiftTypes));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if a button for sending a gift to the user or by the business account must always be shown in the input field\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowGiftButton)]\n    public bool ShowGiftButton { get; set; }\n\n    /// <summary>\n    /// Types of gifts accepted by the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AcceptedGiftTypes)]\n    public AcceptedGiftTypes AcceptedGiftTypes { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetBusinessAccountProfilePhotoArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetBusinessAccountProfilePhoto\" method.\n/// </summary>\npublic class SetBusinessAccountProfilePhotoArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetBusinessAccountProfilePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    public SetBusinessAccountProfilePhotoArgs(string businessConnectionId, InputProfilePhoto photo)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// The new profile photo to set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public InputProfilePhoto Photo { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to set the public photo, which will be visible even if the main photo is hidden by the business account's privacy settings. An account can have only one public photo.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPublic)]\n    public bool? IsPublic { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetChatMenuButtonArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetChatMenuButton\" method.\n/// </summary>\npublic class SetChatMenuButtonArgs\n{\n    /// <summary>\n    /// Unique identifier for the target private chat. If not specified, default bot's menu button will be changed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public long? ChatId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for the bot's new menu button. Defaults to <see cref=\"MenuButtonDefault\"/>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MenuButton)]\n    public MenuButton? MenuButton { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetChatPermissionsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetChatPermissions\" method.\n/// </summary>\npublic class SetChatPermissionsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetChatPermissionsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"permissions\">A JSON-serialized object for new default chat permissions</param>\n    public SetChatPermissionsArgs(long chatId, ChatPermissions permissions)\n    {\n        this.ChatId = chatId;\n        this.Permissions = permissions ?? throw new ArgumentNullException(nameof(permissions));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetChatPermissionsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"permissions\">A JSON-serialized object for new default chat permissions</param>\n    public SetChatPermissionsArgs(string chatId, ChatPermissions permissions)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Permissions = permissions ?? throw new ArgumentNullException(nameof(permissions));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for new default chat permissions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Permissions)]\n    public ChatPermissions Permissions { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UseIndependentChatPermissions)]\n    public bool? UseIndependentChatPermissions { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetChatPhotoArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetChatPhoto\" method.\n/// </summary>\npublic class SetChatPhotoArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetChatPhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">New chat photo, uploaded using multipart/form-data</param>\n    public SetChatPhotoArgs(long chatId, InputFile photo)\n    {\n        this.ChatId = chatId;\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetChatPhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">New chat photo, uploaded using multipart/form-data</param>\n    public SetChatPhotoArgs(string chatId, InputFile photo)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// New chat photo, uploaded using multipart/form-data\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public InputFile Photo { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetManagedBotAccessSettingsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetManagedBotAccessSettings\" method.\n/// </summary>\npublic class SetManagedBotAccessSettingsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetManagedBotAccessSettingsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">User identifier of the managed bot whose access settings will be changed</param>\n    /// <param name=\"isAccessRestricted\">Pass <em>True</em>, if only selected users can access the bot. The bot's owner can always access it.</param>\n    public SetManagedBotAccessSettingsArgs(long userId, bool isAccessRestricted)\n    {\n        this.UserId = userId;\n        this.IsAccessRestricted = isAccessRestricted;\n    }\n\n    /// <summary>\n    /// User identifier of the managed bot whose access settings will be changed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if only selected users can access the bot. The bot's owner can always access it.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAccessRestricted)]\n    public bool IsAccessRestricted { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of up to 10 identifiers of users who will have access to the bot in addition to its owner. Ignored if <em>is_access_restricted</em> is false.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AddedUserIds)]\n    public IEnumerable<int>? AddedUserIds { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetMessageReactionArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetMessageReaction\" method.\n/// </summary>\npublic class SetMessageReactionArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetMessageReactionArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead.</param>\n    public SetMessageReactionArgs(long chatId, int messageId)\n    {\n        this.ChatId = chatId;\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetMessageReactionArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead.</param>\n    public SetMessageReactionArgs(string chatId, int messageId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of reaction types to set on the message. Currently, as non-premium users, bots can set up to one reaction per message. A custom emoji reaction can be used if it is either already present on the message or explicitly allowed by chat administrators. Paid reactions can't be used by bots.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Reaction)]\n    public IEnumerable<ReactionType>? Reaction { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to set the reaction with a big animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsBig)]\n    public bool? IsBig { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetMyCommandsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetMyCommands\" method.\n/// </summary>\npublic class SetMyCommandsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetMyCommandsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"commands\">A JSON-serialized list of bot commands to be set as the list of the bot's commands. At most 100 commands can be specified.</param>\n    public SetMyCommandsArgs(IEnumerable<BotCommand> commands)\n    {\n        this.Commands = commands ?? throw new ArgumentNullException(nameof(commands));\n    }\n\n    /// <summary>\n    /// A JSON-serialized list of bot commands to be set as the list of the bot's commands. At most 100 commands can be specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Commands)]\n    public IEnumerable<BotCommand> Commands { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to <see cref=\"BotCommandScopeDefault\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Scope)]\n    public BotCommandScope? Scope { get; set; }\n\n    /// <summary>\n    /// A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LanguageCode)]\n    public string? LanguageCode { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetMyDefaultAdministratorRightsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetMyDefaultAdministratorRights\" method.\n/// </summary>\npublic class SetMyDefaultAdministratorRightsArgs\n{\n    /// <summary>\n    /// A JSON-serialized object describing new default administrator rights. If not specified, the default administrator rights will be cleared.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Rights)]\n    public ChatAdministratorRights? Rights { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to change the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be changed.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ForChannels)]\n    public bool? ForChannels { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/Args/SetMyProfilePhotoArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Represents the arguments of the \"SetMyProfilePhoto\" method.\n/// </summary>\npublic class SetMyProfilePhotoArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetMyProfilePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    public SetMyProfilePhotoArgs(InputProfilePhoto photo)\n    {\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// The new profile photo to set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public InputProfilePhoto Photo { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/answerCallbackQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Games;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send answers to callback queries sent from <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboards</a>. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. On success, <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerCallbackQuery\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AnswerCallbackQuery(\n        this ITelegramBotClient client,\n        AnswerCallbackQueryArgs args\n    ) => client.AnswerCallbackQueryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send answers to callback queries sent from <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboards</a>. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. On success, <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerCallbackQuery\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AnswerCallbackQueryAsync(\n        this ITelegramBotClient client,\n        AnswerCallbackQueryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.AnswerCallbackQuery,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to send answers to callback queries sent from <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboards</a>. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. On success, <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"callbackQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"text\">Text of the notification. If not specified, nothing will be shown to the user, 0-200 characters</param>\n    /// <param name=\"showAlert\">If <em>True</em>, an alert will be shown by the client instead of a notification at the top of the chat screen. Defaults to <em>false</em>.</param>\n    /// <param name=\"url\">URL that will be opened by the user's client. If you have created a <see cref=\"Game\"/> and accepted the conditions via <a href=\"https://t.me/botfather\">@BotFather</a>, specify the URL that opens your game - note that this will only work if the query comes from a <a href=\"https://core.telegram.org/bots/api#inlinekeyboardbutton\">callback_game</a> button.<br /><br />Otherwise, you may use links like <em>t.me/your_bot?start=XXXX</em> that open your bot with a parameter.</param>\n    /// <param name=\"cacheTime\">The maximum amount of time in seconds that the result of the callback query may be cached client-side. Telegram apps will support caching starting in version 3.14. Defaults to 0.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AnswerCallbackQuery(\n        this ITelegramBotClient client,\n        string callbackQueryId,\n        string? text = null,\n        bool? showAlert = null,\n        string? url = null,\n        int? cacheTime = null\n    ) =>\n        client\n            .AnswerCallbackQueryAsync(callbackQueryId, text, showAlert, url, cacheTime)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send answers to callback queries sent from <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboards</a>. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. On success, <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"callbackQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"text\">Text of the notification. If not specified, nothing will be shown to the user, 0-200 characters</param>\n    /// <param name=\"showAlert\">If <em>True</em>, an alert will be shown by the client instead of a notification at the top of the chat screen. Defaults to <em>false</em>.</param>\n    /// <param name=\"url\">URL that will be opened by the user's client. If you have created a <see cref=\"Game\"/> and accepted the conditions via <a href=\"https://t.me/botfather\">@BotFather</a>, specify the URL that opens your game - note that this will only work if the query comes from a <a href=\"https://core.telegram.org/bots/api#inlinekeyboardbutton\">callback_game</a> button.<br /><br />Otherwise, you may use links like <em>t.me/your_bot?start=XXXX</em> that open your bot with a parameter.</param>\n    /// <param name=\"cacheTime\">The maximum amount of time in seconds that the result of the callback query may be cached client-side. Telegram apps will support caching starting in version 3.14. Defaults to 0.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AnswerCallbackQueryAsync(\n        this ITelegramBotClient client,\n        string callbackQueryId,\n        string? text = null,\n        bool? showAlert = null,\n        string? url = null,\n        int? cacheTime = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.CallbackQueryId,\n                callbackQueryId ?? throw new ArgumentNullException(nameof(callbackQueryId))\n            },\n        };\n        if (text is not null)\n        {\n            args.Add(PropertyNames.Text, text);\n        }\n        if (showAlert is not null)\n        {\n            args.Add(PropertyNames.ShowAlert, showAlert);\n        }\n        if (url is not null)\n        {\n            args.Add(PropertyNames.Url, url);\n        }\n        if (cacheTime is not null)\n        {\n            args.Add(PropertyNames.CacheTime, cacheTime);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.AnswerCallbackQuery,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/answerGuestQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.InlineMode;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to reply to a received guest message. On success, a <see cref=\"SentGuestMessage\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerGuestQuery\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static SentGuestMessage AnswerGuestQuery(\n        this ITelegramBotClient client,\n        AnswerGuestQueryArgs args\n    ) => client.AnswerGuestQueryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to reply to a received guest message. On success, a <see cref=\"SentGuestMessage\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerGuestQuery\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<SentGuestMessage> AnswerGuestQueryAsync(\n        this ITelegramBotClient client,\n        AnswerGuestQueryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<SentGuestMessage>(\n            MethodNames.AnswerGuestQuery,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to reply to a received guest message. On success, a <see cref=\"SentGuestMessage\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"guestQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static SentGuestMessage AnswerGuestQuery(\n        this ITelegramBotClient client,\n        string guestQueryId,\n        InlineQueryResult result\n    ) => client.AnswerGuestQueryAsync(guestQueryId, result).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to reply to a received guest message. On success, a <see cref=\"SentGuestMessage\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"guestQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<SentGuestMessage> AnswerGuestQueryAsync(\n        this ITelegramBotClient client,\n        string guestQueryId,\n        InlineQueryResult result,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.GuestQueryId,\n                guestQueryId ?? throw new ArgumentNullException(nameof(guestQueryId))\n            },\n            { PropertyNames.Result, result ?? throw new ArgumentNullException(nameof(result)) },\n        };\n\n        return client.CallMethodAsync<SentGuestMessage>(\n            MethodNames.AnswerGuestQuery,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/answerWebAppQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.InlineMode;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to set the result of an interaction with a <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> and send a corresponding message on behalf of the user to the chat from which the query originated. On success, a <see cref=\"SentWebAppMessage\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerWebAppQuery\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static SentWebAppMessage AnswerWebAppQuery(\n        this ITelegramBotClient client,\n        AnswerWebAppQueryArgs args\n    ) => client.AnswerWebAppQueryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set the result of an interaction with a <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> and send a corresponding message on behalf of the user to the chat from which the query originated. On success, a <see cref=\"SentWebAppMessage\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerWebAppQuery\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<SentWebAppMessage> AnswerWebAppQueryAsync(\n        this ITelegramBotClient client,\n        AnswerWebAppQueryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<SentWebAppMessage>(\n            MethodNames.AnswerWebAppQuery,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to set the result of an interaction with a <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> and send a corresponding message on behalf of the user to the chat from which the query originated. On success, a <see cref=\"SentWebAppMessage\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"webAppQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static SentWebAppMessage AnswerWebAppQuery(\n        this ITelegramBotClient client,\n        string webAppQueryId,\n        InlineQueryResult result\n    ) => client.AnswerWebAppQueryAsync(webAppQueryId, result).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set the result of an interaction with a <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> and send a corresponding message on behalf of the user to the chat from which the query originated. On success, a <see cref=\"SentWebAppMessage\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"webAppQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<SentWebAppMessage> AnswerWebAppQueryAsync(\n        this ITelegramBotClient client,\n        string webAppQueryId,\n        InlineQueryResult result,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.WebAppQueryId,\n                webAppQueryId ?? throw new ArgumentNullException(nameof(webAppQueryId))\n            },\n            { PropertyNames.Result, result ?? throw new ArgumentNullException(nameof(result)) },\n        };\n\n        return client.CallMethodAsync<SentWebAppMessage>(\n            MethodNames.AnswerWebAppQuery,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/approveChatJoinRequest.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to approve a chat join request. The bot must be an administrator in the chat for this to work and must have the <em>can_invite_users</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ApproveChatJoinRequest(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId\n    ) => client.ApproveChatJoinRequestAsync(chatId, userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to approve a chat join request. The bot must be an administrator in the chat for this to work and must have the <em>can_invite_users</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ApproveChatJoinRequestAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ApproveChatJoinRequest,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to approve a chat join request. The bot must be an administrator in the chat for this to work and must have the <em>can_invite_users</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ApproveChatJoinRequest(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId\n    ) => client.ApproveChatJoinRequestAsync(chatId, userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to approve a chat join request. The bot must be an administrator in the chat for this to work and must have the <em>can_invite_users</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ApproveChatJoinRequestAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ApproveChatJoinRequest,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/banChatMember.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to ban a user in a group, a supergroup or a channel. In the case of supergroups and channels, the user will not be able to return to the chat on their own using invite links, etc., unless <a href=\"https://core.telegram.org/bots/api#unbanchatmember\">unbanned</a> first. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target group or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"untilDate\">Date when the user will be unbanned; Unix time. If user is banned for more than 366 days or less than 30 seconds from the current time they are considered to be banned forever. Applied for supergroups and channels only.</param>\n    /// <param name=\"revokeMessages\">Pass <em>True</em> to delete all messages from the chat for the user that is being removed. If <em>False</em>, the user will be able to see messages in the group that were sent before the user was removed. Always <em>True</em> for supergroups and channels.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool BanChatMember(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        int? untilDate = null,\n        bool? revokeMessages = null\n    ) =>\n        client\n            .BanChatMemberAsync(chatId, userId, untilDate, revokeMessages)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to ban a user in a group, a supergroup or a channel. In the case of supergroups and channels, the user will not be able to return to the chat on their own using invite links, etc., unless <a href=\"https://core.telegram.org/bots/api#unbanchatmember\">unbanned</a> first. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target group or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"untilDate\">Date when the user will be unbanned; Unix time. If user is banned for more than 366 days or less than 30 seconds from the current time they are considered to be banned forever. Applied for supergroups and channels only.</param>\n    /// <param name=\"revokeMessages\">Pass <em>True</em> to delete all messages from the chat for the user that is being removed. If <em>False</em>, the user will be able to see messages in the group that were sent before the user was removed. Always <em>True</em> for supergroups and channels.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> BanChatMemberAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        int? untilDate = null,\n        bool? revokeMessages = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n        };\n        if (untilDate is not null)\n        {\n            args.Add(PropertyNames.UntilDate, untilDate);\n        }\n        if (revokeMessages is not null)\n        {\n            args.Add(PropertyNames.RevokeMessages, revokeMessages);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.BanChatMember, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to ban a user in a group, a supergroup or a channel. In the case of supergroups and channels, the user will not be able to return to the chat on their own using invite links, etc., unless <a href=\"https://core.telegram.org/bots/api#unbanchatmember\">unbanned</a> first. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target group or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"untilDate\">Date when the user will be unbanned; Unix time. If user is banned for more than 366 days or less than 30 seconds from the current time they are considered to be banned forever. Applied for supergroups and channels only.</param>\n    /// <param name=\"revokeMessages\">Pass <em>True</em> to delete all messages from the chat for the user that is being removed. If <em>False</em>, the user will be able to see messages in the group that were sent before the user was removed. Always <em>True</em> for supergroups and channels.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool BanChatMember(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        int? untilDate = null,\n        bool? revokeMessages = null\n    ) =>\n        client\n            .BanChatMemberAsync(chatId, userId, untilDate, revokeMessages)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to ban a user in a group, a supergroup or a channel. In the case of supergroups and channels, the user will not be able to return to the chat on their own using invite links, etc., unless <a href=\"https://core.telegram.org/bots/api#unbanchatmember\">unbanned</a> first. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target group or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"untilDate\">Date when the user will be unbanned; Unix time. If user is banned for more than 366 days or less than 30 seconds from the current time they are considered to be banned forever. Applied for supergroups and channels only.</param>\n    /// <param name=\"revokeMessages\">Pass <em>True</em> to delete all messages from the chat for the user that is being removed. If <em>False</em>, the user will be able to see messages in the group that were sent before the user was removed. Always <em>True</em> for supergroups and channels.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> BanChatMemberAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        int? untilDate = null,\n        bool? revokeMessages = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n        };\n        if (untilDate is not null)\n        {\n            args.Add(PropertyNames.UntilDate, untilDate);\n        }\n        if (revokeMessages is not null)\n        {\n            args.Add(PropertyNames.RevokeMessages, revokeMessages);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.BanChatMember, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/banChatSenderChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to ban a channel chat in a supergroup or a channel. Until the chat is <a href=\"https://core.telegram.org/bots/api#unbanchatsenderchat\">unbanned</a>, the owner of the banned chat won't be able to send messages on behalf of <strong>any of their channels</strong>. The bot must be an administrator in the supergroup or channel for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"senderChatId\">Unique identifier of the target sender chat</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool BanChatSenderChat(\n        this ITelegramBotClient client,\n        long chatId,\n        long senderChatId\n    ) => client.BanChatSenderChatAsync(chatId, senderChatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to ban a channel chat in a supergroup or a channel. Until the chat is <a href=\"https://core.telegram.org/bots/api#unbanchatsenderchat\">unbanned</a>, the owner of the banned chat won't be able to send messages on behalf of <strong>any of their channels</strong>. The bot must be an administrator in the supergroup or channel for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"senderChatId\">Unique identifier of the target sender chat</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> BanChatSenderChatAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long senderChatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.SenderChatId, senderChatId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.BanChatSenderChat, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to ban a channel chat in a supergroup or a channel. Until the chat is <a href=\"https://core.telegram.org/bots/api#unbanchatsenderchat\">unbanned</a>, the owner of the banned chat won't be able to send messages on behalf of <strong>any of their channels</strong>. The bot must be an administrator in the supergroup or channel for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"senderChatId\">Unique identifier of the target sender chat</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool BanChatSenderChat(\n        this ITelegramBotClient client,\n        string chatId,\n        long senderChatId\n    ) => client.BanChatSenderChatAsync(chatId, senderChatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to ban a channel chat in a supergroup or a channel. Until the chat is <a href=\"https://core.telegram.org/bots/api#unbanchatsenderchat\">unbanned</a>, the owner of the banned chat won't be able to send messages on behalf of <strong>any of their channels</strong>. The bot must be an administrator in the supergroup or channel for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"senderChatId\">Unique identifier of the target sender chat</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> BanChatSenderChatAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long senderChatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.SenderChatId, senderChatId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.BanChatSenderChat, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/close.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to close the bot instance before moving it from one local server to another. You need to delete the webhook before calling this method to ensure that the bot isn't launched again after server restart. The method will return error 429 in the first 10 minutes after the bot is launched. Returns <em>True</em> on success. Requires no parameters.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool Close(this ITelegramBotClient client) =>\n        client.CloseAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to close the bot instance before moving it from one local server to another. You need to delete the webhook before calling this method to ensure that the bot isn't launched again after server restart. The method will return error 429 in the first 10 minutes after the bot is launched. Returns <em>True</em> on success. Requires no parameters.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> CloseAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.Close,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/closeForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to close an open topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool CloseForumTopic(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId\n    ) => client.CloseForumTopicAsync(chatId, messageThreadId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to close an open topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> CloseForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.CloseForumTopic, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to close an open topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool CloseForumTopic(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId\n    ) => client.CloseForumTopicAsync(chatId, messageThreadId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to close an open topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> CloseForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.CloseForumTopic, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/closeGeneralForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to close an open 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool CloseGeneralForumTopic(this ITelegramBotClient client, long chatId) =>\n        client.CloseGeneralForumTopicAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to close an open 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> CloseGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.CloseGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to close an open 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool CloseGeneralForumTopic(this ITelegramBotClient client, string chatId) =>\n        client.CloseGeneralForumTopicAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to close an open 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> CloseGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.CloseGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/convertGiftToStars.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Converts a given regular gift to Telegram Stars. Requires the <em>can_convert_gifts_to_stars</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be converted to Telegram Stars</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ConvertGiftToStars(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId\n    ) => client.ConvertGiftToStarsAsync(businessConnectionId, ownedGiftId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Converts a given regular gift to Telegram Stars. Requires the <em>can_convert_gifts_to_stars</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be converted to Telegram Stars</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ConvertGiftToStarsAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.OwnedGiftId,\n                ownedGiftId ?? throw new ArgumentNullException(nameof(ownedGiftId))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ConvertGiftToStars,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/copyMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CopyMessage\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static MessageId CopyMessage(this ITelegramBotClient client, CopyMessageArgs args) =>\n        client.CopyMessageAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CopyMessage\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<MessageId> CopyMessageAsync(\n        this ITelegramBotClient client,\n        CopyMessageArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<MessageId>(MethodNames.CopyMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the copied video in the message</param>\n    /// <param name=\"caption\">New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when copying to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static MessageId CopyMessage(\n        this ITelegramBotClient client,\n        long chatId,\n        long fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .CopyMessageAsync(\n                chatId,\n                fromChatId,\n                messageId,\n                messageThreadId,\n                directMessagesTopicId,\n                videoStartTimestamp,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the copied video in the message</param>\n    /// <param name=\"caption\">New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when copying to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<MessageId> CopyMessageAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.FromChatId, fromChatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (videoStartTimestamp is not null)\n        {\n            args.Add(PropertyNames.VideoStartTimestamp, videoStartTimestamp);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<MessageId>(MethodNames.CopyMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the copied video in the message</param>\n    /// <param name=\"caption\">New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when copying to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static MessageId CopyMessage(\n        this ITelegramBotClient client,\n        long chatId,\n        string fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .CopyMessageAsync(\n                chatId,\n                fromChatId,\n                messageId,\n                messageThreadId,\n                directMessagesTopicId,\n                videoStartTimestamp,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the copied video in the message</param>\n    /// <param name=\"caption\">New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when copying to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<MessageId> CopyMessageAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.FromChatId,\n                fromChatId ?? throw new ArgumentNullException(nameof(fromChatId))\n            },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (videoStartTimestamp is not null)\n        {\n            args.Add(PropertyNames.VideoStartTimestamp, videoStartTimestamp);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<MessageId>(MethodNames.CopyMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the copied video in the message</param>\n    /// <param name=\"caption\">New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when copying to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static MessageId CopyMessage(\n        this ITelegramBotClient client,\n        string chatId,\n        long fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .CopyMessageAsync(\n                chatId,\n                fromChatId,\n                messageId,\n                messageThreadId,\n                directMessagesTopicId,\n                videoStartTimestamp,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the copied video in the message</param>\n    /// <param name=\"caption\">New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when copying to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<MessageId> CopyMessageAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.FromChatId, fromChatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (videoStartTimestamp is not null)\n        {\n            args.Add(PropertyNames.VideoStartTimestamp, videoStartTimestamp);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<MessageId>(MethodNames.CopyMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the copied video in the message</param>\n    /// <param name=\"caption\">New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when copying to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static MessageId CopyMessage(\n        this ITelegramBotClient client,\n        string chatId,\n        string fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .CopyMessageAsync(\n                chatId,\n                fromChatId,\n                messageId,\n                messageThreadId,\n                directMessagesTopicId,\n                videoStartTimestamp,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessage\">forwardMessage</a>, but the copied message doesn't have a link to the original message. Returns the <see cref=\"MessageId\"/> of the sent message on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the copied video in the message</param>\n    /// <param name=\"caption\">New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the new caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Ignored if a new caption isn't specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when copying to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<MessageId> CopyMessageAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.FromChatId,\n                fromChatId ?? throw new ArgumentNullException(nameof(fromChatId))\n            },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (videoStartTimestamp is not null)\n        {\n            args.Add(PropertyNames.VideoStartTimestamp, videoStartTimestamp);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<MessageId>(MethodNames.CopyMessage, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/copyMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CopyMessages\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> CopyMessages(\n        this ITelegramBotClient client,\n        CopyMessagesArgs args\n    ) => client.CopyMessagesAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CopyMessages\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> CopyMessagesAsync(\n        this ITelegramBotClient client,\n        CopyMessagesArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.CopyMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"removeCaption\">Pass <em>True</em> to copy the messages without their captions</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> CopyMessages(\n        this ITelegramBotClient client,\n        long chatId,\n        long fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? removeCaption = null\n    ) =>\n        client\n            .CopyMessagesAsync(\n                chatId,\n                fromChatId,\n                messageIds,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent,\n                removeCaption\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"removeCaption\">Pass <em>True</em> to copy the messages without their captions</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> CopyMessagesAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? removeCaption = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.FromChatId, fromChatId },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (removeCaption is not null)\n        {\n            args.Add(PropertyNames.RemoveCaption, removeCaption);\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.CopyMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"removeCaption\">Pass <em>True</em> to copy the messages without their captions</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> CopyMessages(\n        this ITelegramBotClient client,\n        long chatId,\n        string fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? removeCaption = null\n    ) =>\n        client\n            .CopyMessagesAsync(\n                chatId,\n                fromChatId,\n                messageIds,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent,\n                removeCaption\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"removeCaption\">Pass <em>True</em> to copy the messages without their captions</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> CopyMessagesAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? removeCaption = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.FromChatId,\n                fromChatId ?? throw new ArgumentNullException(nameof(fromChatId))\n            },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (removeCaption is not null)\n        {\n            args.Add(PropertyNames.RemoveCaption, removeCaption);\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.CopyMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"removeCaption\">Pass <em>True</em> to copy the messages without their captions</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> CopyMessages(\n        this ITelegramBotClient client,\n        string chatId,\n        long fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? removeCaption = null\n    ) =>\n        client\n            .CopyMessagesAsync(\n                chatId,\n                fromChatId,\n                messageIds,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent,\n                removeCaption\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"removeCaption\">Pass <em>True</em> to copy the messages without their captions</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> CopyMessagesAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? removeCaption = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.FromChatId, fromChatId },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (removeCaption is not null)\n        {\n            args.Add(PropertyNames.RemoveCaption, removeCaption);\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.CopyMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"removeCaption\">Pass <em>True</em> to copy the messages without their captions</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> CopyMessages(\n        this ITelegramBotClient client,\n        string chatId,\n        string fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? removeCaption = null\n    ) =>\n        client\n            .CopyMessagesAsync(\n                chatId,\n                fromChatId,\n                messageIds,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent,\n                removeCaption\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz <a href=\"https://core.telegram.org/bots/api#poll\">poll</a> can be copied only if the value of the field <em>correct_option_id</em> is known to the bot. The method is analogous to the method <a href=\"https://core.telegram.org/bots/api#forwardmessages\">forwardMessages</a>, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to copy. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"removeCaption\">Pass <em>True</em> to copy the messages without their captions</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> CopyMessagesAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? removeCaption = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.FromChatId,\n                fromChatId ?? throw new ArgumentNullException(nameof(fromChatId))\n            },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (removeCaption is not null)\n        {\n            args.Add(PropertyNames.RemoveCaption, removeCaption);\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.CopyMessages,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/createChatInviteLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CreateChatInviteLink\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink CreateChatInviteLink(\n        this ITelegramBotClient client,\n        CreateChatInviteLinkArgs args\n    ) => client.CreateChatInviteLinkAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CreateChatInviteLink\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> CreateChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        CreateChatInviteLinkArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.CreateChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"expireDate\">Point in time (Unix timestamp) when the link will expire</param>\n    /// <param name=\"memberLimit\">The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999</param>\n    /// <param name=\"createsJoinRequest\"><em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink CreateChatInviteLink(\n        this ITelegramBotClient client,\n        long chatId,\n        string? name = null,\n        int? expireDate = null,\n        int? memberLimit = null,\n        bool? createsJoinRequest = null\n    ) =>\n        client\n            .CreateChatInviteLinkAsync(chatId, name, expireDate, memberLimit, createsJoinRequest)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"expireDate\">Point in time (Unix timestamp) when the link will expire</param>\n    /// <param name=\"memberLimit\">The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999</param>\n    /// <param name=\"createsJoinRequest\"><em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> CreateChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string? name = null,\n        int? expireDate = null,\n        int? memberLimit = null,\n        bool? createsJoinRequest = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n        if (expireDate is not null)\n        {\n            args.Add(PropertyNames.ExpireDate, expireDate);\n        }\n        if (memberLimit is not null)\n        {\n            args.Add(PropertyNames.MemberLimit, memberLimit);\n        }\n        if (createsJoinRequest is not null)\n        {\n            args.Add(PropertyNames.CreatesJoinRequest, createsJoinRequest);\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.CreateChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"expireDate\">Point in time (Unix timestamp) when the link will expire</param>\n    /// <param name=\"memberLimit\">The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999</param>\n    /// <param name=\"createsJoinRequest\"><em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink CreateChatInviteLink(\n        this ITelegramBotClient client,\n        string chatId,\n        string? name = null,\n        int? expireDate = null,\n        int? memberLimit = null,\n        bool? createsJoinRequest = null\n    ) =>\n        client\n            .CreateChatInviteLinkAsync(chatId, name, expireDate, memberLimit, createsJoinRequest)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"expireDate\">Point in time (Unix timestamp) when the link will expire</param>\n    /// <param name=\"memberLimit\">The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999</param>\n    /// <param name=\"createsJoinRequest\"><em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> CreateChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string? name = null,\n        int? expireDate = null,\n        int? memberLimit = null,\n        bool? createsJoinRequest = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n        if (expireDate is not null)\n        {\n            args.Add(PropertyNames.ExpireDate, expireDate);\n        }\n        if (memberLimit is not null)\n        {\n            args.Add(PropertyNames.MemberLimit, memberLimit);\n        }\n        if (createsJoinRequest is not null)\n        {\n            args.Add(PropertyNames.CreatesJoinRequest, createsJoinRequest);\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.CreateChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/createChatSubscriptionInviteLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to create a <a href=\"https://telegram.org/blog/superchannels-star-reactions-subscriptions#star-subscriptions\">subscription invite link</a> for a channel chat. The bot must have the <em>can_invite_users</em> administrator rights. The link can be edited using the method <a href=\"https://core.telegram.org/bots/api#editchatsubscriptioninvitelink\">editChatSubscriptionInviteLink</a> or revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target channel chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"subscriptionPeriod\">The number of seconds the subscription will be active for before the next payment. Currently, it must always be 2592000 (30 days).</param>\n    /// <param name=\"subscriptionPrice\">The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat; 1-10000</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink CreateChatSubscriptionInviteLink(\n        this ITelegramBotClient client,\n        long chatId,\n        int subscriptionPeriod,\n        int subscriptionPrice,\n        string? name = null\n    ) =>\n        client\n            .CreateChatSubscriptionInviteLinkAsync(\n                chatId,\n                subscriptionPeriod,\n                subscriptionPrice,\n                name\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to create a <a href=\"https://telegram.org/blog/superchannels-star-reactions-subscriptions#star-subscriptions\">subscription invite link</a> for a channel chat. The bot must have the <em>can_invite_users</em> administrator rights. The link can be edited using the method <a href=\"https://core.telegram.org/bots/api#editchatsubscriptioninvitelink\">editChatSubscriptionInviteLink</a> or revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target channel chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"subscriptionPeriod\">The number of seconds the subscription will be active for before the next payment. Currently, it must always be 2592000 (30 days).</param>\n    /// <param name=\"subscriptionPrice\">The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat; 1-10000</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> CreateChatSubscriptionInviteLinkAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int subscriptionPeriod,\n        int subscriptionPrice,\n        string? name = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.SubscriptionPeriod, subscriptionPeriod },\n            { PropertyNames.SubscriptionPrice, subscriptionPrice },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.CreateChatSubscriptionInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to create a <a href=\"https://telegram.org/blog/superchannels-star-reactions-subscriptions#star-subscriptions\">subscription invite link</a> for a channel chat. The bot must have the <em>can_invite_users</em> administrator rights. The link can be edited using the method <a href=\"https://core.telegram.org/bots/api#editchatsubscriptioninvitelink\">editChatSubscriptionInviteLink</a> or revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target channel chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"subscriptionPeriod\">The number of seconds the subscription will be active for before the next payment. Currently, it must always be 2592000 (30 days).</param>\n    /// <param name=\"subscriptionPrice\">The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat; 1-10000</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink CreateChatSubscriptionInviteLink(\n        this ITelegramBotClient client,\n        string chatId,\n        int subscriptionPeriod,\n        int subscriptionPrice,\n        string? name = null\n    ) =>\n        client\n            .CreateChatSubscriptionInviteLinkAsync(\n                chatId,\n                subscriptionPeriod,\n                subscriptionPrice,\n                name\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to create a <a href=\"https://telegram.org/blog/superchannels-star-reactions-subscriptions#star-subscriptions\">subscription invite link</a> for a channel chat. The bot must have the <em>can_invite_users</em> administrator rights. The link can be edited using the method <a href=\"https://core.telegram.org/bots/api#editchatsubscriptioninvitelink\">editChatSubscriptionInviteLink</a> or revoked using the method <a href=\"https://core.telegram.org/bots/api#revokechatinvitelink\">revokeChatInviteLink</a>. Returns the new invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target channel chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"subscriptionPeriod\">The number of seconds the subscription will be active for before the next payment. Currently, it must always be 2592000 (30 days).</param>\n    /// <param name=\"subscriptionPrice\">The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat; 1-10000</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> CreateChatSubscriptionInviteLinkAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int subscriptionPeriod,\n        int subscriptionPrice,\n        string? name = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.SubscriptionPeriod, subscriptionPeriod },\n            { PropertyNames.SubscriptionPrice, subscriptionPrice },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.CreateChatSubscriptionInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/createForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to create a topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator right. Returns information about the created topic as a <see cref=\"ForumTopic\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"name\">Topic name, 1-128 characters</param>\n    /// <param name=\"iconColor\">Color of the topic icon in RGB format. Currently, must be one of 7322096 (0x6FB9F0), 16766590 (0xFFD67E), 13338331 (0xCB86DB), 9367192 (0x8EEE98), 16749490 (0xFF93B2), or 16478047 (0xFB6F5F)</param>\n    /// <param name=\"iconCustomEmojiId\">Unique identifier of the custom emoji shown as the topic icon. Use <a href=\"https://core.telegram.org/bots/api#getforumtopiciconstickers\">getForumTopicIconStickers</a> to get all allowed custom emoji identifiers.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ForumTopic CreateForumTopic(\n        this ITelegramBotClient client,\n        long chatId,\n        string name,\n        int? iconColor = null,\n        string? iconCustomEmojiId = null\n    ) =>\n        client\n            .CreateForumTopicAsync(chatId, name, iconColor, iconCustomEmojiId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to create a topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator right. Returns information about the created topic as a <see cref=\"ForumTopic\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"name\">Topic name, 1-128 characters</param>\n    /// <param name=\"iconColor\">Color of the topic icon in RGB format. Currently, must be one of 7322096 (0x6FB9F0), 16766590 (0xFFD67E), 13338331 (0xCB86DB), 9367192 (0x8EEE98), 16749490 (0xFF93B2), or 16478047 (0xFB6F5F)</param>\n    /// <param name=\"iconCustomEmojiId\">Unique identifier of the custom emoji shown as the topic icon. Use <a href=\"https://core.telegram.org/bots/api#getforumtopiciconstickers\">getForumTopicIconStickers</a> to get all allowed custom emoji identifiers.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ForumTopic> CreateForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string name,\n        int? iconColor = null,\n        string? iconCustomEmojiId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n        };\n        if (iconColor is not null)\n        {\n            args.Add(PropertyNames.IconColor, iconColor);\n        }\n        if (iconCustomEmojiId is not null)\n        {\n            args.Add(PropertyNames.IconCustomEmojiId, iconCustomEmojiId);\n        }\n\n        return client.CallMethodAsync<ForumTopic>(\n            MethodNames.CreateForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to create a topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator right. Returns information about the created topic as a <see cref=\"ForumTopic\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"name\">Topic name, 1-128 characters</param>\n    /// <param name=\"iconColor\">Color of the topic icon in RGB format. Currently, must be one of 7322096 (0x6FB9F0), 16766590 (0xFFD67E), 13338331 (0xCB86DB), 9367192 (0x8EEE98), 16749490 (0xFF93B2), or 16478047 (0xFB6F5F)</param>\n    /// <param name=\"iconCustomEmojiId\">Unique identifier of the custom emoji shown as the topic icon. Use <a href=\"https://core.telegram.org/bots/api#getforumtopiciconstickers\">getForumTopicIconStickers</a> to get all allowed custom emoji identifiers.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ForumTopic CreateForumTopic(\n        this ITelegramBotClient client,\n        string chatId,\n        string name,\n        int? iconColor = null,\n        string? iconCustomEmojiId = null\n    ) =>\n        client\n            .CreateForumTopicAsync(chatId, name, iconColor, iconCustomEmojiId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to create a topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator right. Returns information about the created topic as a <see cref=\"ForumTopic\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"name\">Topic name, 1-128 characters</param>\n    /// <param name=\"iconColor\">Color of the topic icon in RGB format. Currently, must be one of 7322096 (0x6FB9F0), 16766590 (0xFFD67E), 13338331 (0xCB86DB), 9367192 (0x8EEE98), 16749490 (0xFF93B2), or 16478047 (0xFB6F5F)</param>\n    /// <param name=\"iconCustomEmojiId\">Unique identifier of the custom emoji shown as the topic icon. Use <a href=\"https://core.telegram.org/bots/api#getforumtopiciconstickers\">getForumTopicIconStickers</a> to get all allowed custom emoji identifiers.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ForumTopic> CreateForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string name,\n        int? iconColor = null,\n        string? iconCustomEmojiId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n        };\n        if (iconColor is not null)\n        {\n            args.Add(PropertyNames.IconColor, iconColor);\n        }\n        if (iconCustomEmojiId is not null)\n        {\n            args.Add(PropertyNames.IconCustomEmojiId, iconCustomEmojiId);\n        }\n\n        return client.CallMethodAsync<ForumTopic>(\n            MethodNames.CreateForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/declineChatJoinRequest.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work and must have the <em>can_invite_users</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeclineChatJoinRequest(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId\n    ) => client.DeclineChatJoinRequestAsync(chatId, userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work and must have the <em>can_invite_users</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeclineChatJoinRequestAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeclineChatJoinRequest,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work and must have the <em>can_invite_users</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeclineChatJoinRequest(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId\n    ) => client.DeclineChatJoinRequestAsync(chatId, userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work and must have the <em>can_invite_users</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeclineChatJoinRequestAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeclineChatJoinRequest,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/deleteBusinessMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Delete messages on behalf of a business account. Requires the <em>can_delete_sent_messages</em> business bot right to delete messages sent by the bot itself, or the <em>can_delete_all_messages</em> business bot right to delete any message. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"DeleteBusinessMessages\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteBusinessMessages(\n        this ITelegramBotClient client,\n        DeleteBusinessMessagesArgs args\n    ) => client.DeleteBusinessMessagesAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Delete messages on behalf of a business account. Requires the <em>can_delete_sent_messages</em> business bot right to delete messages sent by the bot itself, or the <em>can_delete_all_messages</em> business bot right to delete any message. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"DeleteBusinessMessages\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteBusinessMessagesAsync(\n        this ITelegramBotClient client,\n        DeleteBusinessMessagesArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteBusinessMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Delete messages on behalf of a business account. Requires the <em>can_delete_sent_messages</em> business bot right to delete messages sent by the bot itself, or the <em>can_delete_all_messages</em> business bot right to delete any message. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to delete the messages</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must be from the same chat. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteBusinessMessages(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        IEnumerable<int> messageIds\n    ) =>\n        client\n            .DeleteBusinessMessagesAsync(businessConnectionId, messageIds)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Delete messages on behalf of a business account. Requires the <em>can_delete_sent_messages</em> business bot right to delete messages sent by the bot itself, or the <em>can_delete_all_messages</em> business bot right to delete any message. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to delete the messages</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must be from the same chat. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteBusinessMessagesAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        IEnumerable<int> messageIds,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteBusinessMessages,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/deleteChatPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteChatPhoto(this ITelegramBotClient client, long chatId) =>\n        client.DeleteChatPhotoAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteChatPhotoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteChatPhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteChatPhoto(this ITelegramBotClient client, string chatId) =>\n        client.DeleteChatPhotoAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteChatPhotoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteChatPhoto, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/deleteChatStickerSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field <em>can_set_sticker_set</em> optionally returned in <a href=\"https://core.telegram.org/bots/api#getchat\">getChat</a> requests to check if the bot can use this method. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteChatStickerSet(this ITelegramBotClient client, long chatId) =>\n        client.DeleteChatStickerSetAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field <em>can_set_sticker_set</em> optionally returned in <a href=\"https://core.telegram.org/bots/api#getchat\">getChat</a> requests to check if the bot can use this method. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteChatStickerSetAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteChatStickerSet,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field <em>can_set_sticker_set</em> optionally returned in <a href=\"https://core.telegram.org/bots/api#getchat\">getChat</a> requests to check if the bot can use this method. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteChatStickerSet(this ITelegramBotClient client, string chatId) =>\n        client.DeleteChatStickerSetAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field <em>can_set_sticker_set</em> optionally returned in <a href=\"https://core.telegram.org/bots/api#getchat\">getChat</a> requests to check if the bot can use this method. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteChatStickerSetAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteChatStickerSet,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/deleteForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to delete a forum topic along with all its messages in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_delete_messages</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteForumTopic(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId\n    ) => client.DeleteForumTopicAsync(chatId, messageThreadId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a forum topic along with all its messages in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_delete_messages</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteForumTopic, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to delete a forum topic along with all its messages in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_delete_messages</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteForumTopic(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId\n    ) => client.DeleteForumTopicAsync(chatId, messageThreadId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a forum topic along with all its messages in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_delete_messages</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteForumTopic, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/deleteMyCommands.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to delete the list of the bot's commands for the given scope and user language. After deletion, <a href=\"https://core.telegram.org/bots/api#determining-list-of-commands\">higher level commands</a> will be shown to affected users. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"DeleteMyCommands\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMyCommands(\n        this ITelegramBotClient client,\n        DeleteMyCommandsArgs args\n    ) => client.DeleteMyCommandsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete the list of the bot's commands for the given scope and user language. After deletion, <a href=\"https://core.telegram.org/bots/api#determining-list-of-commands\">higher level commands</a> will be shown to affected users. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"DeleteMyCommands\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMyCommandsAsync(\n        this ITelegramBotClient client,\n        DeleteMyCommandsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteMyCommands, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to delete the list of the bot's commands for the given scope and user language. After deletion, <a href=\"https://core.telegram.org/bots/api#determining-list-of-commands\">higher level commands</a> will be shown to affected users. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"scope\">A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to <see cref=\"BotCommandScopeDefault\"/>.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMyCommands(\n        this ITelegramBotClient client,\n        BotCommandScope? scope = null,\n        string? languageCode = null\n    ) => client.DeleteMyCommandsAsync(scope, languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete the list of the bot's commands for the given scope and user language. After deletion, <a href=\"https://core.telegram.org/bots/api#determining-list-of-commands\">higher level commands</a> will be shown to affected users. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"scope\">A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to <see cref=\"BotCommandScopeDefault\"/>.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMyCommandsAsync(\n        this ITelegramBotClient client,\n        BotCommandScope? scope = null,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (scope is not null)\n        {\n            args.Add(PropertyNames.Scope, scope);\n        }\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteMyCommands, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/deleteStory.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Deletes a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to delete</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteStory(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int storyId\n    ) => client.DeleteStoryAsync(businessConnectionId, storyId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Deletes a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to delete</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteStoryAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int storyId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.StoryId, storyId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteStory, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/editChatInviteLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditChatInviteLink\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink EditChatInviteLink(\n        this ITelegramBotClient client,\n        EditChatInviteLinkArgs args\n    ) => client.EditChatInviteLinkAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditChatInviteLink\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> EditChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        EditChatInviteLinkArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.EditChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"expireDate\">Point in time (Unix timestamp) when the link will expire</param>\n    /// <param name=\"memberLimit\">The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999</param>\n    /// <param name=\"createsJoinRequest\"><em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink EditChatInviteLink(\n        this ITelegramBotClient client,\n        long chatId,\n        string inviteLink,\n        string? name = null,\n        int? expireDate = null,\n        int? memberLimit = null,\n        bool? createsJoinRequest = null\n    ) =>\n        client\n            .EditChatInviteLinkAsync(\n                chatId,\n                inviteLink,\n                name,\n                expireDate,\n                memberLimit,\n                createsJoinRequest\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"expireDate\">Point in time (Unix timestamp) when the link will expire</param>\n    /// <param name=\"memberLimit\">The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999</param>\n    /// <param name=\"createsJoinRequest\"><em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> EditChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string inviteLink,\n        string? name = null,\n        int? expireDate = null,\n        int? memberLimit = null,\n        bool? createsJoinRequest = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.InviteLink,\n                inviteLink ?? throw new ArgumentNullException(nameof(inviteLink))\n            },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n        if (expireDate is not null)\n        {\n            args.Add(PropertyNames.ExpireDate, expireDate);\n        }\n        if (memberLimit is not null)\n        {\n            args.Add(PropertyNames.MemberLimit, memberLimit);\n        }\n        if (createsJoinRequest is not null)\n        {\n            args.Add(PropertyNames.CreatesJoinRequest, createsJoinRequest);\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.EditChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"expireDate\">Point in time (Unix timestamp) when the link will expire</param>\n    /// <param name=\"memberLimit\">The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999</param>\n    /// <param name=\"createsJoinRequest\"><em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink EditChatInviteLink(\n        this ITelegramBotClient client,\n        string chatId,\n        string inviteLink,\n        string? name = null,\n        int? expireDate = null,\n        int? memberLimit = null,\n        bool? createsJoinRequest = null\n    ) =>\n        client\n            .EditChatInviteLinkAsync(\n                chatId,\n                inviteLink,\n                name,\n                expireDate,\n                memberLimit,\n                createsJoinRequest\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"expireDate\">Point in time (Unix timestamp) when the link will expire</param>\n    /// <param name=\"memberLimit\">The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999</param>\n    /// <param name=\"createsJoinRequest\"><em>True</em>, if users joining the chat via the link need to be approved by chat administrators. If <em>True</em>, <em>member_limit</em> can't be specified</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> EditChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string inviteLink,\n        string? name = null,\n        int? expireDate = null,\n        int? memberLimit = null,\n        bool? createsJoinRequest = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.InviteLink,\n                inviteLink ?? throw new ArgumentNullException(nameof(inviteLink))\n            },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n        if (expireDate is not null)\n        {\n            args.Add(PropertyNames.ExpireDate, expireDate);\n        }\n        if (memberLimit is not null)\n        {\n            args.Add(PropertyNames.MemberLimit, memberLimit);\n        }\n        if (createsJoinRequest is not null)\n        {\n            args.Add(PropertyNames.CreatesJoinRequest, createsJoinRequest);\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.EditChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/editChatSubscriptionInviteLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to edit a subscription invite link created by the bot. The bot must have the <em>can_invite_users</em> administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink EditChatSubscriptionInviteLink(\n        this ITelegramBotClient client,\n        long chatId,\n        string inviteLink,\n        string? name = null\n    ) =>\n        client\n            .EditChatSubscriptionInviteLinkAsync(chatId, inviteLink, name)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit a subscription invite link created by the bot. The bot must have the <em>can_invite_users</em> administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> EditChatSubscriptionInviteLinkAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string inviteLink,\n        string? name = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.InviteLink,\n                inviteLink ?? throw new ArgumentNullException(nameof(inviteLink))\n            },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.EditChatSubscriptionInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit a subscription invite link created by the bot. The bot must have the <em>can_invite_users</em> administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink EditChatSubscriptionInviteLink(\n        this ITelegramBotClient client,\n        string chatId,\n        string inviteLink,\n        string? name = null\n    ) =>\n        client\n            .EditChatSubscriptionInviteLinkAsync(chatId, inviteLink, name)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit a subscription invite link created by the bot. The bot must have the <em>can_invite_users</em> administrator rights. Returns the edited invite link as a <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to edit</param>\n    /// <param name=\"name\">Invite link name; 0-32 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> EditChatSubscriptionInviteLinkAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string inviteLink,\n        string? name = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.InviteLink,\n                inviteLink ?? throw new ArgumentNullException(nameof(inviteLink))\n            },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.EditChatSubscriptionInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/editForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to edit name and icon of a topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"name\">New topic name, 0-128 characters. If not specified or empty, the current name of the topic will be kept</param>\n    /// <param name=\"iconCustomEmojiId\">New unique identifier of the custom emoji shown as the topic icon. Use <a href=\"https://core.telegram.org/bots/api#getforumtopiciconstickers\">getForumTopicIconStickers</a> to get all allowed custom emoji identifiers. Pass an empty string to remove the icon. If not specified, the current icon will be kept</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditForumTopic(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId,\n        string? name = null,\n        string? iconCustomEmojiId = null\n    ) =>\n        client\n            .EditForumTopicAsync(chatId, messageThreadId, name, iconCustomEmojiId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit name and icon of a topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"name\">New topic name, 0-128 characters. If not specified or empty, the current name of the topic will be kept</param>\n    /// <param name=\"iconCustomEmojiId\">New unique identifier of the custom emoji shown as the topic icon. Use <a href=\"https://core.telegram.org/bots/api#getforumtopiciconstickers\">getForumTopicIconStickers</a> to get all allowed custom emoji identifiers. Pass an empty string to remove the icon. If not specified, the current icon will be kept</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId,\n        string? name = null,\n        string? iconCustomEmojiId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n        if (iconCustomEmojiId is not null)\n        {\n            args.Add(PropertyNames.IconCustomEmojiId, iconCustomEmojiId);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.EditForumTopic, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to edit name and icon of a topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"name\">New topic name, 0-128 characters. If not specified or empty, the current name of the topic will be kept</param>\n    /// <param name=\"iconCustomEmojiId\">New unique identifier of the custom emoji shown as the topic icon. Use <a href=\"https://core.telegram.org/bots/api#getforumtopiciconstickers\">getForumTopicIconStickers</a> to get all allowed custom emoji identifiers. Pass an empty string to remove the icon. If not specified, the current icon will be kept</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditForumTopic(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId,\n        string? name = null,\n        string? iconCustomEmojiId = null\n    ) =>\n        client\n            .EditForumTopicAsync(chatId, messageThreadId, name, iconCustomEmojiId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit name and icon of a topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"name\">New topic name, 0-128 characters. If not specified or empty, the current name of the topic will be kept</param>\n    /// <param name=\"iconCustomEmojiId\">New unique identifier of the custom emoji shown as the topic icon. Use <a href=\"https://core.telegram.org/bots/api#getforumtopiciconstickers\">getForumTopicIconStickers</a> to get all allowed custom emoji identifiers. Pass an empty string to remove the icon. If not specified, the current icon will be kept</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId,\n        string? name = null,\n        string? iconCustomEmojiId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n        if (iconCustomEmojiId is not null)\n        {\n            args.Add(PropertyNames.IconCustomEmojiId, iconCustomEmojiId);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.EditForumTopic, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/editGeneralForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to edit the name of the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"name\">New topic name, 1-128 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditGeneralForumTopic(\n        this ITelegramBotClient client,\n        long chatId,\n        string name\n    ) => client.EditGeneralForumTopicAsync(chatId, name).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit the name of the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"name\">New topic name, 1-128 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string name,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.EditGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit the name of the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"name\">New topic name, 1-128 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditGeneralForumTopic(\n        this ITelegramBotClient client,\n        string chatId,\n        string name\n    ) => client.EditGeneralForumTopicAsync(chatId, name).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit the name of the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"name\">New topic name, 1-128 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string name,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.EditGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/editStory.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Edits a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditStory\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story EditStory(this ITelegramBotClient client, EditStoryArgs args) =>\n        client.EditStoryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Edits a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditStory\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> EditStoryAsync(\n        this ITelegramBotClient client,\n        EditStoryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.EditStory, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Edits a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to edit</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"caption\">Caption of the story, 0-2048 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"areas\">A JSON-serialized list of clickable areas to be shown on the story</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story EditStory(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int storyId,\n        InputStoryContent content,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        IEnumerable<StoryArea>? areas = null\n    ) =>\n        client\n            .EditStoryAsync(\n                businessConnectionId,\n                storyId,\n                content,\n                caption,\n                parseMode,\n                captionEntities,\n                areas\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Edits a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to edit</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"caption\">Caption of the story, 0-2048 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"areas\">A JSON-serialized list of clickable areas to be shown on the story</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> EditStoryAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int storyId,\n        InputStoryContent content,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        IEnumerable<StoryArea>? areas = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.StoryId, storyId },\n            { PropertyNames.Content, content ?? throw new ArgumentNullException(nameof(content)) },\n        };\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (areas is not null)\n        {\n            args.Add(PropertyNames.Areas, areas);\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.EditStory, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/exportChatInviteLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to generate a new primary invite link for a chat; any previously generated primary link is revoked. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the new invite link as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static string ExportChatInviteLink(this ITelegramBotClient client, long chatId) =>\n        client.ExportChatInviteLinkAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to generate a new primary invite link for a chat; any previously generated primary link is revoked. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the new invite link as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<string> ExportChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<string>(\n            MethodNames.ExportChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to generate a new primary invite link for a chat; any previously generated primary link is revoked. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the new invite link as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static string ExportChatInviteLink(this ITelegramBotClient client, string chatId) =>\n        client.ExportChatInviteLinkAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to generate a new primary invite link for a chat; any previously generated primary link is revoked. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the new invite link as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<string> ExportChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<string>(\n            MethodNames.ExportChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/forwardMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"ForwardMessage\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message ForwardMessage(this ITelegramBotClient client, ForwardMessageArgs args) =>\n        client.ForwardMessageAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"ForwardMessage\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> ForwardMessageAsync(\n        this ITelegramBotClient client,\n        ForwardMessageArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.ForwardMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the forwarded video in the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when forwarding to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message ForwardMessage(\n        this ITelegramBotClient client,\n        long chatId,\n        long fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null\n    ) =>\n        client\n            .ForwardMessageAsync(\n                chatId,\n                fromChatId,\n                messageId,\n                messageThreadId,\n                directMessagesTopicId,\n                videoStartTimestamp,\n                disableNotification,\n                protectContent,\n                messageEffectId,\n                suggestedPostParameters\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the forwarded video in the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when forwarding to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> ForwardMessageAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.FromChatId, fromChatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (videoStartTimestamp is not null)\n        {\n            args.Add(PropertyNames.VideoStartTimestamp, videoStartTimestamp);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.ForwardMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the forwarded video in the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when forwarding to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message ForwardMessage(\n        this ITelegramBotClient client,\n        long chatId,\n        string fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null\n    ) =>\n        client\n            .ForwardMessageAsync(\n                chatId,\n                fromChatId,\n                messageId,\n                messageThreadId,\n                directMessagesTopicId,\n                videoStartTimestamp,\n                disableNotification,\n                protectContent,\n                messageEffectId,\n                suggestedPostParameters\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the forwarded video in the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when forwarding to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> ForwardMessageAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.FromChatId,\n                fromChatId ?? throw new ArgumentNullException(nameof(fromChatId))\n            },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (videoStartTimestamp is not null)\n        {\n            args.Add(PropertyNames.VideoStartTimestamp, videoStartTimestamp);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.ForwardMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the forwarded video in the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when forwarding to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message ForwardMessage(\n        this ITelegramBotClient client,\n        string chatId,\n        long fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null\n    ) =>\n        client\n            .ForwardMessageAsync(\n                chatId,\n                fromChatId,\n                messageId,\n                messageThreadId,\n                directMessagesTopicId,\n                videoStartTimestamp,\n                disableNotification,\n                protectContent,\n                messageEffectId,\n                suggestedPostParameters\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the forwarded video in the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when forwarding to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> ForwardMessageAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.FromChatId, fromChatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (videoStartTimestamp is not null)\n        {\n            args.Add(PropertyNames.VideoStartTimestamp, videoStartTimestamp);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.ForwardMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the forwarded video in the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when forwarding to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message ForwardMessage(\n        this ITelegramBotClient client,\n        string chatId,\n        string fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null\n    ) =>\n        client\n            .ForwardMessageAsync(\n                chatId,\n                fromChatId,\n                messageId,\n                messageThreadId,\n                directMessagesTopicId,\n                videoStartTimestamp,\n                disableNotification,\n                protectContent,\n                messageEffectId,\n                suggestedPostParameters\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original message was sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Message identifier in the chat specified in <em>from_chat_id</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be forwarded; required if the message is forwarded to a direct messages chat</param>\n    /// <param name=\"videoStartTimestamp\">New start timestamp for the forwarded video in the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; only available when forwarding to private chats</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> ForwardMessageAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string fromChatId,\n        int messageId,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? videoStartTimestamp = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.FromChatId,\n                fromChatId ?? throw new ArgumentNullException(nameof(fromChatId))\n            },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (videoStartTimestamp is not null)\n        {\n            args.Add(PropertyNames.VideoStartTimestamp, videoStartTimestamp);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.ForwardMessage, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/forwardMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"ForwardMessages\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> ForwardMessages(\n        this ITelegramBotClient client,\n        ForwardMessagesArgs args\n    ) => client.ForwardMessagesAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"ForwardMessages\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> ForwardMessagesAsync(\n        this ITelegramBotClient client,\n        ForwardMessagesArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.ForwardMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded messages from forwarding and saving</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> ForwardMessages(\n        this ITelegramBotClient client,\n        long chatId,\n        long fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null\n    ) =>\n        client\n            .ForwardMessagesAsync(\n                chatId,\n                fromChatId,\n                messageIds,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded messages from forwarding and saving</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> ForwardMessagesAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.FromChatId, fromChatId },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.ForwardMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded messages from forwarding and saving</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> ForwardMessages(\n        this ITelegramBotClient client,\n        long chatId,\n        string fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null\n    ) =>\n        client\n            .ForwardMessagesAsync(\n                chatId,\n                fromChatId,\n                messageIds,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded messages from forwarding and saving</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> ForwardMessagesAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.FromChatId,\n                fromChatId ?? throw new ArgumentNullException(nameof(fromChatId))\n            },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.ForwardMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded messages from forwarding and saving</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> ForwardMessages(\n        this ITelegramBotClient client,\n        string chatId,\n        long fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null\n    ) =>\n        client\n            .ForwardMessagesAsync(\n                chatId,\n                fromChatId,\n                messageIds,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded messages from forwarding and saving</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> ForwardMessagesAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.FromChatId, fromChatId },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.ForwardMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded messages from forwarding and saving</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<MessageId> ForwardMessages(\n        this ITelegramBotClient client,\n        string chatId,\n        string fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null\n    ) =>\n        client\n            .ForwardMessagesAsync(\n                chatId,\n                fromChatId,\n                messageIds,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of <see cref=\"MessageId\"/> of the sent messages is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"fromChatId\">Unique identifier for the chat where the original messages were sent (or username of the target bot, supergroup or channel in the format <em>@username</em>)</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages in the chat <em>from_chat_id</em> to forward. The identifiers must be specified in a strictly increasing order.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be forwarded; required if the messages are forwarded to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends the messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the forwarded messages from forwarding and saving</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<MessageId>> ForwardMessagesAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string fromChatId,\n        IEnumerable<int> messageIds,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.FromChatId,\n                fromChatId ?? throw new ArgumentNullException(nameof(fromChatId))\n            },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n\n        return client.CallMethodAsync<IEnumerable<MessageId>>(\n            MethodNames.ForwardMessages,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getAvailableGifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Returns the list of gifts that can be sent by the bot to users and channel chats. Requires no parameters. Returns a <see cref=\"Gifts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Gifts GetAvailableGifts(this ITelegramBotClient client) =>\n        client.GetAvailableGiftsAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the list of gifts that can be sent by the bot to users and channel chats. Requires no parameters. Returns a <see cref=\"Gifts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Gifts> GetAvailableGiftsAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Gifts>(\n            MethodNames.GetAvailableGifts,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getBusinessAccountGifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Returns the gifts received and owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetBusinessAccountGifts\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetBusinessAccountGifts(\n        this ITelegramBotClient client,\n        GetBusinessAccountGiftsArgs args\n    ) => client.GetBusinessAccountGiftsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the gifts received and owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetBusinessAccountGifts\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetBusinessAccountGiftsAsync(\n        this ITelegramBotClient client,\n        GetBusinessAccountGiftsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetBusinessAccountGifts,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Returns the gifts received and owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"excludeUnsaved\">Pass <em>True</em> to exclude gifts that aren't saved to the account's profile page</param>\n    /// <param name=\"excludeSaved\">Pass <em>True</em> to exclude gifts that are saved to the account's profile page</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimitedUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique</param>\n    /// <param name=\"excludeLimitedNonUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"excludeFromBlockchain\">Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetBusinessAccountGifts(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool? excludeUnsaved = null,\n        bool? excludeSaved = null,\n        bool? excludeUnlimited = null,\n        bool? excludeLimitedUpgradable = null,\n        bool? excludeLimitedNonUpgradable = null,\n        bool? excludeUnique = null,\n        bool? excludeFromBlockchain = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null\n    ) =>\n        client\n            .GetBusinessAccountGiftsAsync(\n                businessConnectionId,\n                excludeUnsaved,\n                excludeSaved,\n                excludeUnlimited,\n                excludeLimitedUpgradable,\n                excludeLimitedNonUpgradable,\n                excludeUnique,\n                excludeFromBlockchain,\n                sortByPrice,\n                offset,\n                limit\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Returns the gifts received and owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"excludeUnsaved\">Pass <em>True</em> to exclude gifts that aren't saved to the account's profile page</param>\n    /// <param name=\"excludeSaved\">Pass <em>True</em> to exclude gifts that are saved to the account's profile page</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimitedUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique</param>\n    /// <param name=\"excludeLimitedNonUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"excludeFromBlockchain\">Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetBusinessAccountGiftsAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool? excludeUnsaved = null,\n        bool? excludeSaved = null,\n        bool? excludeUnlimited = null,\n        bool? excludeLimitedUpgradable = null,\n        bool? excludeLimitedNonUpgradable = null,\n        bool? excludeUnique = null,\n        bool? excludeFromBlockchain = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n        if (excludeUnsaved is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnsaved, excludeUnsaved);\n        }\n        if (excludeSaved is not null)\n        {\n            args.Add(PropertyNames.ExcludeSaved, excludeSaved);\n        }\n        if (excludeUnlimited is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnlimited, excludeUnlimited);\n        }\n        if (excludeLimitedUpgradable is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimitedUpgradable, excludeLimitedUpgradable);\n        }\n        if (excludeLimitedNonUpgradable is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimitedNonUpgradable, excludeLimitedNonUpgradable);\n        }\n        if (excludeUnique is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnique, excludeUnique);\n        }\n        if (excludeFromBlockchain is not null)\n        {\n            args.Add(PropertyNames.ExcludeFromBlockchain, excludeFromBlockchain);\n        }\n        if (sortByPrice is not null)\n        {\n            args.Add(PropertyNames.SortByPrice, sortByPrice);\n        }\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetBusinessAccountGifts,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getBusinessAccountStarBalance.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Returns the amount of Telegram Stars owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"StarAmount\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static StarAmount GetBusinessAccountStarBalance(\n        this ITelegramBotClient client,\n        string businessConnectionId\n    ) => client.GetBusinessAccountStarBalanceAsync(businessConnectionId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the amount of Telegram Stars owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"StarAmount\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<StarAmount> GetBusinessAccountStarBalanceAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n\n        return client.CallMethodAsync<StarAmount>(\n            MethodNames.GetBusinessAccountStarBalance,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getBusinessConnection.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get information about the connection of the bot with a business account. Returns a <see cref=\"BusinessConnection\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static BusinessConnection GetBusinessConnection(\n        this ITelegramBotClient client,\n        string businessConnectionId\n    ) => client.GetBusinessConnectionAsync(businessConnectionId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get information about the connection of the bot with a business account. Returns a <see cref=\"BusinessConnection\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<BusinessConnection> GetBusinessConnectionAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n\n        return client.CallMethodAsync<BusinessConnection>(\n            MethodNames.GetBusinessConnection,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get up-to-date information about the chat. Returns a <see cref=\"ChatFullInfo\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatFullInfo GetChat(this ITelegramBotClient client, long chatId) =>\n        client.GetChatAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get up-to-date information about the chat. Returns a <see cref=\"ChatFullInfo\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatFullInfo> GetChatAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<ChatFullInfo>(MethodNames.GetChat, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to get up-to-date information about the chat. Returns a <see cref=\"ChatFullInfo\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatFullInfo GetChat(this ITelegramBotClient client, string chatId) =>\n        client.GetChatAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get up-to-date information about the chat. Returns a <see cref=\"ChatFullInfo\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatFullInfo> GetChatAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<ChatFullInfo>(MethodNames.GetChat, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getChatAdministrators.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get a list of administrators in a chat. Returns an Array of <see cref=\"ChatMember\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"returnBots\">Pass <em>True</em> to additionally receive all bots that are administrators of the chat. By default, bots other than the current bot are omitted.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<ChatMember> GetChatAdministrators(\n        this ITelegramBotClient client,\n        long chatId,\n        bool? returnBots = null\n    ) => client.GetChatAdministratorsAsync(chatId, returnBots).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get a list of administrators in a chat. Returns an Array of <see cref=\"ChatMember\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"returnBots\">Pass <em>True</em> to additionally receive all bots that are administrators of the chat. By default, bots other than the current bot are omitted.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<ChatMember>> GetChatAdministratorsAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        bool? returnBots = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (returnBots is not null)\n        {\n            args.Add(PropertyNames.ReturnBots, returnBots);\n        }\n\n        return client.CallMethodAsync<IEnumerable<ChatMember>>(\n            MethodNames.GetChatAdministrators,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to get a list of administrators in a chat. Returns an Array of <see cref=\"ChatMember\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"returnBots\">Pass <em>True</em> to additionally receive all bots that are administrators of the chat. By default, bots other than the current bot are omitted.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<ChatMember> GetChatAdministrators(\n        this ITelegramBotClient client,\n        string chatId,\n        bool? returnBots = null\n    ) => client.GetChatAdministratorsAsync(chatId, returnBots).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get a list of administrators in a chat. Returns an Array of <see cref=\"ChatMember\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"returnBots\">Pass <em>True</em> to additionally receive all bots that are administrators of the chat. By default, bots other than the current bot are omitted.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<ChatMember>> GetChatAdministratorsAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        bool? returnBots = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (returnBots is not null)\n        {\n            args.Add(PropertyNames.ReturnBots, returnBots);\n        }\n\n        return client.CallMethodAsync<IEnumerable<ChatMember>>(\n            MethodNames.GetChatAdministrators,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getChatGifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Returns the gifts owned by a chat. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetChatGifts\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetChatGifts(this ITelegramBotClient client, GetChatGiftsArgs args) =>\n        client.GetChatGiftsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the gifts owned by a chat. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetChatGifts\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetChatGiftsAsync(\n        this ITelegramBotClient client,\n        GetChatGiftsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetChatGifts,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Returns the gifts owned by a chat. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"excludeUnsaved\">Pass <em>True</em> to exclude gifts that aren't saved to the chat's profile page. Always <em>True</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.</param>\n    /// <param name=\"excludeSaved\">Pass <em>True</em> to exclude gifts that are saved to the chat's profile page. Always <em>False</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimitedUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique</param>\n    /// <param name=\"excludeLimitedNonUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique</param>\n    /// <param name=\"excludeFromBlockchain\">Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use an empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetChatGifts(\n        this ITelegramBotClient client,\n        long chatId,\n        bool? excludeUnsaved = null,\n        bool? excludeSaved = null,\n        bool? excludeUnlimited = null,\n        bool? excludeLimitedUpgradable = null,\n        bool? excludeLimitedNonUpgradable = null,\n        bool? excludeFromBlockchain = null,\n        bool? excludeUnique = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null\n    ) =>\n        client\n            .GetChatGiftsAsync(\n                chatId,\n                excludeUnsaved,\n                excludeSaved,\n                excludeUnlimited,\n                excludeLimitedUpgradable,\n                excludeLimitedNonUpgradable,\n                excludeFromBlockchain,\n                excludeUnique,\n                sortByPrice,\n                offset,\n                limit\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Returns the gifts owned by a chat. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"excludeUnsaved\">Pass <em>True</em> to exclude gifts that aren't saved to the chat's profile page. Always <em>True</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.</param>\n    /// <param name=\"excludeSaved\">Pass <em>True</em> to exclude gifts that are saved to the chat's profile page. Always <em>False</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimitedUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique</param>\n    /// <param name=\"excludeLimitedNonUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique</param>\n    /// <param name=\"excludeFromBlockchain\">Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use an empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetChatGiftsAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        bool? excludeUnsaved = null,\n        bool? excludeSaved = null,\n        bool? excludeUnlimited = null,\n        bool? excludeLimitedUpgradable = null,\n        bool? excludeLimitedNonUpgradable = null,\n        bool? excludeFromBlockchain = null,\n        bool? excludeUnique = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (excludeUnsaved is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnsaved, excludeUnsaved);\n        }\n        if (excludeSaved is not null)\n        {\n            args.Add(PropertyNames.ExcludeSaved, excludeSaved);\n        }\n        if (excludeUnlimited is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnlimited, excludeUnlimited);\n        }\n        if (excludeLimitedUpgradable is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimitedUpgradable, excludeLimitedUpgradable);\n        }\n        if (excludeLimitedNonUpgradable is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimitedNonUpgradable, excludeLimitedNonUpgradable);\n        }\n        if (excludeFromBlockchain is not null)\n        {\n            args.Add(PropertyNames.ExcludeFromBlockchain, excludeFromBlockchain);\n        }\n        if (excludeUnique is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnique, excludeUnique);\n        }\n        if (sortByPrice is not null)\n        {\n            args.Add(PropertyNames.SortByPrice, sortByPrice);\n        }\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetChatGifts,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Returns the gifts owned by a chat. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"excludeUnsaved\">Pass <em>True</em> to exclude gifts that aren't saved to the chat's profile page. Always <em>True</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.</param>\n    /// <param name=\"excludeSaved\">Pass <em>True</em> to exclude gifts that are saved to the chat's profile page. Always <em>False</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimitedUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique</param>\n    /// <param name=\"excludeLimitedNonUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique</param>\n    /// <param name=\"excludeFromBlockchain\">Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use an empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetChatGifts(\n        this ITelegramBotClient client,\n        string chatId,\n        bool? excludeUnsaved = null,\n        bool? excludeSaved = null,\n        bool? excludeUnlimited = null,\n        bool? excludeLimitedUpgradable = null,\n        bool? excludeLimitedNonUpgradable = null,\n        bool? excludeFromBlockchain = null,\n        bool? excludeUnique = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null\n    ) =>\n        client\n            .GetChatGiftsAsync(\n                chatId,\n                excludeUnsaved,\n                excludeSaved,\n                excludeUnlimited,\n                excludeLimitedUpgradable,\n                excludeLimitedNonUpgradable,\n                excludeFromBlockchain,\n                excludeUnique,\n                sortByPrice,\n                offset,\n                limit\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Returns the gifts owned by a chat. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"excludeUnsaved\">Pass <em>True</em> to exclude gifts that aren't saved to the chat's profile page. Always <em>True</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.</param>\n    /// <param name=\"excludeSaved\">Pass <em>True</em> to exclude gifts that are saved to the chat's profile page. Always <em>False</em>, unless the bot has the <em>can_post_messages</em> administrator right in the channel.</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimitedUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique</param>\n    /// <param name=\"excludeLimitedNonUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique</param>\n    /// <param name=\"excludeFromBlockchain\">Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use an empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetChatGiftsAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        bool? excludeUnsaved = null,\n        bool? excludeSaved = null,\n        bool? excludeUnlimited = null,\n        bool? excludeLimitedUpgradable = null,\n        bool? excludeLimitedNonUpgradable = null,\n        bool? excludeFromBlockchain = null,\n        bool? excludeUnique = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (excludeUnsaved is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnsaved, excludeUnsaved);\n        }\n        if (excludeSaved is not null)\n        {\n            args.Add(PropertyNames.ExcludeSaved, excludeSaved);\n        }\n        if (excludeUnlimited is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnlimited, excludeUnlimited);\n        }\n        if (excludeLimitedUpgradable is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimitedUpgradable, excludeLimitedUpgradable);\n        }\n        if (excludeLimitedNonUpgradable is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimitedNonUpgradable, excludeLimitedNonUpgradable);\n        }\n        if (excludeFromBlockchain is not null)\n        {\n            args.Add(PropertyNames.ExcludeFromBlockchain, excludeFromBlockchain);\n        }\n        if (excludeUnique is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnique, excludeUnique);\n        }\n        if (sortByPrice is not null)\n        {\n            args.Add(PropertyNames.SortByPrice, sortByPrice);\n        }\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetChatGifts,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getChatMember.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get information about a member of a chat. The method is only guaranteed to work for other users if the bot is an administrator in the chat. Returns a <see cref=\"ChatMember\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatMember GetChatMember(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId\n    ) => client.GetChatMemberAsync(chatId, userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get information about a member of a chat. The method is only guaranteed to work for other users if the bot is an administrator in the chat. Returns a <see cref=\"ChatMember\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatMember> GetChatMemberAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n        };\n\n        return client.CallMethodAsync<ChatMember>(\n            MethodNames.GetChatMember,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to get information about a member of a chat. The method is only guaranteed to work for other users if the bot is an administrator in the chat. Returns a <see cref=\"ChatMember\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatMember GetChatMember(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId\n    ) => client.GetChatMemberAsync(chatId, userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get information about a member of a chat. The method is only guaranteed to work for other users if the bot is an administrator in the chat. Returns a <see cref=\"ChatMember\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatMember> GetChatMemberAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n        };\n\n        return client.CallMethodAsync<ChatMember>(\n            MethodNames.GetChatMember,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getChatMemberCount.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the number of members in a chat. Returns <em>Int</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static int GetChatMemberCount(this ITelegramBotClient client, long chatId) =>\n        client.GetChatMemberCountAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the number of members in a chat. Returns <em>Int</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<int> GetChatMemberCountAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<int>(MethodNames.GetChatMemberCount, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to get the number of members in a chat. Returns <em>Int</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static int GetChatMemberCount(this ITelegramBotClient client, string chatId) =>\n        client.GetChatMemberCountAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the number of members in a chat. Returns <em>Int</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<int> GetChatMemberCountAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<int>(MethodNames.GetChatMemberCount, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getChatMenuButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the current value of the bot's menu button in a private chat, or the default menu button. Returns <see cref=\"MenuButton\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target private chat. If not specified, default bot's menu button will be returned</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static MenuButton GetChatMenuButton(\n        this ITelegramBotClient client,\n        long? chatId = null\n    ) => client.GetChatMenuButtonAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the current value of the bot's menu button in a private chat, or the default menu button. Returns <see cref=\"MenuButton\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target private chat. If not specified, default bot's menu button will be returned</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<MenuButton> GetChatMenuButtonAsync(\n        this ITelegramBotClient client,\n        long? chatId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (chatId is not null)\n        {\n            args.Add(PropertyNames.ChatId, chatId);\n        }\n\n        return client.CallMethodAsync<MenuButton>(\n            MethodNames.GetChatMenuButton,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getFile.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get basic information about a file and prepare it for downloading. For the moment, bots can download files of up to 20MB in size. On success, a <see cref=\"File\"/> object is returned. The file can then be downloaded via the link <em>https://api.telegram.org/file/bot&lt;token&gt;/&lt;file_path&gt;</em>, where <em>&lt;file_path&gt;</em> is taken from the response. It is guaranteed that the link will be valid for at least 1 hour. When the link expires, a new one can be requested by calling <a href=\"https://core.telegram.org/bots/api#getfile\">getFile</a> again.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"fileId\">File identifier to get information about</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static File GetFile(this ITelegramBotClient client, string fileId) =>\n        client.GetFileAsync(fileId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get basic information about a file and prepare it for downloading. For the moment, bots can download files of up to 20MB in size. On success, a <see cref=\"File\"/> object is returned. The file can then be downloaded via the link <em>https://api.telegram.org/file/bot&lt;token&gt;/&lt;file_path&gt;</em>, where <em>&lt;file_path&gt;</em> is taken from the response. It is guaranteed that the link will be valid for at least 1 hour. When the link expires, a new one can be requested by calling <a href=\"https://core.telegram.org/bots/api#getfile\">getFile</a> again.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"fileId\">File identifier to get information about</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<File> GetFileAsync(\n        this ITelegramBotClient client,\n        string fileId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.FileId, fileId ?? throw new ArgumentNullException(nameof(fileId)) },\n        };\n\n        return client.CallMethodAsync<File>(MethodNames.GetFile, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getForumTopicIconStickers.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Stickers;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get custom emoji stickers, which can be used as a forum topic icon by any user. Requires no parameters. Returns an Array of <see cref=\"Sticker\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Sticker> GetForumTopicIconStickers(this ITelegramBotClient client) =>\n        client.GetForumTopicIconStickersAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get custom emoji stickers, which can be used as a forum topic icon by any user. Requires no parameters. Returns an Array of <see cref=\"Sticker\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Sticker>> GetForumTopicIconStickersAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<IEnumerable<Sticker>>(\n            MethodNames.GetForumTopicIconStickers,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getManagedBotAccessSettings.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the access settings of a managed bot. Returns a <see cref=\"BotAccessSettings\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the managed bot whose access settings will be returned</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static BotAccessSettings GetManagedBotAccessSettings(\n        this ITelegramBotClient client,\n        long userId\n    ) => client.GetManagedBotAccessSettingsAsync(userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the access settings of a managed bot. Returns a <see cref=\"BotAccessSettings\"/> object on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the managed bot whose access settings will be returned</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<BotAccessSettings> GetManagedBotAccessSettingsAsync(\n        this ITelegramBotClient client,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n\n        return client.CallMethodAsync<BotAccessSettings>(\n            MethodNames.GetManagedBotAccessSettings,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getManagedBotToken.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the token of a managed bot. Returns the token as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the managed bot whose token will be returned</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static string GetManagedBotToken(this ITelegramBotClient client, long userId) =>\n        client.GetManagedBotTokenAsync(userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the token of a managed bot. Returns the token as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the managed bot whose token will be returned</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<string> GetManagedBotTokenAsync(\n        this ITelegramBotClient client,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n\n        return client.CallMethodAsync<string>(\n            MethodNames.GetManagedBotToken,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getMe.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// A simple method for testing your bot's authentication token. Requires no parameters. Returns basic information about the bot in form of a <see cref=\"User\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static User GetMe(this ITelegramBotClient client) =>\n        client.GetMeAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// A simple method for testing your bot's authentication token. Requires no parameters. Returns basic information about the bot in form of a <see cref=\"User\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<User> GetMeAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<User>(\n            MethodNames.GetMe,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getMyCommands.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the current list of the bot's commands for the given scope and user language. Returns an Array of <see cref=\"BotCommand\"/> objects. If commands aren't set, an empty list is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetMyCommands\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<BotCommand> GetMyCommands(\n        this ITelegramBotClient client,\n        GetMyCommandsArgs args\n    ) => client.GetMyCommandsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the current list of the bot's commands for the given scope and user language. Returns an Array of <see cref=\"BotCommand\"/> objects. If commands aren't set, an empty list is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetMyCommands\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<BotCommand>> GetMyCommandsAsync(\n        this ITelegramBotClient client,\n        GetMyCommandsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<IEnumerable<BotCommand>>(\n            MethodNames.GetMyCommands,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to get the current list of the bot's commands for the given scope and user language. Returns an Array of <see cref=\"BotCommand\"/> objects. If commands aren't set, an empty list is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"scope\">A JSON-serialized object, describing scope of users. Defaults to <see cref=\"BotCommandScopeDefault\"/>.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code or an empty string</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<BotCommand> GetMyCommands(\n        this ITelegramBotClient client,\n        BotCommandScope? scope = null,\n        string? languageCode = null\n    ) => client.GetMyCommandsAsync(scope, languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the current list of the bot's commands for the given scope and user language. Returns an Array of <see cref=\"BotCommand\"/> objects. If commands aren't set, an empty list is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"scope\">A JSON-serialized object, describing scope of users. Defaults to <see cref=\"BotCommandScopeDefault\"/>.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code or an empty string</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<BotCommand>> GetMyCommandsAsync(\n        this ITelegramBotClient client,\n        BotCommandScope? scope = null,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (scope is not null)\n        {\n            args.Add(PropertyNames.Scope, scope);\n        }\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<IEnumerable<BotCommand>>(\n            MethodNames.GetMyCommands,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getMyDefaultAdministratorRights.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the current default administrator rights of the bot. Returns <see cref=\"ChatAdministratorRights\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"forChannels\">Pass <em>True</em> to get default administrator rights of the bot in channels. Otherwise, default administrator rights of the bot for groups and supergroups will be returned.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatAdministratorRights GetMyDefaultAdministratorRights(\n        this ITelegramBotClient client,\n        bool? forChannels = null\n    ) => client.GetMyDefaultAdministratorRightsAsync(forChannels).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the current default administrator rights of the bot. Returns <see cref=\"ChatAdministratorRights\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"forChannels\">Pass <em>True</em> to get default administrator rights of the bot in channels. Otherwise, default administrator rights of the bot for groups and supergroups will be returned.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatAdministratorRights> GetMyDefaultAdministratorRightsAsync(\n        this ITelegramBotClient client,\n        bool? forChannels = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (forChannels is not null)\n        {\n            args.Add(PropertyNames.ForChannels, forChannels);\n        }\n\n        return client.CallMethodAsync<ChatAdministratorRights>(\n            MethodNames.GetMyDefaultAdministratorRights,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getMyDescription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the current bot description for the given user language. Returns <see cref=\"BotDescription\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code or an empty string</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static BotDescription GetMyDescription(\n        this ITelegramBotClient client,\n        string? languageCode = null\n    ) => client.GetMyDescriptionAsync(languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the current bot description for the given user language. Returns <see cref=\"BotDescription\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code or an empty string</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<BotDescription> GetMyDescriptionAsync(\n        this ITelegramBotClient client,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<BotDescription>(\n            MethodNames.GetMyDescription,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getMyName.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the current bot name for the given user language. Returns <see cref=\"BotName\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code or an empty string</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static BotName GetMyName(this ITelegramBotClient client, string? languageCode = null) =>\n        client.GetMyNameAsync(languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the current bot name for the given user language. Returns <see cref=\"BotName\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code or an empty string</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<BotName> GetMyNameAsync(\n        this ITelegramBotClient client,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<BotName>(MethodNames.GetMyName, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getMyShortDescription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the current bot short description for the given user language. Returns <see cref=\"BotShortDescription\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code or an empty string</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static BotShortDescription GetMyShortDescription(\n        this ITelegramBotClient client,\n        string? languageCode = null\n    ) => client.GetMyShortDescriptionAsync(languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the current bot short description for the given user language. Returns <see cref=\"BotShortDescription\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code or an empty string</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<BotShortDescription> GetMyShortDescriptionAsync(\n        this ITelegramBotClient client,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<BotShortDescription>(\n            MethodNames.GetMyShortDescription,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getUserChatBoosts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the list of boosts added to a chat by a user. Requires administrator rights in the chat. Returns a <see cref=\"UserChatBoosts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the chat or username of the channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static UserChatBoosts GetUserChatBoosts(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId\n    ) => client.GetUserChatBoostsAsync(chatId, userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the list of boosts added to a chat by a user. Requires administrator rights in the chat. Returns a <see cref=\"UserChatBoosts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the chat or username of the channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<UserChatBoosts> GetUserChatBoostsAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n        };\n\n        return client.CallMethodAsync<UserChatBoosts>(\n            MethodNames.GetUserChatBoosts,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to get the list of boosts added to a chat by a user. Requires administrator rights in the chat. Returns a <see cref=\"UserChatBoosts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the chat or username of the channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static UserChatBoosts GetUserChatBoosts(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId\n    ) => client.GetUserChatBoostsAsync(chatId, userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the list of boosts added to a chat by a user. Requires administrator rights in the chat. Returns a <see cref=\"UserChatBoosts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the chat or username of the channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<UserChatBoosts> GetUserChatBoostsAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n        };\n\n        return client.CallMethodAsync<UserChatBoosts>(\n            MethodNames.GetUserChatBoosts,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getUserGifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Returns the gifts owned and hosted by a user. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetUserGifts\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetUserGifts(this ITelegramBotClient client, GetUserGiftsArgs args) =>\n        client.GetUserGiftsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the gifts owned and hosted by a user. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetUserGifts\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetUserGiftsAsync(\n        this ITelegramBotClient client,\n        GetUserGiftsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetUserGifts,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Returns the gifts owned and hosted by a user. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the user</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimitedUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique</param>\n    /// <param name=\"excludeLimitedNonUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique</param>\n    /// <param name=\"excludeFromBlockchain\">Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use an empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetUserGifts(\n        this ITelegramBotClient client,\n        long userId,\n        bool? excludeUnlimited = null,\n        bool? excludeLimitedUpgradable = null,\n        bool? excludeLimitedNonUpgradable = null,\n        bool? excludeFromBlockchain = null,\n        bool? excludeUnique = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null\n    ) =>\n        client\n            .GetUserGiftsAsync(\n                userId,\n                excludeUnlimited,\n                excludeLimitedUpgradable,\n                excludeLimitedNonUpgradable,\n                excludeFromBlockchain,\n                excludeUnique,\n                sortByPrice,\n                offset,\n                limit\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Returns the gifts owned and hosted by a user. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the user</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimitedUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can be upgraded to unique</param>\n    /// <param name=\"excludeLimitedNonUpgradable\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times and can't be upgraded to unique</param>\n    /// <param name=\"excludeFromBlockchain\">Pass <em>True</em> to exclude gifts that were assigned from the TON blockchain and can't be resold or transferred in Telegram</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use an empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetUserGiftsAsync(\n        this ITelegramBotClient client,\n        long userId,\n        bool? excludeUnlimited = null,\n        bool? excludeLimitedUpgradable = null,\n        bool? excludeLimitedNonUpgradable = null,\n        bool? excludeFromBlockchain = null,\n        bool? excludeUnique = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n        if (excludeUnlimited is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnlimited, excludeUnlimited);\n        }\n        if (excludeLimitedUpgradable is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimitedUpgradable, excludeLimitedUpgradable);\n        }\n        if (excludeLimitedNonUpgradable is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimitedNonUpgradable, excludeLimitedNonUpgradable);\n        }\n        if (excludeFromBlockchain is not null)\n        {\n            args.Add(PropertyNames.ExcludeFromBlockchain, excludeFromBlockchain);\n        }\n        if (excludeUnique is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnique, excludeUnique);\n        }\n        if (sortByPrice is not null)\n        {\n            args.Add(PropertyNames.SortByPrice, sortByPrice);\n        }\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetUserGifts,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getUserPersonalChatMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get the last messages from the personal chat (i.e., the chat currently added to their profile) of a given user. On success, an array of <see cref=\"Message\"/> objects is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier for the target user</param>\n    /// <param name=\"limit\">The maximum number of messages to return; 1-20</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Message> GetUserPersonalChatMessages(\n        this ITelegramBotClient client,\n        long userId,\n        int limit\n    ) => client.GetUserPersonalChatMessagesAsync(userId, limit).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get the last messages from the personal chat (i.e., the chat currently added to their profile) of a given user. On success, an array of <see cref=\"Message\"/> objects is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier for the target user</param>\n    /// <param name=\"limit\">The maximum number of messages to return; 1-20</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Message>> GetUserPersonalChatMessagesAsync(\n        this ITelegramBotClient client,\n        long userId,\n        int limit,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Limit, limit },\n        };\n\n        return client.CallMethodAsync<IEnumerable<Message>>(\n            MethodNames.GetUserPersonalChatMessages,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getUserProfileAudios.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get a list of profile audios for a user. Returns a <see cref=\"UserProfileAudios\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"offset\">Sequential number of the first audio to be returned. By default, all audios are returned.</param>\n    /// <param name=\"limit\">Limits the number of audios to be retrieved. Values between 1-100 are accepted. Defaults to 100.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static UserProfileAudios GetUserProfileAudios(\n        this ITelegramBotClient client,\n        long userId,\n        int? offset = null,\n        int? limit = null\n    ) => client.GetUserProfileAudiosAsync(userId, offset, limit).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get a list of profile audios for a user. Returns a <see cref=\"UserProfileAudios\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"offset\">Sequential number of the first audio to be returned. By default, all audios are returned.</param>\n    /// <param name=\"limit\">Limits the number of audios to be retrieved. Values between 1-100 are accepted. Defaults to 100.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<UserProfileAudios> GetUserProfileAudiosAsync(\n        this ITelegramBotClient client,\n        long userId,\n        int? offset = null,\n        int? limit = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n\n        return client.CallMethodAsync<UserProfileAudios>(\n            MethodNames.GetUserProfileAudios,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/getUserProfilePhotos.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to get a list of profile pictures for a user. Returns a <see cref=\"UserProfilePhotos\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"offset\">Sequential number of the first photo to be returned. By default, all photos are returned.</param>\n    /// <param name=\"limit\">Limits the number of photos to be retrieved. Values between 1-100 are accepted. Defaults to 100.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static UserProfilePhotos GetUserProfilePhotos(\n        this ITelegramBotClient client,\n        long userId,\n        int? offset = null,\n        int? limit = null\n    ) => client.GetUserProfilePhotosAsync(userId, offset, limit).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get a list of profile pictures for a user. Returns a <see cref=\"UserProfilePhotos\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"offset\">Sequential number of the first photo to be returned. By default, all photos are returned.</param>\n    /// <param name=\"limit\">Limits the number of photos to be retrieved. Values between 1-100 are accepted. Defaults to 100.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<UserProfilePhotos> GetUserProfilePhotosAsync(\n        this ITelegramBotClient client,\n        long userId,\n        int? offset = null,\n        int? limit = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n\n        return client.CallMethodAsync<UserProfilePhotos>(\n            MethodNames.GetUserProfilePhotos,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/giftPremiumSubscription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Gifts a Telegram Premium subscription to the given user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GiftPremiumSubscription\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool GiftPremiumSubscription(\n        this ITelegramBotClient client,\n        GiftPremiumSubscriptionArgs args\n    ) => client.GiftPremiumSubscriptionAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Gifts a Telegram Premium subscription to the given user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GiftPremiumSubscription\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> GiftPremiumSubscriptionAsync(\n        this ITelegramBotClient client,\n        GiftPremiumSubscriptionArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.GiftPremiumSubscription,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Gifts a Telegram Premium subscription to the given user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user who will receive a Telegram Premium subscription</param>\n    /// <param name=\"monthCount\">Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months</param>\n    /// <param name=\"text\">Text that will be shown along with the service message about the subscription; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool GiftPremiumSubscription(\n        this ITelegramBotClient client,\n        long userId,\n        int monthCount,\n        int starCount,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null\n    ) =>\n        client\n            .GiftPremiumSubscriptionAsync(\n                userId,\n                monthCount,\n                starCount,\n                text,\n                textParseMode,\n                textEntities\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Gifts a Telegram Premium subscription to the given user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user who will receive a Telegram Premium subscription</param>\n    /// <param name=\"monthCount\">Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months</param>\n    /// <param name=\"text\">Text that will be shown along with the service message about the subscription; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> GiftPremiumSubscriptionAsync(\n        this ITelegramBotClient client,\n        long userId,\n        int monthCount,\n        int starCount,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.MonthCount, monthCount },\n            { PropertyNames.StarCount, starCount },\n        };\n        if (text is not null)\n        {\n            args.Add(PropertyNames.Text, text);\n        }\n        if (textParseMode is not null)\n        {\n            args.Add(PropertyNames.TextParseMode, textParseMode);\n        }\n        if (textEntities is not null)\n        {\n            args.Add(PropertyNames.TextEntities, textEntities);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.GiftPremiumSubscription,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/hideGeneralForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to hide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. The topic will be automatically closed if it was open. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool HideGeneralForumTopic(this ITelegramBotClient client, long chatId) =>\n        client.HideGeneralForumTopicAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to hide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. The topic will be automatically closed if it was open. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> HideGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.HideGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to hide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. The topic will be automatically closed if it was open. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool HideGeneralForumTopic(this ITelegramBotClient client, string chatId) =>\n        client.HideGeneralForumTopicAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to hide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. The topic will be automatically closed if it was open. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> HideGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.HideGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/leaveChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method for your bot to leave a group, supergroup or channel. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em>. Channel direct messages chats aren't supported; leave the corresponding channel instead.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool LeaveChat(this ITelegramBotClient client, long chatId) =>\n        client.LeaveChatAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method for your bot to leave a group, supergroup or channel. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em>. Channel direct messages chats aren't supported; leave the corresponding channel instead.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> LeaveChatAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(MethodNames.LeaveChat, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method for your bot to leave a group, supergroup or channel. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em>. Channel direct messages chats aren't supported; leave the corresponding channel instead.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool LeaveChat(this ITelegramBotClient client, string chatId) =>\n        client.LeaveChatAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method for your bot to leave a group, supergroup or channel. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup or channel in the format <em>@username</em>. Channel direct messages chats aren't supported; leave the corresponding channel instead.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> LeaveChatAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.LeaveChat, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/logOut.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to log out from the cloud Bot API server before launching the bot locally. You <strong>must</strong> log out the bot before running it locally, otherwise there is no guarantee that the bot will receive updates. After a successful call, you can immediately log in on a local server, but will not be able to log in back to the cloud Bot API server for 10 minutes. Returns <em>True</em> on success. Requires no parameters.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool LogOut(this ITelegramBotClient client) =>\n        client.LogOutAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to log out from the cloud Bot API server before launching the bot locally. You <strong>must</strong> log out the bot before running it locally, otherwise there is no guarantee that the bot will receive updates. After a successful call, you can immediately log in on a local server, but will not be able to log in back to the cloud Bot API server for 10 minutes. Returns <em>True</em> on success. Requires no parameters.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> LogOutAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.LogOut,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/pinChatMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to add a message to the list of pinned messages in a chat. In private chats and channel direct messages chats, all non-service messages can be pinned. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to pin messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of a message to pin</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be pinned</param>\n    /// <param name=\"disableNotification\">Pass <em>True</em> if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool PinChatMessage(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        bool? disableNotification = null\n    ) =>\n        client\n            .PinChatMessageAsync(chatId, messageId, businessConnectionId, disableNotification)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to add a message to the list of pinned messages in a chat. In private chats and channel direct messages chats, all non-service messages can be pinned. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to pin messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of a message to pin</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be pinned</param>\n    /// <param name=\"disableNotification\">Pass <em>True</em> if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> PinChatMessageAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        bool? disableNotification = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.PinChatMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to add a message to the list of pinned messages in a chat. In private chats and channel direct messages chats, all non-service messages can be pinned. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to pin messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of a message to pin</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be pinned</param>\n    /// <param name=\"disableNotification\">Pass <em>True</em> if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool PinChatMessage(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        bool? disableNotification = null\n    ) =>\n        client\n            .PinChatMessageAsync(chatId, messageId, businessConnectionId, disableNotification)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to add a message to the list of pinned messages in a chat. In private chats and channel direct messages chats, all non-service messages can be pinned. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to pin messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of a message to pin</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be pinned</param>\n    /// <param name=\"disableNotification\">Pass <em>True</em> if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> PinChatMessageAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        bool? disableNotification = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.PinChatMessage, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/postStory.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Posts a story on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"PostStory\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story PostStory(this ITelegramBotClient client, PostStoryArgs args) =>\n        client.PostStoryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Posts a story on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"PostStory\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> PostStoryAsync(\n        this ITelegramBotClient client,\n        PostStoryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.PostStory, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Posts a story on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    /// <param name=\"caption\">Caption of the story, 0-2048 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"areas\">A JSON-serialized list of clickable areas to be shown on the story</param>\n    /// <param name=\"postToChatPage\">Pass <em>True</em> to keep the story accessible after it expires</param>\n    /// <param name=\"protectContent\">Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story PostStory(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        InputStoryContent content,\n        int activePeriod,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        IEnumerable<StoryArea>? areas = null,\n        bool? postToChatPage = null,\n        bool? protectContent = null\n    ) =>\n        client\n            .PostStoryAsync(\n                businessConnectionId,\n                content,\n                activePeriod,\n                caption,\n                parseMode,\n                captionEntities,\n                areas,\n                postToChatPage,\n                protectContent\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Posts a story on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    /// <param name=\"caption\">Caption of the story, 0-2048 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"areas\">A JSON-serialized list of clickable areas to be shown on the story</param>\n    /// <param name=\"postToChatPage\">Pass <em>True</em> to keep the story accessible after it expires</param>\n    /// <param name=\"protectContent\">Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> PostStoryAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        InputStoryContent content,\n        int activePeriod,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        IEnumerable<StoryArea>? areas = null,\n        bool? postToChatPage = null,\n        bool? protectContent = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.Content, content ?? throw new ArgumentNullException(nameof(content)) },\n            { PropertyNames.ActivePeriod, activePeriod },\n        };\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (areas is not null)\n        {\n            args.Add(PropertyNames.Areas, areas);\n        }\n        if (postToChatPage is not null)\n        {\n            args.Add(PropertyNames.PostToChatPage, postToChatPage);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.PostStory, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/promoteChatMember.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass <em>False</em> for all boolean parameters to demote a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"PromoteChatMember\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool PromoteChatMember(\n        this ITelegramBotClient client,\n        PromoteChatMemberArgs args\n    ) => client.PromoteChatMemberAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass <em>False</em> for all boolean parameters to demote a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"PromoteChatMember\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> PromoteChatMemberAsync(\n        this ITelegramBotClient client,\n        PromoteChatMemberArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.PromoteChatMember, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass <em>False</em> for all boolean parameters to demote a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"isAnonymous\">Pass <em>True</em> if the administrator's presence in the chat is hidden</param>\n    /// <param name=\"canManageChat\">Pass <em>True</em> if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other administrator privilege.</param>\n    /// <param name=\"canDeleteMessages\">Pass <em>True</em> if the administrator can delete messages of other users</param>\n    /// <param name=\"canManageVideoChats\">Pass <em>True</em> if the administrator can manage video chats</param>\n    /// <param name=\"canRestrictMembers\">Pass <em>True</em> if the administrator can restrict, ban or unban chat members, or access supergroup statistics. For backward compatibility, defaults to <em>True</em> for promotions of channel administrators</param>\n    /// <param name=\"canPromoteMembers\">Pass <em>True</em> if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by him)</param>\n    /// <param name=\"canChangeInfo\">Pass <em>True</em> if the administrator can change chat title, photo and other settings</param>\n    /// <param name=\"canInviteUsers\">Pass <em>True</em> if the administrator can invite new users to the chat</param>\n    /// <param name=\"canPostStories\">Pass <em>True</em> if the administrator can post stories to the chat</param>\n    /// <param name=\"canEditStories\">Pass <em>True</em> if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive</param>\n    /// <param name=\"canDeleteStories\">Pass <em>True</em> if the administrator can delete stories posted by other users</param>\n    /// <param name=\"canPostMessages\">Pass <em>True</em> if the administrator can post messages in the channel, approve suggested posts, or access channel statistics; for channels only</param>\n    /// <param name=\"canEditMessages\">Pass <em>True</em> if the administrator can edit messages of other users and can pin messages; for channels only</param>\n    /// <param name=\"canPinMessages\">Pass <em>True</em> if the administrator can pin messages; for supergroups only</param>\n    /// <param name=\"canManageTopics\">Pass <em>True</em> if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only</param>\n    /// <param name=\"canManageDirectMessages\">Pass <em>True</em> if the administrator can manage direct messages within the channel and decline suggested posts; for channels only</param>\n    /// <param name=\"canManageTags\">Pass <em>True</em> if the administrator can edit the tags of regular members; for groups and supergroups only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool PromoteChatMember(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        bool? isAnonymous = null,\n        bool? canManageChat = null,\n        bool? canDeleteMessages = null,\n        bool? canManageVideoChats = null,\n        bool? canRestrictMembers = null,\n        bool? canPromoteMembers = null,\n        bool? canChangeInfo = null,\n        bool? canInviteUsers = null,\n        bool? canPostStories = null,\n        bool? canEditStories = null,\n        bool? canDeleteStories = null,\n        bool? canPostMessages = null,\n        bool? canEditMessages = null,\n        bool? canPinMessages = null,\n        bool? canManageTopics = null,\n        bool? canManageDirectMessages = null,\n        bool? canManageTags = null\n    ) =>\n        client\n            .PromoteChatMemberAsync(\n                chatId,\n                userId,\n                isAnonymous,\n                canManageChat,\n                canDeleteMessages,\n                canManageVideoChats,\n                canRestrictMembers,\n                canPromoteMembers,\n                canChangeInfo,\n                canInviteUsers,\n                canPostStories,\n                canEditStories,\n                canDeleteStories,\n                canPostMessages,\n                canEditMessages,\n                canPinMessages,\n                canManageTopics,\n                canManageDirectMessages,\n                canManageTags\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass <em>False</em> for all boolean parameters to demote a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"isAnonymous\">Pass <em>True</em> if the administrator's presence in the chat is hidden</param>\n    /// <param name=\"canManageChat\">Pass <em>True</em> if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other administrator privilege.</param>\n    /// <param name=\"canDeleteMessages\">Pass <em>True</em> if the administrator can delete messages of other users</param>\n    /// <param name=\"canManageVideoChats\">Pass <em>True</em> if the administrator can manage video chats</param>\n    /// <param name=\"canRestrictMembers\">Pass <em>True</em> if the administrator can restrict, ban or unban chat members, or access supergroup statistics. For backward compatibility, defaults to <em>True</em> for promotions of channel administrators</param>\n    /// <param name=\"canPromoteMembers\">Pass <em>True</em> if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by him)</param>\n    /// <param name=\"canChangeInfo\">Pass <em>True</em> if the administrator can change chat title, photo and other settings</param>\n    /// <param name=\"canInviteUsers\">Pass <em>True</em> if the administrator can invite new users to the chat</param>\n    /// <param name=\"canPostStories\">Pass <em>True</em> if the administrator can post stories to the chat</param>\n    /// <param name=\"canEditStories\">Pass <em>True</em> if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive</param>\n    /// <param name=\"canDeleteStories\">Pass <em>True</em> if the administrator can delete stories posted by other users</param>\n    /// <param name=\"canPostMessages\">Pass <em>True</em> if the administrator can post messages in the channel, approve suggested posts, or access channel statistics; for channels only</param>\n    /// <param name=\"canEditMessages\">Pass <em>True</em> if the administrator can edit messages of other users and can pin messages; for channels only</param>\n    /// <param name=\"canPinMessages\">Pass <em>True</em> if the administrator can pin messages; for supergroups only</param>\n    /// <param name=\"canManageTopics\">Pass <em>True</em> if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only</param>\n    /// <param name=\"canManageDirectMessages\">Pass <em>True</em> if the administrator can manage direct messages within the channel and decline suggested posts; for channels only</param>\n    /// <param name=\"canManageTags\">Pass <em>True</em> if the administrator can edit the tags of regular members; for groups and supergroups only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> PromoteChatMemberAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        bool? isAnonymous = null,\n        bool? canManageChat = null,\n        bool? canDeleteMessages = null,\n        bool? canManageVideoChats = null,\n        bool? canRestrictMembers = null,\n        bool? canPromoteMembers = null,\n        bool? canChangeInfo = null,\n        bool? canInviteUsers = null,\n        bool? canPostStories = null,\n        bool? canEditStories = null,\n        bool? canDeleteStories = null,\n        bool? canPostMessages = null,\n        bool? canEditMessages = null,\n        bool? canPinMessages = null,\n        bool? canManageTopics = null,\n        bool? canManageDirectMessages = null,\n        bool? canManageTags = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n        };\n        if (isAnonymous is not null)\n        {\n            args.Add(PropertyNames.IsAnonymous, isAnonymous);\n        }\n        if (canManageChat is not null)\n        {\n            args.Add(PropertyNames.CanManageChat, canManageChat);\n        }\n        if (canDeleteMessages is not null)\n        {\n            args.Add(PropertyNames.CanDeleteMessages, canDeleteMessages);\n        }\n        if (canManageVideoChats is not null)\n        {\n            args.Add(PropertyNames.CanManageVideoChats, canManageVideoChats);\n        }\n        if (canRestrictMembers is not null)\n        {\n            args.Add(PropertyNames.CanRestrictMembers, canRestrictMembers);\n        }\n        if (canPromoteMembers is not null)\n        {\n            args.Add(PropertyNames.CanPromoteMembers, canPromoteMembers);\n        }\n        if (canChangeInfo is not null)\n        {\n            args.Add(PropertyNames.CanChangeInfo, canChangeInfo);\n        }\n        if (canInviteUsers is not null)\n        {\n            args.Add(PropertyNames.CanInviteUsers, canInviteUsers);\n        }\n        if (canPostStories is not null)\n        {\n            args.Add(PropertyNames.CanPostStories, canPostStories);\n        }\n        if (canEditStories is not null)\n        {\n            args.Add(PropertyNames.CanEditStories, canEditStories);\n        }\n        if (canDeleteStories is not null)\n        {\n            args.Add(PropertyNames.CanDeleteStories, canDeleteStories);\n        }\n        if (canPostMessages is not null)\n        {\n            args.Add(PropertyNames.CanPostMessages, canPostMessages);\n        }\n        if (canEditMessages is not null)\n        {\n            args.Add(PropertyNames.CanEditMessages, canEditMessages);\n        }\n        if (canPinMessages is not null)\n        {\n            args.Add(PropertyNames.CanPinMessages, canPinMessages);\n        }\n        if (canManageTopics is not null)\n        {\n            args.Add(PropertyNames.CanManageTopics, canManageTopics);\n        }\n        if (canManageDirectMessages is not null)\n        {\n            args.Add(PropertyNames.CanManageDirectMessages, canManageDirectMessages);\n        }\n        if (canManageTags is not null)\n        {\n            args.Add(PropertyNames.CanManageTags, canManageTags);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.PromoteChatMember, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass <em>False</em> for all boolean parameters to demote a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"isAnonymous\">Pass <em>True</em> if the administrator's presence in the chat is hidden</param>\n    /// <param name=\"canManageChat\">Pass <em>True</em> if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other administrator privilege.</param>\n    /// <param name=\"canDeleteMessages\">Pass <em>True</em> if the administrator can delete messages of other users</param>\n    /// <param name=\"canManageVideoChats\">Pass <em>True</em> if the administrator can manage video chats</param>\n    /// <param name=\"canRestrictMembers\">Pass <em>True</em> if the administrator can restrict, ban or unban chat members, or access supergroup statistics. For backward compatibility, defaults to <em>True</em> for promotions of channel administrators</param>\n    /// <param name=\"canPromoteMembers\">Pass <em>True</em> if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by him)</param>\n    /// <param name=\"canChangeInfo\">Pass <em>True</em> if the administrator can change chat title, photo and other settings</param>\n    /// <param name=\"canInviteUsers\">Pass <em>True</em> if the administrator can invite new users to the chat</param>\n    /// <param name=\"canPostStories\">Pass <em>True</em> if the administrator can post stories to the chat</param>\n    /// <param name=\"canEditStories\">Pass <em>True</em> if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive</param>\n    /// <param name=\"canDeleteStories\">Pass <em>True</em> if the administrator can delete stories posted by other users</param>\n    /// <param name=\"canPostMessages\">Pass <em>True</em> if the administrator can post messages in the channel, approve suggested posts, or access channel statistics; for channels only</param>\n    /// <param name=\"canEditMessages\">Pass <em>True</em> if the administrator can edit messages of other users and can pin messages; for channels only</param>\n    /// <param name=\"canPinMessages\">Pass <em>True</em> if the administrator can pin messages; for supergroups only</param>\n    /// <param name=\"canManageTopics\">Pass <em>True</em> if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only</param>\n    /// <param name=\"canManageDirectMessages\">Pass <em>True</em> if the administrator can manage direct messages within the channel and decline suggested posts; for channels only</param>\n    /// <param name=\"canManageTags\">Pass <em>True</em> if the administrator can edit the tags of regular members; for groups and supergroups only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool PromoteChatMember(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        bool? isAnonymous = null,\n        bool? canManageChat = null,\n        bool? canDeleteMessages = null,\n        bool? canManageVideoChats = null,\n        bool? canRestrictMembers = null,\n        bool? canPromoteMembers = null,\n        bool? canChangeInfo = null,\n        bool? canInviteUsers = null,\n        bool? canPostStories = null,\n        bool? canEditStories = null,\n        bool? canDeleteStories = null,\n        bool? canPostMessages = null,\n        bool? canEditMessages = null,\n        bool? canPinMessages = null,\n        bool? canManageTopics = null,\n        bool? canManageDirectMessages = null,\n        bool? canManageTags = null\n    ) =>\n        client\n            .PromoteChatMemberAsync(\n                chatId,\n                userId,\n                isAnonymous,\n                canManageChat,\n                canDeleteMessages,\n                canManageVideoChats,\n                canRestrictMembers,\n                canPromoteMembers,\n                canChangeInfo,\n                canInviteUsers,\n                canPostStories,\n                canEditStories,\n                canDeleteStories,\n                canPostMessages,\n                canEditMessages,\n                canPinMessages,\n                canManageTopics,\n                canManageDirectMessages,\n                canManageTags\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass <em>False</em> for all boolean parameters to demote a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"isAnonymous\">Pass <em>True</em> if the administrator's presence in the chat is hidden</param>\n    /// <param name=\"canManageChat\">Pass <em>True</em> if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other administrator privilege.</param>\n    /// <param name=\"canDeleteMessages\">Pass <em>True</em> if the administrator can delete messages of other users</param>\n    /// <param name=\"canManageVideoChats\">Pass <em>True</em> if the administrator can manage video chats</param>\n    /// <param name=\"canRestrictMembers\">Pass <em>True</em> if the administrator can restrict, ban or unban chat members, or access supergroup statistics. For backward compatibility, defaults to <em>True</em> for promotions of channel administrators</param>\n    /// <param name=\"canPromoteMembers\">Pass <em>True</em> if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by him)</param>\n    /// <param name=\"canChangeInfo\">Pass <em>True</em> if the administrator can change chat title, photo and other settings</param>\n    /// <param name=\"canInviteUsers\">Pass <em>True</em> if the administrator can invite new users to the chat</param>\n    /// <param name=\"canPostStories\">Pass <em>True</em> if the administrator can post stories to the chat</param>\n    /// <param name=\"canEditStories\">Pass <em>True</em> if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive</param>\n    /// <param name=\"canDeleteStories\">Pass <em>True</em> if the administrator can delete stories posted by other users</param>\n    /// <param name=\"canPostMessages\">Pass <em>True</em> if the administrator can post messages in the channel, approve suggested posts, or access channel statistics; for channels only</param>\n    /// <param name=\"canEditMessages\">Pass <em>True</em> if the administrator can edit messages of other users and can pin messages; for channels only</param>\n    /// <param name=\"canPinMessages\">Pass <em>True</em> if the administrator can pin messages; for supergroups only</param>\n    /// <param name=\"canManageTopics\">Pass <em>True</em> if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only</param>\n    /// <param name=\"canManageDirectMessages\">Pass <em>True</em> if the administrator can manage direct messages within the channel and decline suggested posts; for channels only</param>\n    /// <param name=\"canManageTags\">Pass <em>True</em> if the administrator can edit the tags of regular members; for groups and supergroups only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> PromoteChatMemberAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        bool? isAnonymous = null,\n        bool? canManageChat = null,\n        bool? canDeleteMessages = null,\n        bool? canManageVideoChats = null,\n        bool? canRestrictMembers = null,\n        bool? canPromoteMembers = null,\n        bool? canChangeInfo = null,\n        bool? canInviteUsers = null,\n        bool? canPostStories = null,\n        bool? canEditStories = null,\n        bool? canDeleteStories = null,\n        bool? canPostMessages = null,\n        bool? canEditMessages = null,\n        bool? canPinMessages = null,\n        bool? canManageTopics = null,\n        bool? canManageDirectMessages = null,\n        bool? canManageTags = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n        };\n        if (isAnonymous is not null)\n        {\n            args.Add(PropertyNames.IsAnonymous, isAnonymous);\n        }\n        if (canManageChat is not null)\n        {\n            args.Add(PropertyNames.CanManageChat, canManageChat);\n        }\n        if (canDeleteMessages is not null)\n        {\n            args.Add(PropertyNames.CanDeleteMessages, canDeleteMessages);\n        }\n        if (canManageVideoChats is not null)\n        {\n            args.Add(PropertyNames.CanManageVideoChats, canManageVideoChats);\n        }\n        if (canRestrictMembers is not null)\n        {\n            args.Add(PropertyNames.CanRestrictMembers, canRestrictMembers);\n        }\n        if (canPromoteMembers is not null)\n        {\n            args.Add(PropertyNames.CanPromoteMembers, canPromoteMembers);\n        }\n        if (canChangeInfo is not null)\n        {\n            args.Add(PropertyNames.CanChangeInfo, canChangeInfo);\n        }\n        if (canInviteUsers is not null)\n        {\n            args.Add(PropertyNames.CanInviteUsers, canInviteUsers);\n        }\n        if (canPostStories is not null)\n        {\n            args.Add(PropertyNames.CanPostStories, canPostStories);\n        }\n        if (canEditStories is not null)\n        {\n            args.Add(PropertyNames.CanEditStories, canEditStories);\n        }\n        if (canDeleteStories is not null)\n        {\n            args.Add(PropertyNames.CanDeleteStories, canDeleteStories);\n        }\n        if (canPostMessages is not null)\n        {\n            args.Add(PropertyNames.CanPostMessages, canPostMessages);\n        }\n        if (canEditMessages is not null)\n        {\n            args.Add(PropertyNames.CanEditMessages, canEditMessages);\n        }\n        if (canPinMessages is not null)\n        {\n            args.Add(PropertyNames.CanPinMessages, canPinMessages);\n        }\n        if (canManageTopics is not null)\n        {\n            args.Add(PropertyNames.CanManageTopics, canManageTopics);\n        }\n        if (canManageDirectMessages is not null)\n        {\n            args.Add(PropertyNames.CanManageDirectMessages, canManageDirectMessages);\n        }\n        if (canManageTags is not null)\n        {\n            args.Add(PropertyNames.CanManageTags, canManageTags);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.PromoteChatMember, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/readBusinessMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Marks incoming message as read on behalf of a business account. Requires the <em>can_read_messages</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to read the message</param>\n    /// <param name=\"chatId\">Unique identifier of the chat in which the message was received. The chat must have been active in the last 24 hours.</param>\n    /// <param name=\"messageId\">Unique identifier of the message to mark as read</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ReadBusinessMessage(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long chatId,\n        int messageId\n    ) =>\n        client\n            .ReadBusinessMessageAsync(businessConnectionId, chatId, messageId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Marks incoming message as read on behalf of a business account. Requires the <em>can_read_messages</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to read the message</param>\n    /// <param name=\"chatId\">Unique identifier of the chat in which the message was received. The chat must have been active in the last 24 hours.</param>\n    /// <param name=\"messageId\">Unique identifier of the message to mark as read</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ReadBusinessMessageAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long chatId,\n        int messageId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ReadBusinessMessage,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/removeBusinessAccountProfilePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Removes the current profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"isPublic\">Pass <em>True</em> to remove the public photo, which is visible even if the main photo is hidden by the business account's privacy settings. After the main photo is removed, the previous profile photo (if present) becomes the main photo.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveBusinessAccountProfilePhoto(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool? isPublic = null\n    ) =>\n        client\n            .RemoveBusinessAccountProfilePhotoAsync(businessConnectionId, isPublic)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Removes the current profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"isPublic\">Pass <em>True</em> to remove the public photo, which is visible even if the main photo is hidden by the business account's privacy settings. After the main photo is removed, the previous profile photo (if present) becomes the main photo.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveBusinessAccountProfilePhotoAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool? isPublic = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n        if (isPublic is not null)\n        {\n            args.Add(PropertyNames.IsPublic, isPublic);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveBusinessAccountProfilePhoto,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/removeChatVerification.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot or channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveChatVerification(this ITelegramBotClient client, long chatId) =>\n        client.RemoveChatVerificationAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot or channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveChatVerificationAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveChatVerification,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot or channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveChatVerification(this ITelegramBotClient client, string chatId) =>\n        client.RemoveChatVerificationAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot or channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveChatVerificationAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveChatVerification,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/removeMyProfilePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Removes the profile photo of the bot. Requires no parameters. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveMyProfilePhoto(this ITelegramBotClient client) =>\n        client.RemoveMyProfilePhotoAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes the profile photo of the bot. Requires no parameters. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveMyProfilePhotoAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveMyProfilePhoto,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/removeUserVerification.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Removes verification from a user who is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveUserVerification(this ITelegramBotClient client, long userId) =>\n        client.RemoveUserVerificationAsync(userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a user who is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveUserVerificationAsync(\n        this ITelegramBotClient client,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveUserVerification,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/reopenForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to reopen a closed topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ReopenForumTopic(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId\n    ) => client.ReopenForumTopicAsync(chatId, messageThreadId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to reopen a closed topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ReopenForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.ReopenForumTopic, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to reopen a closed topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ReopenForumTopic(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId\n    ) => client.ReopenForumTopicAsync(chatId, messageThreadId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to reopen a closed topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights, unless it is the creator of the topic. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ReopenForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.ReopenForumTopic, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/reopenGeneralForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to reopen a closed 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. The topic will be automatically unhidden if it was hidden. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ReopenGeneralForumTopic(this ITelegramBotClient client, long chatId) =>\n        client.ReopenGeneralForumTopicAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to reopen a closed 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. The topic will be automatically unhidden if it was hidden. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ReopenGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ReopenGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to reopen a closed 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. The topic will be automatically unhidden if it was hidden. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ReopenGeneralForumTopic(this ITelegramBotClient client, string chatId) =>\n        client.ReopenGeneralForumTopicAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to reopen a closed 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. The topic will be automatically unhidden if it was hidden. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ReopenGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ReopenGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/replaceManagedBotToken.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to revoke the current token of a managed bot and generate a new one. Returns the new token as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the managed bot whose token will be replaced</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static string ReplaceManagedBotToken(this ITelegramBotClient client, long userId) =>\n        client.ReplaceManagedBotTokenAsync(userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to revoke the current token of a managed bot and generate a new one. Returns the new token as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the managed bot whose token will be replaced</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<string> ReplaceManagedBotTokenAsync(\n        this ITelegramBotClient client,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n\n        return client.CallMethodAsync<string>(\n            MethodNames.ReplaceManagedBotToken,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/repostStory.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Reposts a story on behalf of a business account from another business account. Both business accounts must be managed by the same bot, and the story on the source account must have been posted (or reposted) by the bot. Requires the <em>can_manage_stories</em> business bot right for both business accounts. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"RepostStory\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story RepostStory(this ITelegramBotClient client, RepostStoryArgs args) =>\n        client.RepostStoryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Reposts a story on behalf of a business account from another business account. Both business accounts must be managed by the same bot, and the story on the source account must have been posted (or reposted) by the bot. Requires the <em>can_manage_stories</em> business bot right for both business accounts. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"RepostStory\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> RepostStoryAsync(\n        this ITelegramBotClient client,\n        RepostStoryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.RepostStory, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Reposts a story on behalf of a business account from another business account. Both business accounts must be managed by the same bot, and the story on the source account must have been posted (or reposted) by the bot. Requires the <em>can_manage_stories</em> business bot right for both business accounts. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"fromChatId\">Unique identifier of the chat which posted the story that should be reposted</param>\n    /// <param name=\"fromStoryId\">Unique identifier of the story that should be reposted</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    /// <param name=\"postToChatPage\">Pass <em>True</em> to keep the story accessible after it expires</param>\n    /// <param name=\"protectContent\">Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story RepostStory(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long fromChatId,\n        int fromStoryId,\n        int activePeriod,\n        bool? postToChatPage = null,\n        bool? protectContent = null\n    ) =>\n        client\n            .RepostStoryAsync(\n                businessConnectionId,\n                fromChatId,\n                fromStoryId,\n                activePeriod,\n                postToChatPage,\n                protectContent\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Reposts a story on behalf of a business account from another business account. Both business accounts must be managed by the same bot, and the story on the source account must have been posted (or reposted) by the bot. Requires the <em>can_manage_stories</em> business bot right for both business accounts. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"fromChatId\">Unique identifier of the chat which posted the story that should be reposted</param>\n    /// <param name=\"fromStoryId\">Unique identifier of the story that should be reposted</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    /// <param name=\"postToChatPage\">Pass <em>True</em> to keep the story accessible after it expires</param>\n    /// <param name=\"protectContent\">Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> RepostStoryAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long fromChatId,\n        int fromStoryId,\n        int activePeriod,\n        bool? postToChatPage = null,\n        bool? protectContent = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.FromChatId, fromChatId },\n            { PropertyNames.FromStoryId, fromStoryId },\n            { PropertyNames.ActivePeriod, activePeriod },\n        };\n        if (postToChatPage is not null)\n        {\n            args.Add(PropertyNames.PostToChatPage, postToChatPage);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.RepostStory, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/restrictChatMember.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass <em>True</em> for all permissions to lift restrictions from a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"RestrictChatMember\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RestrictChatMember(\n        this ITelegramBotClient client,\n        RestrictChatMemberArgs args\n    ) => client.RestrictChatMemberAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass <em>True</em> for all permissions to lift restrictions from a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"RestrictChatMember\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RestrictChatMemberAsync(\n        this ITelegramBotClient client,\n        RestrictChatMemberArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RestrictChatMember,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass <em>True</em> for all permissions to lift restrictions from a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"permissions\">A JSON-serialized object for new user permissions</param>\n    /// <param name=\"useIndependentChatPermissions\">Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.</param>\n    /// <param name=\"untilDate\">Date when restrictions will be lifted for the user; Unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RestrictChatMember(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        ChatPermissions permissions,\n        bool? useIndependentChatPermissions = null,\n        int? untilDate = null\n    ) =>\n        client\n            .RestrictChatMemberAsync(\n                chatId,\n                userId,\n                permissions,\n                useIndependentChatPermissions,\n                untilDate\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass <em>True</em> for all permissions to lift restrictions from a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"permissions\">A JSON-serialized object for new user permissions</param>\n    /// <param name=\"useIndependentChatPermissions\">Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.</param>\n    /// <param name=\"untilDate\">Date when restrictions will be lifted for the user; Unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RestrictChatMemberAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        ChatPermissions permissions,\n        bool? useIndependentChatPermissions = null,\n        int? untilDate = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n            {\n                PropertyNames.Permissions,\n                permissions ?? throw new ArgumentNullException(nameof(permissions))\n            },\n        };\n        if (useIndependentChatPermissions is not null)\n        {\n            args.Add(PropertyNames.UseIndependentChatPermissions, useIndependentChatPermissions);\n        }\n        if (untilDate is not null)\n        {\n            args.Add(PropertyNames.UntilDate, untilDate);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RestrictChatMember,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass <em>True</em> for all permissions to lift restrictions from a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"permissions\">A JSON-serialized object for new user permissions</param>\n    /// <param name=\"useIndependentChatPermissions\">Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.</param>\n    /// <param name=\"untilDate\">Date when restrictions will be lifted for the user; Unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RestrictChatMember(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        ChatPermissions permissions,\n        bool? useIndependentChatPermissions = null,\n        int? untilDate = null\n    ) =>\n        client\n            .RestrictChatMemberAsync(\n                chatId,\n                userId,\n                permissions,\n                useIndependentChatPermissions,\n                untilDate\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass <em>True</em> for all permissions to lift restrictions from a user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"permissions\">A JSON-serialized object for new user permissions</param>\n    /// <param name=\"useIndependentChatPermissions\">Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.</param>\n    /// <param name=\"untilDate\">Date when restrictions will be lifted for the user; Unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RestrictChatMemberAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        ChatPermissions permissions,\n        bool? useIndependentChatPermissions = null,\n        int? untilDate = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n            {\n                PropertyNames.Permissions,\n                permissions ?? throw new ArgumentNullException(nameof(permissions))\n            },\n        };\n        if (useIndependentChatPermissions is not null)\n        {\n            args.Add(PropertyNames.UseIndependentChatPermissions, useIndependentChatPermissions);\n        }\n        if (untilDate is not null)\n        {\n            args.Add(PropertyNames.UntilDate, untilDate);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RestrictChatMember,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/revokeChatInviteLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to revoke an invite link created by the bot. If the primary link is revoked, a new link is automatically generated. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the revoked invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier of the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to revoke</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink RevokeChatInviteLink(\n        this ITelegramBotClient client,\n        long chatId,\n        string inviteLink\n    ) => client.RevokeChatInviteLinkAsync(chatId, inviteLink).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to revoke an invite link created by the bot. If the primary link is revoked, a new link is automatically generated. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the revoked invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier of the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to revoke</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> RevokeChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string inviteLink,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.InviteLink,\n                inviteLink ?? throw new ArgumentNullException(nameof(inviteLink))\n            },\n        };\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.RevokeChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to revoke an invite link created by the bot. If the primary link is revoked, a new link is automatically generated. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the revoked invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier of the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to revoke</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static ChatInviteLink RevokeChatInviteLink(\n        this ITelegramBotClient client,\n        string chatId,\n        string inviteLink\n    ) => client.RevokeChatInviteLinkAsync(chatId, inviteLink).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to revoke an invite link created by the bot. If the primary link is revoked, a new link is automatically generated. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the revoked invite link as <see cref=\"ChatInviteLink\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier of the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"inviteLink\">The invite link to revoke</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<ChatInviteLink> RevokeChatInviteLinkAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string inviteLink,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.InviteLink,\n                inviteLink ?? throw new ArgumentNullException(nameof(inviteLink))\n            },\n        };\n\n        return client.CallMethodAsync<ChatInviteLink>(\n            MethodNames.RevokeChatInviteLink,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/savePreparedInlineMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.InlineMode;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Stores a message that can be sent by a user of a Mini App. Returns a <see cref=\"PreparedInlineMessage\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SavePreparedInlineMessage\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static PreparedInlineMessage SavePreparedInlineMessage(\n        this ITelegramBotClient client,\n        SavePreparedInlineMessageArgs args\n    ) => client.SavePreparedInlineMessageAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Stores a message that can be sent by a user of a Mini App. Returns a <see cref=\"PreparedInlineMessage\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SavePreparedInlineMessage\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<PreparedInlineMessage> SavePreparedInlineMessageAsync(\n        this ITelegramBotClient client,\n        SavePreparedInlineMessageArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<PreparedInlineMessage>(\n            MethodNames.SavePreparedInlineMessage,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Stores a message that can be sent by a user of a Mini App. Returns a <see cref=\"PreparedInlineMessage\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user that can use the prepared message</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    /// <param name=\"allowUserChats\">Pass <em>True</em> if the message can be sent to private chats with users</param>\n    /// <param name=\"allowBotChats\">Pass <em>True</em> if the message can be sent to private chats with bots</param>\n    /// <param name=\"allowGroupChats\">Pass <em>True</em> if the message can be sent to group and supergroup chats</param>\n    /// <param name=\"allowChannelChats\">Pass <em>True</em> if the message can be sent to channel chats</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static PreparedInlineMessage SavePreparedInlineMessage(\n        this ITelegramBotClient client,\n        long userId,\n        InlineQueryResult result,\n        bool? allowUserChats = null,\n        bool? allowBotChats = null,\n        bool? allowGroupChats = null,\n        bool? allowChannelChats = null\n    ) =>\n        client\n            .SavePreparedInlineMessageAsync(\n                userId,\n                result,\n                allowUserChats,\n                allowBotChats,\n                allowGroupChats,\n                allowChannelChats\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Stores a message that can be sent by a user of a Mini App. Returns a <see cref=\"PreparedInlineMessage\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user that can use the prepared message</param>\n    /// <param name=\"result\">A JSON-serialized object describing the message to be sent</param>\n    /// <param name=\"allowUserChats\">Pass <em>True</em> if the message can be sent to private chats with users</param>\n    /// <param name=\"allowBotChats\">Pass <em>True</em> if the message can be sent to private chats with bots</param>\n    /// <param name=\"allowGroupChats\">Pass <em>True</em> if the message can be sent to group and supergroup chats</param>\n    /// <param name=\"allowChannelChats\">Pass <em>True</em> if the message can be sent to channel chats</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<PreparedInlineMessage> SavePreparedInlineMessageAsync(\n        this ITelegramBotClient client,\n        long userId,\n        InlineQueryResult result,\n        bool? allowUserChats = null,\n        bool? allowBotChats = null,\n        bool? allowGroupChats = null,\n        bool? allowChannelChats = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Result, result ?? throw new ArgumentNullException(nameof(result)) },\n        };\n        if (allowUserChats is not null)\n        {\n            args.Add(PropertyNames.AllowUserChats, allowUserChats);\n        }\n        if (allowBotChats is not null)\n        {\n            args.Add(PropertyNames.AllowBotChats, allowBotChats);\n        }\n        if (allowGroupChats is not null)\n        {\n            args.Add(PropertyNames.AllowGroupChats, allowGroupChats);\n        }\n        if (allowChannelChats is not null)\n        {\n            args.Add(PropertyNames.AllowChannelChats, allowChannelChats);\n        }\n\n        return client.CallMethodAsync<PreparedInlineMessage>(\n            MethodNames.SavePreparedInlineMessage,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/savePreparedKeyboardButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Stores a keyboard button that can be used by a user within a Mini App. Returns a <see cref=\"PreparedKeyboardButton\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SavePreparedKeyboardButton\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static PreparedKeyboardButton SavePreparedKeyboardButton(\n        this ITelegramBotClient client,\n        SavePreparedKeyboardButtonArgs args\n    ) => client.SavePreparedKeyboardButtonAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Stores a keyboard button that can be used by a user within a Mini App. Returns a <see cref=\"PreparedKeyboardButton\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SavePreparedKeyboardButton\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<PreparedKeyboardButton> SavePreparedKeyboardButtonAsync(\n        this ITelegramBotClient client,\n        SavePreparedKeyboardButtonArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<PreparedKeyboardButton>(\n            MethodNames.SavePreparedKeyboardButton,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Stores a keyboard button that can be used by a user within a Mini App. Returns a <see cref=\"PreparedKeyboardButton\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user that can use the button</param>\n    /// <param name=\"button\">A JSON-serialized object describing the button to be saved. The button must be of the type <em>request_users</em>, <em>request_chat</em>, or <em>request_managed_bot</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static PreparedKeyboardButton SavePreparedKeyboardButton(\n        this ITelegramBotClient client,\n        long userId,\n        KeyboardButton button\n    ) => client.SavePreparedKeyboardButtonAsync(userId, button).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Stores a keyboard button that can be used by a user within a Mini App. Returns a <see cref=\"PreparedKeyboardButton\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user that can use the button</param>\n    /// <param name=\"button\">A JSON-serialized object describing the button to be saved. The button must be of the type <em>request_users</em>, <em>request_chat</em>, or <em>request_managed_bot</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<PreparedKeyboardButton> SavePreparedKeyboardButtonAsync(\n        this ITelegramBotClient client,\n        long userId,\n        KeyboardButton button,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Button, button ?? throw new ArgumentNullException(nameof(button)) },\n        };\n\n        return client.CallMethodAsync<PreparedKeyboardButton>(\n            MethodNames.SavePreparedKeyboardButton,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendAnimation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendAnimation\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAnimation(this ITelegramBotClient client, SendAnimationArgs args) =>\n        client.SendAnimationAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendAnimation\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAnimationAsync(\n        this ITelegramBotClient client,\n        SendAnimationArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAnimation, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent animation in seconds</param>\n    /// <param name=\"width\">Animation width</param>\n    /// <param name=\"height\">Animation height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the animation needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAnimation(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile animation,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendAnimationAsync(\n                chatId,\n                animation,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                width,\n                height,\n                thumbnail,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent animation in seconds</param>\n    /// <param name=\"width\">Animation width</param>\n    /// <param name=\"height\">Animation height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the animation needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAnimationAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile animation,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.Animation,\n                animation ?? throw new ArgumentNullException(nameof(animation))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (width is not null)\n        {\n            args.Add(PropertyNames.Width, width);\n        }\n        if (height is not null)\n        {\n            args.Add(PropertyNames.Height, height);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAnimation, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent animation in seconds</param>\n    /// <param name=\"width\">Animation width</param>\n    /// <param name=\"height\">Animation height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the animation needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAnimation(\n        this ITelegramBotClient client,\n        long chatId,\n        string animation,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        string? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendAnimationAsync(\n                chatId,\n                animation,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                width,\n                height,\n                thumbnail,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent animation in seconds</param>\n    /// <param name=\"width\">Animation width</param>\n    /// <param name=\"height\">Animation height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the animation needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAnimationAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string animation,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        string? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.Animation,\n                animation ?? throw new ArgumentNullException(nameof(animation))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (width is not null)\n        {\n            args.Add(PropertyNames.Width, width);\n        }\n        if (height is not null)\n        {\n            args.Add(PropertyNames.Height, height);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAnimation, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent animation in seconds</param>\n    /// <param name=\"width\">Animation width</param>\n    /// <param name=\"height\">Animation height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the animation needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAnimation(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile animation,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendAnimationAsync(\n                chatId,\n                animation,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                width,\n                height,\n                thumbnail,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent animation in seconds</param>\n    /// <param name=\"width\">Animation width</param>\n    /// <param name=\"height\">Animation height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the animation needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAnimationAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile animation,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.Animation,\n                animation ?? throw new ArgumentNullException(nameof(animation))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (width is not null)\n        {\n            args.Add(PropertyNames.Width, width);\n        }\n        if (height is not null)\n        {\n            args.Add(PropertyNames.Height, height);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAnimation, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent animation in seconds</param>\n    /// <param name=\"width\">Animation width</param>\n    /// <param name=\"height\">Animation height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the animation needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAnimation(\n        this ITelegramBotClient client,\n        string chatId,\n        string animation,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        string? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendAnimationAsync(\n                chatId,\n                animation,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                width,\n                height,\n                thumbnail,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"animation\">Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent animation in seconds</param>\n    /// <param name=\"width\">Animation width</param>\n    /// <param name=\"height\">Animation height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Animation caption (may also be used when resending animation by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the animation needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAnimationAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string animation,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        string? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.Animation,\n                animation ?? throw new ArgumentNullException(nameof(animation))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (width is not null)\n        {\n            args.Add(PropertyNames.Width, width);\n        }\n        if (height is not null)\n        {\n            args.Add(PropertyNames.Height, height);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAnimation, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendAudio.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendAudio\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAudio(this ITelegramBotClient client, SendAudioArgs args) =>\n        client.SendAudioAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendAudio\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAudioAsync(\n        this ITelegramBotClient client,\n        SendAudioArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAudio, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Audio caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the audio in seconds</param>\n    /// <param name=\"performer\">Performer</param>\n    /// <param name=\"title\">Track name</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAudio(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile audio,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        string? performer = null,\n        string? title = null,\n        InputFile? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendAudioAsync(\n                chatId,\n                audio,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                duration,\n                performer,\n                title,\n                thumbnail,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Audio caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the audio in seconds</param>\n    /// <param name=\"performer\">Performer</param>\n    /// <param name=\"title\">Track name</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAudioAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile audio,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        string? performer = null,\n        string? title = null,\n        InputFile? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Audio, audio ?? throw new ArgumentNullException(nameof(audio)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (performer is not null)\n        {\n            args.Add(PropertyNames.Performer, performer);\n        }\n        if (title is not null)\n        {\n            args.Add(PropertyNames.Title, title);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAudio, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Audio caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the audio in seconds</param>\n    /// <param name=\"performer\">Performer</param>\n    /// <param name=\"title\">Track name</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAudio(\n        this ITelegramBotClient client,\n        long chatId,\n        string audio,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        string? performer = null,\n        string? title = null,\n        string? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendAudioAsync(\n                chatId,\n                audio,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                duration,\n                performer,\n                title,\n                thumbnail,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Audio caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the audio in seconds</param>\n    /// <param name=\"performer\">Performer</param>\n    /// <param name=\"title\">Track name</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAudioAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string audio,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        string? performer = null,\n        string? title = null,\n        string? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Audio, audio ?? throw new ArgumentNullException(nameof(audio)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (performer is not null)\n        {\n            args.Add(PropertyNames.Performer, performer);\n        }\n        if (title is not null)\n        {\n            args.Add(PropertyNames.Title, title);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAudio, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Audio caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the audio in seconds</param>\n    /// <param name=\"performer\">Performer</param>\n    /// <param name=\"title\">Track name</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAudio(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile audio,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        string? performer = null,\n        string? title = null,\n        InputFile? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendAudioAsync(\n                chatId,\n                audio,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                duration,\n                performer,\n                title,\n                thumbnail,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Audio caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the audio in seconds</param>\n    /// <param name=\"performer\">Performer</param>\n    /// <param name=\"title\">Track name</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAudioAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile audio,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        string? performer = null,\n        string? title = null,\n        InputFile? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Audio, audio ?? throw new ArgumentNullException(nameof(audio)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (performer is not null)\n        {\n            args.Add(PropertyNames.Performer, performer);\n        }\n        if (title is not null)\n        {\n            args.Add(PropertyNames.Title, title);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAudio, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Audio caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the audio in seconds</param>\n    /// <param name=\"performer\">Performer</param>\n    /// <param name=\"title\">Track name</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendAudio(\n        this ITelegramBotClient client,\n        string chatId,\n        string audio,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        string? performer = null,\n        string? title = null,\n        string? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendAudioAsync(\n                chatId,\n                audio,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                duration,\n                performer,\n                title,\n                thumbnail,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.\n    /// For sending voice messages, use the <a href=\"https://core.telegram.org/bots/api#sendvoice\">sendVoice</a> method instead.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"audio\">Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Audio caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the audio in seconds</param>\n    /// <param name=\"performer\">Performer</param>\n    /// <param name=\"title\">Track name</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendAudioAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string audio,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        string? performer = null,\n        string? title = null,\n        string? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Audio, audio ?? throw new ArgumentNullException(nameof(audio)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (performer is not null)\n        {\n            args.Add(PropertyNames.Performer, performer);\n        }\n        if (title is not null)\n        {\n            args.Add(PropertyNames.Title, title);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendAudio, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendChatAction.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method when you need to tell the user that something is happening on the bot's side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status). Returns <em>True</em> on success.\n    /// We only recommend using this method when a response from the bot will take a <strong>noticeable</strong> amount of time to arrive.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Channel chats and channel direct messages chats aren't supported.</param>\n    /// <param name=\"action\">Type of action to broadcast. Choose one, depending on what the user is about to receive: <em>typing</em> for <a href=\"https://core.telegram.org/bots/api#sendmessage\">text messages</a>, <em>upload_photo</em> for <a href=\"https://core.telegram.org/bots/api#sendphoto\">photos</a>, <em>record_video</em> or <em>upload_video</em> for <a href=\"https://core.telegram.org/bots/api#sendvideo\">videos</a>, <em>record_voice</em> or <em>upload_voice</em> for <a href=\"https://core.telegram.org/bots/api#sendvoice\">voice notes</a>, <em>upload_document</em> for <a href=\"https://core.telegram.org/bots/api#senddocument\">general files</a>, <em>choose_sticker</em> for <a href=\"https://core.telegram.org/bots/api#sendsticker\">stickers</a>, <em>find_location</em> for <a href=\"https://core.telegram.org/bots/api#sendlocation\">location data</a>, <em>record_video_note</em> or <em>upload_video_note</em> for <a href=\"https://core.telegram.org/bots/api#sendvideonote\">video notes</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the action will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread or topic of a forum; for supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendChatAction(\n        this ITelegramBotClient client,\n        long chatId,\n        string action,\n        string? businessConnectionId = null,\n        int? messageThreadId = null\n    ) =>\n        client\n            .SendChatActionAsync(chatId, action, businessConnectionId, messageThreadId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method when you need to tell the user that something is happening on the bot's side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status). Returns <em>True</em> on success.\n    /// We only recommend using this method when a response from the bot will take a <strong>noticeable</strong> amount of time to arrive.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Channel chats and channel direct messages chats aren't supported.</param>\n    /// <param name=\"action\">Type of action to broadcast. Choose one, depending on what the user is about to receive: <em>typing</em> for <a href=\"https://core.telegram.org/bots/api#sendmessage\">text messages</a>, <em>upload_photo</em> for <a href=\"https://core.telegram.org/bots/api#sendphoto\">photos</a>, <em>record_video</em> or <em>upload_video</em> for <a href=\"https://core.telegram.org/bots/api#sendvideo\">videos</a>, <em>record_voice</em> or <em>upload_voice</em> for <a href=\"https://core.telegram.org/bots/api#sendvoice\">voice notes</a>, <em>upload_document</em> for <a href=\"https://core.telegram.org/bots/api#senddocument\">general files</a>, <em>choose_sticker</em> for <a href=\"https://core.telegram.org/bots/api#sendsticker\">stickers</a>, <em>find_location</em> for <a href=\"https://core.telegram.org/bots/api#sendlocation\">location data</a>, <em>record_video_note</em> or <em>upload_video_note</em> for <a href=\"https://core.telegram.org/bots/api#sendvideonote\">video notes</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the action will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread or topic of a forum; for supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendChatActionAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string action,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Action, action ?? throw new ArgumentNullException(nameof(action)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendChatAction, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method when you need to tell the user that something is happening on the bot's side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status). Returns <em>True</em> on success.\n    /// We only recommend using this method when a response from the bot will take a <strong>noticeable</strong> amount of time to arrive.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Channel chats and channel direct messages chats aren't supported.</param>\n    /// <param name=\"action\">Type of action to broadcast. Choose one, depending on what the user is about to receive: <em>typing</em> for <a href=\"https://core.telegram.org/bots/api#sendmessage\">text messages</a>, <em>upload_photo</em> for <a href=\"https://core.telegram.org/bots/api#sendphoto\">photos</a>, <em>record_video</em> or <em>upload_video</em> for <a href=\"https://core.telegram.org/bots/api#sendvideo\">videos</a>, <em>record_voice</em> or <em>upload_voice</em> for <a href=\"https://core.telegram.org/bots/api#sendvoice\">voice notes</a>, <em>upload_document</em> for <a href=\"https://core.telegram.org/bots/api#senddocument\">general files</a>, <em>choose_sticker</em> for <a href=\"https://core.telegram.org/bots/api#sendsticker\">stickers</a>, <em>find_location</em> for <a href=\"https://core.telegram.org/bots/api#sendlocation\">location data</a>, <em>record_video_note</em> or <em>upload_video_note</em> for <a href=\"https://core.telegram.org/bots/api#sendvideonote\">video notes</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the action will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread or topic of a forum; for supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendChatAction(\n        this ITelegramBotClient client,\n        string chatId,\n        string action,\n        string? businessConnectionId = null,\n        int? messageThreadId = null\n    ) =>\n        client\n            .SendChatActionAsync(chatId, action, businessConnectionId, messageThreadId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method when you need to tell the user that something is happening on the bot's side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status). Returns <em>True</em> on success.\n    /// We only recommend using this method when a response from the bot will take a <strong>noticeable</strong> amount of time to arrive.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Channel chats and channel direct messages chats aren't supported.</param>\n    /// <param name=\"action\">Type of action to broadcast. Choose one, depending on what the user is about to receive: <em>typing</em> for <a href=\"https://core.telegram.org/bots/api#sendmessage\">text messages</a>, <em>upload_photo</em> for <a href=\"https://core.telegram.org/bots/api#sendphoto\">photos</a>, <em>record_video</em> or <em>upload_video</em> for <a href=\"https://core.telegram.org/bots/api#sendvideo\">videos</a>, <em>record_voice</em> or <em>upload_voice</em> for <a href=\"https://core.telegram.org/bots/api#sendvoice\">voice notes</a>, <em>upload_document</em> for <a href=\"https://core.telegram.org/bots/api#senddocument\">general files</a>, <em>choose_sticker</em> for <a href=\"https://core.telegram.org/bots/api#sendsticker\">stickers</a>, <em>find_location</em> for <a href=\"https://core.telegram.org/bots/api#sendlocation\">location data</a>, <em>record_video_note</em> or <em>upload_video_note</em> for <a href=\"https://core.telegram.org/bots/api#sendvideonote\">video notes</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the action will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread or topic of a forum; for supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendChatActionAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string action,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Action, action ?? throw new ArgumentNullException(nameof(action)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendChatAction, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendChecklist.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send a checklist on behalf of a connected business account. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendChecklist\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendChecklist(this ITelegramBotClient client, SendChecklistArgs args) =>\n        client.SendChecklistAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send a checklist on behalf of a connected business account. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendChecklist\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendChecklistAsync(\n        this ITelegramBotClient client,\n        SendChecklistArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendChecklist, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send a checklist on behalf of a connected business account. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"checklist\">A JSON-serialized object for the checklist to send</param>\n    /// <param name=\"disableNotification\">Sends the message silently. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message</param>\n    /// <param name=\"replyParameters\">A JSON-serialized object for description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendChecklist(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long chatId,\n        InputChecklist checklist,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendChecklistAsync(\n                businessConnectionId,\n                chatId,\n                checklist,\n                disableNotification,\n                protectContent,\n                messageEffectId,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send a checklist on behalf of a connected business account. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"checklist\">A JSON-serialized object for the checklist to send</param>\n    /// <param name=\"disableNotification\">Sends the message silently. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message</param>\n    /// <param name=\"replyParameters\">A JSON-serialized object for description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendChecklistAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long chatId,\n        InputChecklist checklist,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.Checklist,\n                checklist ?? throw new ArgumentNullException(nameof(checklist))\n            },\n        };\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendChecklist, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send a checklist on behalf of a connected business account. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"checklist\">A JSON-serialized object for the checklist to send</param>\n    /// <param name=\"disableNotification\">Sends the message silently. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message</param>\n    /// <param name=\"replyParameters\">A JSON-serialized object for description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendChecklist(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string chatId,\n        InputChecklist checklist,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendChecklistAsync(\n                businessConnectionId,\n                chatId,\n                checklist,\n                disableNotification,\n                protectContent,\n                messageEffectId,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send a checklist on behalf of a connected business account. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"checklist\">A JSON-serialized object for the checklist to send</param>\n    /// <param name=\"disableNotification\">Sends the message silently. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message</param>\n    /// <param name=\"replyParameters\">A JSON-serialized object for description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendChecklistAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string chatId,\n        InputChecklist checklist,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.Checklist,\n                checklist ?? throw new ArgumentNullException(nameof(checklist))\n            },\n        };\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendChecklist, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendContact.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send phone contacts. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendContact\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendContact(this ITelegramBotClient client, SendContactArgs args) =>\n        client.SendContactAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send phone contacts. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendContact\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendContactAsync(\n        this ITelegramBotClient client,\n        SendContactArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendContact, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send phone contacts. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"phoneNumber\">Contact's phone number</param>\n    /// <param name=\"firstName\">Contact's first name</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"lastName\">Contact's last name</param>\n    /// <param name=\"vcard\">Additional data about the contact in the form of a <a href=\"https://en.wikipedia.org/wiki/VCard\">vCard</a>, 0-2048 bytes</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendContact(\n        this ITelegramBotClient client,\n        long chatId,\n        string phoneNumber,\n        string firstName,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? lastName = null,\n        string? vcard = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendContactAsync(\n                chatId,\n                phoneNumber,\n                firstName,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                lastName,\n                vcard,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send phone contacts. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"phoneNumber\">Contact's phone number</param>\n    /// <param name=\"firstName\">Contact's first name</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"lastName\">Contact's last name</param>\n    /// <param name=\"vcard\">Additional data about the contact in the form of a <a href=\"https://en.wikipedia.org/wiki/VCard\">vCard</a>, 0-2048 bytes</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendContactAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string phoneNumber,\n        string firstName,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? lastName = null,\n        string? vcard = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.PhoneNumber,\n                phoneNumber ?? throw new ArgumentNullException(nameof(phoneNumber))\n            },\n            {\n                PropertyNames.FirstName,\n                firstName ?? throw new ArgumentNullException(nameof(firstName))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (lastName is not null)\n        {\n            args.Add(PropertyNames.LastName, lastName);\n        }\n        if (vcard is not null)\n        {\n            args.Add(PropertyNames.Vcard, vcard);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendContact, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send phone contacts. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"phoneNumber\">Contact's phone number</param>\n    /// <param name=\"firstName\">Contact's first name</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"lastName\">Contact's last name</param>\n    /// <param name=\"vcard\">Additional data about the contact in the form of a <a href=\"https://en.wikipedia.org/wiki/VCard\">vCard</a>, 0-2048 bytes</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendContact(\n        this ITelegramBotClient client,\n        string chatId,\n        string phoneNumber,\n        string firstName,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? lastName = null,\n        string? vcard = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendContactAsync(\n                chatId,\n                phoneNumber,\n                firstName,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                lastName,\n                vcard,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send phone contacts. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"phoneNumber\">Contact's phone number</param>\n    /// <param name=\"firstName\">Contact's first name</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"lastName\">Contact's last name</param>\n    /// <param name=\"vcard\">Additional data about the contact in the form of a <a href=\"https://en.wikipedia.org/wiki/VCard\">vCard</a>, 0-2048 bytes</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendContactAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string phoneNumber,\n        string firstName,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? lastName = null,\n        string? vcard = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.PhoneNumber,\n                phoneNumber ?? throw new ArgumentNullException(nameof(phoneNumber))\n            },\n            {\n                PropertyNames.FirstName,\n                firstName ?? throw new ArgumentNullException(nameof(firstName))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (lastName is not null)\n        {\n            args.Add(PropertyNames.LastName, lastName);\n        }\n        if (vcard is not null)\n        {\n            args.Add(PropertyNames.Vcard, vcard);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendContact, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendDice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send an animated emoji that will display a random value. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendDice\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendDice(this ITelegramBotClient client, SendDiceArgs args) =>\n        client.SendDiceAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send an animated emoji that will display a random value. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendDice\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendDiceAsync(\n        this ITelegramBotClient client,\n        SendDiceArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendDice, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send an animated emoji that will display a random value. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji on which the dice throw animation is based. Currently, must be one of “🎲”, “🎯”, “🏀”, “⚽”, “🎳”, or “🎰”. Dice can have values 1-6 for “🎲”, “🎯” and “🎳”, values 1-5 for “🏀” and “⚽”, and values 1-64 for “🎰”. Defaults to “🎲”</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendDice(\n        this ITelegramBotClient client,\n        long chatId,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendDiceAsync(\n                chatId,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                emoji,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send an animated emoji that will display a random value. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji on which the dice throw animation is based. Currently, must be one of “🎲”, “🎯”, “🏀”, “⚽”, “🎳”, or “🎰”. Dice can have values 1-6 for “🎲”, “🎯” and “🎳”, values 1-5 for “🏀” and “⚽”, and values 1-64 for “🎰”. Defaults to “🎲”</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendDiceAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (emoji is not null)\n        {\n            args.Add(PropertyNames.Emoji, emoji);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendDice, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send an animated emoji that will display a random value. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji on which the dice throw animation is based. Currently, must be one of “🎲”, “🎯”, “🏀”, “⚽”, “🎳”, or “🎰”. Dice can have values 1-6 for “🎲”, “🎯” and “🎳”, values 1-5 for “🏀” and “⚽”, and values 1-64 for “🎰”. Defaults to “🎲”</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendDice(\n        this ITelegramBotClient client,\n        string chatId,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendDiceAsync(\n                chatId,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                emoji,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send an animated emoji that will display a random value. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji on which the dice throw animation is based. Currently, must be one of “🎲”, “🎯”, “🏀”, “⚽”, “🎳”, or “🎰”. Dice can have values 1-6 for “🎲”, “🎯” and “🎳”, values 1-5 for “🏀” and “⚽”, and values 1-64 for “🎰”. Defaults to “🎲”</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendDiceAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (emoji is not null)\n        {\n            args.Add(PropertyNames.Emoji, emoji);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendDice, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendDocument.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendDocument\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendDocument(this ITelegramBotClient client, SendDocumentArgs args) =>\n        client.SendDocumentAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendDocument\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendDocumentAsync(\n        this ITelegramBotClient client,\n        SendDocumentArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendDocument, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"disableContentTypeDetection\">Disables automatic server-side content type detection for files uploaded using multipart/form-data</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendDocument(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile document,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        InputFile? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? disableContentTypeDetection = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendDocumentAsync(\n                chatId,\n                document,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                thumbnail,\n                caption,\n                parseMode,\n                captionEntities,\n                disableContentTypeDetection,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"disableContentTypeDetection\">Disables automatic server-side content type detection for files uploaded using multipart/form-data</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendDocumentAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile document,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        InputFile? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? disableContentTypeDetection = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.Document,\n                document ?? throw new ArgumentNullException(nameof(document))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (disableContentTypeDetection is not null)\n        {\n            args.Add(PropertyNames.DisableContentTypeDetection, disableContentTypeDetection);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendDocument, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"disableContentTypeDetection\">Disables automatic server-side content type detection for files uploaded using multipart/form-data</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendDocument(\n        this ITelegramBotClient client,\n        long chatId,\n        string document,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? disableContentTypeDetection = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendDocumentAsync(\n                chatId,\n                document,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                thumbnail,\n                caption,\n                parseMode,\n                captionEntities,\n                disableContentTypeDetection,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"disableContentTypeDetection\">Disables automatic server-side content type detection for files uploaded using multipart/form-data</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendDocumentAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string document,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? disableContentTypeDetection = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.Document,\n                document ?? throw new ArgumentNullException(nameof(document))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (disableContentTypeDetection is not null)\n        {\n            args.Add(PropertyNames.DisableContentTypeDetection, disableContentTypeDetection);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendDocument, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"disableContentTypeDetection\">Disables automatic server-side content type detection for files uploaded using multipart/form-data</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendDocument(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile document,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        InputFile? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? disableContentTypeDetection = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendDocumentAsync(\n                chatId,\n                document,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                thumbnail,\n                caption,\n                parseMode,\n                captionEntities,\n                disableContentTypeDetection,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"disableContentTypeDetection\">Disables automatic server-side content type detection for files uploaded using multipart/form-data</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendDocumentAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile document,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        InputFile? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? disableContentTypeDetection = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.Document,\n                document ?? throw new ArgumentNullException(nameof(document))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (disableContentTypeDetection is not null)\n        {\n            args.Add(PropertyNames.DisableContentTypeDetection, disableContentTypeDetection);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendDocument, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"disableContentTypeDetection\">Disables automatic server-side content type detection for files uploaded using multipart/form-data</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendDocument(\n        this ITelegramBotClient client,\n        string chatId,\n        string document,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? disableContentTypeDetection = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendDocumentAsync(\n                chatId,\n                document,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                thumbnail,\n                caption,\n                parseMode,\n                captionEntities,\n                disableContentTypeDetection,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send general files. On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"document\">File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"caption\">Document caption (may also be used when resending documents by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"disableContentTypeDetection\">Disables automatic server-side content type detection for files uploaded using multipart/form-data</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendDocumentAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string document,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? thumbnail = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? disableContentTypeDetection = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.Document,\n                document ?? throw new ArgumentNullException(nameof(document))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (disableContentTypeDetection is not null)\n        {\n            args.Add(PropertyNames.DisableContentTypeDetection, disableContentTypeDetection);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendDocument, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendGift\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendGift(this ITelegramBotClient client, SendGiftArgs args) =>\n        client.SendGiftAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendGift\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendGiftAsync(\n        this ITelegramBotClient client,\n        SendGiftArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendGift, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"giftId\">Identifier of the gift; limited gifts can't be sent to channel chats</param>\n    /// <param name=\"userId\">Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.</param>\n    /// <param name=\"chatId\">Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@username</em>) that will receive the gift.</param>\n    /// <param name=\"payForUpgrade\">Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver</param>\n    /// <param name=\"text\">Text that will be shown along with the gift; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendGift(\n        this ITelegramBotClient client,\n        string giftId,\n        long? userId = null,\n        long? chatId = null,\n        bool? payForUpgrade = null,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null\n    ) =>\n        client\n            .SendGiftAsync(giftId, userId, chatId, payForUpgrade, text, textParseMode, textEntities)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"giftId\">Identifier of the gift; limited gifts can't be sent to channel chats</param>\n    /// <param name=\"userId\">Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.</param>\n    /// <param name=\"chatId\">Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@username</em>) that will receive the gift.</param>\n    /// <param name=\"payForUpgrade\">Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver</param>\n    /// <param name=\"text\">Text that will be shown along with the gift; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendGiftAsync(\n        this ITelegramBotClient client,\n        string giftId,\n        long? userId = null,\n        long? chatId = null,\n        bool? payForUpgrade = null,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.GiftId, giftId ?? throw new ArgumentNullException(nameof(giftId)) },\n        };\n        if (userId is not null)\n        {\n            args.Add(PropertyNames.UserId, userId);\n        }\n        if (chatId is not null)\n        {\n            args.Add(PropertyNames.ChatId, chatId);\n        }\n        if (payForUpgrade is not null)\n        {\n            args.Add(PropertyNames.PayForUpgrade, payForUpgrade);\n        }\n        if (text is not null)\n        {\n            args.Add(PropertyNames.Text, text);\n        }\n        if (textParseMode is not null)\n        {\n            args.Add(PropertyNames.TextParseMode, textParseMode);\n        }\n        if (textEntities is not null)\n        {\n            args.Add(PropertyNames.TextEntities, textEntities);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendGift, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendLivePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendLivePhoto\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(this ITelegramBotClient client, SendLivePhotoArgs args) =>\n        client.SendLivePhotoAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendLivePhoto\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        SendLivePhotoArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile livePhoto,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLivePhotoAsync(\n                chatId,\n                livePhoto,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile livePhoto,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.LivePhoto,\n                livePhoto ?? throw new ArgumentNullException(nameof(livePhoto))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile livePhoto,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLivePhotoAsync(\n                chatId,\n                livePhoto,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile livePhoto,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.LivePhoto,\n                livePhoto ?? throw new ArgumentNullException(nameof(livePhoto))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(\n        this ITelegramBotClient client,\n        long chatId,\n        string livePhoto,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLivePhotoAsync(\n                chatId,\n                livePhoto,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string livePhoto,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.LivePhoto,\n                livePhoto ?? throw new ArgumentNullException(nameof(livePhoto))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(\n        this ITelegramBotClient client,\n        long chatId,\n        string livePhoto,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLivePhotoAsync(\n                chatId,\n                livePhoto,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string livePhoto,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.LivePhoto,\n                livePhoto ?? throw new ArgumentNullException(nameof(livePhoto))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile livePhoto,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLivePhotoAsync(\n                chatId,\n                livePhoto,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile livePhoto,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.LivePhoto,\n                livePhoto ?? throw new ArgumentNullException(nameof(livePhoto))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile livePhoto,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLivePhotoAsync(\n                chatId,\n                livePhoto,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile livePhoto,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.LivePhoto,\n                livePhoto ?? throw new ArgumentNullException(nameof(livePhoto))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(\n        this ITelegramBotClient client,\n        string chatId,\n        string livePhoto,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLivePhotoAsync(\n                chatId,\n                livePhoto,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string livePhoto,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.LivePhoto,\n                livePhoto ?? throw new ArgumentNullException(nameof(livePhoto))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLivePhoto(\n        this ITelegramBotClient client,\n        string chatId,\n        string livePhoto,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLivePhotoAsync(\n                chatId,\n                livePhoto,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send live photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"livePhoto\">Live photo video to send. The video must be no longer than 10 seconds and must not exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLivePhotoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string livePhoto,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.LivePhoto,\n                livePhoto ?? throw new ArgumentNullException(nameof(livePhoto))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLivePhoto, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendLocation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send point on the map. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendLocation\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLocation(this ITelegramBotClient client, SendLocationArgs args) =>\n        client.SendLocationAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send point on the map. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendLocation\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLocationAsync(\n        this ITelegramBotClient client,\n        SendLocationArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLocation, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send point on the map. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the location</param>\n    /// <param name=\"longitude\">Longitude of the location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"livePeriod\">Period in seconds during which the location will be updated (see <a href=\"https://telegram.org/blog/live-locations\">Live Locations</a>, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.</param>\n    /// <param name=\"heading\">For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLocation(\n        this ITelegramBotClient client,\n        long chatId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        float? horizontalAccuracy = null,\n        int? livePeriod = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLocationAsync(\n                chatId,\n                latitude,\n                longitude,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                horizontalAccuracy,\n                livePeriod,\n                heading,\n                proximityAlertRadius,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send point on the map. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the location</param>\n    /// <param name=\"longitude\">Longitude of the location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"livePeriod\">Period in seconds during which the location will be updated (see <a href=\"https://telegram.org/blog/live-locations\">Live Locations</a>, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.</param>\n    /// <param name=\"heading\">For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLocationAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        float? horizontalAccuracy = null,\n        int? livePeriod = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Latitude, latitude },\n            { PropertyNames.Longitude, longitude },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (horizontalAccuracy is not null)\n        {\n            args.Add(PropertyNames.HorizontalAccuracy, horizontalAccuracy);\n        }\n        if (livePeriod is not null)\n        {\n            args.Add(PropertyNames.LivePeriod, livePeriod);\n        }\n        if (heading is not null)\n        {\n            args.Add(PropertyNames.Heading, heading);\n        }\n        if (proximityAlertRadius is not null)\n        {\n            args.Add(PropertyNames.ProximityAlertRadius, proximityAlertRadius);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLocation, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send point on the map. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the location</param>\n    /// <param name=\"longitude\">Longitude of the location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"livePeriod\">Period in seconds during which the location will be updated (see <a href=\"https://telegram.org/blog/live-locations\">Live Locations</a>, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.</param>\n    /// <param name=\"heading\">For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendLocation(\n        this ITelegramBotClient client,\n        string chatId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        float? horizontalAccuracy = null,\n        int? livePeriod = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendLocationAsync(\n                chatId,\n                latitude,\n                longitude,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                horizontalAccuracy,\n                livePeriod,\n                heading,\n                proximityAlertRadius,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send point on the map. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the location</param>\n    /// <param name=\"longitude\">Longitude of the location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"livePeriod\">Period in seconds during which the location will be updated (see <a href=\"https://telegram.org/blog/live-locations\">Live Locations</a>, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.</param>\n    /// <param name=\"heading\">For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendLocationAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        float? horizontalAccuracy = null,\n        int? livePeriod = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Latitude, latitude },\n            { PropertyNames.Longitude, longitude },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (horizontalAccuracy is not null)\n        {\n            args.Add(PropertyNames.HorizontalAccuracy, horizontalAccuracy);\n        }\n        if (livePeriod is not null)\n        {\n            args.Add(PropertyNames.LivePeriod, livePeriod);\n        }\n        if (heading is not null)\n        {\n            args.Add(PropertyNames.Heading, heading);\n        }\n        if (proximityAlertRadius is not null)\n        {\n            args.Add(PropertyNames.ProximityAlertRadius, proximityAlertRadius);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendLocation, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendMediaGroup.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send a group of photos, live photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of <see cref=\"Message\"/> objects that were sent is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendMediaGroup\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Message> SendMediaGroup(\n        this ITelegramBotClient client,\n        SendMediaGroupArgs args\n    ) => client.SendMediaGroupAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send a group of photos, live photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of <see cref=\"Message\"/> objects that were sent is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendMediaGroup\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Message>> SendMediaGroupAsync(\n        this ITelegramBotClient client,\n        SendMediaGroupArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<IEnumerable<Message>>(\n            MethodNames.SendMediaGroup,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to send a group of photos, live photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of <see cref=\"Message\"/> objects that were sent is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Message> SendMediaGroup(\n        this ITelegramBotClient client,\n        long chatId,\n        IEnumerable<InputMedia> media,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null\n    ) =>\n        client\n            .SendMediaGroupAsync(\n                chatId,\n                media,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                replyParameters\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send a group of photos, live photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of <see cref=\"Message\"/> objects that were sent is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Message>> SendMediaGroupAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        IEnumerable<InputMedia> media,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Media, media ?? throw new ArgumentNullException(nameof(media)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n\n        return client.CallMethodAsync<IEnumerable<Message>>(\n            MethodNames.SendMediaGroup,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to send a group of photos, live photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of <see cref=\"Message\"/> objects that were sent is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Message> SendMediaGroup(\n        this ITelegramBotClient client,\n        string chatId,\n        IEnumerable<InputMedia> media,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null\n    ) =>\n        client\n            .SendMediaGroupAsync(\n                chatId,\n                media,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                replyParameters\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send a group of photos, live photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of <see cref=\"Message\"/> objects that were sent is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"media\">A JSON-serialized array describing messages to be sent, must include 2-10 items</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the messages will be sent; required if the messages are sent to a direct messages chat</param>\n    /// <param name=\"disableNotification\">Sends messages <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent messages from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Message>> SendMediaGroupAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        IEnumerable<InputMedia> media,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Media, media ?? throw new ArgumentNullException(nameof(media)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n\n        return client.CallMethodAsync<IEnumerable<Message>>(\n            MethodNames.SendMediaGroup,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send text messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendMessage\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendMessage(this ITelegramBotClient client, SendMessageArgs args) =>\n        client.SendMessageAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send text messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendMessage\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendMessageAsync(\n        this ITelegramBotClient client,\n        SendMessageArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send text messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"text\">Text of the message to be sent, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendMessage(\n        this ITelegramBotClient client,\n        long chatId,\n        string text,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendMessageAsync(\n                chatId,\n                text,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                parseMode,\n                entities,\n                linkPreviewOptions,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send text messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"text\">Text of the message to be sent, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendMessageAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string text,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Text, text ?? throw new ArgumentNullException(nameof(text)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (entities is not null)\n        {\n            args.Add(PropertyNames.Entities, entities);\n        }\n        if (linkPreviewOptions is not null)\n        {\n            args.Add(PropertyNames.LinkPreviewOptions, linkPreviewOptions);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send text messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"text\">Text of the message to be sent, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendMessage(\n        this ITelegramBotClient client,\n        string chatId,\n        string text,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendMessageAsync(\n                chatId,\n                text,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                parseMode,\n                entities,\n                linkPreviewOptions,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send text messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"text\">Text of the message to be sent, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendMessageAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string text,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Text, text ?? throw new ArgumentNullException(nameof(text)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (entities is not null)\n        {\n            args.Add(PropertyNames.Entities, entities);\n        }\n        if (linkPreviewOptions is not null)\n        {\n            args.Add(PropertyNames.LinkPreviewOptions, linkPreviewOptions);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendMessage, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendMessageDraft.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to stream a partial message to a user while the message is being generated. Note that the streamed draft is ephemeral and acts as a temporary 30-second preview - once the output is finalized, you <strong>must</strong> call <a href=\"https://core.telegram.org/bots/api#sendmessage\">sendMessage</a> with the complete message to persist it in the user's chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendMessageDraft\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendMessageDraft(\n        this ITelegramBotClient client,\n        SendMessageDraftArgs args\n    ) => client.SendMessageDraftAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to stream a partial message to a user while the message is being generated. Note that the streamed draft is ephemeral and acts as a temporary 30-second preview - once the output is finalized, you <strong>must</strong> call <a href=\"https://core.telegram.org/bots/api#sendmessage\">sendMessage</a> with the complete message to persist it in the user's chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendMessageDraft\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendMessageDraftAsync(\n        this ITelegramBotClient client,\n        SendMessageDraftArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendMessageDraft, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to stream a partial message to a user while the message is being generated. Note that the streamed draft is ephemeral and acts as a temporary 30-second preview - once the output is finalized, you <strong>must</strong> call <a href=\"https://core.telegram.org/bots/api#sendmessage\">sendMessage</a> with the complete message to persist it in the user's chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target private chat</param>\n    /// <param name=\"draftId\">Unique identifier of the message draft; must be non-zero. Changes of drafts with the same identifier are animated.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread</param>\n    /// <param name=\"text\">Text of the message to be sent, 0-4096 characters after entities parsing. Pass an empty text to show a “Thinking…” placeholder.</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendMessageDraft(\n        this ITelegramBotClient client,\n        long chatId,\n        int draftId,\n        int? messageThreadId = null,\n        string? text = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null\n    ) =>\n        client\n            .SendMessageDraftAsync(chatId, draftId, messageThreadId, text, parseMode, entities)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to stream a partial message to a user while the message is being generated. Note that the streamed draft is ephemeral and acts as a temporary 30-second preview - once the output is finalized, you <strong>must</strong> call <a href=\"https://core.telegram.org/bots/api#sendmessage\">sendMessage</a> with the complete message to persist it in the user's chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target private chat</param>\n    /// <param name=\"draftId\">Unique identifier of the message draft; must be non-zero. Changes of drafts with the same identifier are animated.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread</param>\n    /// <param name=\"text\">Text of the message to be sent, 0-4096 characters after entities parsing. Pass an empty text to show a “Thinking…” placeholder.</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendMessageDraftAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int draftId,\n        int? messageThreadId = null,\n        string? text = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.DraftId, draftId },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (text is not null)\n        {\n            args.Add(PropertyNames.Text, text);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (entities is not null)\n        {\n            args.Add(PropertyNames.Entities, entities);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendMessageDraft, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendPaidMedia.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send paid media. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendPaidMedia\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPaidMedia(this ITelegramBotClient client, SendPaidMediaArgs args) =>\n        client.SendPaidMediaAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send paid media. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendPaidMedia\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPaidMediaAsync(\n        this ITelegramBotClient client,\n        SendPaidMediaArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPaidMedia, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send paid media. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.</param>\n    /// <param name=\"starCount\">The number of Telegram Stars that must be paid to buy access to the media; 1-25000</param>\n    /// <param name=\"media\">A JSON-serialized array describing the media to be sent; up to 10 items</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"payload\">Bot-defined paid media payload, 0-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"caption\">Media caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the media caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPaidMedia(\n        this ITelegramBotClient client,\n        long chatId,\n        int starCount,\n        IEnumerable<InputPaidMedia> media,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? payload = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendPaidMediaAsync(\n                chatId,\n                starCount,\n                media,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                payload,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send paid media. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.</param>\n    /// <param name=\"starCount\">The number of Telegram Stars that must be paid to buy access to the media; 1-25000</param>\n    /// <param name=\"media\">A JSON-serialized array describing the media to be sent; up to 10 items</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"payload\">Bot-defined paid media payload, 0-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"caption\">Media caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the media caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPaidMediaAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int starCount,\n        IEnumerable<InputPaidMedia> media,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? payload = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.StarCount, starCount },\n            { PropertyNames.Media, media ?? throw new ArgumentNullException(nameof(media)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (payload is not null)\n        {\n            args.Add(PropertyNames.Payload, payload);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPaidMedia, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send paid media. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.</param>\n    /// <param name=\"starCount\">The number of Telegram Stars that must be paid to buy access to the media; 1-25000</param>\n    /// <param name=\"media\">A JSON-serialized array describing the media to be sent; up to 10 items</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"payload\">Bot-defined paid media payload, 0-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"caption\">Media caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the media caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPaidMedia(\n        this ITelegramBotClient client,\n        string chatId,\n        int starCount,\n        IEnumerable<InputPaidMedia> media,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? payload = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendPaidMediaAsync(\n                chatId,\n                starCount,\n                media,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                payload,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send paid media. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.</param>\n    /// <param name=\"starCount\">The number of Telegram Stars that must be paid to buy access to the media; 1-25000</param>\n    /// <param name=\"media\">A JSON-serialized array describing the media to be sent; up to 10 items</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"payload\">Bot-defined paid media payload, 0-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"caption\">Media caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the media caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPaidMediaAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int starCount,\n        IEnumerable<InputPaidMedia> media,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? payload = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.StarCount, starCount },\n            { PropertyNames.Media, media ?? throw new ArgumentNullException(nameof(media)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (payload is not null)\n        {\n            args.Add(PropertyNames.Payload, payload);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPaidMedia, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendPhoto\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPhoto(this ITelegramBotClient client, SendPhotoArgs args) =>\n        client.SendPhotoAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendPhoto\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPhotoAsync(\n        this ITelegramBotClient client,\n        SendPhotoArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the photo needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPhoto(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendPhotoAsync(\n                chatId,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the photo needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPhotoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the photo needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPhoto(\n        this ITelegramBotClient client,\n        long chatId,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendPhotoAsync(\n                chatId,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the photo needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPhotoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the photo needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPhoto(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendPhotoAsync(\n                chatId,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the photo needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPhotoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the photo needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPhoto(\n        this ITelegramBotClient client,\n        string chatId,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendPhotoAsync(\n                chatId,\n                photo,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send photos. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Photo caption (may also be used when resending photos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the photo needs to be covered with a spoiler animation</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPhotoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string photo,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPhoto, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendPoll.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\nusing InputPollMedia = Telegram.BotAPI.AvailableTypes.InputMedia;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send a native poll. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendPoll\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPoll(this ITelegramBotClient client, SendPollArgs args) =>\n        client.SendPollAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send a native poll. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendPoll\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPollAsync(\n        this ITelegramBotClient client,\n        SendPollArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPoll, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send a native poll. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Polls can't be sent to channel direct messages chats.</param>\n    /// <param name=\"question\">Poll question, 1-300 characters</param>\n    /// <param name=\"options\">A JSON-serialized list of 1-12 answer options</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"questionParseMode\">Mode for parsing entities in the question. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Currently, only custom emoji entities are allowed</param>\n    /// <param name=\"questionEntities\">A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of <em>question_parse_mode</em></param>\n    /// <param name=\"isAnonymous\"><em>True</em>, if the poll needs to be anonymous, defaults to <em>True</em></param>\n    /// <param name=\"type\">Poll type, “quiz” or “regular”, defaults to “regular”</param>\n    /// <param name=\"allowsMultipleAnswers\">Pass <em>True</em>, if the poll allows multiple answers, defaults to <em>False</em></param>\n    /// <param name=\"allowsRevoting\">Pass <em>True</em>, if the poll allows to change chosen answer options, defaults to <em>False</em> for quizzes and to <em>True</em> for regular polls</param>\n    /// <param name=\"shuffleOptions\">Pass <em>True</em>, if the poll options must be shown in random order</param>\n    /// <param name=\"allowAddingOptions\">Pass <em>True</em>, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes</param>\n    /// <param name=\"hideResultsUntilCloses\">Pass <em>True</em>, if poll results must be shown only after the poll closes</param>\n    /// <param name=\"membersOnly\">Pass <em>True</em>, if voting is limited to users who have been members of the chat where the poll is being sent for more than 24 hours; for channel chats only</param>\n    /// <param name=\"countryCodes\">A JSON-serialized list of 0-12 two-letter <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\">ISO 3166-1 alpha-2</a> country codes indicating the countries from which users can vote in the poll; for channel chats only. If omitted or empty, then users from any country can participate in the poll.</param>\n    /// <param name=\"correctOptionIds\">A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode</param>\n    /// <param name=\"explanation\">Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing</param>\n    /// <param name=\"explanationParseMode\">Mode for parsing entities in the explanation. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"explanationEntities\">A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of <em>explanation_parse_mode</em></param>\n    /// <param name=\"explanationMedia\">Media added to the quiz explanation</param>\n    /// <param name=\"openPeriod\">Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with <em>close_date</em>.</param>\n    /// <param name=\"closeDate\">Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with <em>open_period</em>.</param>\n    /// <param name=\"isClosed\">Pass <em>True</em> if the poll needs to be immediately closed. This can be useful for poll preview.</param>\n    /// <param name=\"description\">Description of the poll to be sent, 0-1024 characters after entities parsing</param>\n    /// <param name=\"descriptionParseMode\">Mode for parsing entities in the poll description. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"descriptionEntities\">A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of <em>description_parse_mode</em></param>\n    /// <param name=\"media\">Media added to the poll description</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPoll(\n        this ITelegramBotClient client,\n        long chatId,\n        string question,\n        IEnumerable<InputPollOption> options,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        string? questionParseMode = null,\n        IEnumerable<MessageEntity>? questionEntities = null,\n        bool? isAnonymous = null,\n        string? type = null,\n        bool? allowsMultipleAnswers = null,\n        bool? allowsRevoting = null,\n        bool? shuffleOptions = null,\n        bool? allowAddingOptions = null,\n        bool? hideResultsUntilCloses = null,\n        bool? membersOnly = null,\n        IEnumerable<string>? countryCodes = null,\n        IEnumerable<int>? correctOptionIds = null,\n        string? explanation = null,\n        string? explanationParseMode = null,\n        IEnumerable<MessageEntity>? explanationEntities = null,\n        InputPollMedia? explanationMedia = null,\n        int? openPeriod = null,\n        int? closeDate = null,\n        bool? isClosed = null,\n        string? description = null,\n        string? descriptionParseMode = null,\n        IEnumerable<MessageEntity>? descriptionEntities = null,\n        InputPollMedia? media = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendPollAsync(\n                chatId,\n                question,\n                options,\n                businessConnectionId,\n                messageThreadId,\n                questionParseMode,\n                questionEntities,\n                isAnonymous,\n                type,\n                allowsMultipleAnswers,\n                allowsRevoting,\n                shuffleOptions,\n                allowAddingOptions,\n                hideResultsUntilCloses,\n                membersOnly,\n                countryCodes,\n                correctOptionIds,\n                explanation,\n                explanationParseMode,\n                explanationEntities,\n                explanationMedia,\n                openPeriod,\n                closeDate,\n                isClosed,\n                description,\n                descriptionParseMode,\n                descriptionEntities,\n                media,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send a native poll. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Polls can't be sent to channel direct messages chats.</param>\n    /// <param name=\"question\">Poll question, 1-300 characters</param>\n    /// <param name=\"options\">A JSON-serialized list of 1-12 answer options</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"questionParseMode\">Mode for parsing entities in the question. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Currently, only custom emoji entities are allowed</param>\n    /// <param name=\"questionEntities\">A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of <em>question_parse_mode</em></param>\n    /// <param name=\"isAnonymous\"><em>True</em>, if the poll needs to be anonymous, defaults to <em>True</em></param>\n    /// <param name=\"type\">Poll type, “quiz” or “regular”, defaults to “regular”</param>\n    /// <param name=\"allowsMultipleAnswers\">Pass <em>True</em>, if the poll allows multiple answers, defaults to <em>False</em></param>\n    /// <param name=\"allowsRevoting\">Pass <em>True</em>, if the poll allows to change chosen answer options, defaults to <em>False</em> for quizzes and to <em>True</em> for regular polls</param>\n    /// <param name=\"shuffleOptions\">Pass <em>True</em>, if the poll options must be shown in random order</param>\n    /// <param name=\"allowAddingOptions\">Pass <em>True</em>, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes</param>\n    /// <param name=\"hideResultsUntilCloses\">Pass <em>True</em>, if poll results must be shown only after the poll closes</param>\n    /// <param name=\"membersOnly\">Pass <em>True</em>, if voting is limited to users who have been members of the chat where the poll is being sent for more than 24 hours; for channel chats only</param>\n    /// <param name=\"countryCodes\">A JSON-serialized list of 0-12 two-letter <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\">ISO 3166-1 alpha-2</a> country codes indicating the countries from which users can vote in the poll; for channel chats only. If omitted or empty, then users from any country can participate in the poll.</param>\n    /// <param name=\"correctOptionIds\">A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode</param>\n    /// <param name=\"explanation\">Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing</param>\n    /// <param name=\"explanationParseMode\">Mode for parsing entities in the explanation. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"explanationEntities\">A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of <em>explanation_parse_mode</em></param>\n    /// <param name=\"explanationMedia\">Media added to the quiz explanation</param>\n    /// <param name=\"openPeriod\">Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with <em>close_date</em>.</param>\n    /// <param name=\"closeDate\">Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with <em>open_period</em>.</param>\n    /// <param name=\"isClosed\">Pass <em>True</em> if the poll needs to be immediately closed. This can be useful for poll preview.</param>\n    /// <param name=\"description\">Description of the poll to be sent, 0-1024 characters after entities parsing</param>\n    /// <param name=\"descriptionParseMode\">Mode for parsing entities in the poll description. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"descriptionEntities\">A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of <em>description_parse_mode</em></param>\n    /// <param name=\"media\">Media added to the poll description</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPollAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string question,\n        IEnumerable<InputPollOption> options,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        string? questionParseMode = null,\n        IEnumerable<MessageEntity>? questionEntities = null,\n        bool? isAnonymous = null,\n        string? type = null,\n        bool? allowsMultipleAnswers = null,\n        bool? allowsRevoting = null,\n        bool? shuffleOptions = null,\n        bool? allowAddingOptions = null,\n        bool? hideResultsUntilCloses = null,\n        bool? membersOnly = null,\n        IEnumerable<string>? countryCodes = null,\n        IEnumerable<int>? correctOptionIds = null,\n        string? explanation = null,\n        string? explanationParseMode = null,\n        IEnumerable<MessageEntity>? explanationEntities = null,\n        InputPollMedia? explanationMedia = null,\n        int? openPeriod = null,\n        int? closeDate = null,\n        bool? isClosed = null,\n        string? description = null,\n        string? descriptionParseMode = null,\n        IEnumerable<MessageEntity>? descriptionEntities = null,\n        InputPollMedia? media = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.Question,\n                question ?? throw new ArgumentNullException(nameof(question))\n            },\n            { PropertyNames.Options, options ?? throw new ArgumentNullException(nameof(options)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (questionParseMode is not null)\n        {\n            args.Add(PropertyNames.QuestionParseMode, questionParseMode);\n        }\n        if (questionEntities is not null)\n        {\n            args.Add(PropertyNames.QuestionEntities, questionEntities);\n        }\n        if (isAnonymous is not null)\n        {\n            args.Add(PropertyNames.IsAnonymous, isAnonymous);\n        }\n        if (type is not null)\n        {\n            args.Add(PropertyNames.Type, type);\n        }\n        if (allowsMultipleAnswers is not null)\n        {\n            args.Add(PropertyNames.AllowsMultipleAnswers, allowsMultipleAnswers);\n        }\n        if (allowsRevoting is not null)\n        {\n            args.Add(PropertyNames.AllowsRevoting, allowsRevoting);\n        }\n        if (shuffleOptions is not null)\n        {\n            args.Add(PropertyNames.ShuffleOptions, shuffleOptions);\n        }\n        if (allowAddingOptions is not null)\n        {\n            args.Add(PropertyNames.AllowAddingOptions, allowAddingOptions);\n        }\n        if (hideResultsUntilCloses is not null)\n        {\n            args.Add(PropertyNames.HideResultsUntilCloses, hideResultsUntilCloses);\n        }\n        if (membersOnly is not null)\n        {\n            args.Add(PropertyNames.MembersOnly, membersOnly);\n        }\n        if (countryCodes is not null)\n        {\n            args.Add(PropertyNames.CountryCodes, countryCodes);\n        }\n        if (correctOptionIds is not null)\n        {\n            args.Add(PropertyNames.CorrectOptionIds, correctOptionIds);\n        }\n        if (explanation is not null)\n        {\n            args.Add(PropertyNames.Explanation, explanation);\n        }\n        if (explanationParseMode is not null)\n        {\n            args.Add(PropertyNames.ExplanationParseMode, explanationParseMode);\n        }\n        if (explanationEntities is not null)\n        {\n            args.Add(PropertyNames.ExplanationEntities, explanationEntities);\n        }\n        if (explanationMedia is not null)\n        {\n            args.Add(PropertyNames.ExplanationMedia, explanationMedia);\n        }\n        if (openPeriod is not null)\n        {\n            args.Add(PropertyNames.OpenPeriod, openPeriod);\n        }\n        if (closeDate is not null)\n        {\n            args.Add(PropertyNames.CloseDate, closeDate);\n        }\n        if (isClosed is not null)\n        {\n            args.Add(PropertyNames.IsClosed, isClosed);\n        }\n        if (description is not null)\n        {\n            args.Add(PropertyNames.Description, description);\n        }\n        if (descriptionParseMode is not null)\n        {\n            args.Add(PropertyNames.DescriptionParseMode, descriptionParseMode);\n        }\n        if (descriptionEntities is not null)\n        {\n            args.Add(PropertyNames.DescriptionEntities, descriptionEntities);\n        }\n        if (media is not null)\n        {\n            args.Add(PropertyNames.Media, media);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPoll, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send a native poll. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Polls can't be sent to channel direct messages chats.</param>\n    /// <param name=\"question\">Poll question, 1-300 characters</param>\n    /// <param name=\"options\">A JSON-serialized list of 1-12 answer options</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"questionParseMode\">Mode for parsing entities in the question. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Currently, only custom emoji entities are allowed</param>\n    /// <param name=\"questionEntities\">A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of <em>question_parse_mode</em></param>\n    /// <param name=\"isAnonymous\"><em>True</em>, if the poll needs to be anonymous, defaults to <em>True</em></param>\n    /// <param name=\"type\">Poll type, “quiz” or “regular”, defaults to “regular”</param>\n    /// <param name=\"allowsMultipleAnswers\">Pass <em>True</em>, if the poll allows multiple answers, defaults to <em>False</em></param>\n    /// <param name=\"allowsRevoting\">Pass <em>True</em>, if the poll allows to change chosen answer options, defaults to <em>False</em> for quizzes and to <em>True</em> for regular polls</param>\n    /// <param name=\"shuffleOptions\">Pass <em>True</em>, if the poll options must be shown in random order</param>\n    /// <param name=\"allowAddingOptions\">Pass <em>True</em>, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes</param>\n    /// <param name=\"hideResultsUntilCloses\">Pass <em>True</em>, if poll results must be shown only after the poll closes</param>\n    /// <param name=\"membersOnly\">Pass <em>True</em>, if voting is limited to users who have been members of the chat where the poll is being sent for more than 24 hours; for channel chats only</param>\n    /// <param name=\"countryCodes\">A JSON-serialized list of 0-12 two-letter <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\">ISO 3166-1 alpha-2</a> country codes indicating the countries from which users can vote in the poll; for channel chats only. If omitted or empty, then users from any country can participate in the poll.</param>\n    /// <param name=\"correctOptionIds\">A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode</param>\n    /// <param name=\"explanation\">Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing</param>\n    /// <param name=\"explanationParseMode\">Mode for parsing entities in the explanation. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"explanationEntities\">A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of <em>explanation_parse_mode</em></param>\n    /// <param name=\"explanationMedia\">Media added to the quiz explanation</param>\n    /// <param name=\"openPeriod\">Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with <em>close_date</em>.</param>\n    /// <param name=\"closeDate\">Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with <em>open_period</em>.</param>\n    /// <param name=\"isClosed\">Pass <em>True</em> if the poll needs to be immediately closed. This can be useful for poll preview.</param>\n    /// <param name=\"description\">Description of the poll to be sent, 0-1024 characters after entities parsing</param>\n    /// <param name=\"descriptionParseMode\">Mode for parsing entities in the poll description. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"descriptionEntities\">A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of <em>description_parse_mode</em></param>\n    /// <param name=\"media\">Media added to the poll description</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendPoll(\n        this ITelegramBotClient client,\n        string chatId,\n        string question,\n        IEnumerable<InputPollOption> options,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        string? questionParseMode = null,\n        IEnumerable<MessageEntity>? questionEntities = null,\n        bool? isAnonymous = null,\n        string? type = null,\n        bool? allowsMultipleAnswers = null,\n        bool? allowsRevoting = null,\n        bool? shuffleOptions = null,\n        bool? allowAddingOptions = null,\n        bool? hideResultsUntilCloses = null,\n        bool? membersOnly = null,\n        IEnumerable<string>? countryCodes = null,\n        IEnumerable<int>? correctOptionIds = null,\n        string? explanation = null,\n        string? explanationParseMode = null,\n        IEnumerable<MessageEntity>? explanationEntities = null,\n        InputPollMedia? explanationMedia = null,\n        int? openPeriod = null,\n        int? closeDate = null,\n        bool? isClosed = null,\n        string? description = null,\n        string? descriptionParseMode = null,\n        IEnumerable<MessageEntity>? descriptionEntities = null,\n        InputPollMedia? media = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendPollAsync(\n                chatId,\n                question,\n                options,\n                businessConnectionId,\n                messageThreadId,\n                questionParseMode,\n                questionEntities,\n                isAnonymous,\n                type,\n                allowsMultipleAnswers,\n                allowsRevoting,\n                shuffleOptions,\n                allowAddingOptions,\n                hideResultsUntilCloses,\n                membersOnly,\n                countryCodes,\n                correctOptionIds,\n                explanation,\n                explanationParseMode,\n                explanationEntities,\n                explanationMedia,\n                openPeriod,\n                closeDate,\n                isClosed,\n                description,\n                descriptionParseMode,\n                descriptionEntities,\n                media,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send a native poll. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Polls can't be sent to channel direct messages chats.</param>\n    /// <param name=\"question\">Poll question, 1-300 characters</param>\n    /// <param name=\"options\">A JSON-serialized list of 1-12 answer options</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"questionParseMode\">Mode for parsing entities in the question. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Currently, only custom emoji entities are allowed</param>\n    /// <param name=\"questionEntities\">A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of <em>question_parse_mode</em></param>\n    /// <param name=\"isAnonymous\"><em>True</em>, if the poll needs to be anonymous, defaults to <em>True</em></param>\n    /// <param name=\"type\">Poll type, “quiz” or “regular”, defaults to “regular”</param>\n    /// <param name=\"allowsMultipleAnswers\">Pass <em>True</em>, if the poll allows multiple answers, defaults to <em>False</em></param>\n    /// <param name=\"allowsRevoting\">Pass <em>True</em>, if the poll allows to change chosen answer options, defaults to <em>False</em> for quizzes and to <em>True</em> for regular polls</param>\n    /// <param name=\"shuffleOptions\">Pass <em>True</em>, if the poll options must be shown in random order</param>\n    /// <param name=\"allowAddingOptions\">Pass <em>True</em>, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes</param>\n    /// <param name=\"hideResultsUntilCloses\">Pass <em>True</em>, if poll results must be shown only after the poll closes</param>\n    /// <param name=\"membersOnly\">Pass <em>True</em>, if voting is limited to users who have been members of the chat where the poll is being sent for more than 24 hours; for channel chats only</param>\n    /// <param name=\"countryCodes\">A JSON-serialized list of 0-12 two-letter <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\">ISO 3166-1 alpha-2</a> country codes indicating the countries from which users can vote in the poll; for channel chats only. If omitted or empty, then users from any country can participate in the poll.</param>\n    /// <param name=\"correctOptionIds\">A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode</param>\n    /// <param name=\"explanation\">Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing</param>\n    /// <param name=\"explanationParseMode\">Mode for parsing entities in the explanation. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"explanationEntities\">A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of <em>explanation_parse_mode</em></param>\n    /// <param name=\"explanationMedia\">Media added to the quiz explanation</param>\n    /// <param name=\"openPeriod\">Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with <em>close_date</em>.</param>\n    /// <param name=\"closeDate\">Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with <em>open_period</em>.</param>\n    /// <param name=\"isClosed\">Pass <em>True</em> if the poll needs to be immediately closed. This can be useful for poll preview.</param>\n    /// <param name=\"description\">Description of the poll to be sent, 0-1024 characters after entities parsing</param>\n    /// <param name=\"descriptionParseMode\">Mode for parsing entities in the poll description. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"descriptionEntities\">A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of <em>description_parse_mode</em></param>\n    /// <param name=\"media\">Media added to the poll description</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendPollAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string question,\n        IEnumerable<InputPollOption> options,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        string? questionParseMode = null,\n        IEnumerable<MessageEntity>? questionEntities = null,\n        bool? isAnonymous = null,\n        string? type = null,\n        bool? allowsMultipleAnswers = null,\n        bool? allowsRevoting = null,\n        bool? shuffleOptions = null,\n        bool? allowAddingOptions = null,\n        bool? hideResultsUntilCloses = null,\n        bool? membersOnly = null,\n        IEnumerable<string>? countryCodes = null,\n        IEnumerable<int>? correctOptionIds = null,\n        string? explanation = null,\n        string? explanationParseMode = null,\n        IEnumerable<MessageEntity>? explanationEntities = null,\n        InputPollMedia? explanationMedia = null,\n        int? openPeriod = null,\n        int? closeDate = null,\n        bool? isClosed = null,\n        string? description = null,\n        string? descriptionParseMode = null,\n        IEnumerable<MessageEntity>? descriptionEntities = null,\n        InputPollMedia? media = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.Question,\n                question ?? throw new ArgumentNullException(nameof(question))\n            },\n            { PropertyNames.Options, options ?? throw new ArgumentNullException(nameof(options)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (questionParseMode is not null)\n        {\n            args.Add(PropertyNames.QuestionParseMode, questionParseMode);\n        }\n        if (questionEntities is not null)\n        {\n            args.Add(PropertyNames.QuestionEntities, questionEntities);\n        }\n        if (isAnonymous is not null)\n        {\n            args.Add(PropertyNames.IsAnonymous, isAnonymous);\n        }\n        if (type is not null)\n        {\n            args.Add(PropertyNames.Type, type);\n        }\n        if (allowsMultipleAnswers is not null)\n        {\n            args.Add(PropertyNames.AllowsMultipleAnswers, allowsMultipleAnswers);\n        }\n        if (allowsRevoting is not null)\n        {\n            args.Add(PropertyNames.AllowsRevoting, allowsRevoting);\n        }\n        if (shuffleOptions is not null)\n        {\n            args.Add(PropertyNames.ShuffleOptions, shuffleOptions);\n        }\n        if (allowAddingOptions is not null)\n        {\n            args.Add(PropertyNames.AllowAddingOptions, allowAddingOptions);\n        }\n        if (hideResultsUntilCloses is not null)\n        {\n            args.Add(PropertyNames.HideResultsUntilCloses, hideResultsUntilCloses);\n        }\n        if (membersOnly is not null)\n        {\n            args.Add(PropertyNames.MembersOnly, membersOnly);\n        }\n        if (countryCodes is not null)\n        {\n            args.Add(PropertyNames.CountryCodes, countryCodes);\n        }\n        if (correctOptionIds is not null)\n        {\n            args.Add(PropertyNames.CorrectOptionIds, correctOptionIds);\n        }\n        if (explanation is not null)\n        {\n            args.Add(PropertyNames.Explanation, explanation);\n        }\n        if (explanationParseMode is not null)\n        {\n            args.Add(PropertyNames.ExplanationParseMode, explanationParseMode);\n        }\n        if (explanationEntities is not null)\n        {\n            args.Add(PropertyNames.ExplanationEntities, explanationEntities);\n        }\n        if (explanationMedia is not null)\n        {\n            args.Add(PropertyNames.ExplanationMedia, explanationMedia);\n        }\n        if (openPeriod is not null)\n        {\n            args.Add(PropertyNames.OpenPeriod, openPeriod);\n        }\n        if (closeDate is not null)\n        {\n            args.Add(PropertyNames.CloseDate, closeDate);\n        }\n        if (isClosed is not null)\n        {\n            args.Add(PropertyNames.IsClosed, isClosed);\n        }\n        if (description is not null)\n        {\n            args.Add(PropertyNames.Description, description);\n        }\n        if (descriptionParseMode is not null)\n        {\n            args.Add(PropertyNames.DescriptionParseMode, descriptionParseMode);\n        }\n        if (descriptionEntities is not null)\n        {\n            args.Add(PropertyNames.DescriptionEntities, descriptionEntities);\n        }\n        if (media is not null)\n        {\n            args.Add(PropertyNames.Media, media);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendPoll, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendVenue.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send information about a venue. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendVenue\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVenue(this ITelegramBotClient client, SendVenueArgs args) =>\n        client.SendVenueAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send information about a venue. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendVenue\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVenueAsync(\n        this ITelegramBotClient client,\n        SendVenueArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVenue, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send information about a venue. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the venue</param>\n    /// <param name=\"longitude\">Longitude of the venue</param>\n    /// <param name=\"title\">Name of the venue</param>\n    /// <param name=\"address\">Address of the venue</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"foursquareId\">Foursquare identifier of the venue</param>\n    /// <param name=\"foursquareType\">Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)</param>\n    /// <param name=\"googlePlaceId\">Google Places identifier of the venue</param>\n    /// <param name=\"googlePlaceType\">Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVenue(\n        this ITelegramBotClient client,\n        long chatId,\n        float latitude,\n        float longitude,\n        string title,\n        string address,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? foursquareId = null,\n        string? foursquareType = null,\n        string? googlePlaceId = null,\n        string? googlePlaceType = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVenueAsync(\n                chatId,\n                latitude,\n                longitude,\n                title,\n                address,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                foursquareId,\n                foursquareType,\n                googlePlaceId,\n                googlePlaceType,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send information about a venue. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the venue</param>\n    /// <param name=\"longitude\">Longitude of the venue</param>\n    /// <param name=\"title\">Name of the venue</param>\n    /// <param name=\"address\">Address of the venue</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"foursquareId\">Foursquare identifier of the venue</param>\n    /// <param name=\"foursquareType\">Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)</param>\n    /// <param name=\"googlePlaceId\">Google Places identifier of the venue</param>\n    /// <param name=\"googlePlaceType\">Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVenueAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        float latitude,\n        float longitude,\n        string title,\n        string address,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? foursquareId = null,\n        string? foursquareType = null,\n        string? googlePlaceId = null,\n        string? googlePlaceType = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Latitude, latitude },\n            { PropertyNames.Longitude, longitude },\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n            { PropertyNames.Address, address ?? throw new ArgumentNullException(nameof(address)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (foursquareId is not null)\n        {\n            args.Add(PropertyNames.FoursquareId, foursquareId);\n        }\n        if (foursquareType is not null)\n        {\n            args.Add(PropertyNames.FoursquareType, foursquareType);\n        }\n        if (googlePlaceId is not null)\n        {\n            args.Add(PropertyNames.GooglePlaceId, googlePlaceId);\n        }\n        if (googlePlaceType is not null)\n        {\n            args.Add(PropertyNames.GooglePlaceType, googlePlaceType);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVenue, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send information about a venue. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the venue</param>\n    /// <param name=\"longitude\">Longitude of the venue</param>\n    /// <param name=\"title\">Name of the venue</param>\n    /// <param name=\"address\">Address of the venue</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"foursquareId\">Foursquare identifier of the venue</param>\n    /// <param name=\"foursquareType\">Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)</param>\n    /// <param name=\"googlePlaceId\">Google Places identifier of the venue</param>\n    /// <param name=\"googlePlaceType\">Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVenue(\n        this ITelegramBotClient client,\n        string chatId,\n        float latitude,\n        float longitude,\n        string title,\n        string address,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? foursquareId = null,\n        string? foursquareType = null,\n        string? googlePlaceId = null,\n        string? googlePlaceType = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVenueAsync(\n                chatId,\n                latitude,\n                longitude,\n                title,\n                address,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                foursquareId,\n                foursquareType,\n                googlePlaceId,\n                googlePlaceType,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send information about a venue. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"latitude\">Latitude of the venue</param>\n    /// <param name=\"longitude\">Longitude of the venue</param>\n    /// <param name=\"title\">Name of the venue</param>\n    /// <param name=\"address\">Address of the venue</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"foursquareId\">Foursquare identifier of the venue</param>\n    /// <param name=\"foursquareType\">Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)</param>\n    /// <param name=\"googlePlaceId\">Google Places identifier of the venue</param>\n    /// <param name=\"googlePlaceType\">Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVenueAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        float latitude,\n        float longitude,\n        string title,\n        string address,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? foursquareId = null,\n        string? foursquareType = null,\n        string? googlePlaceId = null,\n        string? googlePlaceType = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Latitude, latitude },\n            { PropertyNames.Longitude, longitude },\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n            { PropertyNames.Address, address ?? throw new ArgumentNullException(nameof(address)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (foursquareId is not null)\n        {\n            args.Add(PropertyNames.FoursquareId, foursquareId);\n        }\n        if (foursquareType is not null)\n        {\n            args.Add(PropertyNames.FoursquareType, foursquareType);\n        }\n        if (googlePlaceId is not null)\n        {\n            args.Add(PropertyNames.GooglePlaceId, googlePlaceId);\n        }\n        if (googlePlaceType is not null)\n        {\n            args.Add(PropertyNames.GooglePlaceType, googlePlaceType);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVenue, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendVideo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendVideo\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideo(this ITelegramBotClient client, SendVideoArgs args) =>\n        client.SendVideoAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendVideo\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoAsync(\n        this ITelegramBotClient client,\n        SendVideoArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideo, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"width\">Video width</param>\n    /// <param name=\"height\">Video height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"cover\">Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"startTimestamp\">Start timestamp for the video in the message</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"supportsStreaming\">Pass <em>True</em> if the uploaded video is suitable for streaming</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideo(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile video,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        InputFile? cover = null,\n        int? startTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? supportsStreaming = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVideoAsync(\n                chatId,\n                video,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                width,\n                height,\n                thumbnail,\n                cover,\n                startTimestamp,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                supportsStreaming,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"width\">Video width</param>\n    /// <param name=\"height\">Video height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"cover\">Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"startTimestamp\">Start timestamp for the video in the message</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"supportsStreaming\">Pass <em>True</em> if the uploaded video is suitable for streaming</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile video,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        InputFile? cover = null,\n        int? startTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? supportsStreaming = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Video, video ?? throw new ArgumentNullException(nameof(video)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (width is not null)\n        {\n            args.Add(PropertyNames.Width, width);\n        }\n        if (height is not null)\n        {\n            args.Add(PropertyNames.Height, height);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (cover is not null)\n        {\n            args.Add(PropertyNames.Cover, cover);\n        }\n        if (startTimestamp is not null)\n        {\n            args.Add(PropertyNames.StartTimestamp, startTimestamp);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (supportsStreaming is not null)\n        {\n            args.Add(PropertyNames.SupportsStreaming, supportsStreaming);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideo, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"width\">Video width</param>\n    /// <param name=\"height\">Video height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"cover\">Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"startTimestamp\">Start timestamp for the video in the message</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"supportsStreaming\">Pass <em>True</em> if the uploaded video is suitable for streaming</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideo(\n        this ITelegramBotClient client,\n        long chatId,\n        string video,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        string? cover = null,\n        int? startTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? supportsStreaming = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendVideoAsync(\n                chatId,\n                video,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                width,\n                height,\n                thumbnail,\n                cover,\n                startTimestamp,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                supportsStreaming,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"width\">Video width</param>\n    /// <param name=\"height\">Video height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"cover\">Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"startTimestamp\">Start timestamp for the video in the message</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"supportsStreaming\">Pass <em>True</em> if the uploaded video is suitable for streaming</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string video,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        string? cover = null,\n        int? startTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? supportsStreaming = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Video, video ?? throw new ArgumentNullException(nameof(video)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (width is not null)\n        {\n            args.Add(PropertyNames.Width, width);\n        }\n        if (height is not null)\n        {\n            args.Add(PropertyNames.Height, height);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (cover is not null)\n        {\n            args.Add(PropertyNames.Cover, cover);\n        }\n        if (startTimestamp is not null)\n        {\n            args.Add(PropertyNames.StartTimestamp, startTimestamp);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (supportsStreaming is not null)\n        {\n            args.Add(PropertyNames.SupportsStreaming, supportsStreaming);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideo, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"width\">Video width</param>\n    /// <param name=\"height\">Video height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"cover\">Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"startTimestamp\">Start timestamp for the video in the message</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"supportsStreaming\">Pass <em>True</em> if the uploaded video is suitable for streaming</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideo(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile video,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        InputFile? cover = null,\n        int? startTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? supportsStreaming = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVideoAsync(\n                chatId,\n                video,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                width,\n                height,\n                thumbnail,\n                cover,\n                startTimestamp,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                supportsStreaming,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"width\">Video width</param>\n    /// <param name=\"height\">Video height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"cover\">Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"startTimestamp\">Start timestamp for the video in the message</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"supportsStreaming\">Pass <em>True</em> if the uploaded video is suitable for streaming</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile video,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        InputFile? cover = null,\n        int? startTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? supportsStreaming = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Video, video ?? throw new ArgumentNullException(nameof(video)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (width is not null)\n        {\n            args.Add(PropertyNames.Width, width);\n        }\n        if (height is not null)\n        {\n            args.Add(PropertyNames.Height, height);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (cover is not null)\n        {\n            args.Add(PropertyNames.Cover, cover);\n        }\n        if (startTimestamp is not null)\n        {\n            args.Add(PropertyNames.StartTimestamp, startTimestamp);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (supportsStreaming is not null)\n        {\n            args.Add(PropertyNames.SupportsStreaming, supportsStreaming);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideo, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"width\">Video width</param>\n    /// <param name=\"height\">Video height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"cover\">Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"startTimestamp\">Start timestamp for the video in the message</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"supportsStreaming\">Pass <em>True</em> if the uploaded video is suitable for streaming</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideo(\n        this ITelegramBotClient client,\n        string chatId,\n        string video,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        string? cover = null,\n        int? startTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? supportsStreaming = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendVideoAsync(\n                chatId,\n                video,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                width,\n                height,\n                thumbnail,\n                cover,\n                startTimestamp,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                hasSpoiler,\n                supportsStreaming,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"video\">Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"width\">Video width</param>\n    /// <param name=\"height\">Video height</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"cover\">Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"startTimestamp\">Start timestamp for the video in the message</param>\n    /// <param name=\"caption\">Video caption (may also be used when resending videos by <em>file_id</em>), 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media</param>\n    /// <param name=\"hasSpoiler\">Pass <em>True</em> if the video needs to be covered with a spoiler animation</param>\n    /// <param name=\"supportsStreaming\">Pass <em>True</em> if the uploaded video is suitable for streaming</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string video,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? width = null,\n        int? height = null,\n        InputFile? thumbnail = null,\n        string? cover = null,\n        int? startTimestamp = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        bool? hasSpoiler = null,\n        bool? supportsStreaming = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Video, video ?? throw new ArgumentNullException(nameof(video)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (width is not null)\n        {\n            args.Add(PropertyNames.Width, width);\n        }\n        if (height is not null)\n        {\n            args.Add(PropertyNames.Height, height);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (cover is not null)\n        {\n            args.Add(PropertyNames.Cover, cover);\n        }\n        if (startTimestamp is not null)\n        {\n            args.Add(PropertyNames.StartTimestamp, startTimestamp);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (hasSpoiler is not null)\n        {\n            args.Add(PropertyNames.HasSpoiler, hasSpoiler);\n        }\n        if (supportsStreaming is not null)\n        {\n            args.Add(PropertyNames.SupportsStreaming, supportsStreaming);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideo, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendVideoNote.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendVideoNote\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideoNote(this ITelegramBotClient client, SendVideoNoteArgs args) =>\n        client.SendVideoNoteAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendVideoNote\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoNoteAsync(\n        this ITelegramBotClient client,\n        SendVideoNoteArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideoNote, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"length\">Video width and height, i.e. diameter of the video message</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideoNote(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile videoNote,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? length = null,\n        InputFile? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVideoNoteAsync(\n                chatId,\n                videoNote,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                length,\n                thumbnail,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"length\">Video width and height, i.e. diameter of the video message</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoNoteAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile videoNote,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? length = null,\n        InputFile? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.VideoNote,\n                videoNote ?? throw new ArgumentNullException(nameof(videoNote))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (length is not null)\n        {\n            args.Add(PropertyNames.Length, length);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideoNote, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"length\">Video width and height, i.e. diameter of the video message</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideoNote(\n        this ITelegramBotClient client,\n        long chatId,\n        string videoNote,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? length = null,\n        string? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendVideoNoteAsync(\n                chatId,\n                videoNote,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                length,\n                thumbnail,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"length\">Video width and height, i.e. diameter of the video message</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoNoteAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string videoNote,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? length = null,\n        string? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.VideoNote,\n                videoNote ?? throw new ArgumentNullException(nameof(videoNote))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (length is not null)\n        {\n            args.Add(PropertyNames.Length, length);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideoNote, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"length\">Video width and height, i.e. diameter of the video message</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideoNote(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile videoNote,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? length = null,\n        InputFile? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVideoNoteAsync(\n                chatId,\n                videoNote,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                length,\n                thumbnail,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"length\">Video width and height, i.e. diameter of the video message</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoNoteAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile videoNote,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? length = null,\n        InputFile? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.VideoNote,\n                videoNote ?? throw new ArgumentNullException(nameof(videoNote))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (length is not null)\n        {\n            args.Add(PropertyNames.Length, length);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideoNote, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"length\">Video width and height, i.e. diameter of the video message</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVideoNote(\n        this ITelegramBotClient client,\n        string chatId,\n        string videoNote,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? length = null,\n        string? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null\n    ) =>\n        client\n            .SendVideoNoteAsync(\n                chatId,\n                videoNote,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                duration,\n                length,\n                thumbnail,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup,\n                files\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// As of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"videoNote\">Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending video notes by a URL is currently unsupported</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"duration\">Duration of sent video in seconds</param>\n    /// <param name=\"length\">Video width and height, i.e. diameter of the video message</param>\n    /// <param name=\"thumbnail\">Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"files\">The files to upload.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVideoNoteAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string videoNote,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        int? duration = null,\n        int? length = null,\n        string? thumbnail = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        IDictionary<string, InputFile>? files = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.VideoNote,\n                videoNote ?? throw new ArgumentNullException(nameof(videoNote))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (length is not null)\n        {\n            args.Add(PropertyNames.Length, length);\n        }\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n        if (files is not null)\n        {\n            foreach (var file in files)\n            {\n                args.Add(file.Key, file.Value);\n            }\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVideoNote, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/sendVoice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendVoice\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVoice(this ITelegramBotClient client, SendVoiceArgs args) =>\n        client.SendVoiceAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendVoice\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVoiceAsync(\n        this ITelegramBotClient client,\n        SendVoiceArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVoice, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Voice message caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the voice message in seconds</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVoice(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile voice,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVoiceAsync(\n                chatId,\n                voice,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                duration,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Voice message caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the voice message in seconds</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVoiceAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile voice,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Voice, voice ?? throw new ArgumentNullException(nameof(voice)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVoice, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Voice message caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the voice message in seconds</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVoice(\n        this ITelegramBotClient client,\n        long chatId,\n        string voice,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVoiceAsync(\n                chatId,\n                voice,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                duration,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Voice message caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the voice message in seconds</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVoiceAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string voice,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Voice, voice ?? throw new ArgumentNullException(nameof(voice)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVoice, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Voice message caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the voice message in seconds</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVoice(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile voice,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVoiceAsync(\n                chatId,\n                voice,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                duration,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Voice message caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the voice message in seconds</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVoiceAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile voice,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Voice, voice ?? throw new ArgumentNullException(nameof(voice)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVoice, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Voice message caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the voice message in seconds</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendVoice(\n        this ITelegramBotClient client,\n        string chatId,\n        string voice,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendVoiceAsync(\n                chatId,\n                voice,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                caption,\n                parseMode,\n                captionEntities,\n                duration,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as <see cref=\"Audio\"/> or <see cref=\"Document\"/>). On success, the sent <see cref=\"Message\"/> is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"voice\">Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"caption\">Voice message caption, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"duration\">Duration of the voice message in seconds</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendVoiceAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string voice,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        int? duration = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Voice, voice ?? throw new ArgumentNullException(nameof(voice)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (duration is not null)\n        {\n            args.Add(PropertyNames.Duration, duration);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendVoice, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setBusinessAccountBio.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Changes the bio of a managed business account. Requires the <em>can_change_bio</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"bio\">The new value of the bio for the business account; 0-140 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountBio(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string? bio = null\n    ) => client.SetBusinessAccountBioAsync(businessConnectionId, bio).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Changes the bio of a managed business account. Requires the <em>can_change_bio</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"bio\">The new value of the bio for the business account; 0-140 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountBioAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string? bio = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n        if (bio is not null)\n        {\n            args.Add(PropertyNames.Bio, bio);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountBio,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setBusinessAccountGiftSettings.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Changes the privacy settings pertaining to incoming gifts in a managed business account. Requires the <em>can_change_gift_settings</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetBusinessAccountGiftSettings\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountGiftSettings(\n        this ITelegramBotClient client,\n        SetBusinessAccountGiftSettingsArgs args\n    ) => client.SetBusinessAccountGiftSettingsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Changes the privacy settings pertaining to incoming gifts in a managed business account. Requires the <em>can_change_gift_settings</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetBusinessAccountGiftSettings\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountGiftSettingsAsync(\n        this ITelegramBotClient client,\n        SetBusinessAccountGiftSettingsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountGiftSettings,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Changes the privacy settings pertaining to incoming gifts in a managed business account. Requires the <em>can_change_gift_settings</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"showGiftButton\">Pass <em>True</em>, if a button for sending a gift to the user or by the business account must always be shown in the input field</param>\n    /// <param name=\"acceptedGiftTypes\">Types of gifts accepted by the business account</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountGiftSettings(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool showGiftButton,\n        AcceptedGiftTypes acceptedGiftTypes\n    ) =>\n        client\n            .SetBusinessAccountGiftSettingsAsync(\n                businessConnectionId,\n                showGiftButton,\n                acceptedGiftTypes\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the privacy settings pertaining to incoming gifts in a managed business account. Requires the <em>can_change_gift_settings</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"showGiftButton\">Pass <em>True</em>, if a button for sending a gift to the user or by the business account must always be shown in the input field</param>\n    /// <param name=\"acceptedGiftTypes\">Types of gifts accepted by the business account</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountGiftSettingsAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool showGiftButton,\n        AcceptedGiftTypes acceptedGiftTypes,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.ShowGiftButton, showGiftButton },\n            {\n                PropertyNames.AcceptedGiftTypes,\n                acceptedGiftTypes ?? throw new ArgumentNullException(nameof(acceptedGiftTypes))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountGiftSettings,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setBusinessAccountName.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Changes the first and last name of a managed business account. Requires the <em>can_change_name</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"firstName\">The new value of the first name for the business account; 1-64 characters</param>\n    /// <param name=\"lastName\">The new value of the last name for the business account; 0-64 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountName(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string firstName,\n        string? lastName = null\n    ) =>\n        client\n            .SetBusinessAccountNameAsync(businessConnectionId, firstName, lastName)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the first and last name of a managed business account. Requires the <em>can_change_name</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"firstName\">The new value of the first name for the business account; 1-64 characters</param>\n    /// <param name=\"lastName\">The new value of the last name for the business account; 0-64 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountNameAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string firstName,\n        string? lastName = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.FirstName,\n                firstName ?? throw new ArgumentNullException(nameof(firstName))\n            },\n        };\n        if (lastName is not null)\n        {\n            args.Add(PropertyNames.LastName, lastName);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountName,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setBusinessAccountProfilePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Changes the profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetBusinessAccountProfilePhoto\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountProfilePhoto(\n        this ITelegramBotClient client,\n        SetBusinessAccountProfilePhotoArgs args\n    ) => client.SetBusinessAccountProfilePhotoAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Changes the profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetBusinessAccountProfilePhoto\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountProfilePhotoAsync(\n        this ITelegramBotClient client,\n        SetBusinessAccountProfilePhotoArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountProfilePhoto,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Changes the profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    /// <param name=\"isPublic\">Pass <em>True</em> to set the public photo, which will be visible even if the main photo is hidden by the business account's privacy settings. An account can have only one public photo.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountProfilePhoto(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        InputProfilePhoto photo,\n        bool? isPublic = null\n    ) =>\n        client\n            .SetBusinessAccountProfilePhotoAsync(businessConnectionId, photo, isPublic)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    /// <param name=\"isPublic\">Pass <em>True</em> to set the public photo, which will be visible even if the main photo is hidden by the business account's privacy settings. An account can have only one public photo.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountProfilePhotoAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        InputProfilePhoto photo,\n        bool? isPublic = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (isPublic is not null)\n        {\n            args.Add(PropertyNames.IsPublic, isPublic);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountProfilePhoto,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setBusinessAccountUsername.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Changes the username of a managed business account. Requires the <em>can_change_username</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"username\">The new value of the username for the business account; 0-32 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountUsername(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string? username = null\n    ) =>\n        client\n            .SetBusinessAccountUsernameAsync(businessConnectionId, username)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the username of a managed business account. Requires the <em>can_change_username</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"username\">The new value of the username for the business account; 0-32 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountUsernameAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string? username = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n        if (username is not null)\n        {\n            args.Add(PropertyNames.Username, username);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountUsername,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setChatAdministratorCustomTitle.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to set a custom title for an administrator in a supergroup promoted by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customTitle\">New custom title for the administrator; 0-16 characters, emoji are not allowed</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatAdministratorCustomTitle(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        string customTitle\n    ) =>\n        client\n            .SetChatAdministratorCustomTitleAsync(chatId, userId, customTitle)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to set a custom title for an administrator in a supergroup promoted by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customTitle\">New custom title for the administrator; 0-16 characters, emoji are not allowed</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatAdministratorCustomTitleAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        string customTitle,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n            {\n                PropertyNames.CustomTitle,\n                customTitle ?? throw new ArgumentNullException(nameof(customTitle))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetChatAdministratorCustomTitle,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to set a custom title for an administrator in a supergroup promoted by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customTitle\">New custom title for the administrator; 0-16 characters, emoji are not allowed</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatAdministratorCustomTitle(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        string customTitle\n    ) =>\n        client\n            .SetChatAdministratorCustomTitleAsync(chatId, userId, customTitle)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to set a custom title for an administrator in a supergroup promoted by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customTitle\">New custom title for the administrator; 0-16 characters, emoji are not allowed</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatAdministratorCustomTitleAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        string customTitle,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n            {\n                PropertyNames.CustomTitle,\n                customTitle ?? throw new ArgumentNullException(nameof(customTitle))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetChatAdministratorCustomTitle,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setChatDescription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the description of a group, a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"description\">New chat description, 0-255 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatDescription(\n        this ITelegramBotClient client,\n        long chatId,\n        string? description = null\n    ) => client.SetChatDescriptionAsync(chatId, description).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the description of a group, a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"description\">New chat description, 0-255 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatDescriptionAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string? description = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (description is not null)\n        {\n            args.Add(PropertyNames.Description, description);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetChatDescription,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to change the description of a group, a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"description\">New chat description, 0-255 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatDescription(\n        this ITelegramBotClient client,\n        string chatId,\n        string? description = null\n    ) => client.SetChatDescriptionAsync(chatId, description).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the description of a group, a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"description\">New chat description, 0-255 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatDescriptionAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string? description = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (description is not null)\n        {\n            args.Add(PropertyNames.Description, description);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetChatDescription,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setChatMemberTag.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_tags</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"tag\">New tag for the member; 0-16 characters, emoji are not allowed</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatMemberTag(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        string? tag = null\n    ) => client.SetChatMemberTagAsync(chatId, userId, tag).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_tags</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"tag\">New tag for the member; 0-16 characters, emoji are not allowed</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatMemberTagAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        string? tag = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n        };\n        if (tag is not null)\n        {\n            args.Add(PropertyNames.Tag, tag);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatMemberTag, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_tags</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"tag\">New tag for the member; 0-16 characters, emoji are not allowed</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatMemberTag(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        string? tag = null\n    ) => client.SetChatMemberTagAsync(chatId, userId, tag).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_tags</em> administrator right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"tag\">New tag for the member; 0-16 characters, emoji are not allowed</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatMemberTagAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        string? tag = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n        };\n        if (tag is not null)\n        {\n            args.Add(PropertyNames.Tag, tag);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatMemberTag, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setChatMenuButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the bot's menu button in a private chat, or the default menu button. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetChatMenuButton\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatMenuButton(\n        this ITelegramBotClient client,\n        SetChatMenuButtonArgs args\n    ) => client.SetChatMenuButtonAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the bot's menu button in a private chat, or the default menu button. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetChatMenuButton\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatMenuButtonAsync(\n        this ITelegramBotClient client,\n        SetChatMenuButtonArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatMenuButton, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to change the bot's menu button in a private chat, or the default menu button. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target private chat. If not specified, default bot's menu button will be changed</param>\n    /// <param name=\"menuButton\">A JSON-serialized object for the bot's new menu button. Defaults to <see cref=\"MenuButtonDefault\"/></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatMenuButton(\n        this ITelegramBotClient client,\n        long? chatId = null,\n        MenuButton? menuButton = null\n    ) => client.SetChatMenuButtonAsync(chatId, menuButton).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the bot's menu button in a private chat, or the default menu button. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target private chat. If not specified, default bot's menu button will be changed</param>\n    /// <param name=\"menuButton\">A JSON-serialized object for the bot's new menu button. Defaults to <see cref=\"MenuButtonDefault\"/></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatMenuButtonAsync(\n        this ITelegramBotClient client,\n        long? chatId = null,\n        MenuButton? menuButton = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (chatId is not null)\n        {\n            args.Add(PropertyNames.ChatId, chatId);\n        }\n        if (menuButton is not null)\n        {\n            args.Add(PropertyNames.MenuButton, menuButton);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatMenuButton, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setChatPermissions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the <em>can_restrict_members</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetChatPermissions\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatPermissions(\n        this ITelegramBotClient client,\n        SetChatPermissionsArgs args\n    ) => client.SetChatPermissionsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the <em>can_restrict_members</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetChatPermissions\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatPermissionsAsync(\n        this ITelegramBotClient client,\n        SetChatPermissionsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetChatPermissions,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the <em>can_restrict_members</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"permissions\">A JSON-serialized object for new default chat permissions</param>\n    /// <param name=\"useIndependentChatPermissions\">Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatPermissions(\n        this ITelegramBotClient client,\n        long chatId,\n        ChatPermissions permissions,\n        bool? useIndependentChatPermissions = null\n    ) =>\n        client\n            .SetChatPermissionsAsync(chatId, permissions, useIndependentChatPermissions)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the <em>can_restrict_members</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"permissions\">A JSON-serialized object for new default chat permissions</param>\n    /// <param name=\"useIndependentChatPermissions\">Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatPermissionsAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        ChatPermissions permissions,\n        bool? useIndependentChatPermissions = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.Permissions,\n                permissions ?? throw new ArgumentNullException(nameof(permissions))\n            },\n        };\n        if (useIndependentChatPermissions is not null)\n        {\n            args.Add(PropertyNames.UseIndependentChatPermissions, useIndependentChatPermissions);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetChatPermissions,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the <em>can_restrict_members</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"permissions\">A JSON-serialized object for new default chat permissions</param>\n    /// <param name=\"useIndependentChatPermissions\">Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatPermissions(\n        this ITelegramBotClient client,\n        string chatId,\n        ChatPermissions permissions,\n        bool? useIndependentChatPermissions = null\n    ) =>\n        client\n            .SetChatPermissionsAsync(chatId, permissions, useIndependentChatPermissions)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the <em>can_restrict_members</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"permissions\">A JSON-serialized object for new default chat permissions</param>\n    /// <param name=\"useIndependentChatPermissions\">Pass <em>True</em> if chat permissions are set independently. Otherwise, the <em>can_send_other_messages</em> and <em>can_add_web_page_previews</em> permissions will imply the <em>can_send_messages</em>, <em>can_send_audios</em>, <em>can_send_documents</em>, <em>can_send_photos</em>, <em>can_send_videos</em>, <em>can_send_video_notes</em>, and <em>can_send_voice_notes</em> permissions; the <em>can_send_polls</em> permission will imply the <em>can_send_messages</em> permission.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatPermissionsAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        ChatPermissions permissions,\n        bool? useIndependentChatPermissions = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.Permissions,\n                permissions ?? throw new ArgumentNullException(nameof(permissions))\n            },\n        };\n        if (useIndependentChatPermissions is not null)\n        {\n            args.Add(PropertyNames.UseIndependentChatPermissions, useIndependentChatPermissions);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetChatPermissions,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setChatPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetChatPhoto\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatPhoto(this ITelegramBotClient client, SetChatPhotoArgs args) =>\n        client.SetChatPhotoAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetChatPhoto\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatPhotoAsync(\n        this ITelegramBotClient client,\n        SetChatPhotoArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatPhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">New chat photo, uploaded using multipart/form-data</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatPhoto(this ITelegramBotClient client, long chatId, InputFile photo) =>\n        client.SetChatPhotoAsync(chatId, photo).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">New chat photo, uploaded using multipart/form-data</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatPhotoAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile photo,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatPhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">New chat photo, uploaded using multipart/form-data</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatPhoto(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile photo\n    ) => client.SetChatPhotoAsync(chatId, photo).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"photo\">New chat photo, uploaded using multipart/form-data</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatPhotoAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile photo,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatPhoto, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setChatStickerSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to set a new group sticker set for a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field <em>can_set_sticker_set</em> optionally returned in <a href=\"https://core.telegram.org/bots/api#getchat\">getChat</a> requests to check if the bot can use this method. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"stickerSetName\">Name of the sticker set to be set as the group sticker set</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatStickerSet(\n        this ITelegramBotClient client,\n        long chatId,\n        string stickerSetName\n    ) => client.SetChatStickerSetAsync(chatId, stickerSetName).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set a new group sticker set for a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field <em>can_set_sticker_set</em> optionally returned in <a href=\"https://core.telegram.org/bots/api#getchat\">getChat</a> requests to check if the bot can use this method. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"stickerSetName\">Name of the sticker set to be set as the group sticker set</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatStickerSetAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string stickerSetName,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.StickerSetName,\n                stickerSetName ?? throw new ArgumentNullException(nameof(stickerSetName))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatStickerSet, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to set a new group sticker set for a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field <em>can_set_sticker_set</em> optionally returned in <a href=\"https://core.telegram.org/bots/api#getchat\">getChat</a> requests to check if the bot can use this method. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"stickerSetName\">Name of the sticker set to be set as the group sticker set</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatStickerSet(\n        this ITelegramBotClient client,\n        string chatId,\n        string stickerSetName\n    ) => client.SetChatStickerSetAsync(chatId, stickerSetName).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set a new group sticker set for a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field <em>can_set_sticker_set</em> optionally returned in <a href=\"https://core.telegram.org/bots/api#getchat\">getChat</a> requests to check if the bot can use this method. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"stickerSetName\">Name of the sticker set to be set as the group sticker set</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatStickerSetAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string stickerSetName,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.StickerSetName,\n                stickerSetName ?? throw new ArgumentNullException(nameof(stickerSetName))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatStickerSet, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setChatTitle.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the title of a chat. Titles can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"title\">New chat title, 1-128 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatTitle(this ITelegramBotClient client, long chatId, string title) =>\n        client.SetChatTitleAsync(chatId, title).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the title of a chat. Titles can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"title\">New chat title, 1-128 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatTitleAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string title,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatTitle, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to change the title of a chat. Titles can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"title\">New chat title, 1-128 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetChatTitle(this ITelegramBotClient client, string chatId, string title) =>\n        client.SetChatTitleAsync(chatId, title).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the title of a chat. Titles can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"title\">New chat title, 1-128 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetChatTitleAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string title,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.SetChatTitle, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setManagedBotAccessSettings.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the access settings of a managed bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetManagedBotAccessSettings\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetManagedBotAccessSettings(\n        this ITelegramBotClient client,\n        SetManagedBotAccessSettingsArgs args\n    ) => client.SetManagedBotAccessSettingsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the access settings of a managed bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetManagedBotAccessSettings\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetManagedBotAccessSettingsAsync(\n        this ITelegramBotClient client,\n        SetManagedBotAccessSettingsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetManagedBotAccessSettings,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to change the access settings of a managed bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the managed bot whose access settings will be changed</param>\n    /// <param name=\"isAccessRestricted\">Pass <em>True</em>, if only selected users can access the bot. The bot's owner can always access it.</param>\n    /// <param name=\"addedUserIds\">A JSON-serialized list of up to 10 identifiers of users who will have access to the bot in addition to its owner. Ignored if <em>is_access_restricted</em> is false.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetManagedBotAccessSettings(\n        this ITelegramBotClient client,\n        long userId,\n        bool isAccessRestricted,\n        IEnumerable<int>? addedUserIds = null\n    ) =>\n        client\n            .SetManagedBotAccessSettingsAsync(userId, isAccessRestricted, addedUserIds)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to change the access settings of a managed bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the managed bot whose access settings will be changed</param>\n    /// <param name=\"isAccessRestricted\">Pass <em>True</em>, if only selected users can access the bot. The bot's owner can always access it.</param>\n    /// <param name=\"addedUserIds\">A JSON-serialized list of up to 10 identifiers of users who will have access to the bot in addition to its owner. Ignored if <em>is_access_restricted</em> is false.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetManagedBotAccessSettingsAsync(\n        this ITelegramBotClient client,\n        long userId,\n        bool isAccessRestricted,\n        IEnumerable<int>? addedUserIds = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.IsAccessRestricted, isAccessRestricted },\n        };\n        if (addedUserIds is not null)\n        {\n            args.Add(PropertyNames.AddedUserIds, addedUserIds);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetManagedBotAccessSettings,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setMessageReaction.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the chosen reactions on a message. Service messages of some types can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetMessageReaction\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMessageReaction(\n        this ITelegramBotClient client,\n        SetMessageReactionArgs args\n    ) => client.SetMessageReactionAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the chosen reactions on a message. Service messages of some types can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetMessageReaction\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMessageReactionAsync(\n        this ITelegramBotClient client,\n        SetMessageReactionArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetMessageReaction,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to change the chosen reactions on a message. Service messages of some types can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead.</param>\n    /// <param name=\"reaction\">A JSON-serialized list of reaction types to set on the message. Currently, as non-premium users, bots can set up to one reaction per message. A custom emoji reaction can be used if it is either already present on the message or explicitly allowed by chat administrators. Paid reactions can't be used by bots.</param>\n    /// <param name=\"isBig\">Pass <em>True</em> to set the reaction with a big animation</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMessageReaction(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        IEnumerable<ReactionType>? reaction = null,\n        bool? isBig = null\n    ) =>\n        client.SetMessageReactionAsync(chatId, messageId, reaction, isBig).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the chosen reactions on a message. Service messages of some types can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead.</param>\n    /// <param name=\"reaction\">A JSON-serialized list of reaction types to set on the message. Currently, as non-premium users, bots can set up to one reaction per message. A custom emoji reaction can be used if it is either already present on the message or explicitly allowed by chat administrators. Paid reactions can't be used by bots.</param>\n    /// <param name=\"isBig\">Pass <em>True</em> to set the reaction with a big animation</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMessageReactionAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        IEnumerable<ReactionType>? reaction = null,\n        bool? isBig = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (reaction is not null)\n        {\n            args.Add(PropertyNames.Reaction, reaction);\n        }\n        if (isBig is not null)\n        {\n            args.Add(PropertyNames.IsBig, isBig);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetMessageReaction,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to change the chosen reactions on a message. Service messages of some types can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead.</param>\n    /// <param name=\"reaction\">A JSON-serialized list of reaction types to set on the message. Currently, as non-premium users, bots can set up to one reaction per message. A custom emoji reaction can be used if it is either already present on the message or explicitly allowed by chat administrators. Paid reactions can't be used by bots.</param>\n    /// <param name=\"isBig\">Pass <em>True</em> to set the reaction with a big animation</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMessageReaction(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        IEnumerable<ReactionType>? reaction = null,\n        bool? isBig = null\n    ) =>\n        client.SetMessageReactionAsync(chatId, messageId, reaction, isBig).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the chosen reactions on a message. Service messages of some types can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead.</param>\n    /// <param name=\"reaction\">A JSON-serialized list of reaction types to set on the message. Currently, as non-premium users, bots can set up to one reaction per message. A custom emoji reaction can be used if it is either already present on the message or explicitly allowed by chat administrators. Paid reactions can't be used by bots.</param>\n    /// <param name=\"isBig\">Pass <em>True</em> to set the reaction with a big animation</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMessageReactionAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        IEnumerable<ReactionType>? reaction = null,\n        bool? isBig = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (reaction is not null)\n        {\n            args.Add(PropertyNames.Reaction, reaction);\n        }\n        if (isBig is not null)\n        {\n            args.Add(PropertyNames.IsBig, isBig);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetMessageReaction,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setMyCommands.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the list of the bot's commands. See <a href=\"https://core.telegram.org/bots/features#commands\">this manual</a> for more details about bot commands. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetMyCommands\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyCommands(this ITelegramBotClient client, SetMyCommandsArgs args) =>\n        client.SetMyCommandsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the list of the bot's commands. See <a href=\"https://core.telegram.org/bots/features#commands\">this manual</a> for more details about bot commands. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetMyCommands\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyCommandsAsync(\n        this ITelegramBotClient client,\n        SetMyCommandsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetMyCommands, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to change the list of the bot's commands. See <a href=\"https://core.telegram.org/bots/features#commands\">this manual</a> for more details about bot commands. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"commands\">A JSON-serialized list of bot commands to be set as the list of the bot's commands. At most 100 commands can be specified.</param>\n    /// <param name=\"scope\">A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to <see cref=\"BotCommandScopeDefault\"/>.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyCommands(\n        this ITelegramBotClient client,\n        IEnumerable<BotCommand> commands,\n        BotCommandScope? scope = null,\n        string? languageCode = null\n    ) => client.SetMyCommandsAsync(commands, scope, languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the list of the bot's commands. See <a href=\"https://core.telegram.org/bots/features#commands\">this manual</a> for more details about bot commands. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"commands\">A JSON-serialized list of bot commands to be set as the list of the bot's commands. At most 100 commands can be specified.</param>\n    /// <param name=\"scope\">A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to <see cref=\"BotCommandScopeDefault\"/>.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyCommandsAsync(\n        this ITelegramBotClient client,\n        IEnumerable<BotCommand> commands,\n        BotCommandScope? scope = null,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.Commands,\n                commands ?? throw new ArgumentNullException(nameof(commands))\n            },\n        };\n        if (scope is not null)\n        {\n            args.Add(PropertyNames.Scope, scope);\n        }\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetMyCommands, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setMyDefaultAdministratorRights.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the default administrator rights requested by the bot when it's added as an administrator to groups or channels. These rights will be suggested to users, but they are free to modify the list before adding the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetMyDefaultAdministratorRights\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyDefaultAdministratorRights(\n        this ITelegramBotClient client,\n        SetMyDefaultAdministratorRightsArgs args\n    ) => client.SetMyDefaultAdministratorRightsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the default administrator rights requested by the bot when it's added as an administrator to groups or channels. These rights will be suggested to users, but they are free to modify the list before adding the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetMyDefaultAdministratorRights\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyDefaultAdministratorRightsAsync(\n        this ITelegramBotClient client,\n        SetMyDefaultAdministratorRightsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetMyDefaultAdministratorRights,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to change the default administrator rights requested by the bot when it's added as an administrator to groups or channels. These rights will be suggested to users, but they are free to modify the list before adding the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"rights\">A JSON-serialized object describing new default administrator rights. If not specified, the default administrator rights will be cleared.</param>\n    /// <param name=\"forChannels\">Pass <em>True</em> to change the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be changed.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyDefaultAdministratorRights(\n        this ITelegramBotClient client,\n        ChatAdministratorRights? rights = null,\n        bool? forChannels = null\n    ) => client.SetMyDefaultAdministratorRightsAsync(rights, forChannels).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the default administrator rights requested by the bot when it's added as an administrator to groups or channels. These rights will be suggested to users, but they are free to modify the list before adding the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"rights\">A JSON-serialized object describing new default administrator rights. If not specified, the default administrator rights will be cleared.</param>\n    /// <param name=\"forChannels\">Pass <em>True</em> to change the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be changed.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyDefaultAdministratorRightsAsync(\n        this ITelegramBotClient client,\n        ChatAdministratorRights? rights = null,\n        bool? forChannels = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (rights is not null)\n        {\n            args.Add(PropertyNames.Rights, rights);\n        }\n        if (forChannels is not null)\n        {\n            args.Add(PropertyNames.ForChannels, forChannels);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetMyDefaultAdministratorRights,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setMyDescription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the bot's description, which is shown in the chat with the bot if the chat is empty. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"description\">New bot description; 0-512 characters. Pass an empty string to remove the dedicated description for the given language.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, the description will be applied to all users for whose language there is no dedicated description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyDescription(\n        this ITelegramBotClient client,\n        string? description = null,\n        string? languageCode = null\n    ) => client.SetMyDescriptionAsync(description, languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the bot's description, which is shown in the chat with the bot if the chat is empty. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"description\">New bot description; 0-512 characters. Pass an empty string to remove the dedicated description for the given language.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, the description will be applied to all users for whose language there is no dedicated description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyDescriptionAsync(\n        this ITelegramBotClient client,\n        string? description = null,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (description is not null)\n        {\n            args.Add(PropertyNames.Description, description);\n        }\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetMyDescription, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setMyName.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the bot's name. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">New bot name; 0-64 characters. Pass an empty string to remove the dedicated name for the given language.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, the name will be shown to all users for whose language there is no dedicated name.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyName(\n        this ITelegramBotClient client,\n        string? name = null,\n        string? languageCode = null\n    ) => client.SetMyNameAsync(name, languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the bot's name. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">New bot name; 0-64 characters. Pass an empty string to remove the dedicated name for the given language.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, the name will be shown to all users for whose language there is no dedicated name.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyNameAsync(\n        this ITelegramBotClient client,\n        string? name = null,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (name is not null)\n        {\n            args.Add(PropertyNames.Name, name);\n        }\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetMyName, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setMyProfilePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Changes the profile photo of the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetMyProfilePhoto\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyProfilePhoto(\n        this ITelegramBotClient client,\n        SetMyProfilePhotoArgs args\n    ) => client.SetMyProfilePhotoAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Changes the profile photo of the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetMyProfilePhoto\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyProfilePhotoAsync(\n        this ITelegramBotClient client,\n        SetMyProfilePhotoArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetMyProfilePhoto, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Changes the profile photo of the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyProfilePhoto(this ITelegramBotClient client, InputProfilePhoto photo) =>\n        client.SetMyProfilePhotoAsync(photo).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Changes the profile photo of the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyProfilePhotoAsync(\n        this ITelegramBotClient client,\n        InputProfilePhoto photo,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.SetMyProfilePhoto, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setMyShortDescription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to change the bot's short description, which is shown on the bot's profile page and is sent together with the link when users share the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"shortDescription\">New short description for the bot; 0-120 characters. Pass an empty string to remove the dedicated short description for the given language.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, the short description will be applied to all users for whose language there is no dedicated short description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetMyShortDescription(\n        this ITelegramBotClient client,\n        string? shortDescription = null,\n        string? languageCode = null\n    ) => client.SetMyShortDescriptionAsync(shortDescription, languageCode).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the bot's short description, which is shown on the bot's profile page and is sent together with the link when users share the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"shortDescription\">New short description for the bot; 0-120 characters. Pass an empty string to remove the dedicated short description for the given language.</param>\n    /// <param name=\"languageCode\">A two-letter ISO 639-1 language code. If empty, the short description will be applied to all users for whose language there is no dedicated short description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetMyShortDescriptionAsync(\n        this ITelegramBotClient client,\n        string? shortDescription = null,\n        string? languageCode = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (shortDescription is not null)\n        {\n            args.Add(PropertyNames.ShortDescription, shortDescription);\n        }\n        if (languageCode is not null)\n        {\n            args.Add(PropertyNames.LanguageCode, languageCode);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetMyShortDescription,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/setUserEmojiStatus.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Changes the emoji status for a given user that previously allowed the bot to manage their emoji status via the Mini App method <a href=\"https://core.telegram.org/bots/webapps#initializing-mini-apps\">requestEmojiStatusAccess</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"emojiStatusCustomEmojiId\">Custom emoji identifier of the emoji status to set. Pass an empty string to remove the status.</param>\n    /// <param name=\"emojiStatusExpirationDate\">Expiration date of the emoji status, if any</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetUserEmojiStatus(\n        this ITelegramBotClient client,\n        long userId,\n        string? emojiStatusCustomEmojiId = null,\n        int? emojiStatusExpirationDate = null\n    ) =>\n        client\n            .SetUserEmojiStatusAsync(userId, emojiStatusCustomEmojiId, emojiStatusExpirationDate)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the emoji status for a given user that previously allowed the bot to manage their emoji status via the Mini App method <a href=\"https://core.telegram.org/bots/webapps#initializing-mini-apps\">requestEmojiStatusAccess</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"emojiStatusCustomEmojiId\">Custom emoji identifier of the emoji status to set. Pass an empty string to remove the status.</param>\n    /// <param name=\"emojiStatusExpirationDate\">Expiration date of the emoji status, if any</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetUserEmojiStatusAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string? emojiStatusCustomEmojiId = null,\n        int? emojiStatusExpirationDate = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n        if (emojiStatusCustomEmojiId is not null)\n        {\n            args.Add(PropertyNames.EmojiStatusCustomEmojiId, emojiStatusCustomEmojiId);\n        }\n        if (emojiStatusExpirationDate is not null)\n        {\n            args.Add(PropertyNames.EmojiStatusExpirationDate, emojiStatusExpirationDate);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetUserEmojiStatus,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/transferBusinessAccountStars.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Transfers Telegram Stars from the business account balance to the bot's balance. Requires the <em>can_transfer_stars</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to transfer; 1-10000</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool TransferBusinessAccountStars(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int starCount\n    ) =>\n        client\n            .TransferBusinessAccountStarsAsync(businessConnectionId, starCount)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Transfers Telegram Stars from the business account balance to the bot's balance. Requires the <em>can_transfer_stars</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to transfer; 1-10000</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> TransferBusinessAccountStarsAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int starCount,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.StarCount, starCount },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.TransferBusinessAccountStars,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/transferGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Transfers an owned unique gift to another user. Requires the <em>can_transfer_and_upgrade_gifts</em> business bot right. Requires <em>can_transfer_stars</em> business bot right if the transfer is paid. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be transferred</param>\n    /// <param name=\"newOwnerChatId\">Unique identifier of the chat which will own the gift. The chat must be active in the last 24 hours.</param>\n    /// <param name=\"starCount\">The amount of Telegram Stars that will be paid for the transfer from the business account balance. If positive, then the <em>can_transfer_stars</em> business bot right is required.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool TransferGift(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        long newOwnerChatId,\n        int? starCount = null\n    ) =>\n        client\n            .TransferGiftAsync(businessConnectionId, ownedGiftId, newOwnerChatId, starCount)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Transfers an owned unique gift to another user. Requires the <em>can_transfer_and_upgrade_gifts</em> business bot right. Requires <em>can_transfer_stars</em> business bot right if the transfer is paid. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be transferred</param>\n    /// <param name=\"newOwnerChatId\">Unique identifier of the chat which will own the gift. The chat must be active in the last 24 hours.</param>\n    /// <param name=\"starCount\">The amount of Telegram Stars that will be paid for the transfer from the business account balance. If positive, then the <em>can_transfer_stars</em> business bot right is required.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> TransferGiftAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        long newOwnerChatId,\n        int? starCount = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.OwnedGiftId,\n                ownedGiftId ?? throw new ArgumentNullException(nameof(ownedGiftId))\n            },\n            { PropertyNames.NewOwnerChatId, newOwnerChatId },\n        };\n        if (starCount is not null)\n        {\n            args.Add(PropertyNames.StarCount, starCount);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.TransferGift, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/unbanChatMember.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to unban a previously banned user in a supergroup or channel. The user will <strong>not</strong> return to the group or channel automatically, but will be able to join via link, etc. The bot must be an administrator for this to work. By default, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. So if the user is a member of the chat they will also be <strong>removed</strong> from the chat. If you don't want this, use the parameter <em>only_if_banned</em>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target group or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"onlyIfBanned\">Do nothing if the user is not banned</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnbanChatMember(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        bool? onlyIfBanned = null\n    ) => client.UnbanChatMemberAsync(chatId, userId, onlyIfBanned).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to unban a previously banned user in a supergroup or channel. The user will <strong>not</strong> return to the group or channel automatically, but will be able to join via link, etc. The bot must be an administrator for this to work. By default, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. So if the user is a member of the chat they will also be <strong>removed</strong> from the chat. If you don't want this, use the parameter <em>only_if_banned</em>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target group or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"onlyIfBanned\">Do nothing if the user is not banned</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnbanChatMemberAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long userId,\n        bool? onlyIfBanned = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.UserId, userId },\n        };\n        if (onlyIfBanned is not null)\n        {\n            args.Add(PropertyNames.OnlyIfBanned, onlyIfBanned);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.UnbanChatMember, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to unban a previously banned user in a supergroup or channel. The user will <strong>not</strong> return to the group or channel automatically, but will be able to join via link, etc. The bot must be an administrator for this to work. By default, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. So if the user is a member of the chat they will also be <strong>removed</strong> from the chat. If you don't want this, use the parameter <em>only_if_banned</em>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target group or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"onlyIfBanned\">Do nothing if the user is not banned</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnbanChatMember(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        bool? onlyIfBanned = null\n    ) => client.UnbanChatMemberAsync(chatId, userId, onlyIfBanned).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to unban a previously banned user in a supergroup or channel. The user will <strong>not</strong> return to the group or channel automatically, but will be able to join via link, etc. The bot must be an administrator for this to work. By default, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. So if the user is a member of the chat they will also be <strong>removed</strong> from the chat. If you don't want this, use the parameter <em>only_if_banned</em>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target group or username of the target supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"onlyIfBanned\">Do nothing if the user is not banned</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnbanChatMemberAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long userId,\n        bool? onlyIfBanned = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.UserId, userId },\n        };\n        if (onlyIfBanned is not null)\n        {\n            args.Add(PropertyNames.OnlyIfBanned, onlyIfBanned);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.UnbanChatMember, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/unbanChatSenderChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to unban a previously banned channel chat in a supergroup or channel. The bot must be an administrator for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"senderChatId\">Unique identifier of the target sender chat</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnbanChatSenderChat(\n        this ITelegramBotClient client,\n        long chatId,\n        long senderChatId\n    ) => client.UnbanChatSenderChatAsync(chatId, senderChatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to unban a previously banned channel chat in a supergroup or channel. The bot must be an administrator for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"senderChatId\">Unique identifier of the target sender chat</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnbanChatSenderChatAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long senderChatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.SenderChatId, senderChatId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnbanChatSenderChat,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to unban a previously banned channel chat in a supergroup or channel. The bot must be an administrator for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"senderChatId\">Unique identifier of the target sender chat</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnbanChatSenderChat(\n        this ITelegramBotClient client,\n        string chatId,\n        long senderChatId\n    ) => client.UnbanChatSenderChatAsync(chatId, senderChatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to unban a previously banned channel chat in a supergroup or channel. The bot must be an administrator for this to work and must have the appropriate administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"senderChatId\">Unique identifier of the target sender chat</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnbanChatSenderChatAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long senderChatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.SenderChatId, senderChatId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnbanChatSenderChat,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/unhideGeneralForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to unhide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnhideGeneralForumTopic(this ITelegramBotClient client, long chatId) =>\n        client.UnhideGeneralForumTopicAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to unhide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnhideGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnhideGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to unhide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnhideGeneralForumTopic(this ITelegramBotClient client, string chatId) =>\n        client.UnhideGeneralForumTopicAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to unhide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_topics</em> administrator rights. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnhideGeneralForumTopicAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnhideGeneralForumTopic,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/unpinAllChatMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a chat. In private chats and channel direct messages chats, no additional rights are required to unpin all pinned messages. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to unpin all pinned messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnpinAllChatMessages(this ITelegramBotClient client, long chatId) =>\n        client.UnpinAllChatMessagesAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a chat. In private chats and channel direct messages chats, no additional rights are required to unpin all pinned messages. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to unpin all pinned messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnpinAllChatMessagesAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnpinAllChatMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a chat. In private chats and channel direct messages chats, no additional rights are required to unpin all pinned messages. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to unpin all pinned messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnpinAllChatMessages(this ITelegramBotClient client, string chatId) =>\n        client.UnpinAllChatMessagesAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a chat. In private chats and channel direct messages chats, no additional rights are required to unpin all pinned messages. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to unpin all pinned messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnpinAllChatMessagesAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnpinAllChatMessages,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/unpinAllForumTopicMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a forum topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_pin_messages</em> administrator right in the supergroup. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnpinAllForumTopicMessages(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId\n    ) => client.UnpinAllForumTopicMessagesAsync(chatId, messageThreadId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a forum topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_pin_messages</em> administrator right in the supergroup. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnpinAllForumTopicMessagesAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageThreadId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnpinAllForumTopicMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a forum topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_pin_messages</em> administrator right in the supergroup. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnpinAllForumTopicMessages(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId\n    ) => client.UnpinAllForumTopicMessagesAsync(chatId, messageThreadId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a forum topic in a forum supergroup chat or a private chat with a user. In the case of a supergroup chat the bot must be an administrator in the chat for this to work and must have the <em>can_pin_messages</em> administrator right in the supergroup. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread of the forum topic</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnpinAllForumTopicMessagesAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageThreadId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageThreadId, messageThreadId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnpinAllForumTopicMessages,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/unpinAllGeneralForumTopicMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a General forum topic. The bot must be an administrator in the chat for this to work and must have the <em>can_pin_messages</em> administrator right in the supergroup. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnpinAllGeneralForumTopicMessages(\n        this ITelegramBotClient client,\n        long chatId\n    ) => client.UnpinAllGeneralForumTopicMessagesAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a General forum topic. The bot must be an administrator in the chat for this to work and must have the <em>can_pin_messages</em> administrator right in the supergroup. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnpinAllGeneralForumTopicMessagesAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnpinAllGeneralForumTopicMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a General forum topic. The bot must be an administrator in the chat for this to work and must have the <em>can_pin_messages</em> administrator right in the supergroup. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnpinAllGeneralForumTopicMessages(\n        this ITelegramBotClient client,\n        string chatId\n    ) => client.UnpinAllGeneralForumTopicMessagesAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to clear the list of pinned messages in a General forum topic. The bot must be an administrator in the chat for this to work and must have the <em>can_pin_messages</em> administrator right in the supergroup. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em></param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnpinAllGeneralForumTopicMessagesAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.UnpinAllGeneralForumTopicMessages,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/unpinChatMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Use this method to remove a message from the list of pinned messages in a chat. In private chats and channel direct messages chats, all messages can be unpinned. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to unpin messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be unpinned</param>\n    /// <param name=\"messageId\">Identifier of the message to unpin. Required if <em>business_connection_id</em> is specified. If not specified, the most recent pinned message (by sending date) will be unpinned.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnpinChatMessage(\n        this ITelegramBotClient client,\n        long chatId,\n        string? businessConnectionId = null,\n        int? messageId = null\n    ) =>\n        client\n            .UnpinChatMessageAsync(chatId, businessConnectionId, messageId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to remove a message from the list of pinned messages in a chat. In private chats and channel direct messages chats, all messages can be unpinned. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to unpin messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be unpinned</param>\n    /// <param name=\"messageId\">Identifier of the message to unpin. Required if <em>business_connection_id</em> is specified. If not specified, the most recent pinned message (by sending date) will be unpinned.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnpinChatMessageAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string? businessConnectionId = null,\n        int? messageId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageId is not null)\n        {\n            args.Add(PropertyNames.MessageId, messageId);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.UnpinChatMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to remove a message from the list of pinned messages in a chat. In private chats and channel direct messages chats, all messages can be unpinned. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to unpin messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be unpinned</param>\n    /// <param name=\"messageId\">Identifier of the message to unpin. Required if <em>business_connection_id</em> is specified. If not specified, the most recent pinned message (by sending date) will be unpinned.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UnpinChatMessage(\n        this ITelegramBotClient client,\n        string chatId,\n        string? businessConnectionId = null,\n        int? messageId = null\n    ) =>\n        client\n            .UnpinChatMessageAsync(chatId, businessConnectionId, messageId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to remove a message from the list of pinned messages in a chat. In private chats and channel direct messages chats, all messages can be unpinned. Conversely, the bot must be an administrator with the 'can_pin_messages' right or the 'can_edit_messages' right to unpin messages in groups and channels respectively. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel in the format <em>@username</em></param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be unpinned</param>\n    /// <param name=\"messageId\">Identifier of the message to unpin. Required if <em>business_connection_id</em> is specified. If not specified, the most recent pinned message (by sending date) will be unpinned.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UnpinChatMessageAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string? businessConnectionId = null,\n        int? messageId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageId is not null)\n        {\n            args.Add(PropertyNames.MessageId, messageId);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.UnpinChatMessage, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/upgradeGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Upgrades a given regular gift to a unique gift. Requires the <em>can_transfer_and_upgrade_gifts</em> business bot right. Additionally requires the <em>can_transfer_stars</em> business bot right if the upgrade is paid. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be upgraded to a unique one</param>\n    /// <param name=\"keepOriginalDetails\">Pass <em>True</em> to keep the original gift text, sender and receiver in the upgraded gift</param>\n    /// <param name=\"starCount\">The amount of Telegram Stars that will be paid for the upgrade from the business account balance. If <em>gift.prepaid_upgrade_star_count &gt; 0</em>, then pass 0, otherwise, the <em>can_transfer_stars</em> business bot right is required and <em>gift.upgrade_star_count</em> must be passed.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UpgradeGift(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        bool? keepOriginalDetails = null,\n        int? starCount = null\n    ) =>\n        client\n            .UpgradeGiftAsync(businessConnectionId, ownedGiftId, keepOriginalDetails, starCount)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Upgrades a given regular gift to a unique gift. Requires the <em>can_transfer_and_upgrade_gifts</em> business bot right. Additionally requires the <em>can_transfer_stars</em> business bot right if the upgrade is paid. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be upgraded to a unique one</param>\n    /// <param name=\"keepOriginalDetails\">Pass <em>True</em> to keep the original gift text, sender and receiver in the upgraded gift</param>\n    /// <param name=\"starCount\">The amount of Telegram Stars that will be paid for the upgrade from the business account balance. If <em>gift.prepaid_upgrade_star_count &gt; 0</em>, then pass 0, otherwise, the <em>can_transfer_stars</em> business bot right is required and <em>gift.upgrade_star_count</em> must be passed.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UpgradeGiftAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        bool? keepOriginalDetails = null,\n        int? starCount = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.OwnedGiftId,\n                ownedGiftId ?? throw new ArgumentNullException(nameof(ownedGiftId))\n            },\n        };\n        if (keepOriginalDetails is not null)\n        {\n            args.Add(PropertyNames.KeepOriginalDetails, keepOriginalDetails);\n        }\n        if (starCount is not null)\n        {\n            args.Add(PropertyNames.StarCount, starCount);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.UpgradeGift, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/verifyChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Channel direct messages chats can't be verified.</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyChat(\n        this ITelegramBotClient client,\n        long chatId,\n        string? customDescription = null\n    ) => client.VerifyChatAsync(chatId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Channel direct messages chats can't be verified.</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyChatAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyChat, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Channel direct messages chats can't be verified.</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyChat(\n        this ITelegramBotClient client,\n        string chatId,\n        string? customDescription = null\n    ) => client.VerifyChatAsync(chatId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>. Channel direct messages chats can't be verified.</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyChatAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyChat, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableMethods/verifyUser.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableMethods;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class AvailableMethodsExtensions\n{\n    /// <summary>\n    /// Verifies a user <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyUser(\n        this ITelegramBotClient client,\n        long userId,\n        string? customDescription = null\n    ) => client.VerifyUserAsync(userId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a user <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyUserAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyUser, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/AcceptedGiftTypes.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the types of gifts that can be gifted to a user or a chat.\n/// </summary>\npublic class AcceptedGiftTypes\n{\n    /// <summary>\n    /// <em>True</em>, if unlimited regular gifts are accepted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UnlimitedGifts)]\n    public bool UnlimitedGifts { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if limited regular gifts are accepted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LimitedGifts)]\n    public bool LimitedGifts { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if unique gifts or gifts that can be upgraded to unique for free are accepted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UniqueGifts)]\n    public bool UniqueGifts { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if a Telegram Premium subscription is accepted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PremiumSubscription)]\n    public bool PremiumSubscription { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if transfers of unique gifts from channels are accepted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiftsFromChannels)]\n    public bool GiftsFromChannels { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Animation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents an animation file (GIF or H.264/MPEG-4 AVC video without sound).\n/// </summary>\npublic class Animation\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Video width as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int Width { get; set; }\n\n    /// <summary>\n    /// Video height as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int Height { get; set; }\n\n    /// <summary>\n    /// Duration of the video in seconds as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Animation thumbnail as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public PhotoSize? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Original animation filename as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileName)]\n    public string? FileName { get; set; }\n\n    /// <summary>\n    /// Optional. MIME type of the file as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MimeType)]\n    public string? MimeType { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Audio.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents an audio file to be treated as music by the Telegram clients.\n/// </summary>\npublic class Audio\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Duration of the audio in seconds as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Performer of the audio as defined by the sender or by audio tags\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Performer)]\n    public string? Performer { get; set; }\n\n    /// <summary>\n    /// Optional. Title of the audio as defined by the sender or by audio tags\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Original filename as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileName)]\n    public string? FileName { get; set; }\n\n    /// <summary>\n    /// Optional. MIME type of the file as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MimeType)]\n    public string? MimeType { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail of the album cover to which the music file belongs\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public PhotoSize? Thumbnail { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundFill/BackgroundFill.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the way a background is filled based on the selected colors. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"BackgroundFillSolid\"/></description></item>\n/// <item><description><see cref=\"BackgroundFillGradient\"/></description></item>\n/// <item><description><see cref=\"BackgroundFillFreeformGradient\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(BackgroundFillConverter))]\npublic abstract class BackgroundFill\n{\n    /// <summary>\n    /// Type of the background fill\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundFill/BackgroundFillFreeformGradient.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The background is a freeform gradient that rotates after every message in the chat.\n/// </summary>\npublic class BackgroundFillFreeformGradient : BackgroundFill\n{\n    /// <summary>\n    /// Type of the background fill, always “freeform_gradient”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"freeform_gradient\";\n\n    /// <summary>\n    /// A list of the 3 or 4 base colors that are used to generate the freeform gradient in the RGB24 format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Colors)]\n    public IEnumerable<int> Colors { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundFill/BackgroundFillGradient.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The background is a gradient fill.\n/// </summary>\npublic class BackgroundFillGradient : BackgroundFill\n{\n    /// <summary>\n    /// Type of the background fill, always “gradient”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"gradient\";\n\n    /// <summary>\n    /// Top color of the gradient in the RGB24 format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TopColor)]\n    public int TopColor { get; set; }\n\n    /// <summary>\n    /// Bottom color of the gradient in the RGB24 format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BottomColor)]\n    public int BottomColor { get; set; }\n\n    /// <summary>\n    /// Clockwise rotation angle of the background fill in degrees; 0-359\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RotationAngle)]\n    public int RotationAngle { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundFill/BackgroundFillSolid.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The background is filled using the selected color.\n/// </summary>\npublic class BackgroundFillSolid : BackgroundFill\n{\n    /// <summary>\n    /// Type of the background fill, always “solid”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"solid\";\n\n    /// <summary>\n    /// The color of the background fill in the RGB24 format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Color)]\n    public int Color { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundType/BackgroundType.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the type of a background. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"BackgroundTypeFill\"/></description></item>\n/// <item><description><see cref=\"BackgroundTypeWallpaper\"/></description></item>\n/// <item><description><see cref=\"BackgroundTypePattern\"/></description></item>\n/// <item><description><see cref=\"BackgroundTypeChatTheme\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(BackgroundTypeConverter))]\npublic abstract class BackgroundType\n{\n    /// <summary>\n    /// Type of the background\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundType/BackgroundTypeChatTheme.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The background is taken directly from a built-in chat theme.\n/// </summary>\npublic class BackgroundTypeChatTheme : BackgroundType\n{\n    /// <summary>\n    /// Type of the background, always “chat_theme”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"chat_theme\";\n\n    /// <summary>\n    /// Name of the chat theme, which is usually an emoji\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThemeName)]\n    public string ThemeName { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundType/BackgroundTypeFill.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The background is automatically filled based on the selected colors.\n/// </summary>\npublic class BackgroundTypeFill : BackgroundType\n{\n    /// <summary>\n    /// Type of the background, always “fill”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"fill\";\n\n    /// <summary>\n    /// The background fill\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Fill)]\n    public BackgroundFill Fill { get; set; } = null!;\n\n    /// <summary>\n    /// Dimming of the background in dark themes, as a percentage; 0-100\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DarkThemeDimming)]\n    public int DarkThemeDimming { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundType/BackgroundTypePattern.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The background is a .PNG or .TGV (gzipped subset of SVG with MIME type “application/x-tgwallpattern”) pattern to be combined with the background fill chosen by the user.\n/// </summary>\npublic class BackgroundTypePattern : BackgroundType\n{\n    /// <summary>\n    /// Type of the background, always “pattern”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"pattern\";\n\n    /// <summary>\n    /// Document with the pattern\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Document)]\n    public Document Document { get; set; } = null!;\n\n    /// <summary>\n    /// The background fill that is combined with the pattern\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Fill)]\n    public BackgroundFill Fill { get; set; } = null!;\n\n    /// <summary>\n    /// Intensity of the pattern when it is shown above the filled background; 0-100\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Intensity)]\n    public int Intensity { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the background fill must be applied only to the pattern itself. All other pixels are black in this case. For dark themes only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsInverted)]\n    public bool? IsInverted { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the background moves slightly when the device is tilted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsMoving)]\n    public bool? IsMoving { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BackgroundType/BackgroundTypeWallpaper.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The background is a wallpaper in the JPEG format.\n/// </summary>\npublic class BackgroundTypeWallpaper : BackgroundType\n{\n    /// <summary>\n    /// Type of the background, always “wallpaper”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"wallpaper\";\n\n    /// <summary>\n    /// Document with the wallpaper\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Document)]\n    public Document Document { get; set; } = null!;\n\n    /// <summary>\n    /// Dimming of the background in dark themes, as a percentage; 0-100\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DarkThemeDimming)]\n    public int DarkThemeDimming { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the wallpaper is downscaled to fit in a 450x450 square and then box-blurred with radius 12\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsBlurred)]\n    public bool? IsBlurred { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the background moves slightly when the device is tilted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsMoving)]\n    public bool? IsMoving { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Birthdate.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the birthdate of a user.\n/// </summary>\npublic class Birthdate\n{\n    /// <summary>\n    /// Day of the user's birth; 1-31\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Day)]\n    public int Day { get; set; }\n\n    /// <summary>\n    /// Month of the user's birth; 1-12\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Month)]\n    public int Month { get; set; }\n\n    /// <summary>\n    /// Optional. Year of the user's birth\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Year)]\n    public int? Year { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotAccessSettings.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the access settings of a bot.\n/// </summary>\npublic class BotAccessSettings\n{\n    /// <summary>\n    /// <em>True</em>, if only selected users can access the bot. The bot's owner can always access it.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAccessRestricted)]\n    public bool IsAccessRestricted { get; set; }\n\n    /// <summary>\n    /// Optional. The list of other users who have access to the bot if the access is restricted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AddedUsers)]\n    public IEnumerable<User>? AddedUsers { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommand.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a bot command.\n/// </summary>\npublic class BotCommand\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BotCommand\"/> class.\n    /// </summary>\n    /// <param name=\"command\">Text of the command; 1-32 characters. Can contain only lowercase English letters, digits and underscores.</param>\n    /// <param name=\"description\">Description of the command; 1-256 characters.</param>\n    public BotCommand(string command, string description)\n    {\n        this.Command = command ?? throw new ArgumentNullException(nameof(command));\n        this.Description = description ?? throw new ArgumentNullException(nameof(description));\n    }\n\n    /// <summary>\n    /// Text of the command; 1-32 characters. Can contain only lowercase English letters, digits and underscores.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Command)]\n    public string Command { get; set; }\n\n    /// <summary>\n    /// Description of the command; 1-256 characters.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string Description { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommandScope/BotCommandScope.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents the scope to which bot commands are applied. Currently, the following 7 scopes are supported:\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"BotCommandScopeDefault\"/></description></item>\n/// <item><description><see cref=\"BotCommandScopeAllPrivateChats\"/></description></item>\n/// <item><description><see cref=\"BotCommandScopeAllGroupChats\"/></description></item>\n/// <item><description><see cref=\"BotCommandScopeAllChatAdministrators\"/></description></item>\n/// <item><description><see cref=\"BotCommandScopeChat\"/></description></item>\n/// <item><description><see cref=\"BotCommandScopeChatAdministrators\"/></description></item>\n/// <item><description><see cref=\"BotCommandScopeChatMember\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(BotCommandScopeConverter))]\npublic abstract class BotCommandScope\n{\n    /// <summary>\n    /// Scope type\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommandScope/BotCommandScopeAllChatAdministrators.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#botcommandscope\">scope</a> of bot commands, covering all group and supergroup chat administrators.\n/// </summary>\npublic class BotCommandScopeAllChatAdministrators : BotCommandScope\n{\n    /// <summary>\n    /// Scope type, must be <em>all_chat_administrators</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"all_chat_administrators\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommandScope/BotCommandScopeAllGroupChats.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#botcommandscope\">scope</a> of bot commands, covering all group and supergroup chats.\n/// </summary>\npublic class BotCommandScopeAllGroupChats : BotCommandScope\n{\n    /// <summary>\n    /// Scope type, must be <em>all_group_chats</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"all_group_chats\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommandScope/BotCommandScopeAllPrivateChats.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#botcommandscope\">scope</a> of bot commands, covering all private chats.\n/// </summary>\npublic class BotCommandScopeAllPrivateChats : BotCommandScope\n{\n    /// <summary>\n    /// Scope type, must be <em>all_private_chats</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"all_private_chats\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommandScope/BotCommandScopeChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#botcommandscope\">scope</a> of bot commands, covering a specific chat.\n/// </summary>\npublic class BotCommandScopeChat : BotCommandScope\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BotCommandScopeChat\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.</param>\n    public BotCommandScopeChat(long chatId)\n    {\n        this.ChatId = chatId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BotCommandScopeChat\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.</param>\n    public BotCommandScopeChat(string chatId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n    }\n\n    /// <summary>\n    /// Scope type, must be <em>chat</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"chat\";\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommandScope/BotCommandScopeChatAdministrators.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#botcommandscope\">scope</a> of bot commands, covering all administrators of a specific group or supergroup chat.\n/// </summary>\npublic class BotCommandScopeChatAdministrators : BotCommandScope\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BotCommandScopeChatAdministrators\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.</param>\n    public BotCommandScopeChatAdministrators(long chatId)\n    {\n        this.ChatId = chatId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BotCommandScopeChatAdministrators\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.</param>\n    public BotCommandScopeChatAdministrators(string chatId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n    }\n\n    /// <summary>\n    /// Scope type, must be <em>chat_administrators</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"chat_administrators\";\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommandScope/BotCommandScopeChatMember.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#botcommandscope\">scope</a> of bot commands, covering a specific member of a group or supergroup chat.\n/// </summary>\npublic class BotCommandScopeChatMember : BotCommandScope\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BotCommandScopeChatMember\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    public BotCommandScopeChatMember(long chatId, long userId)\n    {\n        this.ChatId = chatId;\n        this.UserId = userId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BotCommandScopeChatMember\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    public BotCommandScopeChatMember(string chatId, long userId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.UserId = userId;\n    }\n\n    /// <summary>\n    /// Scope type, must be <em>chat_member</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"chat_member\";\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target supergroup in the format <em>@username</em>. Channel direct messages chats and channel chats aren't supported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the target user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotCommandScope/BotCommandScopeDefault.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the default <a href=\"https://core.telegram.org/bots/api#botcommandscope\">scope</a> of bot commands. Default commands are used if no commands with a <a href=\"https://core.telegram.org/bots/api#determining-list-of-commands\">narrower scope</a> are specified for the user.\n/// </summary>\npublic class BotCommandScopeDefault : BotCommandScope\n{\n    /// <summary>\n    /// Scope type, must be <em>default</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"default\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotDescription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents the bot's description.\n/// </summary>\npublic class BotDescription\n{\n    /// <summary>\n    /// The bot's description\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string Description { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotName.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents the bot's name.\n/// </summary>\npublic class BotName\n{\n    /// <summary>\n    /// The bot's name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BotShortDescription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents the bot's short description.\n/// </summary>\npublic class BotShortDescription\n{\n    /// <summary>\n    /// The bot's short description\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShortDescription)]\n    public string ShortDescription { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BusinessBotRights.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the rights of a business bot.\n/// </summary>\npublic class BusinessBotRights\n{\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can send and edit messages in the private chats that had incoming messages in the last 24 hours\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanReply)]\n    public bool? CanReply { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can mark incoming private messages as read\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanReadMessages)]\n    public bool? CanReadMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can delete messages sent by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanDeleteSentMessages)]\n    public bool? CanDeleteSentMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can delete all private messages in managed chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanDeleteAllMessages)]\n    public bool? CanDeleteAllMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can edit the first and last name of the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditName)]\n    public bool? CanEditName { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can edit the bio of the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditBio)]\n    public bool? CanEditBio { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can edit the profile photo of the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditProfilePhoto)]\n    public bool? CanEditProfilePhoto { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can edit the username of the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditUsername)]\n    public bool? CanEditUsername { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can change the privacy settings pertaining to gifts for the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanChangeGiftSettings)]\n    public bool? CanChangeGiftSettings { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can view gifts and the amount of Telegram Stars owned by the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanViewGiftsAndStars)]\n    public bool? CanViewGiftsAndStars { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can convert regular gifts owned by the business account to Telegram Stars\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanConvertGiftsToStars)]\n    public bool? CanConvertGiftsToStars { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can transfer and upgrade gifts owned by the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanTransferAndUpgradeGifts)]\n    public bool? CanTransferAndUpgradeGifts { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can transfer Telegram Stars received by the business account to its own account, or use them to upgrade and transfer gifts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanTransferStars)]\n    public bool? CanTransferStars { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can post, edit and delete stories on behalf of the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageStories)]\n    public bool? CanManageStories { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BusinessConnection.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the connection of the bot with a business account.\n/// </summary>\npublic class BusinessConnection\n{\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Business account user that created the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User User { get; set; } = null!;\n\n    /// <summary>\n    /// Identifier of a private chat with the user who created the business connection. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserChatId)]\n    public long UserChatId { get; set; }\n\n    /// <summary>\n    /// Date the connection was established in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public int Date { get; set; }\n\n    /// <summary>\n    /// Optional. Rights of the business bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Rights)]\n    public BusinessBotRights? Rights { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the connection is active\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsEnabled)]\n    public bool IsEnabled { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BusinessIntro.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Stickers;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Contains information about the start page settings of a Telegram Business account.\n/// </summary>\npublic class BusinessIntro\n{\n    /// <summary>\n    /// Optional. Title text of the business intro\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Message text of the business intro\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Message)]\n    public string? Message { get; set; }\n\n    /// <summary>\n    /// Optional. Sticker of the business intro\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public Sticker? Sticker { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BusinessLocation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Contains information about the location of a Telegram Business account.\n/// </summary>\npublic class BusinessLocation\n{\n    /// <summary>\n    /// Address of the business\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Address)]\n    public string Address { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Location of the business\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public Location? Location { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BusinessMessagesDeleted.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object is received when messages are deleted from a connected business account.\n/// </summary>\npublic class BusinessMessagesDeleted\n{\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; } = null!;\n\n    /// <summary>\n    /// Information about a chat in the business account. The bot may not have access to the chat or the corresponding user.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// The list of identifiers of deleted messages in the chat of the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageIds)]\n    public IEnumerable<int> MessageIds { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BusinessOpeningHours.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the opening hours of a business.\n/// </summary>\npublic class BusinessOpeningHours\n{\n    /// <summary>\n    /// Unique name of the time zone for which the opening hours are defined\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TimeZoneName)]\n    public string TimeZoneName { get; set; } = null!;\n\n    /// <summary>\n    /// List of time intervals describing business opening hours\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OpeningHours)]\n    public IEnumerable<BusinessOpeningHoursInterval> OpeningHours { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/BusinessOpeningHoursInterval.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes an interval of time during which a business is open.\n/// </summary>\npublic class BusinessOpeningHoursInterval\n{\n    /// <summary>\n    /// The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 * 24 * 60\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OpeningMinute)]\n    public int OpeningMinute { get; set; }\n\n    /// <summary>\n    /// The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 * 24 * 60\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ClosingMinute)]\n    public int ClosingMinute { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/CallbackQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Games;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents an incoming callback query from a callback button in an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If the button that originated the query was attached to a message sent by the bot, the field <em>message</em> will be present. If the button was attached to a message sent via the bot (in <a href=\"https://core.telegram.org/bots/api#inline-mode\">inline mode</a>), the field <em>inline_message_id</em> will be present. Exactly one of the fields <em>data</em> or <em>game_short_name</em> will be present.\n/// </summary>\npublic class CallbackQuery\n{\n    /// <summary>\n    /// Unique identifier for this query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User From { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Message sent by the bot with the callback button that originated the query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Message)]\n    public MaybeInaccessibleMessage? Message { get; set; }\n\n    /// <summary>\n    /// Optional. Identifier of the message sent via the bot in inline mode, that originated the query.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n\n    /// <summary>\n    /// Global identifier, uniquely corresponding to the chat to which the message with the callback button was sent. Useful for high scores in <a href=\"https://core.telegram.org/bots/api#games\">games</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatInstance)]\n    public string ChatInstance { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Data associated with the callback button. Be aware that the message originated the query can contain no callback buttons with this data.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Data)]\n    public string? Data { get; set; }\n\n    /// <summary>\n    /// Optional. Short name of a <see cref=\"Game\"/> to be returned, serves as the unique identifier for the game\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GameShortName)]\n    public string? GameShortName { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Chat/Chat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a chat.\n/// </summary>\npublic class Chat\n{\n    /// <summary>\n    /// Unique identifier for this chat. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public long Id { get; set; }\n\n    /// <summary>\n    /// Type of the chat, can be either “private”, “group”, “supergroup” or “channel”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Title, for supergroups, channels and group chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Username, for private chats, supergroups and channels if available\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Username)]\n    public string? Username { get; set; }\n\n    /// <summary>\n    /// Optional. First name of the other party in a private chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FirstName)]\n    public string? FirstName { get; set; }\n\n    /// <summary>\n    /// Optional. Last name of the other party in a private chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastName)]\n    public string? LastName { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the supergroup chat is a forum (has <a href=\"https://telegram.org/blog/topics-in-groups-collectible-usernames#topics-in-groups\">topics</a> enabled)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsForum)]\n    public bool? IsForum { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the chat is the direct messages chat of a channel\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsDirectMessages)]\n    public bool? IsDirectMessages { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Chat/ChatFullInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains full information about a chat.\n/// </summary>\npublic class ChatFullInfo : Chat\n{\n    /// <summary>\n    /// Identifier of the accent color for the chat name and backgrounds of the chat photo, reply header, and link preview. See <a href=\"https://core.telegram.org/bots/api#accent-colors\">accent colors</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AccentColorId)]\n    public int AccentColorId { get; set; }\n\n    /// <summary>\n    /// The maximum number of reactions that can be set on a message in the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaxReactionCount)]\n    public int MaxReactionCount { get; set; }\n\n    /// <summary>\n    /// Optional. Chat photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public ChatPhoto? Photo { get; set; }\n\n    /// <summary>\n    /// Optional. If non-empty, the list of all <a href=\"https://telegram.org/blog/topics-in-groups-collectible-usernames#collectible-usernames\">active chat usernames</a>; for private chats, supergroups and channels\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ActiveUsernames)]\n    public IEnumerable<string>? ActiveUsernames { get; set; }\n\n    /// <summary>\n    /// Optional. For private chats, the date of birth of the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Birthdate)]\n    public Birthdate? Birthdate { get; set; }\n\n    /// <summary>\n    /// Optional. For private chats with business accounts, the intro of the business\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessIntro)]\n    public BusinessIntro? BusinessIntro { get; set; }\n\n    /// <summary>\n    /// Optional. For private chats with business accounts, the location of the business\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessLocation)]\n    public BusinessLocation? BusinessLocation { get; set; }\n\n    /// <summary>\n    /// Optional. For private chats with business accounts, the opening hours of the business\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessOpeningHours)]\n    public BusinessOpeningHours? BusinessOpeningHours { get; set; }\n\n    /// <summary>\n    /// Optional. For private chats, the personal channel of the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PersonalChat)]\n    public Chat? PersonalChat { get; set; }\n\n    /// <summary>\n    /// Optional. Information about the corresponding channel chat; for direct messages chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParentChat)]\n    public Chat? ParentChat { get; set; }\n\n    /// <summary>\n    /// Optional. List of available reactions allowed in the chat. If omitted, then all <a href=\"https://core.telegram.org/bots/api#reactiontypeemoji\">emoji reactions</a> are allowed.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AvailableReactions)]\n    public IEnumerable<ReactionType>? AvailableReactions { get; set; }\n\n    /// <summary>\n    /// Optional. Custom emoji identifier of the emoji chosen by the chat for the reply header and link preview background\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BackgroundCustomEmojiId)]\n    public string? BackgroundCustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. Identifier of the accent color for the chat's profile background. See <a href=\"https://core.telegram.org/bots/api#profile-accent-colors\">profile accent colors</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProfileAccentColorId)]\n    public int? ProfileAccentColorId { get; set; }\n\n    /// <summary>\n    /// Optional. Custom emoji identifier of the emoji chosen by the chat for its profile background\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProfileBackgroundCustomEmojiId)]\n    public string? ProfileBackgroundCustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. Custom emoji identifier of the emoji status of the chat or the other party in a private chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EmojiStatusCustomEmojiId)]\n    public string? EmojiStatusCustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. Expiration date of the emoji status of the chat or the other party in a private chat, in Unix time, if any\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EmojiStatusExpirationDate)]\n    public int? EmojiStatusExpirationDate { get; set; }\n\n    /// <summary>\n    /// Optional. Bio of the other party in a private chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Bio)]\n    public string? Bio { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if privacy settings of the other party in the private chat allows to use <em>tg://user?id=&lt;user_id&gt;</em> links only in chats with the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasPrivateForwards)]\n    public bool? HasPrivateForwards { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the privacy settings of the other party restrict sending voice and video note messages in the private chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasRestrictedVoiceAndVideoMessages)]\n    public bool? HasRestrictedVoiceAndVideoMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if users need to join the supergroup before they can send messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.JoinToSendMessages)]\n    public bool? JoinToSendMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if all users directly joining the supergroup without using an invite link need to be approved by supergroup administrators\n    /// </summary>\n    [JsonPropertyName(PropertyNames.JoinByRequest)]\n    public bool? JoinByRequest { get; set; }\n\n    /// <summary>\n    /// Optional. Description, for groups, supergroups and channel chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Primary invite link, for groups, supergroups and channel chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InviteLink)]\n    public string? InviteLink { get; set; }\n\n    /// <summary>\n    /// Optional. The most recent pinned message (by sending date)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PinnedMessage)]\n    public Message? PinnedMessage { get; set; }\n\n    /// <summary>\n    /// Optional. Default chat member permissions, for groups and supergroups\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Permissions)]\n    public ChatPermissions? Permissions { get; set; }\n\n    /// <summary>\n    /// Information about types of gifts that are accepted by the chat or by the corresponding user for private chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AcceptedGiftTypes)]\n    public AcceptedGiftTypes AcceptedGiftTypes { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. <em>True</em>, if paid media messages can be sent or forwarded to the channel chat. The field is available only for channel chats.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendPaidMedia)]\n    public bool? CanSendPaidMedia { get; set; }\n\n    /// <summary>\n    /// Optional. For supergroups, the minimum allowed delay between consecutive messages sent by each unprivileged user; in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SlowModeDelay)]\n    public int? SlowModeDelay { get; set; }\n\n    /// <summary>\n    /// Optional. For supergroups, the minimum number of boosts that a non-administrator user needs to add in order to ignore slow mode and chat permissions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UnrestrictBoostCount)]\n    public int? UnrestrictBoostCount { get; set; }\n\n    /// <summary>\n    /// Optional. The time after which all messages sent to the chat will be automatically deleted; in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageAutoDeleteTime)]\n    public int? MessageAutoDeleteTime { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if aggressive anti-spam checks are enabled in the supergroup. The field is only available to chat administrators.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasAggressiveAntiSpamEnabled)]\n    public bool? HasAggressiveAntiSpamEnabled { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if non-administrators can only get the list of bots and administrators in the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasHiddenMembers)]\n    public bool? HasHiddenMembers { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if messages from the chat can't be forwarded to other chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasProtectedContent)]\n    public bool? HasProtectedContent { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if new chat members will have access to old messages; available only to chat administrators\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasVisibleHistory)]\n    public bool? HasVisibleHistory { get; set; }\n\n    /// <summary>\n    /// Optional. For supergroups, name of the group sticker set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StickerSetName)]\n    public string? StickerSetName { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can change the group sticker set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSetStickerSet)]\n    public bool? CanSetStickerSet { get; set; }\n\n    /// <summary>\n    /// Optional. For supergroups, the name of the group's custom emoji sticker set. Custom emoji from this set can be used by all users and bots in the group.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CustomEmojiStickerSetName)]\n    public string? CustomEmojiStickerSetName { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier for the linked chat, i.e. the discussion group identifier for a channel and vice versa; for supergroups and channel chats. This identifier may be greater than 32 bits and some programming languages may have difficulty/silent defects in interpreting it. But it is smaller than 52 bits, so a signed 64 bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LinkedChatId)]\n    public long? LinkedChatId { get; set; }\n\n    /// <summary>\n    /// Optional. For supergroups, the location to which the supergroup is connected\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public ChatLocation? Location { get; set; }\n\n    /// <summary>\n    /// Optional. For private chats, the rating of the user if any\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Rating)]\n    public UserRating? Rating { get; set; }\n\n    /// <summary>\n    /// Optional. For private chats, the first audio added to the profile of the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FirstProfileAudio)]\n    public Audio? FirstProfileAudio { get; set; }\n\n    /// <summary>\n    /// Optional. The color scheme based on a unique gift that must be used for the chat's name, message replies and link previews\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UniqueGiftColors)]\n    public UniqueGiftColors? UniqueGiftColors { get; set; }\n\n    /// <summary>\n    /// Optional. The number of Telegram Stars a general user have to pay to send a message to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMessageStarCount)]\n    public int? PaidMessageStarCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatAdministratorRights.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents the rights of an administrator in a chat.\n/// </summary>\npublic class ChatAdministratorRights\n{\n    /// <summary>\n    /// <em>True</em>, if the user's presence in the chat is hidden\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAnonymous)]\n    public bool IsAnonymous { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other administrator privilege.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageChat)]\n    public bool CanManageChat { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can delete messages of other users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanDeleteMessages)]\n    public bool CanDeleteMessages { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can manage video chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageVideoChats)]\n    public bool CanManageVideoChats { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can restrict, ban or unban chat members, or access supergroup statistics\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanRestrictMembers)]\n    public bool CanRestrictMembers { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by the user)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPromoteMembers)]\n    public bool CanPromoteMembers { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to change the chat title, photo and other settings\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanChangeInfo)]\n    public bool CanChangeInfo { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to invite new users to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanInviteUsers)]\n    public bool CanInviteUsers { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can post stories to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPostStories)]\n    public bool CanPostStories { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditStories)]\n    public bool CanEditStories { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can delete stories posted by other users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanDeleteStories)]\n    public bool CanDeleteStories { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the administrator can post messages in the channel, approve suggested posts, or access channel statistics; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPostMessages)]\n    public bool? CanPostMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the administrator can edit messages of other users and can pin messages; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditMessages)]\n    public bool? CanEditMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to pin messages; for groups and supergroups only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPinMessages)]\n    public bool? CanPinMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageTopics)]\n    public bool? CanManageTopics { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the administrator can manage direct messages of the channel and decline suggested posts; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageDirectMessages)]\n    public bool? CanManageDirectMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageTags)]\n    public bool? CanManageTags { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBackground.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a chat background.\n/// </summary>\npublic class ChatBackground\n{\n    /// <summary>\n    /// Type of the background\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public BackgroundType Type { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBoost.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about a chat boost.\n/// </summary>\npublic class ChatBoost\n{\n    /// <summary>\n    /// Unique identifier of the boost\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BoostId)]\n    public string BoostId { get; set; } = null!;\n\n    /// <summary>\n    /// Point in time (Unix timestamp) when the chat was boosted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AddDate)]\n    public int AddDate { get; set; }\n\n    /// <summary>\n    /// Point in time (Unix timestamp) when the boost will automatically expire, unless the booster's Telegram Premium subscription is prolonged\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExpirationDate)]\n    public int ExpirationDate { get; set; }\n\n    /// <summary>\n    /// Source of the added boost\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public ChatBoostSource Source { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBoostAdded.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a user boosting a chat.\n/// </summary>\npublic class ChatBoostAdded\n{\n    /// <summary>\n    /// Number of boosts added by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BoostCount)]\n    public int BoostCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBoostRemoved.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a boost removed from a chat.\n/// </summary>\npublic class ChatBoostRemoved\n{\n    /// <summary>\n    /// Chat which was boosted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier of the boost\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BoostId)]\n    public string BoostId { get; set; } = null!;\n\n    /// <summary>\n    /// Point in time (Unix timestamp) when the boost was removed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RemoveDate)]\n    public int RemoveDate { get; set; }\n\n    /// <summary>\n    /// Source of the removed boost\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public ChatBoostSource Source { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBoostSource/ChatBoostSource.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the source of a chat boost. It can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"ChatBoostSourcePremium\"/></description></item>\n/// <item><description><see cref=\"ChatBoostSourceGiftCode\"/></description></item>\n/// <item><description><see cref=\"ChatBoostSourceGiveaway\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(ChatBoostSourceConverter))]\npublic abstract class ChatBoostSource\n{\n    /// <summary>\n    /// Source of the boost\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public abstract string Source { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBoostSource/ChatBoostSourceGiftCode.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The boost was obtained by the creation of Telegram Premium gift codes to boost a chat. Each such code boosts the chat 4 times for the duration of the corresponding Telegram Premium subscription.\n/// </summary>\npublic class ChatBoostSourceGiftCode : ChatBoostSource\n{\n    /// <summary>\n    /// Source of the boost, always “gift_code”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"gift_code\";\n\n    /// <summary>\n    /// User for which the gift code was created\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User User { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBoostSource/ChatBoostSourceGiveaway.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The boost was obtained by the creation of a Telegram Premium or a Telegram Star giveaway. This boosts the chat 4 times for the duration of the corresponding Telegram Premium subscription for Telegram Premium giveaways and <em>prize_star_count</em> / 500 times for one year for Telegram Star giveaways.\n/// </summary>\npublic class ChatBoostSourceGiveaway : ChatBoostSource\n{\n    /// <summary>\n    /// Source of the boost, always “giveaway”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"giveaway\";\n\n    /// <summary>\n    /// Identifier of a message in the chat with the giveaway; the message could have been deleted already. May be 0 if the message isn't sent yet.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiveawayMessageId)]\n    public int GiveawayMessageId { get; set; }\n\n    /// <summary>\n    /// Optional. User that won the prize in the giveaway if any; for Telegram Premium giveaways only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User? User { get; set; }\n\n    /// <summary>\n    /// Optional. The number of Telegram Stars to be split between giveaway winners; for Telegram Star giveaways only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PrizeStarCount)]\n    public int? PrizeStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the giveaway was completed, but there was no user to win the prize\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsUnclaimed)]\n    public bool? IsUnclaimed { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBoostSource/ChatBoostSourcePremium.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The boost was obtained by subscribing to Telegram Premium or by gifting a Telegram Premium subscription to another user.\n/// </summary>\npublic class ChatBoostSourcePremium : ChatBoostSource\n{\n    /// <summary>\n    /// Source of the boost, always “premium”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"premium\";\n\n    /// <summary>\n    /// User that boosted the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User User { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatBoostUpdated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a boost added to a chat or changed.\n/// </summary>\npublic class ChatBoostUpdated\n{\n    /// <summary>\n    /// Chat which was boosted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Information about the chat boost\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Boost)]\n    public ChatBoost Boost { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatInviteLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents an invite link for a chat.\n/// </summary>\npublic class ChatInviteLink\n{\n    /// <summary>\n    /// The invite link. If the link was created by another chat administrator, then the second part of the link will be replaced with “…”.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InviteLink)]\n    public string InviteLink { get; set; } = null!;\n\n    /// <summary>\n    /// Creator of the link\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Creator)]\n    public User Creator { get; set; } = null!;\n\n    /// <summary>\n    /// <em>True</em>, if users joining the chat via the link need to be approved by chat administrators\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CreatesJoinRequest)]\n    public bool CreatesJoinRequest { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the link is primary\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPrimary)]\n    public bool IsPrimary { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the link is revoked\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsRevoked)]\n    public bool IsRevoked { get; set; }\n\n    /// <summary>\n    /// Optional. Invite link name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string? Name { get; set; }\n\n    /// <summary>\n    /// Optional. Point in time (Unix timestamp) when the link will expire or has been expired\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExpireDate)]\n    public int? ExpireDate { get; set; }\n\n    /// <summary>\n    /// Optional. The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MemberLimit)]\n    public int? MemberLimit { get; set; }\n\n    /// <summary>\n    /// Optional. Number of pending join requests created using this link\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PendingJoinRequestCount)]\n    public int? PendingJoinRequestCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of seconds the subscription will be active for before the next payment\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SubscriptionPeriod)]\n    public int? SubscriptionPeriod { get; set; }\n\n    /// <summary>\n    /// Optional. The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat using the link\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SubscriptionPrice)]\n    public int? SubscriptionPrice { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatJoinRequest.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a join request sent to a chat.\n/// </summary>\npublic class ChatJoinRequest\n{\n    /// <summary>\n    /// Chat to which the request was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// User that sent the join request\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User From { get; set; } = null!;\n\n    /// <summary>\n    /// Identifier of a private chat with the user who sent the join request. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier. The bot can use this identifier for 5 minutes to send messages until the join request is processed, assuming no other administrator contacted the user.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserChatId)]\n    public long UserChatId { get; set; }\n\n    /// <summary>\n    /// Date the request was sent in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public int Date { get; set; }\n\n    /// <summary>\n    /// Optional. Bio of the user.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Bio)]\n    public string? Bio { get; set; }\n\n    /// <summary>\n    /// Optional. Chat invite link that was used by the user to send the join request\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InviteLink)]\n    public ChatInviteLink? InviteLink { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatLocation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a location to which a chat is connected.\n/// </summary>\npublic class ChatLocation\n{\n    /// <summary>\n    /// The location to which the supergroup is connected. Can't be a live location.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public Location Location { get; set; } = null!;\n\n    /// <summary>\n    /// Location address; 1-64 characters, as defined by the chat owner\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Address)]\n    public string Address { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatMember/ChatMember.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about one member of a chat. Currently, the following 6 types of chat members are supported:\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"ChatMemberOwner\"/></description></item>\n/// <item><description><see cref=\"ChatMemberAdministrator\"/></description></item>\n/// <item><description><see cref=\"ChatMemberMember\"/></description></item>\n/// <item><description><see cref=\"ChatMemberRestricted\"/></description></item>\n/// <item><description><see cref=\"ChatMemberLeft\"/></description></item>\n/// <item><description><see cref=\"ChatMemberBanned\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(ChatMemberConverter))]\npublic abstract class ChatMember\n{\n    /// <summary>\n    /// The member's status in the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Status)]\n    public abstract string Status { get; }\n\n    /// <summary>\n    /// Information about the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User User { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatMember/ChatMemberAdministrator.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a <a href=\"https://core.telegram.org/bots/api#chatmember\">chat member</a> that has some additional privileges.\n/// </summary>\npublic class ChatMemberAdministrator : ChatMember\n{\n    /// <summary>\n    /// The member's status in the chat, always “administrator”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Status)]\n    public override string Status => \"administrator\";\n\n    /// <summary>\n    /// <em>True</em>, if the bot is allowed to edit administrator privileges of that user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanBeEdited)]\n    public bool CanBeEdited { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user's presence in the chat is hidden\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAnonymous)]\n    public bool IsAnonymous { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other administrator privilege.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageChat)]\n    public bool CanManageChat { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can delete messages of other users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanDeleteMessages)]\n    public bool CanDeleteMessages { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can manage video chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageVideoChats)]\n    public bool CanManageVideoChats { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can restrict, ban or unban chat members, or access supergroup statistics\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanRestrictMembers)]\n    public bool CanRestrictMembers { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by the user)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPromoteMembers)]\n    public bool CanPromoteMembers { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to change the chat title, photo and other settings\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanChangeInfo)]\n    public bool CanChangeInfo { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to invite new users to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanInviteUsers)]\n    public bool CanInviteUsers { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can post stories to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPostStories)]\n    public bool CanPostStories { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditStories)]\n    public bool CanEditStories { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the administrator can delete stories posted by other users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanDeleteStories)]\n    public bool CanDeleteStories { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the administrator can post messages in the channel, approve suggested posts, or access channel statistics; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPostMessages)]\n    public bool? CanPostMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the administrator can edit messages of other users and can pin messages; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditMessages)]\n    public bool? CanEditMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to pin messages; for groups and supergroups only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPinMessages)]\n    public bool? CanPinMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageTopics)]\n    public bool? CanManageTopics { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the administrator can manage direct messages of the channel and decline suggested posts; for channels only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageDirectMessages)]\n    public bool? CanManageDirectMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageTags)]\n    public bool? CanManageTags { get; set; }\n\n    /// <summary>\n    /// Optional. Custom title for this user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CustomTitle)]\n    public string? CustomTitle { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatMember/ChatMemberBanned.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a <a href=\"https://core.telegram.org/bots/api#chatmember\">chat member</a> that was banned in the chat and can't return to the chat or view chat messages.\n/// </summary>\npublic class ChatMemberBanned : ChatMember\n{\n    /// <summary>\n    /// The member's status in the chat, always “kicked”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Status)]\n    public override string Status => \"kicked\";\n\n    /// <summary>\n    /// Date when restrictions will be lifted for this user; Unix time. If 0, then the user is banned forever\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UntilDate)]\n    public int UntilDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatMember/ChatMemberLeft.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a <a href=\"https://core.telegram.org/bots/api#chatmember\">chat member</a> that isn't currently a member of the chat, but may join it themselves.\n/// </summary>\npublic class ChatMemberLeft : ChatMember\n{\n    /// <summary>\n    /// The member's status in the chat, always “left”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Status)]\n    public override string Status => \"left\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatMember/ChatMemberMember.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a <a href=\"https://core.telegram.org/bots/api#chatmember\">chat member</a> that has no additional privileges or restrictions.\n/// </summary>\npublic class ChatMemberMember : ChatMember\n{\n    /// <summary>\n    /// The member's status in the chat, always “member”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Status)]\n    public override string Status => \"member\";\n\n    /// <summary>\n    /// Optional. Tag of the member\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Tag)]\n    public string? Tag { get; set; }\n\n    /// <summary>\n    /// Optional. Date when the user's subscription will expire; Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UntilDate)]\n    public int? UntilDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatMember/ChatMemberOwner.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a <a href=\"https://core.telegram.org/bots/api#chatmember\">chat member</a> that owns the chat and has all administrator privileges.\n/// </summary>\npublic class ChatMemberOwner : ChatMember\n{\n    /// <summary>\n    /// The member's status in the chat, always “creator”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Status)]\n    public override string Status => \"creator\";\n\n    /// <summary>\n    /// <em>True</em>, if the user's presence in the chat is hidden\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAnonymous)]\n    public bool IsAnonymous { get; set; }\n\n    /// <summary>\n    /// Optional. Custom title for this user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CustomTitle)]\n    public string? CustomTitle { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatMember/ChatMemberRestricted.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a <a href=\"https://core.telegram.org/bots/api#chatmember\">chat member</a> that is under certain restrictions in the chat. Supergroups only.\n/// </summary>\npublic class ChatMemberRestricted : ChatMember\n{\n    /// <summary>\n    /// The member's status in the chat, always “restricted”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Status)]\n    public override string Status => \"restricted\";\n\n    /// <summary>\n    /// Optional. Tag of the member\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Tag)]\n    public string? Tag { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is a member of the chat at the moment of the request\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsMember)]\n    public bool IsMember { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send text messages, contacts, giveaways, giveaway winners, invoices, locations and venues\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendMessages)]\n    public bool CanSendMessages { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send audios\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendAudios)]\n    public bool CanSendAudios { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send documents\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendDocuments)]\n    public bool CanSendDocuments { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send photos\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendPhotos)]\n    public bool CanSendPhotos { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send videos\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendVideos)]\n    public bool CanSendVideos { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send video notes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendVideoNotes)]\n    public bool CanSendVideoNotes { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send voice notes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendVoiceNotes)]\n    public bool CanSendVoiceNotes { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send polls and checklists\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendPolls)]\n    public bool CanSendPolls { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to send animations, games, stickers and use inline bots\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendOtherMessages)]\n    public bool CanSendOtherMessages { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to add web page previews to their messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanAddWebPagePreviews)]\n    public bool CanAddWebPagePreviews { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to react to messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanReactToMessages)]\n    public bool CanReactToMessages { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to edit their own tag\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditTag)]\n    public bool CanEditTag { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to change the chat title, photo and other settings\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanChangeInfo)]\n    public bool CanChangeInfo { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to invite new users to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanInviteUsers)]\n    public bool CanInviteUsers { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to pin messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPinMessages)]\n    public bool CanPinMessages { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the user is allowed to create forum topics\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageTopics)]\n    public bool CanManageTopics { get; set; }\n\n    /// <summary>\n    /// Date when restrictions will be lifted for this user; Unix time. If 0, then the user is restricted forever\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UntilDate)]\n    public int UntilDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatMemberUpdated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents changes in the status of a chat member.\n/// </summary>\npublic class ChatMemberUpdated\n{\n    /// <summary>\n    /// Chat the user belongs to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Performer of the action, which resulted in the change\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User From { get; set; } = null!;\n\n    /// <summary>\n    /// Date the change was done in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public int Date { get; set; }\n\n    /// <summary>\n    /// Previous information about the chat member\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OldChatMember)]\n    public ChatMember OldChatMember { get; set; } = null!;\n\n    /// <summary>\n    /// New information about the chat member\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NewChatMember)]\n    public ChatMember NewChatMember { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Chat invite link, which was used by the user to join the chat; for joining by invite link events only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InviteLink)]\n    public ChatInviteLink? InviteLink { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user joined the chat after sending a direct join request without using an invite link and being approved by an administrator\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ViaJoinRequest)]\n    public bool? ViaJoinRequest { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user joined the chat via a chat folder invite link\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ViaChatFolderInviteLink)]\n    public bool? ViaChatFolderInviteLink { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatOwnerChanged.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about an ownership change in the chat.\n/// </summary>\npublic class ChatOwnerChanged\n{\n    /// <summary>\n    /// The new owner of the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NewOwner)]\n    public User NewOwner { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatOwnerLeft.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about the chat owner leaving the chat.\n/// </summary>\npublic class ChatOwnerLeft\n{\n    /// <summary>\n    /// Optional. The user who will become the new owner of the chat if the previous owner does not return to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NewOwner)]\n    public User? NewOwner { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatPermissions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes actions that a non-administrator user is allowed to take in a chat.\n/// </summary>\npublic class ChatPermissions\n{\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send text messages, contacts, giveaways, giveaway winners, invoices, locations and venues\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendMessages)]\n    public bool? CanSendMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send audios\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendAudios)]\n    public bool? CanSendAudios { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send documents\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendDocuments)]\n    public bool? CanSendDocuments { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send photos\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendPhotos)]\n    public bool? CanSendPhotos { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send videos\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendVideos)]\n    public bool? CanSendVideos { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send video notes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendVideoNotes)]\n    public bool? CanSendVideoNotes { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send voice notes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendVoiceNotes)]\n    public bool? CanSendVoiceNotes { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send polls and checklists\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendPolls)]\n    public bool? CanSendPolls { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to send animations, games, stickers and use inline bots\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanSendOtherMessages)]\n    public bool? CanSendOtherMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to add web page previews to their messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanAddWebPagePreviews)]\n    public bool? CanAddWebPagePreviews { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to react to messages. If omitted, defaults to the value of <em>can_send_messages</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanReactToMessages)]\n    public bool? CanReactToMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to edit their own tag. If omitted, defaults to the value of <em>can_pin_messages</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanEditTag)]\n    public bool? CanEditTag { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to change the chat title, photo and other settings. Ignored in public supergroups\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanChangeInfo)]\n    public bool? CanChangeInfo { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to invite new users to the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanInviteUsers)]\n    public bool? CanInviteUsers { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to pin messages. Ignored in public supergroups\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanPinMessages)]\n    public bool? CanPinMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the user is allowed to create forum topics. If omitted defaults to the value of can_pin_messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageTopics)]\n    public bool? CanManageTopics { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a chat photo.\n/// </summary>\npublic class ChatPhoto\n{\n    /// <summary>\n    /// File identifier of small (160x160) chat photo. This file_id can be used only for photo download and only for as long as the photo is not changed.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SmallFileId)]\n    public string SmallFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique file identifier of small (160x160) chat photo, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SmallFileUniqueId)]\n    public string SmallFileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// File identifier of big (640x640) chat photo. This file_id can be used only for photo download and only for as long as the photo is not changed.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BigFileId)]\n    public string BigFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique file identifier of big (640x640) chat photo, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BigFileUniqueId)]\n    public string BigFileUniqueId { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChatShared.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about a chat that was shared with the bot using a <see cref=\"KeyboardButtonRequestChat\"/> button.\n/// </summary>\npublic class ChatShared\n{\n    /// <summary>\n    /// Identifier of the request\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestId)]\n    public int RequestId { get; set; }\n\n    /// <summary>\n    /// Identifier of the shared chat. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier. The bot may not have access to the chat and could be unable to use this identifier, unless the chat is already known to the bot by some other means.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public long ChatId { get; set; }\n\n    /// <summary>\n    /// Optional. Title of the chat, if the title was requested by the bot.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Username of the chat, if the username was requested by the bot and available.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Username)]\n    public string? Username { get; set; }\n\n    /// <summary>\n    /// Optional. Available sizes of the chat photo, if the photo was requested by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public IEnumerable<PhotoSize>? Photo { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Checklist.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a checklist.\n/// </summary>\npublic class Checklist\n{\n    /// <summary>\n    /// Title of the checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Special entities that appear in the checklist title\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TitleEntities)]\n    public IEnumerable<MessageEntity>? TitleEntities { get; set; }\n\n    /// <summary>\n    /// List of tasks in the checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Tasks)]\n    public IEnumerable<ChecklistTask> Tasks { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. <em>True</em>, if users other than the creator of the list can add tasks to the list\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OthersCanAddTasks)]\n    public bool? OthersCanAddTasks { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if users other than the creator of the list can mark tasks as done or not done\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OthersCanMarkTasksAsDone)]\n    public bool? OthersCanMarkTasksAsDone { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChecklistTask.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a task in a checklist.\n/// </summary>\npublic class ChecklistTask\n{\n    /// <summary>\n    /// Unique identifier of the task\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public int Id { get; set; }\n\n    /// <summary>\n    /// Text of the task\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Special entities that appear in the task text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n\n    /// <summary>\n    /// Optional. User that completed the task; omitted if the task wasn't completed by a user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CompletedByUser)]\n    public User? CompletedByUser { get; set; }\n\n    /// <summary>\n    /// Optional. Chat that completed the task; omitted if the task wasn't completed by a chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CompletedByChat)]\n    public Chat? CompletedByChat { get; set; }\n\n    /// <summary>\n    /// Optional. Point in time (Unix timestamp) when the task was completed; 0 if the task wasn't completed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CompletionDate)]\n    public int? CompletionDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChecklistTasksAdded.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about tasks added to a checklist.\n/// </summary>\npublic class ChecklistTasksAdded\n{\n    /// <summary>\n    /// Optional. Message containing the checklist to which the tasks were added. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChecklistMessage)]\n    public Message? ChecklistMessage { get; set; }\n\n    /// <summary>\n    /// List of tasks added to the checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Tasks)]\n    public IEnumerable<ChecklistTask> Tasks { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ChecklistTasksDone.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about checklist tasks marked as done or not done.\n/// </summary>\npublic class ChecklistTasksDone\n{\n    /// <summary>\n    /// Optional. Message containing the checklist whose tasks were marked as done or not done. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChecklistMessage)]\n    public Message? ChecklistMessage { get; set; }\n\n    /// <summary>\n    /// Optional. Identifiers of the tasks that were marked as done\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MarkedAsDoneTaskIds)]\n    public IEnumerable<int>? MarkedAsDoneTaskIds { get; set; }\n\n    /// <summary>\n    /// Optional. Identifiers of the tasks that were marked as not done\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MarkedAsNotDoneTaskIds)]\n    public IEnumerable<int>? MarkedAsNotDoneTaskIds { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Contact.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a phone contact.\n/// </summary>\npublic class Contact\n{\n    /// <summary>\n    /// Contact's phone number\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhoneNumber)]\n    public string PhoneNumber { get; set; } = null!;\n\n    /// <summary>\n    /// Contact's first name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FirstName)]\n    public string FirstName { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Contact's last name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastName)]\n    public string? LastName { get; set; }\n\n    /// <summary>\n    /// Optional. Contact's user identifier in Telegram. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long? UserId { get; set; }\n\n    /// <summary>\n    /// Optional. Additional data about the contact in the form of a <a href=\"https://en.wikipedia.org/wiki/VCard\">vCard</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Vcard)]\n    public string? Vcard { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/CopyTextButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents an inline keyboard button that copies specified text to the clipboard.\n/// </summary>\npublic class CopyTextButton\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CopyTextButton\"/> class.\n    /// </summary>\n    /// <param name=\"text\">The text to be copied to the clipboard; 1-256 characters</param>\n    public CopyTextButton(string text)\n    {\n        this.Text = text ?? throw new ArgumentNullException(nameof(text));\n    }\n\n    /// <summary>\n    /// The text to be copied to the clipboard; 1-256 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Dice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents an animated emoji that displays a random value.\n/// </summary>\npublic class Dice\n{\n    /// <summary>\n    /// Emoji on which the dice throw animation is based\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Emoji)]\n    public string Emoji { get; set; } = null!;\n\n    /// <summary>\n    /// Value of the dice, 1-6 for “🎲”, “🎯” and “🎳” base emoji, 1-5 for “🏀” and “⚽” base emoji, 1-64 for “🎰” base emoji\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Value)]\n    public int Value { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/DirectMessagePriceChanged.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about a change in the price of direct messages sent to a channel chat.\n/// </summary>\npublic class DirectMessagePriceChanged\n{\n    /// <summary>\n    /// <em>True</em>, if direct messages are enabled for the channel chat; false otherwise\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AreDirectMessagesEnabled)]\n    public bool AreDirectMessagesEnabled { get; set; }\n\n    /// <summary>\n    /// Optional. The new number of Telegram Stars that must be paid by users for each direct message sent to the channel. Does not apply to users who have been exempted by administrators. Defaults to 0.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessageStarCount)]\n    public int? DirectMessageStarCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/DirectMessagesTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a topic of a direct messages chat.\n/// </summary>\npublic class DirectMessagesTopic\n{\n    /// <summary>\n    /// Unique identifier of the topic. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TopicId)]\n    public int TopicId { get; set; }\n\n    /// <summary>\n    /// Optional. Information about the user that created the topic. Currently, it is always present\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User? User { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Document.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a general file (as opposed to <a href=\"https://core.telegram.org/bots/api#photosize\">photos</a>, <a href=\"https://core.telegram.org/bots/api#voice\">voice messages</a> and <a href=\"https://core.telegram.org/bots/api#audio\">audio files</a>).\n/// </summary>\npublic class Document\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Document thumbnail as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public PhotoSize? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Original filename as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileName)]\n    public string? FileName { get; set; }\n\n    /// <summary>\n    /// Optional. MIME type of the file as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MimeType)]\n    public string? MimeType { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ExternalReplyInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Games;\nusing Telegram.BotAPI.Payments;\nusing Telegram.BotAPI.Stickers;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about a message that is being replied to, which may come from another chat or forum topic.\n/// </summary>\npublic class ExternalReplyInfo\n{\n    /// <summary>\n    /// Origin of the message replied to by the given message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Origin)]\n    public MessageOrigin Origin { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Chat the original message belongs to. Available only if the chat is a supergroup or a channel.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat? Chat { get; set; }\n\n    /// <summary>\n    /// Optional. Unique message identifier inside the original chat. Available only if the original chat is a supergroup or a channel.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int? MessageId { get; set; }\n\n    /// <summary>\n    /// Optional. Options used for link preview generation for the original message, if it is a text message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LinkPreviewOptions)]\n    public LinkPreviewOptions? LinkPreviewOptions { get; set; }\n\n    /// <summary>\n    /// Optional. Message is an animation, information about the animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Animation)]\n    public Animation? Animation { get; set; }\n\n    /// <summary>\n    /// Optional. Message is an audio file, information about the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Audio)]\n    public Audio? Audio { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a general file, information about the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Document)]\n    public Document? Document { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a live photo, information about the live photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePhoto)]\n    public LivePhoto? LivePhoto { get; set; }\n\n    /// <summary>\n    /// Optional. Message contains paid media; information about the paid media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMedia)]\n    public PaidMediaInfo? PaidMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a photo, available sizes of the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public IEnumerable<PhotoSize>? Photo { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a sticker, information about the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public Sticker? Sticker { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a forwarded story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Story)]\n    public Story? Story { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a video, information about the video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Video)]\n    public Video? Video { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a <a href=\"https://telegram.org/blog/video-messages-and-telescope\">video note</a>, information about the video message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoNote)]\n    public VideoNote? VideoNote { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a voice message, information about the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Voice)]\n    public Voice? Voice { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the message media is covered by a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasMediaSpoiler)]\n    public bool? HasMediaSpoiler { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Checklist)]\n    public Checklist? Checklist { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a shared contact, information about the contact\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Contact)]\n    public Contact? Contact { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a dice with random value\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Dice)]\n    public Dice? Dice { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a game, information about the game. <a href=\"https://core.telegram.org/bots/api#games\">More about games »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Game)]\n    public Game? Game { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a scheduled giveaway, information about the giveaway\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Giveaway)]\n    public Giveaway? Giveaway { get; set; }\n\n    /// <summary>\n    /// Optional. A giveaway with public winners was completed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiveawayWinners)]\n    public GiveawayWinners? GiveawayWinners { get; set; }\n\n    /// <summary>\n    /// Optional. Message is an invoice for a <a href=\"https://core.telegram.org/bots/api#payments\">payment</a>, information about the invoice. <a href=\"https://core.telegram.org/bots/api#payments\">More about payments »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Invoice)]\n    public Invoice? Invoice { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a shared location, information about the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public Location? Location { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a native poll, information about the poll\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Poll)]\n    public Poll? Poll { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a venue, information about the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Venue)]\n    public Venue? Venue { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/File.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a file ready to be downloaded. The file can be downloaded via the link <em>https://api.telegram.org/file/bot&lt;token&gt;/&lt;file_path&gt;</em>. It is guaranteed that the link will be valid for at least 1 hour. When the link expires, a new one can be requested by calling <a href=\"https://core.telegram.org/bots/api#getfile\">getFile</a>.\n/// </summary>\npublic class File\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n\n    /// <summary>\n    /// Optional. File path. Use <em>https://api.telegram.org/file/bot&lt;token&gt;/&lt;file_path&gt;</em> to get the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FilePath)]\n    public string? FilePath { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ForumTopic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a forum topic.\n/// </summary>\npublic class ForumTopic\n{\n    /// <summary>\n    /// Unique identifier of the forum topic\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Name of the topic\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n\n    /// <summary>\n    /// Color of the topic icon in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IconColor)]\n    public int IconColor { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier of the custom emoji shown as the topic icon\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IconCustomEmojiId)]\n    public string? IconCustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the name of the topic wasn't specified explicitly by its creator and likely needs to be changed by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsNameImplicit)]\n    public bool? IsNameImplicit { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ForumTopicClosed.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a forum topic closed in the chat. Currently holds no information.\n/// </summary>\npublic class ForumTopicClosed { }\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ForumTopicCreated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a new forum topic created in the chat.\n/// </summary>\npublic class ForumTopicCreated\n{\n    /// <summary>\n    /// Name of the topic\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n\n    /// <summary>\n    /// Color of the topic icon in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IconColor)]\n    public int IconColor { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier of the custom emoji shown as the topic icon\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IconCustomEmojiId)]\n    public string? IconCustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the name of the topic wasn't specified explicitly by its creator and likely needs to be changed by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsNameImplicit)]\n    public bool? IsNameImplicit { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ForumTopicEdited.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about an edited forum topic.\n/// </summary>\npublic class ForumTopicEdited\n{\n    /// <summary>\n    /// Optional. New name of the topic, if it was edited\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string? Name { get; set; }\n\n    /// <summary>\n    /// Optional. New identifier of the custom emoji shown as the topic icon, if it was edited; an empty string if the icon was removed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IconCustomEmojiId)]\n    public string? IconCustomEmojiId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ForumTopicReopened.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a forum topic reopened in the chat. Currently holds no information.\n/// </summary>\npublic class ForumTopicReopened { }\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/GeneralForumTopicHidden.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about General forum topic hidden in the chat. Currently holds no information.\n/// </summary>\npublic class GeneralForumTopicHidden { }\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/GeneralForumTopicUnhidden.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about General forum topic unhidden in the chat. Currently holds no information.\n/// </summary>\npublic class GeneralForumTopicUnhidden { }\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Gift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Stickers;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a gift that can be sent by the bot.\n/// </summary>\npublic class Gift\n{\n    /// <summary>\n    /// Unique identifier of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// The sticker that represents the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public Sticker Sticker { get; set; } = null!;\n\n    /// <summary>\n    /// The number of Telegram Stars that must be paid to send the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StarCount)]\n    public int StarCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of Telegram Stars that must be paid to upgrade the gift to a unique one\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UpgradeStarCount)]\n    public int? UpgradeStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift can only be purchased by Telegram Premium subscribers\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPremium)]\n    public bool? IsPremium { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift can be used (after being upgraded) to customize a user's appearance\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasColors)]\n    public bool? HasColors { get; set; }\n\n    /// <summary>\n    /// Optional. The total number of gifts of this type that can be sent by all users; for limited gifts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalCount)]\n    public int? TotalCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of remaining gifts of this type that can be sent by all users; for limited gifts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RemainingCount)]\n    public int? RemainingCount { get; set; }\n\n    /// <summary>\n    /// Optional. The total number of gifts of this type that can be sent by the bot; for limited gifts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PersonalTotalCount)]\n    public int? PersonalTotalCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of remaining gifts of this type that can be sent by the bot; for limited gifts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PersonalRemainingCount)]\n    public int? PersonalRemainingCount { get; set; }\n\n    /// <summary>\n    /// Optional. Background of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Background)]\n    public GiftBackground? Background { get; set; }\n\n    /// <summary>\n    /// Optional. The total number of different unique gifts that can be obtained by upgrading the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UniqueGiftVariantCount)]\n    public int? UniqueGiftVariantCount { get; set; }\n\n    /// <summary>\n    /// Optional. Information about the chat that published the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PublisherChat)]\n    public Chat? PublisherChat { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/GiftBackground.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the background of a gift.\n/// </summary>\npublic class GiftBackground\n{\n    /// <summary>\n    /// Center color of the background in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CenterColor)]\n    public int CenterColor { get; set; }\n\n    /// <summary>\n    /// Edge color of the background in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EdgeColor)]\n    public int EdgeColor { get; set; }\n\n    /// <summary>\n    /// Text color of the background in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextColor)]\n    public int TextColor { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/GiftInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about a regular gift that was sent or received.\n/// </summary>\npublic class GiftInfo\n{\n    /// <summary>\n    /// Information about the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gift)]\n    public Gift Gift { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Unique identifier of the received gift for the bot; only present for gifts received on behalf of business accounts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OwnedGiftId)]\n    public string? OwnedGiftId { get; set; }\n\n    /// <summary>\n    /// Optional. Number of Telegram Stars that can be claimed by the receiver by converting the gift; omitted if conversion to Telegram Stars is impossible\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ConvertStarCount)]\n    public int? ConvertStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. Number of Telegram Stars that were prepaid for the ability to upgrade the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PrepaidUpgradeStarCount)]\n    public int? PrepaidUpgradeStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift's upgrade was purchased after the gift was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsUpgradeSeparate)]\n    public bool? IsUpgradeSeparate { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift can be upgraded to a unique gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanBeUpgraded)]\n    public bool? CanBeUpgraded { get; set; }\n\n    /// <summary>\n    /// Optional. Text of the message that was added to the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Optional. Special entities that appear in the text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Entities)]\n    public IEnumerable<MessageEntity>? Entities { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the sender and gift text are shown only to the gift receiver; otherwise, everyone will be able to see them\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPrivate)]\n    public bool? IsPrivate { get; set; }\n\n    /// <summary>\n    /// Optional. Unique number reserved for this gift when upgraded. See the <em>number</em> field in <see cref=\"UniqueGift\"/>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UniqueGiftNumber)]\n    public int? UniqueGiftNumber { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Gifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represent a list of gifts.\n/// </summary>\npublic class Gifts\n{\n    /// <summary>\n    /// The list of gifts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gifts)]\n    public IEnumerable<Gift> GiftList { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Giveaway.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a message about a scheduled giveaway.\n/// </summary>\npublic class Giveaway\n{\n    /// <summary>\n    /// The list of chats which the user must join to participate in the giveaway\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chats)]\n    public IEnumerable<Chat> Chats { get; set; } = null!;\n\n    /// <summary>\n    /// Point in time (Unix timestamp) when winners of the giveaway will be selected\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WinnersSelectionDate)]\n    public int WinnersSelectionDate { get; set; }\n\n    /// <summary>\n    /// The number of users which are supposed to be selected as winners of the giveaway\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WinnerCount)]\n    public int WinnerCount { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if only users who join the chats after the giveaway started should be eligible to win\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OnlyNewMembers)]\n    public bool? OnlyNewMembers { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the list of giveaway winners will be visible to everyone\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasPublicWinners)]\n    public bool? HasPublicWinners { get; set; }\n\n    /// <summary>\n    /// Optional. Description of additional giveaway prize\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PrizeDescription)]\n    public string? PrizeDescription { get; set; }\n\n    /// <summary>\n    /// Optional. A list of two-letter <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\">ISO 3166-1 alpha-2</a> country codes indicating the countries from which eligible users for the giveaway must come. If empty, then all users can participate in the giveaway. Users with a phone number that was bought on Fragment can always participate in giveaways.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CountryCodes)]\n    public IEnumerable<string>? CountryCodes { get; set; }\n\n    /// <summary>\n    /// Optional. The number of Telegram Stars to be split between giveaway winners; for Telegram Star giveaways only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PrizeStarCount)]\n    public int? PrizeStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of months the Telegram Premium subscription won from the giveaway will be active for; for Telegram Premium giveaways only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PremiumSubscriptionMonthCount)]\n    public int? PremiumSubscriptionMonthCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/GiveawayCompleted.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about the completion of a giveaway without public winners.\n/// </summary>\npublic class GiveawayCompleted\n{\n    /// <summary>\n    /// Number of winners in the giveaway\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WinnerCount)]\n    public int WinnerCount { get; set; }\n\n    /// <summary>\n    /// Optional. Number of undistributed prizes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UnclaimedPrizeCount)]\n    public int? UnclaimedPrizeCount { get; set; }\n\n    /// <summary>\n    /// Optional. Message with the giveaway that was completed, if it wasn't deleted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiveawayMessage)]\n    public Message? GiveawayMessage { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the giveaway is a Telegram Star giveaway. Otherwise, currently, the giveaway is a Telegram Premium giveaway.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsStarGiveaway)]\n    public bool? IsStarGiveaway { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/GiveawayCreated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about the creation of a scheduled giveaway.\n/// </summary>\npublic class GiveawayCreated\n{\n    /// <summary>\n    /// Optional. The number of Telegram Stars to be split between giveaway winners; for Telegram Star giveaways only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PrizeStarCount)]\n    public int? PrizeStarCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/GiveawayWinners.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a message about the completion of a giveaway with public winners.\n/// </summary>\npublic class GiveawayWinners\n{\n    /// <summary>\n    /// The chat that created the giveaway\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Identifier of the message with the giveaway in the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiveawayMessageId)]\n    public int GiveawayMessageId { get; set; }\n\n    /// <summary>\n    /// Point in time (Unix timestamp) when winners of the giveaway were selected\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WinnersSelectionDate)]\n    public int WinnersSelectionDate { get; set; }\n\n    /// <summary>\n    /// Total number of winners in the giveaway\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WinnerCount)]\n    public int WinnerCount { get; set; }\n\n    /// <summary>\n    /// List of up to 100 winners of the giveaway\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Winners)]\n    public IEnumerable<User> Winners { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. The number of other chats the user had to join in order to be eligible for the giveaway\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AdditionalChatCount)]\n    public int? AdditionalChatCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of Telegram Stars that were split between giveaway winners; for Telegram Star giveaways only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PrizeStarCount)]\n    public int? PrizeStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of months the Telegram Premium subscription won from the giveaway will be active for; for Telegram Premium giveaways only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PremiumSubscriptionMonthCount)]\n    public int? PremiumSubscriptionMonthCount { get; set; }\n\n    /// <summary>\n    /// Optional. Number of undistributed prizes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UnclaimedPrizeCount)]\n    public int? UnclaimedPrizeCount { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if only users who had joined the chats after the giveaway started were eligible to win\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OnlyNewMembers)]\n    public bool? OnlyNewMembers { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the giveaway was canceled because the payment for it was refunded\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WasRefunded)]\n    public bool? WasRefunded { get; set; }\n\n    /// <summary>\n    /// Optional. Description of additional giveaway prize\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PrizeDescription)]\n    public string? PrizeDescription { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InlineKeyboardButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Games;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents one button of an inline keyboard. Exactly one of the fields other than <em>text</em>, <em>icon_custom_emoji_id</em>, and <em>style</em> must be used to specify the type of the button.\n/// </summary>\npublic class InlineKeyboardButton\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InlineKeyboardButton\"/> class.\n    /// </summary>\n    /// <param name=\"text\">Label text on the button</param>\n    public InlineKeyboardButton(string text)\n    {\n        this.Text = text ?? throw new ArgumentNullException(nameof(text));\n    }\n\n    /// <summary>\n    /// Label text on the button\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier of the custom emoji shown before the text of the button. Can only be used by bots that purchased additional usernames on <a href=\"https://fragment.com\">Fragment</a> or in the messages directly sent by the bot to private, group and supergroup chats if the owner of the bot has a Telegram Premium subscription.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IconCustomEmojiId)]\n    public string? IconCustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. Style of the button. Must be one of “danger” (red), “success” (green) or “primary” (blue). If omitted, then an app-specific style is used.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Style)]\n    public string? Style { get; set; }\n\n    /// <summary>\n    /// Optional. HTTP or tg:// URL to be opened when the button is pressed. Links <em>tg://user?id=&lt;user_id&gt;</em> can be used to mention a user by their identifier without using a username, if this is allowed by their privacy settings.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string? Url { get; set; }\n\n    /// <summary>\n    /// Optional. Data to be sent in a <a href=\"https://core.telegram.org/bots/api#callbackquery\">callback query</a> to the bot when the button is pressed, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CallbackData)]\n    public string? CallbackData { get; set; }\n\n    /// <summary>\n    /// Optional. Description of the <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> that will be launched when the user presses the button. The Web App will be able to send an arbitrary message on behalf of the user using the method <a href=\"https://core.telegram.org/bots/api#answerwebappquery\">answerWebAppQuery</a>. Available only in private chats between a user and the bot. Not supported for messages sent on behalf of a business account.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WebApp)]\n    public WebAppInfo? WebApp { get; set; }\n\n    /// <summary>\n    /// Optional. An HTTPS URL used to automatically authorize the user. Can be used as a replacement for the <a href=\"https://core.telegram.org/widgets/login\">Telegram Login Widget</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LoginUrl)]\n    public LoginUrl? LoginUrl { get; set; }\n\n    /// <summary>\n    /// Optional. If set, pressing the button will prompt the user to select one of their chats, open that chat and insert the bot's username and the specified inline query in the input field. May be empty, in which case just the bot's username will be inserted. Not supported for messages sent in channel direct messages chats and on behalf of a business account.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SwitchInlineQuery)]\n    public string? SwitchInlineQuery { get; set; }\n\n    /// <summary>\n    /// Optional. If set, pressing the button will insert the bot's username and the specified inline query in the current chat's input field. May be empty, in which case only the bot's username will be inserted.<br /><br />This offers a quick way for the user to open your bot in inline mode in the same chat - good for selecting something from multiple options. Not supported in channels and for messages sent in channel direct messages chats and on behalf of a business account.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SwitchInlineQueryCurrentChat)]\n    public string? SwitchInlineQueryCurrentChat { get; set; }\n\n    /// <summary>\n    /// Optional. If set, pressing the button will prompt the user to select one of their chats of the specified type, open that chat and insert the bot's username and the specified inline query in the input field. Not supported for messages sent in channel direct messages chats and on behalf of a business account.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SwitchInlineQueryChosenChat)]\n    public SwitchInlineQueryChosenChat? SwitchInlineQueryChosenChat { get; set; }\n\n    /// <summary>\n    /// Optional. Description of the button that copies the specified text to the clipboard.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CopyText)]\n    public CopyTextButton? CopyText { get; set; }\n\n    /// <summary>\n    /// Optional. Description of the game that will be launched when the user presses the button.<br /><br /><strong>NOTE:</strong> This type of button <strong>must</strong> always be the first button in the first row.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CallbackGame)]\n    public CallbackGame? CallbackGame { get; set; }\n\n    /// <summary>\n    /// Optional. Specify <em>True</em>, to send a <a href=\"https://core.telegram.org/bots/api#payments\">Pay button</a>. Substrings “⭐” and “XTR” in the buttons's text will be replaced with a Telegram Star icon.<br /><br /><strong>NOTE:</strong> This type of button <strong>must</strong> always be the first button in the first row and can only be used in invoice messages.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Pay)]\n    public bool? Pay { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputChecklist.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a checklist to create.\n/// </summary>\npublic class InputChecklist\n{\n    /// <summary>\n    /// Title of the checklist; 1-255 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the title. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, <em>custom_emoji</em>, and <em>date_time</em> entities are allowed.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TitleEntities)]\n    public IEnumerable<MessageEntity>? TitleEntities { get; set; }\n\n    /// <summary>\n    /// List of 1-30 tasks in the checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Tasks)]\n    public IEnumerable<InputChecklistTask> Tasks { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if other users can add tasks to the checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OthersCanAddTasks)]\n    public bool? OthersCanAddTasks { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if other users can mark tasks as done or not done in the checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OthersCanMarkTasksAsDone)]\n    public bool? OthersCanMarkTasksAsDone { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputChecklistTask.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a task to add to a checklist.\n/// </summary>\npublic class InputChecklistTask\n{\n    /// <summary>\n    /// Unique identifier of the task; must be positive and unique among all task identifiers currently present in the checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public int Id { get; set; }\n\n    /// <summary>\n    /// Text of the task; 1-100 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, <em>custom_emoji</em>, and <em>date_time</em> entities are allowed.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputFile.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.IO;\nusing System.Net.Http;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents the contents of a file to be uploaded. Must be posted using multipart/form-data in the usual way that files are uploaded via the browser.\n/// </summary>\npublic sealed class InputFile : IEquatable<InputFile>\n{\n    /// <summary>\n    /// HTTP file content.\n    /// </summary>\n    [JsonIgnore]\n    public StreamContent Content { get; private set; }\n\n    /// <summary>\n    /// File name.\n    /// </summary>\n    [JsonIgnore]\n    public string Filename { get; private set; }\n\n    /// <summary>New InputFile.</summary>\n    /// <param name=\"streamcontent\">HTTP file content.</param>\n    /// <param name=\"filename\">File name.</param>\n    public InputFile(StreamContent streamcontent, string filename)\n    {\n        this.Content = streamcontent;\n        this.Filename = filename;\n    }\n\n    /// <summary>New InputFile.</summary>\n    /// <param name=\"stream\">Stream file.</param>\n    /// <param name=\"filename\">File name.</param>\n    public InputFile(Stream stream, string filename)\n    {\n        this.Content = new StreamContent(stream);\n        this.Filename = filename;\n    }\n\n    /// <summary>New InputFile.</summary>\n    /// <param name=\"file\">File.</param>\n    /// <param name=\"filename\">File name.</param>\n    public InputFile(byte[] file, string filename)\n    {\n        this.Content = new StreamContent(new MemoryStream(file));\n        this.Filename = filename;\n    }\n\n    /// <inheritdoc/>\n    public override bool Equals(object obj)\n    {\n        return this.Equals(obj as InputFile);\n    }\n\n    /// <inheritdoc/>\n    public bool Equals(InputFile? other)\n    {\n        return other != null\n            && EqualityComparer<StreamContent>.Default.Equals(this.Content, other.Content)\n            && this.Filename == other.Filename;\n    }\n\n    /// <inheritdoc/>\n    public override int GetHashCode()\n    {\n        int hashCode = 1463301466;\n        hashCode =\n            hashCode * -1521134295\n            + EqualityComparer<StreamContent>.Default.GetHashCode(this.Content);\n        hashCode =\n            hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(this.Filename);\n        return hashCode;\n    }\n\n    /// <inheritdoc/>\n    public static bool operator ==(InputFile? left, InputFile? right)\n    {\n        return EqualityComparer<InputFile>.Default.Equals(left!, right!);\n    }\n\n    /// <inheritdoc/>\n    public static bool operator !=(InputFile? left, InputFile? right)\n    {\n        return !(left == right);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMedia.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents the content of a media message to be sent. It should be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"InputMediaAnimation\"/></description></item>\n/// <item><description><see cref=\"InputMediaAudio\"/></description></item>\n/// <item><description><see cref=\"InputMediaDocument\"/></description></item>\n/// <item><description><see cref=\"InputMediaLivePhoto\"/></description></item>\n/// <item><description><see cref=\"InputMediaPhoto\"/></description></item>\n/// <item><description><see cref=\"InputMediaVideo\"/></description></item>\n/// <item><description><see cref=\"InputMediaLocation\"/></description></item>\n/// <item><description><see cref=\"InputMediaVenue\"/></description></item>\n/// <item><description><see cref=\"InputMediaSticker\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(InputMediaConverter))]\npublic abstract class InputMedia\n{\n    /// <summary>\n    /// Type of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaAnimation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents an animation file (GIF or H.264/MPEG-4 AVC video without sound) to be sent.\n/// </summary>\npublic class InputMediaAnimation : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaAnimation\"/> class.\n    /// </summary>\n    /// <param name=\"media\">File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputMediaAnimation(string media)\n    {\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>animation</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"animation\";\n\n    /// <summary>\n    /// File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public string Media { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public string? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the animation to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the animation caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Animation width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int? Width { get; set; }\n\n    /// <summary>\n    /// Optional. Animation height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int? Height { get; set; }\n\n    /// <summary>\n    /// Optional. Animation duration in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the animation needs to be covered with a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasSpoiler)]\n    public bool? HasSpoiler { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaAudio.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents an audio file to be treated as music to be sent.\n/// </summary>\npublic class InputMediaAudio : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaAudio\"/> class.\n    /// </summary>\n    /// <param name=\"media\">File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputMediaAudio(string media)\n    {\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>audio</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"audio\";\n\n    /// <summary>\n    /// File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public string Media { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public string? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the audio to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Duration of the audio in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Performer of the audio\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Performer)]\n    public string? Performer { get; set; }\n\n    /// <summary>\n    /// Optional. Title of the audio\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaDocument.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a general file to be sent.\n/// </summary>\npublic class InputMediaDocument : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaDocument\"/> class.\n    /// </summary>\n    /// <param name=\"media\">File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputMediaDocument(string media)\n    {\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>document</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"document\";\n\n    /// <summary>\n    /// File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public string Media { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public string? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the document to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Disables automatic server-side content type detection for files uploaded using multipart/form-data. Always <em>True</em>, if the document is sent as part of an album.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableContentTypeDetection)]\n    public bool? DisableContentTypeDetection { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaLivePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a live photo to be sent.\n/// </summary>\npublic class InputMediaLivePhoto : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaLivePhoto\"/> class.\n    /// </summary>\n    /// <param name=\"media\">Video of the live photo to send. Pass a file_id to send a file that exists on the Telegram servers (recommended) or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    /// <param name=\"photo\">The static photo to send. Pass a file_id to send a file that exists on the Telegram servers (recommended) or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.</param>\n    public InputMediaLivePhoto(string media, string photo)\n    {\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>live_photo</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"live_photo\";\n\n    /// <summary>\n    /// Video of the live photo to send. Pass a file_id to send a file that exists on the Telegram servers (recommended) or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public string Media { get; set; }\n\n    /// <summary>\n    /// The static photo to send. Pass a file_id to send a file that exists on the Telegram servers (recommended) or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public string Photo { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the live photo to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the live photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the live photo needs to be covered with a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasSpoiler)]\n    public bool? HasSpoiler { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaLocation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a location to be sent.\n/// </summary>\npublic class InputMediaLocation : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaLocation\"/> class.\n    /// </summary>\n    /// <param name=\"latitude\">Latitude of the location</param>\n    /// <param name=\"longitude\">Longitude of the location</param>\n    public InputMediaLocation(float latitude, float longitude)\n    {\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>location</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"location\";\n\n    /// <summary>\n    /// Latitude of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Optional. The radius of uncertainty for the location, measured in meters; 0-1500\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HorizontalAccuracy)]\n    public float? HorizontalAccuracy { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a photo to be sent.\n/// </summary>\npublic class InputMediaPhoto : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaPhoto\"/> class.\n    /// </summary>\n    /// <param name=\"media\">File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputMediaPhoto(string media)\n    {\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>photo</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"photo\";\n\n    /// <summary>\n    /// File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public string Media { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the photo to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the photo needs to be covered with a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasSpoiler)]\n    public bool? HasSpoiler { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaSticker.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a sticker file to be sent.\n/// </summary>\npublic class InputMediaSticker : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaSticker\"/> class.\n    /// </summary>\n    /// <param name=\"media\">File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a .WEBP sticker from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputMediaSticker(string media)\n    {\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>sticker</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"sticker\";\n\n    /// <summary>\n    /// File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a .WEBP sticker from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public string Media { get; set; }\n\n    /// <summary>\n    /// Optional. Emoji associated with the sticker; only for just uploaded stickers\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Emoji)]\n    public string? Emoji { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaVenue.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a venue to be sent.\n/// </summary>\npublic class InputMediaVenue : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaVenue\"/> class.\n    /// </summary>\n    /// <param name=\"latitude\">Latitude of the location</param>\n    /// <param name=\"longitude\">Longitude of the location</param>\n    /// <param name=\"title\">Name of the venue</param>\n    /// <param name=\"address\">Address of the venue</param>\n    public InputMediaVenue(float latitude, float longitude, string title, string address)\n    {\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Address = address ?? throw new ArgumentNullException(nameof(address));\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>venue</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"venue\";\n\n    /// <summary>\n    /// Latitude of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Name of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; }\n\n    /// <summary>\n    /// Address of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Address)]\n    public string Address { get; set; }\n\n    /// <summary>\n    /// Optional. Foursquare identifier of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareId)]\n    public string? FoursquareId { get; set; }\n\n    /// <summary>\n    /// Optional. Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareType)]\n    public string? FoursquareType { get; set; }\n\n    /// <summary>\n    /// Optional. Google Places identifier of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceId)]\n    public string? GooglePlaceId { get; set; }\n\n    /// <summary>\n    /// Optional. Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceType)]\n    public string? GooglePlaceType { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputMedia/InputMediaVideo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a video to be sent.\n/// </summary>\npublic class InputMediaVideo : InputMedia\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputMediaVideo\"/> class.\n    /// </summary>\n    /// <param name=\"media\">File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputMediaVideo(string media)\n    {\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Type of the result, must be <em>video</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"video\";\n\n    /// <summary>\n    /// File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public string Media { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public string? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Cover)]\n    public string? Cover { get; set; }\n\n    /// <summary>\n    /// Optional. Start timestamp for the video in the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StartTimestamp)]\n    public int? StartTimestamp { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the video to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Video width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int? Width { get; set; }\n\n    /// <summary>\n    /// Optional. Video height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int? Height { get; set; }\n\n    /// <summary>\n    /// Optional. Video duration in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the uploaded video is suitable for streaming\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SupportsStreaming)]\n    public bool? SupportsStreaming { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the video needs to be covered with a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasSpoiler)]\n    public bool? HasSpoiler { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputPaidMedia/InputPaidMedia.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the paid media to be sent. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"InputPaidMediaLivePhoto\"/></description></item>\n/// <item><description><see cref=\"InputPaidMediaPhoto\"/></description></item>\n/// <item><description><see cref=\"InputPaidMediaVideo\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(InputPaidMediaConverter))]\npublic abstract class InputPaidMedia\n{\n    /// <summary>\n    /// Type of the media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n\n    /// <summary>\n    /// No description available\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public abstract string Media { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputPaidMedia/InputPaidMediaLivePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The paid media to send is a live photo.\n/// </summary>\npublic class InputPaidMediaLivePhoto : InputPaidMedia\n{\n    /// <summary>\n    /// Type of the media, must be <em>live_photo</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"live_photo\";\n\n    /// <summary>\n    /// Video of the live photo to send. Pass a file_id to send a file that exists on the Telegram servers (recommended) or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public override string Media { get; set; } = null!;\n\n    /// <summary>\n    /// The static photo to send. Pass a file_id to send a file that exists on the Telegram servers (recommended) or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Sending live photos by a URL is currently unsupported.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public string Photo { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputPaidMedia/InputPaidMediaPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The paid media to send is a photo.\n/// </summary>\npublic class InputPaidMediaPhoto : InputPaidMedia\n{\n    /// <summary>\n    /// Type of the media, must be <em>photo</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"photo\";\n\n    /// <summary>\n    /// File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public override string Media { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputPaidMedia/InputPaidMediaVideo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The paid media to send is a video.\n/// </summary>\npublic class InputPaidMediaVideo : InputPaidMedia\n{\n    /// <summary>\n    /// Type of the media, must be <em>video</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"video\";\n\n    /// <summary>\n    /// File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public override string Media { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the thumbnail was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public string? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new one using multipart/form-data under &lt;file_attach_name&gt; name. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Cover)]\n    public string? Cover { get; set; }\n\n    /// <summary>\n    /// Optional. Start timestamp for the video in the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StartTimestamp)]\n    public int? StartTimestamp { get; set; }\n\n    /// <summary>\n    /// Optional. Video width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int? Width { get; set; }\n\n    /// <summary>\n    /// Optional. Video height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int? Height { get; set; }\n\n    /// <summary>\n    /// Optional. Video duration in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the uploaded video is suitable for streaming\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SupportsStreaming)]\n    public bool? SupportsStreaming { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputPollOption.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing InputPollOptionMedia = Telegram.BotAPI.AvailableTypes.InputMedia;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about one answer option in a poll to be sent.\n/// </summary>\npublic class InputPollOption\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputPollOption\"/> class.\n    /// </summary>\n    /// <param name=\"text\">Option text, 1-100 characters</param>\n    public InputPollOption(string text)\n    {\n        this.Text = text ?? throw new ArgumentNullException(nameof(text));\n    }\n\n    /// <summary>\n    /// Option text, 1-100 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Currently, only custom emoji entities are allowed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextParseMode)]\n    public string? TextParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. A JSON-serialized list of special entities that appear in the poll option text. It can be specified instead of <em>text_parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Media added to the poll option\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public InputPollOptionMedia? Media { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputProfilePhoto/InputProfilePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes a profile photo to set. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"InputProfilePhotoStatic\"/></description></item>\n/// <item><description><see cref=\"InputProfilePhotoAnimated\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(InputProfilePhotoConverter))]\npublic abstract class InputProfilePhoto\n{\n    /// <summary>\n    /// Type of the profile photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputProfilePhoto/InputProfilePhotoAnimated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// An animated profile photo in the MPEG4 format.\n/// </summary>\npublic class InputProfilePhotoAnimated : InputProfilePhoto\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputProfilePhotoAnimated\"/> class.\n    /// </summary>\n    /// <param name=\"animation\">The animated profile photo. Profile photos can't be reused and can only be uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the photo was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputProfilePhotoAnimated(string animation)\n    {\n        this.Animation = animation ?? throw new ArgumentNullException(nameof(animation));\n    }\n\n    /// <summary>\n    /// Type of the profile photo, must be <em>animated</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"animated\";\n\n    /// <summary>\n    /// The animated profile photo. Profile photos can't be reused and can only be uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the photo was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Animation)]\n    public string Animation { get; set; }\n\n    /// <summary>\n    /// Optional. Timestamp in seconds of the frame that will be used as the static profile photo. Defaults to 0.0.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MainFrameTimestamp)]\n    public float? MainFrameTimestamp { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputProfilePhoto/InputProfilePhotoStatic.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// A static profile photo in the .JPG format.\n/// </summary>\npublic class InputProfilePhotoStatic : InputProfilePhoto\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputProfilePhotoStatic\"/> class.\n    /// </summary>\n    /// <param name=\"photo\">The static profile photo. Profile photos can't be reused and can only be uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the photo was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputProfilePhotoStatic(string photo)\n    {\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Type of the profile photo, must be <em>static</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"static\";\n\n    /// <summary>\n    /// The static profile photo. Profile photos can't be reused and can only be uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the photo was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public string Photo { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputStoryContent/InputStoryContent.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the content of a story to post. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"InputStoryContentPhoto\"/></description></item>\n/// <item><description><see cref=\"InputStoryContentVideo\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(InputStoryContentConverter))]\npublic abstract class InputStoryContent\n{\n    /// <summary>\n    /// Type of the content\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputStoryContent/InputStoryContentPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a photo to post as a story.\n/// </summary>\npublic class InputStoryContentPhoto : InputStoryContent\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputStoryContentPhoto\"/> class.\n    /// </summary>\n    /// <param name=\"photo\">The photo to post as a story. The photo must be of the size 1080x1920 and must not exceed 10 MB. The photo can't be reused and can only be uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the photo was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputStoryContentPhoto(string photo)\n    {\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Type of the content, must be <em>photo</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"photo\";\n\n    /// <summary>\n    /// The photo to post as a story. The photo must be of the size 1080x1920 and must not exceed 10 MB. The photo can't be reused and can only be uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the photo was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public string Photo { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/InputStoryContent/InputStoryContentVideo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a video to post as a story.\n/// </summary>\npublic class InputStoryContentVideo : InputStoryContent\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputStoryContentVideo\"/> class.\n    /// </summary>\n    /// <param name=\"video\">The video to post as a story. The video must be of the size 720x1280, streamable, encoded with H.265 codec, with key frames added each second in the MPEG4 format, and must not exceed 30 MB. The video can't be reused and can only be uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the video was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    public InputStoryContentVideo(string video)\n    {\n        this.Video = video ?? throw new ArgumentNullException(nameof(video));\n    }\n\n    /// <summary>\n    /// Type of the content, must be <em>video</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"video\";\n\n    /// <summary>\n    /// The video to post as a story. The video must be of the size 720x1280, streamable, encoded with H.265 codec, with key frames added each second in the MPEG4 format, and must not exceed 30 MB. The video can't be reused and can only be uploaded as a new file, so you can pass “attach://&lt;file_attach_name&gt;” if the video was uploaded using multipart/form-data under &lt;file_attach_name&gt;. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Video)]\n    public string Video { get; set; }\n\n    /// <summary>\n    /// Optional. Precise duration of the video in seconds; 0-60\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public float? Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Timestamp in seconds of the frame that will be used as the static cover for the story. Defaults to 0.0.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CoverFrameTimestamp)]\n    public float? CoverFrameTimestamp { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the video has no sound\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAnimation)]\n    public bool? IsAnimation { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/KeyboardButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents one button of the reply keyboard. At most one of the fields other than <em>text</em>, <em>icon_custom_emoji_id</em>, and <em>style</em> must be used to specify the type of the button. For simple text buttons, <em>String</em> can be used instead of this object to specify the button text.\n/// </summary>\npublic class KeyboardButton\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"KeyboardButton\"/> class.\n    /// </summary>\n    /// <param name=\"text\">Text of the button. If none of the fields other than <em>text</em>, <em>icon_custom_emoji_id</em>, and <em>style</em> are used, it will be sent as a message when the button is pressed</param>\n    public KeyboardButton(string text)\n    {\n        this.Text = text ?? throw new ArgumentNullException(nameof(text));\n    }\n\n    /// <summary>\n    /// Text of the button. If none of the fields other than <em>text</em>, <em>icon_custom_emoji_id</em>, and <em>style</em> are used, it will be sent as a message when the button is pressed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier of the custom emoji shown before the text of the button. Can only be used by bots that purchased additional usernames on <a href=\"https://fragment.com\">Fragment</a> or in the messages directly sent by the bot to private, group and supergroup chats if the owner of the bot has a Telegram Premium subscription.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IconCustomEmojiId)]\n    public string? IconCustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. Style of the button. Must be one of “danger” (red), “success” (green) or “primary” (blue). If omitted, then an app-specific style is used.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Style)]\n    public string? Style { get; set; }\n\n    /// <summary>\n    /// Optional. If specified, pressing the button will open a list of suitable users. Identifiers of selected users will be sent to the bot in a “users_shared” service message. Available in private chats only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestUsers)]\n    public KeyboardButtonRequestUsers? RequestUsers { get; set; }\n\n    /// <summary>\n    /// Optional. If specified, pressing the button will open a list of suitable chats. Tapping on a chat will send its identifier to the bot in a “chat_shared” service message. Available in private chats only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestChat)]\n    public KeyboardButtonRequestChat? RequestChat { get; set; }\n\n    /// <summary>\n    /// Optional. If specified, pressing the button will ask the user to create and share a bot that will be managed by the current bot. Available for bots that enabled management of other bots in the <a href=\"https://t.me/BotFather\">@BotFather</a> Mini App. Available in private chats only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestManagedBot)]\n    public KeyboardButtonRequestManagedBot? RequestManagedBot { get; set; }\n\n    /// <summary>\n    /// Optional. If <em>True</em>, the user's phone number will be sent as a contact when the button is pressed. Available in private chats only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestContact)]\n    public bool? RequestContact { get; set; }\n\n    /// <summary>\n    /// Optional. If <em>True</em>, the user's current location will be sent when the button is pressed. Available in private chats only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestLocation)]\n    public bool? RequestLocation { get; set; }\n\n    /// <summary>\n    /// Optional. If specified, the user will be asked to create a poll and send it to the bot when the button is pressed. Available in private chats only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestPoll)]\n    public KeyboardButtonPollType? RequestPoll { get; set; }\n\n    /// <summary>\n    /// Optional. If specified, the described <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> will be launched when the button is pressed. The Web App will be able to send a “web_app_data” service message. Available in private chats only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WebApp)]\n    public WebAppInfo? WebApp { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/KeyboardButtonPollType.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents type of a poll, which is allowed to be created and sent when the corresponding button is pressed.\n/// </summary>\npublic class KeyboardButtonPollType\n{\n    /// <summary>\n    /// Optional. If <em>quiz</em> is passed, the user will be allowed to create only polls in the quiz mode. If <em>regular</em> is passed, only regular polls will be allowed. Otherwise, the user will be allowed to create a poll of any type.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public string? Type { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/KeyboardButtonRequestChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object defines the criteria used to request a suitable chat. Information about the selected chat will be shared with the bot when the corresponding button is pressed. The bot will be granted requested rights in the chat if appropriate. <a href=\"https://core.telegram.org/bots/features#chat-and-user-selection\">More about requesting chats »</a>.\n/// </summary>\npublic class KeyboardButtonRequestChat\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"KeyboardButtonRequestChat\"/> class.\n    /// </summary>\n    /// <param name=\"requestId\">Signed 32-bit identifier of the request, which will be received back in the <see cref=\"ChatShared\"/> object. Must be unique within the message</param>\n    /// <param name=\"chatIsChannel\">Pass <em>True</em> to request a channel chat, pass <em>False</em> to request a group or a supergroup chat.</param>\n    public KeyboardButtonRequestChat(int requestId, bool chatIsChannel)\n    {\n        this.RequestId = requestId;\n        this.ChatIsChannel = chatIsChannel;\n    }\n\n    /// <summary>\n    /// Signed 32-bit identifier of the request, which will be received back in the <see cref=\"ChatShared\"/> object. Must be unique within the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestId)]\n    public int RequestId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to request a channel chat, pass <em>False</em> to request a group or a supergroup chat.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatIsChannel)]\n    public bool ChatIsChannel { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request a forum supergroup, pass <em>False</em> to request a non-forum chat. If not specified, no additional restrictions are applied.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatIsForum)]\n    public bool? ChatIsForum { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request a supergroup or a channel with a username, pass <em>False</em> to request a chat without a username. If not specified, no additional restrictions are applied.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatHasUsername)]\n    public bool? ChatHasUsername { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request a chat owned by the user. Otherwise, no additional restrictions are applied.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatIsCreated)]\n    public bool? ChatIsCreated { get; set; }\n\n    /// <summary>\n    /// Optional. A JSON-serialized object listing the required administrator rights of the user in the chat. The rights must be a superset of <em>bot_administrator_rights</em>. If not specified, no additional restrictions are applied.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserAdministratorRights)]\n    public ChatAdministratorRights? UserAdministratorRights { get; set; }\n\n    /// <summary>\n    /// Optional. A JSON-serialized object listing the required administrator rights of the bot in the chat. The rights must be a subset of <em>user_administrator_rights</em>. If not specified, no additional restrictions are applied.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BotAdministratorRights)]\n    public ChatAdministratorRights? BotAdministratorRights { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request a chat with the bot as a member. Otherwise, no additional restrictions are applied.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BotIsMember)]\n    public bool? BotIsMember { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request the chat's title\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestTitle)]\n    public bool? RequestTitle { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request the chat's username\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestUsername)]\n    public bool? RequestUsername { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request the chat's photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestPhoto)]\n    public bool? RequestPhoto { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/KeyboardButtonRequestManagedBot.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object defines the parameters for the creation of a managed bot. Information about the created bot will be shared with the bot using the update <em>managed_bot</em> and a <see cref=\"Message\"/> with the field <em>managed_bot_created</em>.\n/// </summary>\npublic class KeyboardButtonRequestManagedBot\n{\n    /// <summary>\n    /// Signed 32-bit identifier of the request. Must be unique within the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestId)]\n    public int RequestId { get; set; }\n\n    /// <summary>\n    /// Optional. Suggested name for the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedName)]\n    public string? SuggestedName { get; set; }\n\n    /// <summary>\n    /// Optional. Suggested username for the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedUsername)]\n    public string? SuggestedUsername { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/KeyboardButtonRequestUsers.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object defines the criteria used to request suitable users. Information about the selected users will be shared with the bot when the corresponding button is pressed. <a href=\"https://core.telegram.org/bots/features#chat-and-user-selection\">More about requesting users »</a>\n/// </summary>\npublic class KeyboardButtonRequestUsers\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"KeyboardButtonRequestUsers\"/> class.\n    /// </summary>\n    /// <param name=\"requestId\">Signed 32-bit identifier of the request that will be received back in the <see cref=\"UsersShared\"/> object. Must be unique within the message</param>\n    public KeyboardButtonRequestUsers(int requestId)\n    {\n        this.RequestId = requestId;\n    }\n\n    /// <summary>\n    /// Signed 32-bit identifier of the request that will be received back in the <see cref=\"UsersShared\"/> object. Must be unique within the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestId)]\n    public int RequestId { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request bots, pass <em>False</em> to request regular users. If not specified, no additional restrictions are applied.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserIsBot)]\n    public bool? UserIsBot { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request premium users, pass <em>False</em> to request non-premium users. If not specified, no additional restrictions are applied.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserIsPremium)]\n    public bool? UserIsPremium { get; set; }\n\n    /// <summary>\n    /// Optional. The maximum number of users to be selected; 1-10. Defaults to 1.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaxQuantity)]\n    public int? MaxQuantity { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request the users' first and last names\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestName)]\n    public bool? RequestName { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request the users' usernames\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestUsername)]\n    public bool? RequestUsername { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request the users' photos\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestPhoto)]\n    public bool? RequestPhoto { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/LinkPreviewOptions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the options used for link preview generation.\n/// </summary>\npublic class LinkPreviewOptions\n{\n    /// <summary>\n    /// Optional. <em>True</em>, if the link preview is disabled\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsDisabled)]\n    public bool? IsDisabled { get; set; }\n\n    /// <summary>\n    /// Optional. URL to use for the link preview. If empty, then the first URL found in the message text will be used\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string? Url { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the media in the link preview is supposed to be shrunk; ignored if the URL isn't explicitly specified or media size change isn't supported for the preview\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PreferSmallMedia)]\n    public bool? PreferSmallMedia { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the media in the link preview is supposed to be enlarged; ignored if the URL isn't explicitly specified or media size change isn't supported for the preview\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PreferLargeMedia)]\n    public bool? PreferLargeMedia { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the link preview must be shown above the message text; otherwise, the link preview will be shown below the message text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowAboveText)]\n    public bool? ShowAboveText { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/LivePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a live photo.\n/// </summary>\npublic class LivePhoto\n{\n    /// <summary>\n    /// Optional. Available sizes of the corresponding static photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public IEnumerable<PhotoSize>? Photo { get; set; }\n\n    /// <summary>\n    /// Identifier for the video file which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for the video file which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Video width as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int Width { get; set; }\n\n    /// <summary>\n    /// Video height as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int Height { get; set; }\n\n    /// <summary>\n    /// Duration of the video in seconds as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int Duration { get; set; }\n\n    /// <summary>\n    /// Optional. MIME type of the file as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MimeType)]\n    public string? MimeType { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Location.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a point on the map.\n/// </summary>\npublic class Location\n{\n    /// <summary>\n    /// Latitude as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Optional. The radius of uncertainty for the location, measured in meters; 0-1500\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HorizontalAccuracy)]\n    public float? HorizontalAccuracy { get; set; }\n\n    /// <summary>\n    /// Optional. Time relative to the message sending date, during which the location can be updated; in seconds. For active live locations only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePeriod)]\n    public int? LivePeriod { get; set; }\n\n    /// <summary>\n    /// Optional. The direction in which user is moving, in degrees; 1-360. For active live locations only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Heading)]\n    public int? Heading { get; set; }\n\n    /// <summary>\n    /// Optional. The maximum distance for proximity alerts about approaching another chat member, in meters. For sent live locations only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProximityAlertRadius)]\n    public int? ProximityAlertRadius { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/LocationAddress.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the physical address of a location.\n/// </summary>\npublic class LocationAddress\n{\n    /// <summary>\n    /// The two-letter ISO 3166-1 alpha-2 country code of the country where the location is located\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CountryCode)]\n    public string CountryCode { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. State of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.State)]\n    public string? State { get; set; }\n\n    /// <summary>\n    /// Optional. City of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.City)]\n    public string? City { get; set; }\n\n    /// <summary>\n    /// Optional. Street address of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Street)]\n    public string? Street { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/LoginUrl.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a parameter of the inline keyboard button used to automatically authorize a user. Serves as a great replacement for the <a href=\"https://core.telegram.org/widgets/login\">Telegram Login Widget</a> when the user is coming from Telegram. All the user needs to do is tap/click a button and confirm that they want to log in:\n/// Telegram apps support these buttons as of <a href=\"https://telegram.org/blog/privacy-discussions-web-bots#meet-seamless-web-bots\">version 5.7</a>.\n/// </summary>\npublic class LoginUrl\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"LoginUrl\"/> class.\n    /// </summary>\n    /// <param name=\"url\">An HTTPS URL to be opened with user authorization data added to the query string when the button is pressed. If the user refuses to provide authorization data, the original URL without information about the user will be opened. The data added is the same as described in <a href=\"https://core.telegram.org/widgets/login#receiving-authorization-data\">Receiving authorization data</a>.<br /><br /><strong>NOTE:</strong> You <strong>must</strong> always check the hash of the received data to verify the authentication and the integrity of the data as described in <a href=\"https://core.telegram.org/widgets/login#checking-authorization\">Checking authorization</a>.</param>\n    public LoginUrl(string url)\n    {\n        this.Url = url ?? throw new ArgumentNullException(nameof(url));\n    }\n\n    /// <summary>\n    /// An HTTPS URL to be opened with user authorization data added to the query string when the button is pressed. If the user refuses to provide authorization data, the original URL without information about the user will be opened. The data added is the same as described in <a href=\"https://core.telegram.org/widgets/login#receiving-authorization-data\">Receiving authorization data</a>.<br /><br /><strong>NOTE:</strong> You <strong>must</strong> always check the hash of the received data to verify the authentication and the integrity of the data as described in <a href=\"https://core.telegram.org/widgets/login#checking-authorization\">Checking authorization</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string Url { get; set; }\n\n    /// <summary>\n    /// Optional. New text of the button in forwarded messages.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ForwardText)]\n    public string? ForwardText { get; set; }\n\n    /// <summary>\n    /// Optional. Username of a bot, which will be used for user authorization. See <a href=\"https://core.telegram.org/widgets/login#setting-up-a-bot\">Setting up a bot</a> for more details. If not specified, the current bot's username will be assumed. The <em>url</em>'s domain must be the same as the domain linked with the bot. See <a href=\"https://core.telegram.org/widgets/login#linking-your-domain-to-the-bot\">Linking your domain to the bot</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BotUsername)]\n    public string? BotUsername { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> to request the permission for your bot to send messages to the user.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestWriteAccess)]\n    public bool? RequestWriteAccess { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ManagedBotCreated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about the bot that was created to be managed by the current bot.\n/// </summary>\npublic class ManagedBotCreated\n{\n    /// <summary>\n    /// Information about the bot. The bot's token can be fetched using the method <a href=\"https://core.telegram.org/bots/api#getmanagedbottoken\">getManagedBotToken</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Bot)]\n    public User Bot { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ManagedBotUpdated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about the creation, token update, or owner update of a bot that is managed by the current bot.\n/// </summary>\npublic class ManagedBotUpdated\n{\n    /// <summary>\n    /// User that created the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User User { get; set; } = null!;\n\n    /// <summary>\n    /// Information about the bot. Token of the bot can be fetched using the method <a href=\"https://core.telegram.org/bots/api#getmanagedbottoken\">getManagedBotToken</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Bot)]\n    public User Bot { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MaybeInaccessibleMessage/InaccessibleMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes a message that was deleted or is otherwise inaccessible to the bot.\n/// </summary>\npublic class InaccessibleMessage : MaybeInaccessibleMessage\n{\n    /// <summary>\n    /// Chat the message belonged to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public override Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Unique message identifier inside the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public override int MessageId { get; set; }\n\n    /// <summary>\n    /// Always 0. The field can be used to differentiate regular and inaccessible messages.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public override int Date { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MaybeInaccessibleMessage/MaybeInaccessibleMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes a message that can be inaccessible to the bot. It can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"Message\"/></description></item>\n/// <item><description><see cref=\"InaccessibleMessage\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(MaybeInaccessibleMessageConverter))]\npublic abstract class MaybeInaccessibleMessage\n{\n    /// <summary>\n    /// No description available\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public abstract int MessageId { get; set; }\n\n    /// <summary>\n    /// No description available\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public abstract int Date { get; set; }\n\n    /// <summary>\n    /// No description available\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public abstract Chat Chat { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MaybeInaccessibleMessage/Message.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Games;\nusing Telegram.BotAPI.Payments;\nusing Telegram.BotAPI.Stickers;\nusing Telegram.BotAPI.TelegramPassport;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a message.\n/// </summary>\npublic class Message : MaybeInaccessibleMessage\n{\n    /// <summary>\n    /// Unique message identifier inside this chat. In specific instances (e.g., message containing a video sent to a big chat), the server might automatically schedule a message instead of sending it immediately. In such cases, this field will be 0 and the relevant message will be unusable until it is actually sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public override int MessageId { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier of a message thread or forum topic to which the message belongs; for supergroups and private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Optional. Information about the direct messages chat topic that contains the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopic)]\n    public DirectMessagesTopic? DirectMessagesTopic { get; set; }\n\n    /// <summary>\n    /// Optional. Sender of the message; may be empty for messages sent to channels. For backward compatibility, if the message was sent on behalf of a chat, the field contains a fake sender user in non-channel chats\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User? From { get; set; }\n\n    /// <summary>\n    /// Optional. Sender of the message when sent on behalf of a chat. For example, the supergroup itself for messages sent by its anonymous administrators or a linked channel for messages automatically forwarded to the channel's discussion group. For backward compatibility, if the message was sent on behalf of a chat, the field <em>from</em> contains a fake sender user in non-channel chats.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SenderChat)]\n    public Chat? SenderChat { get; set; }\n\n    /// <summary>\n    /// Optional. If the sender of the message boosted the chat, the number of boosts added by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SenderBoostCount)]\n    public int? SenderBoostCount { get; set; }\n\n    /// <summary>\n    /// Optional. The bot that actually sent the message on behalf of the business account. Available only for outgoing messages sent on behalf of the connected business account.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SenderBusinessBot)]\n    public User? SenderBusinessBot { get; set; }\n\n    /// <summary>\n    /// Optional. Tag or custom title of the sender of the message; for supergroups only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SenderTag)]\n    public string? SenderTag { get; set; }\n\n    /// <summary>\n    /// Date the message was sent in Unix time. It is always a positive number, representing a valid date.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public override int Date { get; set; }\n\n    /// <summary>\n    /// Optional. The unique identifier for the guest query. Use this identifier with the method <a href=\"https://core.telegram.org/bots/api#answerguestquery\">answerGuestQuery</a> to send a response message. If non-empty, the message belongs to the chat where the guest bot was summoned, which may not coincide with other existing bot chats sharing the same identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GuestQueryId)]\n    public string? GuestQueryId { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier of the business connection from which the message was received. If non-empty, the message belongs to a chat of the corresponding business account that is independent from any potential bot chat which might share the same identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Chat the message belongs to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public override Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Information about the original message for forwarded messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ForwardOrigin)]\n    public MessageOrigin? ForwardOrigin { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the message is sent to a topic in a forum supergroup or a private chat with the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsTopicMessage)]\n    public bool? IsTopicMessage { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the message is a channel post that was automatically forwarded to the connected discussion group\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAutomaticForward)]\n    public bool? IsAutomaticForward { get; set; }\n\n    /// <summary>\n    /// Optional. For replies in the same chat and message thread, the original message. Note that the <see cref=\"Message\"/> object in this field will not contain further <em>reply_to_message</em> fields even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyToMessage)]\n    public Message? ReplyToMessage { get; set; }\n\n    /// <summary>\n    /// Optional. Information about the message that is being replied to, which may come from another chat or forum topic\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExternalReply)]\n    public ExternalReplyInfo? ExternalReply { get; set; }\n\n    /// <summary>\n    /// Optional. For replies that quote part of the original message, the quoted part of the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Quote)]\n    public TextQuote? Quote { get; set; }\n\n    /// <summary>\n    /// Optional. For replies to a story, the original story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyToStory)]\n    public Story? ReplyToStory { get; set; }\n\n    /// <summary>\n    /// Optional. Identifier of the specific checklist task that is being replied to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyToChecklistTaskId)]\n    public int? ReplyToChecklistTaskId { get; set; }\n\n    /// <summary>\n    /// Optional. Persistent identifier of the specific poll option that is being replied to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyToPollOptionId)]\n    public string? ReplyToPollOptionId { get; set; }\n\n    /// <summary>\n    /// Optional. Bot through which the message was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ViaBot)]\n    public User? ViaBot { get; set; }\n\n    /// <summary>\n    /// Optional. For a message sent by a guest bot, this is the user whose original message triggered the bot's response\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GuestBotCallerUser)]\n    public User? GuestBotCallerUser { get; set; }\n\n    /// <summary>\n    /// Optional. For a message sent by a guest bot, this is the chat whose original message triggered the bot's response\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GuestBotCallerChat)]\n    public Chat? GuestBotCallerChat { get; set; }\n\n    /// <summary>\n    /// Optional. Date the message was last edited in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EditDate)]\n    public int? EditDate { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the message can't be forwarded\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasProtectedContent)]\n    public bool? HasProtectedContent { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the message was sent by an implicit action, for example, as an away or a greeting business message, or as a scheduled message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsFromOffline)]\n    public bool? IsFromOffline { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the message is a paid post. Note that such posts must not be deleted for 24 hours to receive the payment and can't be edited.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPaidPost)]\n    public bool? IsPaidPost { get; set; }\n\n    /// <summary>\n    /// Optional. The unique identifier inside this chat of a media message group this message belongs to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MediaGroupId)]\n    public string? MediaGroupId { get; set; }\n\n    /// <summary>\n    /// Optional. Signature of the post author for messages in channels, or the custom title of an anonymous group administrator\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AuthorSignature)]\n    public string? AuthorSignature { get; set; }\n\n    /// <summary>\n    /// Optional. The number of Telegram Stars that were paid by the sender of the message to send it\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidStarCount)]\n    public int? PaidStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. For text messages, the actual UTF-8 text of the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Optional. For text messages, special entities like usernames, URLs, bot commands, etc. that appear in the text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Entities)]\n    public IEnumerable<MessageEntity>? Entities { get; set; }\n\n    /// <summary>\n    /// Optional. Options used for link preview generation for the message, if it is a text message and link preview options were changed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LinkPreviewOptions)]\n    public LinkPreviewOptions? LinkPreviewOptions { get; set; }\n\n    /// <summary>\n    /// Optional. Information about suggested post parameters if the message is a suggested post in a channel direct messages chat. If the message is an approved or declined suggested post, then it can't be edited.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostInfo)]\n    public SuggestedPostInfo? SuggestedPostInfo { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier of the message effect added to the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EffectId)]\n    public string? EffectId { get; set; }\n\n    /// <summary>\n    /// Optional. Message is an animation, information about the animation. For backward compatibility, when this field is set, the <em>document</em> field will also be set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Animation)]\n    public Animation? Animation { get; set; }\n\n    /// <summary>\n    /// Optional. Message is an audio file, information about the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Audio)]\n    public Audio? Audio { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a general file, information about the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Document)]\n    public Document? Document { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a live photo, information about the live photo. For backward compatibility, when this field is set, the <em>photo</em> field will also be set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePhoto)]\n    public LivePhoto? LivePhoto { get; set; }\n\n    /// <summary>\n    /// Optional. Message contains paid media; information about the paid media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMedia)]\n    public PaidMediaInfo? PaidMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a photo, available sizes of the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public IEnumerable<PhotoSize>? Photo { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a sticker, information about the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public Sticker? Sticker { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a forwarded story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Story)]\n    public Story? Story { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a video, information about the video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Video)]\n    public Video? Video { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a <a href=\"https://telegram.org/blog/video-messages-and-telescope\">video note</a>, information about the video message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoNote)]\n    public VideoNote? VideoNote { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a voice message, information about the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Voice)]\n    public Voice? Voice { get; set; }\n\n    /// <summary>\n    /// Optional. Caption for the animation, audio, document, paid media, photo, video or voice\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. For messages with a caption, special entities like usernames, URLs, bot commands, etc. that appear in the caption\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the message media is covered by a spoiler animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasMediaSpoiler)]\n    public bool? HasMediaSpoiler { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Checklist)]\n    public Checklist? Checklist { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a shared contact, information about the contact\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Contact)]\n    public Contact? Contact { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a dice with random value\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Dice)]\n    public Dice? Dice { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a game, information about the game. <a href=\"https://core.telegram.org/bots/api#games\">More about games »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Game)]\n    public Game? Game { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a native poll, information about the poll\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Poll)]\n    public Poll? Poll { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a venue, information about the venue. For backward compatibility, when this field is set, the <em>location</em> field will also be set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Venue)]\n    public Venue? Venue { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a shared location, information about the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public Location? Location { get; set; }\n\n    /// <summary>\n    /// Optional. New members that were added to the group or supergroup and information about them (the bot itself may be one of these members)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NewChatMembers)]\n    public IEnumerable<User>? NewChatMembers { get; set; }\n\n    /// <summary>\n    /// Optional. A member was removed from the group, information about them (this member may be the bot itself)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LeftChatMember)]\n    public User? LeftChatMember { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: chat owner has left\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatOwnerLeft)]\n    public ChatOwnerLeft? ChatOwnerLeft { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: chat owner has changed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatOwnerChanged)]\n    public ChatOwnerChanged? ChatOwnerChanged { get; set; }\n\n    /// <summary>\n    /// Optional. A chat title was changed to this value\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NewChatTitle)]\n    public string? NewChatTitle { get; set; }\n\n    /// <summary>\n    /// Optional. A chat photo was change to this value\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NewChatPhoto)]\n    public IEnumerable<PhotoSize>? NewChatPhoto { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the chat photo was deleted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DeleteChatPhoto)]\n    public bool? DeleteChatPhoto { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the group has been created\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GroupChatCreated)]\n    public bool? GroupChatCreated { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the supergroup has been created. This field can't be received in a message coming through updates, because bot can't be a member of a supergroup when it is created. It can only be found in reply_to_message if someone replies to a very first message in a directly created supergroup.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SupergroupChatCreated)]\n    public bool? SupergroupChatCreated { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the channel has been created. This field can't be received in a message coming through updates, because bot can't be a member of a channel when it is created. It can only be found in reply_to_message if someone replies to a very first message in a channel.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChannelChatCreated)]\n    public bool? ChannelChatCreated { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: auto-delete timer settings changed in the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageAutoDeleteTimerChanged)]\n    public MessageAutoDeleteTimerChanged? MessageAutoDeleteTimerChanged { get; set; }\n\n    /// <summary>\n    /// Optional. The group has been migrated to a supergroup with the specified identifier. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MigrateToChatId)]\n    public long? MigrateToChatId { get; set; }\n\n    /// <summary>\n    /// Optional. The supergroup has been migrated from a group with the specified identifier. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MigrateFromChatId)]\n    public long? MigrateFromChatId { get; set; }\n\n    /// <summary>\n    /// Optional. Specified message was pinned. Note that the <see cref=\"Message\"/> object in this field will not contain further <em>reply_to_message</em> fields even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PinnedMessage)]\n    public MaybeInaccessibleMessage? PinnedMessage { get; set; }\n\n    /// <summary>\n    /// Optional. Message is an invoice for a <a href=\"https://core.telegram.org/bots/api#payments\">payment</a>, information about the invoice. <a href=\"https://core.telegram.org/bots/api#payments\">More about payments »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Invoice)]\n    public Invoice? Invoice { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a service message about a successful payment, information about the payment. <a href=\"https://core.telegram.org/bots/api#payments\">More about payments »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuccessfulPayment)]\n    public SuccessfulPayment? SuccessfulPayment { get; set; }\n\n    /// <summary>\n    /// Optional. Message is a service message about a refunded payment, information about the payment. <a href=\"https://core.telegram.org/bots/api#payments\">More about payments »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RefundedPayment)]\n    public RefundedPayment? RefundedPayment { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: users were shared with the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UsersShared)]\n    public UsersShared? UsersShared { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: a chat was shared with the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatShared)]\n    public ChatShared? ChatShared { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: a regular gift was sent or received\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gift)]\n    public GiftInfo? Gift { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: a unique gift was sent or received\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UniqueGift)]\n    public UniqueGiftInfo? UniqueGift { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: upgrade of a gift was purchased after the gift was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiftUpgradeSent)]\n    public GiftInfo? GiftUpgradeSent { get; set; }\n\n    /// <summary>\n    /// Optional. The domain name of the website on which the user has logged in. <a href=\"https://core.telegram.org/widgets/login\">More about Telegram Login »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ConnectedWebsite)]\n    public string? ConnectedWebsite { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the user allowed the bot to write messages after adding it to the attachment or side menu, launching a Web App from a link, or accepting an explicit request from a Web App sent by the method <a href=\"https://core.telegram.org/bots/webapps#initializing-mini-apps\">requestWriteAccess</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WriteAccessAllowed)]\n    public WriteAccessAllowed? WriteAccessAllowed { get; set; }\n\n    /// <summary>\n    /// Optional. Telegram Passport data\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PassportData)]\n    public PassportData? PassportData { get; set; }\n\n    /// <summary>\n    /// Optional. Service message. A user in the chat triggered another user's proximity alert while sharing Live Location.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProximityAlertTriggered)]\n    public ProximityAlertTriggered? ProximityAlertTriggered { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: user boosted the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BoostAdded)]\n    public ChatBoostAdded? BoostAdded { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: chat background set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatBackgroundSet)]\n    public ChatBackground? ChatBackgroundSet { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: some tasks in a checklist were marked as done or not done\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChecklistTasksDone)]\n    public ChecklistTasksDone? ChecklistTasksDone { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: tasks were added to a checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChecklistTasksAdded)]\n    public ChecklistTasksAdded? ChecklistTasksAdded { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the price for paid messages in the corresponding direct messages chat of a channel has changed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagePriceChanged)]\n    public DirectMessagePriceChanged? DirectMessagePriceChanged { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: forum topic created\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ForumTopicCreated)]\n    public ForumTopicCreated? ForumTopicCreated { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: forum topic edited\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ForumTopicEdited)]\n    public ForumTopicEdited? ForumTopicEdited { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: forum topic closed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ForumTopicClosed)]\n    public ForumTopicClosed? ForumTopicClosed { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: forum topic reopened\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ForumTopicReopened)]\n    public ForumTopicReopened? ForumTopicReopened { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the 'General' forum topic hidden\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GeneralForumTopicHidden)]\n    public GeneralForumTopicHidden? GeneralForumTopicHidden { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the 'General' forum topic unhidden\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GeneralForumTopicUnhidden)]\n    public GeneralForumTopicUnhidden? GeneralForumTopicUnhidden { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: a scheduled giveaway was created\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiveawayCreated)]\n    public GiveawayCreated? GiveawayCreated { get; set; }\n\n    /// <summary>\n    /// Optional. The message is a scheduled giveaway message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Giveaway)]\n    public Giveaway? Giveaway { get; set; }\n\n    /// <summary>\n    /// Optional. A giveaway with public winners was completed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiveawayWinners)]\n    public GiveawayWinners? GiveawayWinners { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: a giveaway without public winners was completed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiveawayCompleted)]\n    public GiveawayCompleted? GiveawayCompleted { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: user created a bot that will be managed by the current bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ManagedBotCreated)]\n    public ManagedBotCreated? ManagedBotCreated { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: the price for paid messages has changed in the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMessagePriceChanged)]\n    public PaidMessagePriceChanged? PaidMessagePriceChanged { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: answer option was added to a poll\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PollOptionAdded)]\n    public PollOptionAdded? PollOptionAdded { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: answer option was deleted from a poll\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PollOptionDeleted)]\n    public PollOptionDeleted? PollOptionDeleted { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: a suggested post was approved\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostApproved)]\n    public SuggestedPostApproved? SuggestedPostApproved { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: approval of a suggested post has failed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostApprovalFailed)]\n    public SuggestedPostApprovalFailed? SuggestedPostApprovalFailed { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: a suggested post was declined\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostDeclined)]\n    public SuggestedPostDeclined? SuggestedPostDeclined { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: payment for a suggested post was received\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostPaid)]\n    public SuggestedPostPaid? SuggestedPostPaid { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: payment for a suggested post was refunded\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostRefunded)]\n    public SuggestedPostRefunded? SuggestedPostRefunded { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: video chat scheduled\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoChatScheduled)]\n    public VideoChatScheduled? VideoChatScheduled { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: video chat started\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoChatStarted)]\n    public VideoChatStarted? VideoChatStarted { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: video chat ended\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoChatEnded)]\n    public VideoChatEnded? VideoChatEnded { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: new participants invited to a video chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoChatParticipantsInvited)]\n    public VideoChatParticipantsInvited? VideoChatParticipantsInvited { get; set; }\n\n    /// <summary>\n    /// Optional. Service message: data sent by a Web App\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WebAppData)]\n    public WebAppData? WebAppData { get; set; }\n\n    /// <summary>\n    /// Optional. <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">Inline keyboard</a> attached to the message. <em>login_url</em> buttons are represented as ordinary <em>url</em> buttons.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MenuButton/MenuButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the bot's menu button in a private chat. It should be one of\n/// If a menu button other than <see cref=\"MenuButtonDefault\"/> is set for a private chat, then it is applied in the chat. Otherwise the default menu button is applied. By default, the menu button opens the list of bot commands.\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"MenuButtonCommands\"/></description></item>\n/// <item><description><see cref=\"MenuButtonWebApp\"/></description></item>\n/// <item><description><see cref=\"MenuButtonDefault\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(MenuButtonConverter))]\npublic abstract class MenuButton\n{\n    /// <summary>\n    /// Type of the button\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MenuButton/MenuButtonCommands.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a menu button, which opens the bot's list of commands.\n/// </summary>\npublic class MenuButtonCommands : MenuButton\n{\n    /// <summary>\n    /// Type of the button, must be <em>commands</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"commands\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MenuButton/MenuButtonDefault.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes that no specific value for the menu button was set.\n/// </summary>\npublic class MenuButtonDefault : MenuButton\n{\n    /// <summary>\n    /// Type of the button, must be <em>default</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"default\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MenuButton/MenuButtonWebApp.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a menu button, which launches a <a href=\"https://core.telegram.org/bots/webapps\">Web App</a>.\n/// </summary>\npublic class MenuButtonWebApp : MenuButton\n{\n    /// <summary>\n    /// Type of the button, must be <em>web_app</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"web_app\";\n\n    /// <summary>\n    /// Text on the button\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; } = null!;\n\n    /// <summary>\n    /// Description of the Web App that will be launched when the user presses the button. The Web App will be able to send an arbitrary message on behalf of the user using the method <a href=\"https://core.telegram.org/bots/api#answerwebappquery\">answerWebAppQuery</a>. Alternatively, a <em>t.me</em> link to a Web App of the bot can be specified in the object instead of the Web App's URL, in which case the Web App will be opened as if the user pressed the link.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WebApp)]\n    public WebAppInfo WebApp { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageAutoDeleteTimerChanged.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a change in auto-delete timer settings.\n/// </summary>\npublic class MessageAutoDeleteTimerChanged\n{\n    /// <summary>\n    /// New auto-delete time for messages in the chat; in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageAutoDeleteTime)]\n    public int MessageAutoDeleteTime { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageEntity.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents one special entity in a text message. For example, hashtags, usernames, URLs, etc.\n/// </summary>\npublic class MessageEntity\n{\n    /// <summary>\n    /// Type of the entity. Currently, can be “mention” (<em>@username</em>), “hashtag” (<em>#hashtag</em> or <em>#hashtag@chatusername</em>), “cashtag” (<em>$USD</em> or <em>$USD@chatusername</em>), “bot_command” (<em>/start@jobs_bot</em>), “url” (<em>https://telegram.org</em>), “email” (<em>do-not-reply@telegram.org</em>), “phone_number” (<em>+1-212-555-0123</em>), “bold” (<strong>bold text</strong>), “italic” (<em>italic text</em>), “underline” (underlined text), “strikethrough” (strikethrough text), “spoiler” (spoiler message), “blockquote” (block quotation), “expandable_blockquote” (collapsed-by-default block quotation), “code” (monowidth string), “pre” (monowidth block), “text_link” (for clickable text URLs), “text_mention” (for users <a href=\"https://telegram.org/blog/edit#new-mentions\">without usernames</a>), “custom_emoji” (for inline custom emoji stickers), or “date_time” (for formatted date and time)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Offset in <a href=\"https://core.telegram.org/api/entities#entity-length\">UTF-16 code units</a> to the start of the entity\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Offset)]\n    public int Offset { get; set; }\n\n    /// <summary>\n    /// Length of the entity in <a href=\"https://core.telegram.org/api/entities#entity-length\">UTF-16 code units</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Length)]\n    public int Length { get; set; }\n\n    /// <summary>\n    /// Optional. For “text_link” only, URL that will be opened after user taps on the text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string? Url { get; set; }\n\n    /// <summary>\n    /// Optional. For “text_mention” only, the mentioned user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User? User { get; set; }\n\n    /// <summary>\n    /// Optional. For “pre” only, the programming language of the entity text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Language)]\n    public string? Language { get; set; }\n\n    /// <summary>\n    /// Optional. For “custom_emoji” only, unique identifier of the custom emoji. Use <a href=\"https://core.telegram.org/bots/api#getcustomemojistickers\">getCustomEmojiStickers</a> to get full information about the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CustomEmojiId)]\n    public string? CustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. For “date_time” only, the Unix time associated with the entity\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UnixTime)]\n    public int? UnixTime { get; set; }\n\n    /// <summary>\n    /// Optional. For “date_time” only, the string that defines the formatting of the date and time. See <a href=\"https://core.telegram.org/bots/api#date-time-entity-formatting\">date-time entity formatting</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DateTimeFormat)]\n    public string? DateTimeFormat { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageID.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a unique message identifier.\n/// </summary>\npublic class MessageId\n{\n    /// <summary>\n    /// Unique message identifier. In specific instances (e.g., message containing a video sent to a big chat), the server might automatically schedule a message instead of sending it immediately. In such cases, this field will be 0 and the relevant message will be unusable until it is actually sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int Id { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageOrigin/MessageOrigin.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the origin of a message. It can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"MessageOriginUser\"/></description></item>\n/// <item><description><see cref=\"MessageOriginHiddenUser\"/></description></item>\n/// <item><description><see cref=\"MessageOriginChat\"/></description></item>\n/// <item><description><see cref=\"MessageOriginChannel\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(MessageOriginConverter))]\npublic abstract class MessageOrigin\n{\n    /// <summary>\n    /// Type of the message origin\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n\n    /// <summary>\n    /// Date the message was sent originally in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public int Date { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageOrigin/MessageOriginChannel.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The message was originally sent to a channel chat.\n/// </summary>\npublic class MessageOriginChannel : MessageOrigin\n{\n    /// <summary>\n    /// Type of the message origin, always “channel”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"channel\";\n\n    /// <summary>\n    /// Channel chat to which the message was originally sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Unique message identifier inside the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n\n    /// <summary>\n    /// Optional. Signature of the original post author\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AuthorSignature)]\n    public string? AuthorSignature { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageOrigin/MessageOriginChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The message was originally sent on behalf of a chat to a group chat.\n/// </summary>\npublic class MessageOriginChat : MessageOrigin\n{\n    /// <summary>\n    /// Type of the message origin, always “chat”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"chat\";\n\n    /// <summary>\n    /// Chat that sent the message originally\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SenderChat)]\n    public Chat SenderChat { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. For messages originally sent by an anonymous chat administrator, original message author signature\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AuthorSignature)]\n    public string? AuthorSignature { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageOrigin/MessageOriginHiddenUser.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The message was originally sent by an unknown user.\n/// </summary>\npublic class MessageOriginHiddenUser : MessageOrigin\n{\n    /// <summary>\n    /// Type of the message origin, always “hidden_user”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"hidden_user\";\n\n    /// <summary>\n    /// Name of the user that sent the message originally\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SenderUserName)]\n    public string SenderUserName { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageOrigin/MessageOriginUser.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The message was originally sent by a known user.\n/// </summary>\npublic class MessageOriginUser : MessageOrigin\n{\n    /// <summary>\n    /// Type of the message origin, always “user”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"user\";\n\n    /// <summary>\n    /// User that sent the message originally\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SenderUser)]\n    public User SenderUser { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageReactionCountUpdated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents reaction changes on a message with anonymous reactions.\n/// </summary>\npublic class MessageReactionCountUpdated\n{\n    /// <summary>\n    /// The chat containing the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Unique message identifier inside the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n\n    /// <summary>\n    /// Date of the change in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public int Date { get; set; }\n\n    /// <summary>\n    /// List of reactions that are present on the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Reactions)]\n    public IEnumerable<ReactionCount> Reactions { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/MessageReactionUpdated.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a change of a reaction on a message performed by a user.\n/// </summary>\npublic class MessageReactionUpdated\n{\n    /// <summary>\n    /// The chat containing the message the user reacted to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier of the message inside the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n\n    /// <summary>\n    /// Optional. The user that changed the reaction, if the user isn't anonymous\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User? User { get; set; }\n\n    /// <summary>\n    /// Optional. The chat on behalf of which the reaction was changed, if the user is anonymous\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ActorChat)]\n    public Chat? ActorChat { get; set; }\n\n    /// <summary>\n    /// Date of the change in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public int Date { get; set; }\n\n    /// <summary>\n    /// Previous list of reaction types that were set by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OldReaction)]\n    public IEnumerable<ReactionType> OldReaction { get; set; } = null!;\n\n    /// <summary>\n    /// New list of reaction types that have been set by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NewReaction)]\n    public IEnumerable<ReactionType> NewReaction { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/OwnedGift/OwnedGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes a gift received and owned by a user or a chat. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"OwnedGiftRegular\"/></description></item>\n/// <item><description><see cref=\"OwnedGiftUnique\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(OwnedGiftConverter))]\npublic abstract class OwnedGift\n{\n    /// <summary>\n    /// Type of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n\n    /// <summary>\n    /// No description available\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OwnedGiftId)]\n    public abstract string? OwnedGiftId { get; set; }\n\n    /// <summary>\n    /// Optional. Sender of the gift if it is a known user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SenderUser)]\n    public User? SenderUser { get; set; }\n\n    /// <summary>\n    /// Date the gift was sent in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendDate)]\n    public int SendDate { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift is displayed on the account's profile page; for gifts received on behalf of business accounts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsSaved)]\n    public bool? IsSaved { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/OwnedGift/OwnedGiftRegular.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a regular gift owned by a user or a chat.\n/// </summary>\npublic class OwnedGiftRegular : OwnedGift\n{\n    /// <summary>\n    /// Type of the gift, always “regular”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"regular\";\n\n    /// <summary>\n    /// Information about the regular gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gift)]\n    public Gift Gift { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Unique identifier of the gift for the bot; for gifts received on behalf of business accounts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OwnedGiftId)]\n    public override string? OwnedGiftId { get; set; }\n\n    /// <summary>\n    /// Optional. Text of the message that was added to the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Optional. Special entities that appear in the text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Entities)]\n    public IEnumerable<MessageEntity>? Entities { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the sender and gift text are shown only to the gift receiver; otherwise, everyone will be able to see them\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPrivate)]\n    public bool? IsPrivate { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift can be upgraded to a unique gift; for gifts received on behalf of business accounts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanBeUpgraded)]\n    public bool? CanBeUpgraded { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift was refunded and isn't available anymore\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WasRefunded)]\n    public bool? WasRefunded { get; set; }\n\n    /// <summary>\n    /// Optional. Number of Telegram Stars that can be claimed by the receiver instead of the gift; omitted if the gift cannot be converted to Telegram Stars; for gifts received on behalf of business accounts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ConvertStarCount)]\n    public int? ConvertStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. Number of Telegram Stars that were paid for the ability to upgrade the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PrepaidUpgradeStarCount)]\n    public int? PrepaidUpgradeStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift's upgrade was purchased after the gift was sent; for gifts received on behalf of business accounts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsUpgradeSeparate)]\n    public bool? IsUpgradeSeparate { get; set; }\n\n    /// <summary>\n    /// Optional. Unique number reserved for this gift when upgraded. See the <em>number</em> field in <see cref=\"UniqueGift\"/>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UniqueGiftNumber)]\n    public int? UniqueGiftNumber { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/OwnedGift/OwnedGiftUnique.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a unique gift received and owned by a user or a chat.\n/// </summary>\npublic class OwnedGiftUnique : OwnedGift\n{\n    /// <summary>\n    /// Type of the gift, always “unique”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"unique\";\n\n    /// <summary>\n    /// Information about the unique gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gift)]\n    public UniqueGift Gift { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Unique identifier of the received gift for the bot; for gifts received on behalf of business accounts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OwnedGiftId)]\n    public override string? OwnedGiftId { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift can be transferred to another owner; for gifts received on behalf of business accounts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanBeTransferred)]\n    public bool? CanBeTransferred { get; set; }\n\n    /// <summary>\n    /// Optional. Number of Telegram Stars that must be paid to transfer the gift; omitted if the bot cannot transfer the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TransferStarCount)]\n    public int? TransferStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. Point in time (Unix timestamp) when the gift can be transferred. If it is in the past, then the gift can be transferred now\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NextTransferDate)]\n    public int? NextTransferDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/OwnedGifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Contains the list of gifts received and owned by a user or a chat.\n/// </summary>\npublic class OwnedGifts\n{\n    /// <summary>\n    /// The total number of gifts owned by the user or the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalCount)]\n    public int TotalCount { get; set; }\n\n    /// <summary>\n    /// The list of gifts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gifts)]\n    public IEnumerable<OwnedGift> Gifts { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Offset for the next request. If empty, then there are no more results\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NextOffset)]\n    public string? NextOffset { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PaidMedia/PaidMedia.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes paid media. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"PaidMediaLivePhoto\"/></description></item>\n/// <item><description><see cref=\"PaidMediaPhoto\"/></description></item>\n/// <item><description><see cref=\"PaidMediaPreview\"/></description></item>\n/// <item><description><see cref=\"PaidMediaVideo\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(PaidMediaConverter))]\npublic abstract class PaidMedia\n{\n    /// <summary>\n    /// Type of the paid media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PaidMedia/PaidMediaLivePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The paid media is a <a href=\"https://core.telegram.org/bots/api#livephoto\">live photo</a>.\n/// </summary>\npublic class PaidMediaLivePhoto : PaidMedia\n{\n    /// <summary>\n    /// Type of the paid media, always “live_photo”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"live_photo\";\n\n    /// <summary>\n    /// The photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePhoto)]\n    public LivePhoto LivePhoto { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PaidMedia/PaidMediaPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The paid media is a photo.\n/// </summary>\npublic class PaidMediaPhoto : PaidMedia\n{\n    /// <summary>\n    /// Type of the paid media, always “photo”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"photo\";\n\n    /// <summary>\n    /// The photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public IEnumerable<PhotoSize> Photo { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PaidMedia/PaidMediaPreview.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The paid media isn't available before the payment.\n/// </summary>\npublic class PaidMediaPreview : PaidMedia\n{\n    /// <summary>\n    /// Type of the paid media, always “preview”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"preview\";\n\n    /// <summary>\n    /// Optional. Media width as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int? Width { get; set; }\n\n    /// <summary>\n    /// Optional. Media height as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int? Height { get; set; }\n\n    /// <summary>\n    /// Optional. Duration of the media in seconds as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int? Duration { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PaidMedia/PaidMediaVideo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The paid media is a video.\n/// </summary>\npublic class PaidMediaVideo : PaidMedia\n{\n    /// <summary>\n    /// Type of the paid media, always “video”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"video\";\n\n    /// <summary>\n    /// The video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Video)]\n    public Video Video { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PaidMediaInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the paid media added to a message.\n/// </summary>\npublic class PaidMediaInfo\n{\n    /// <summary>\n    /// The number of Telegram Stars that must be paid to buy access to the media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StarCount)]\n    public int StarCount { get; set; }\n\n    /// <summary>\n    /// Information about the paid media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMedia)]\n    public IEnumerable<PaidMedia> PaidMedia { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PaidMessagePriceChanged.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about a change in the price of paid messages within a chat.\n/// </summary>\npublic class PaidMessagePriceChanged\n{\n    /// <summary>\n    /// The new number of Telegram Stars that must be paid by non-administrator users of the supergroup chat for each sent message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMessageStarCount)]\n    public int PaidMessageStarCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PhotoSize.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents one size of a photo or a <a href=\"https://core.telegram.org/bots/api#document\">file</a> / <a href=\"https://core.telegram.org/bots/api#sticker\">sticker</a> thumbnail.\n/// </summary>\npublic class PhotoSize\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Photo width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int Width { get; set; }\n\n    /// <summary>\n    /// Photo height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int Height { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Poll.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about a poll.\n/// </summary>\npublic class Poll\n{\n    /// <summary>\n    /// Unique poll identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Poll question, 1-300 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Question)]\n    public string Question { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Special entities that appear in the <em>question</em>. Currently, only custom emoji entities are allowed in poll questions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.QuestionEntities)]\n    public IEnumerable<MessageEntity>? QuestionEntities { get; set; }\n\n    /// <summary>\n    /// List of poll options\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Options)]\n    public IEnumerable<PollOption> Options { get; set; } = null!;\n\n    /// <summary>\n    /// Total number of users that voted in the poll\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalVoterCount)]\n    public int TotalVoterCount { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the poll is closed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsClosed)]\n    public bool IsClosed { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the poll is anonymous\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAnonymous)]\n    public bool IsAnonymous { get; set; }\n\n    /// <summary>\n    /// Poll type, currently can be “regular” or “quiz”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public string Type { get; set; } = null!;\n\n    /// <summary>\n    /// <em>True</em>, if the poll allows multiple answers\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowsMultipleAnswers)]\n    public bool AllowsMultipleAnswers { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the poll allows to change the chosen answer options\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowsRevoting)]\n    public bool AllowsRevoting { get; set; }\n\n    /// <summary>\n    /// <em>True</em> if voting is limited to users who have been members of the chat where the poll was originally sent for more than 24 hours\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MembersOnly)]\n    public bool MembersOnly { get; set; }\n\n    /// <summary>\n    /// Optional. A list of two-letter <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\">ISO 3166-1 alpha-2</a> country codes indicating the countries from which users can vote in the poll. If omitted, then users from any country can participate in the poll.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CountryCodes)]\n    public IEnumerable<string>? CountryCodes { get; set; }\n\n    /// <summary>\n    /// Optional. Array of 0-based identifiers of the correct answer options. Available only for polls in quiz mode which are closed or were sent (not forwarded) by the bot or to the private chat with the bot.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CorrectOptionIds)]\n    public IEnumerable<int>? CorrectOptionIds { get; set; }\n\n    /// <summary>\n    /// Optional. Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Explanation)]\n    public string? Explanation { get; set; }\n\n    /// <summary>\n    /// Optional. Special entities like usernames, URLs, bot commands, etc. that appear in the <em>explanation</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExplanationEntities)]\n    public IEnumerable<MessageEntity>? ExplanationEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Media added to the quiz explanation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExplanationMedia)]\n    public PollMedia? ExplanationMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Amount of time in seconds the poll will be active after creation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OpenPeriod)]\n    public int? OpenPeriod { get; set; }\n\n    /// <summary>\n    /// Optional. Point in time (Unix timestamp) when the poll will be automatically closed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CloseDate)]\n    public int? CloseDate { get; set; }\n\n    /// <summary>\n    /// Optional. Description of the poll; for polls inside the <see cref=\"Message\"/> object only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Special entities like usernames, URLs, bot commands, etc. that appear in the description\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DescriptionEntities)]\n    public IEnumerable<MessageEntity>? DescriptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Media added to the poll description; for polls inside the <see cref=\"Message\"/> object only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public PollMedia? Media { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PollAnswer.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents an answer of a user in a non-anonymous poll.\n/// </summary>\npublic class PollAnswer\n{\n    /// <summary>\n    /// Unique poll identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PollId)]\n    public string PollId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. The chat that changed the answer to the poll, if the voter is anonymous\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VoterChat)]\n    public Chat? VoterChat { get; set; }\n\n    /// <summary>\n    /// Optional. The user that changed the answer to the poll, if the voter isn't anonymous\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User? User { get; set; }\n\n    /// <summary>\n    /// 0-based identifiers of chosen answer options. May be empty if the vote was retracted.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OptionIds)]\n    public IEnumerable<int> OptionIds { get; set; } = null!;\n\n    /// <summary>\n    /// Persistent identifiers of the chosen answer options. May be empty if the vote was retracted.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OptionPersistentIds)]\n    public IEnumerable<string> OptionPersistentIds { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PollMedia.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Stickers;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// At most <strong>one</strong> of the optional fields can be present in any given object.\n/// </summary>\npublic class PollMedia\n{\n    /// <summary>\n    /// Optional. Media is an animation, information about the animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Animation)]\n    public Animation? Animation { get; set; }\n\n    /// <summary>\n    /// Optional. Media is an audio file, information about the file; currently, can't be received in a poll option\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Audio)]\n    public Audio? Audio { get; set; }\n\n    /// <summary>\n    /// Optional. Media is a general file, information about the file; currently, can't be received in a poll option\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Document)]\n    public Document? Document { get; set; }\n\n    /// <summary>\n    /// Optional. Media is a live photo, information about the live photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePhoto)]\n    public LivePhoto? LivePhoto { get; set; }\n\n    /// <summary>\n    /// Optional. Media is a shared location, information about the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public Location? Location { get; set; }\n\n    /// <summary>\n    /// Optional. Media is a photo, available sizes of the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public IEnumerable<PhotoSize>? Photo { get; set; }\n\n    /// <summary>\n    /// Optional. Media is a sticker, information about the sticker; currently, for poll options only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public Sticker? Sticker { get; set; }\n\n    /// <summary>\n    /// Optional. Media is a venue, information about the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Venue)]\n    public Venue? Venue { get; set; }\n\n    /// <summary>\n    /// Optional. Media is a video, information about the video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Video)]\n    public Video? Video { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PollOption.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about one answer option in a poll.\n/// </summary>\npublic class PollOption\n{\n    /// <summary>\n    /// Unique identifier of the option, persistent on option addition and deletion\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PersistentId)]\n    public string PersistentId { get; set; } = null!;\n\n    /// <summary>\n    /// Option text, 1-100 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Special entities that appear in the option <em>text</em>. Currently, only custom emoji entities are allowed in poll option texts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Media added to the poll option\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public PollMedia? Media { get; set; }\n\n    /// <summary>\n    /// Number of users who voted for this option; may be 0 if unknown\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VoterCount)]\n    public int VoterCount { get; set; }\n\n    /// <summary>\n    /// Optional. User who added the option; omitted if the option wasn't added by a user after poll creation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AddedByUser)]\n    public User? AddedByUser { get; set; }\n\n    /// <summary>\n    /// Optional. Chat that added the option; omitted if the option wasn't added by a chat after poll creation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AddedByChat)]\n    public Chat? AddedByChat { get; set; }\n\n    /// <summary>\n    /// Optional. Point in time (Unix timestamp) when the option was added; omitted if the option existed in the original poll\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AdditionDate)]\n    public int? AdditionDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PollOptionAdded.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about an option added to a poll.\n/// </summary>\npublic class PollOptionAdded\n{\n    /// <summary>\n    /// Optional. Message containing the poll to which the option was added, if known. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PollMessage)]\n    public MaybeInaccessibleMessage? PollMessage { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the added option\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OptionPersistentId)]\n    public string OptionPersistentId { get; set; } = null!;\n\n    /// <summary>\n    /// Option text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OptionText)]\n    public string OptionText { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Special entities that appear in the <em>option_text</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OptionTextEntities)]\n    public IEnumerable<MessageEntity>? OptionTextEntities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PollOptionDeleted.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about an option deleted from a poll.\n/// </summary>\npublic class PollOptionDeleted\n{\n    /// <summary>\n    /// Optional. Message containing the poll from which the option was deleted, if known. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PollMessage)]\n    public MaybeInaccessibleMessage? PollMessage { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the deleted option\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OptionPersistentId)]\n    public string OptionPersistentId { get; set; } = null!;\n\n    /// <summary>\n    /// Option text\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OptionText)]\n    public string OptionText { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Special entities that appear in the <em>option_text</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OptionTextEntities)]\n    public IEnumerable<MessageEntity>? OptionTextEntities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PreparedInlineMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes an inline message to be sent by a user of a Mini App.\n/// </summary>\npublic class PreparedInlineMessage\n{\n    /// <summary>\n    /// Unique identifier of the prepared message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Expiration date of the prepared message, in Unix time. Expired prepared messages can no longer be used\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExpirationDate)]\n    public int ExpirationDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/PreparedKeyboardButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a keyboard button to be used by a user of a Mini App.\n/// </summary>\npublic class PreparedKeyboardButton\n{\n    /// <summary>\n    /// Unique identifier of the keyboard button\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ProximityAlertTriggered.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents the content of a service message, sent whenever a user in the chat triggers a proximity alert set by another user.\n/// </summary>\npublic class ProximityAlertTriggered\n{\n    /// <summary>\n    /// User that triggered the alert\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Traveler)]\n    public User Traveler { get; set; } = null!;\n\n    /// <summary>\n    /// User that set the alert\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Watcher)]\n    public User Watcher { get; set; } = null!;\n\n    /// <summary>\n    /// The distance between the users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Distance)]\n    public int Distance { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReactionCount.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Represents a reaction added to a message along with the number of times it was added.\n/// </summary>\npublic class ReactionCount\n{\n    /// <summary>\n    /// Type of the reaction\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public ReactionType Type { get; set; } = null!;\n\n    /// <summary>\n    /// Number of times the reaction was added\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalCount)]\n    public int TotalCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReactionType/ReactionType.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the type of a reaction. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"ReactionTypeEmoji\"/></description></item>\n/// <item><description><see cref=\"ReactionTypeCustomEmoji\"/></description></item>\n/// <item><description><see cref=\"ReactionTypePaid\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(ReactionTypeConverter))]\npublic abstract class ReactionType\n{\n    /// <summary>\n    /// Type of the reaction\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReactionType/ReactionTypeCustomEmoji.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The reaction is based on a custom emoji.\n/// </summary>\npublic class ReactionTypeCustomEmoji : ReactionType\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ReactionTypeCustomEmoji\"/> class.\n    /// </summary>\n    /// <param name=\"customEmojiId\">Custom emoji identifier</param>\n    public ReactionTypeCustomEmoji(string customEmojiId)\n    {\n        this.CustomEmojiId =\n            customEmojiId ?? throw new ArgumentNullException(nameof(customEmojiId));\n    }\n\n    /// <summary>\n    /// Type of the reaction, always “custom_emoji”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"custom_emoji\";\n\n    /// <summary>\n    /// Custom emoji identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CustomEmojiId)]\n    public string CustomEmojiId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReactionType/ReactionTypeEmoji.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The reaction is based on an emoji.\n/// </summary>\npublic class ReactionTypeEmoji : ReactionType\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ReactionTypeEmoji\"/> class.\n    /// </summary>\n    /// <param name=\"emoji\">Reaction emoji. Currently, it can be one of \"❤\", \"👍\", \"👎\", \"🔥\", \"🥰\", \"👏\", \"😁\", \"🤔\", \"🤯\", \"😱\", \"🤬\", \"😢\", \"🎉\", \"🤩\", \"🤮\", \"💩\", \"🙏\", \"👌\", \"🕊\", \"🤡\", \"🥱\", \"🥴\", \"😍\", \"🐳\", \"❤‍🔥\", \"🌚\", \"🌭\", \"💯\", \"🤣\", \"⚡\", \"🍌\", \"🏆\", \"💔\", \"🤨\", \"😐\", \"🍓\", \"🍾\", \"💋\", \"🖕\", \"😈\", \"😴\", \"😭\", \"🤓\", \"👻\", \"👨‍💻\", \"👀\", \"🎃\", \"🙈\", \"😇\", \"😨\", \"🤝\", \"✍\", \"🤗\", \"🫡\", \"🎅\", \"🎄\", \"☃\", \"💅\", \"🤪\", \"🗿\", \"🆒\", \"💘\", \"🙉\", \"🦄\", \"😘\", \"💊\", \"🙊\", \"😎\", \"👾\", \"🤷‍♂\", \"🤷\", \"🤷‍♀\", \"😡\"</param>\n    public ReactionTypeEmoji(string emoji)\n    {\n        this.Emoji = emoji ?? throw new ArgumentNullException(nameof(emoji));\n    }\n\n    /// <summary>\n    /// Type of the reaction, always “emoji”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"emoji\";\n\n    /// <summary>\n    /// Reaction emoji. Currently, it can be one of \"❤\", \"👍\", \"👎\", \"🔥\", \"🥰\", \"👏\", \"😁\", \"🤔\", \"🤯\", \"😱\", \"🤬\", \"😢\", \"🎉\", \"🤩\", \"🤮\", \"💩\", \"🙏\", \"👌\", \"🕊\", \"🤡\", \"🥱\", \"🥴\", \"😍\", \"🐳\", \"❤‍🔥\", \"🌚\", \"🌭\", \"💯\", \"🤣\", \"⚡\", \"🍌\", \"🏆\", \"💔\", \"🤨\", \"😐\", \"🍓\", \"🍾\", \"💋\", \"🖕\", \"😈\", \"😴\", \"😭\", \"🤓\", \"👻\", \"👨‍💻\", \"👀\", \"🎃\", \"🙈\", \"😇\", \"😨\", \"🤝\", \"✍\", \"🤗\", \"🫡\", \"🎅\", \"🎄\", \"☃\", \"💅\", \"🤪\", \"🗿\", \"🆒\", \"💘\", \"🙉\", \"🦄\", \"😘\", \"💊\", \"🙊\", \"😎\", \"👾\", \"🤷‍♂\", \"🤷\", \"🤷‍♀\", \"😡\"\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Emoji)]\n    public string Emoji { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReactionType/ReactionTypePaid.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// The reaction is paid.\n/// </summary>\npublic class ReactionTypePaid : ReactionType\n{\n    /// <summary>\n    /// Type of the reaction, always “paid”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"paid\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReplyMarkup/ForceReply.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Upon receiving a message with this object, Telegram clients will display a reply interface to the user (act as if the user has selected the bot's message and tapped 'Reply'). This can be extremely useful if you want to create user-friendly step-by-step interfaces without having to sacrifice <a href=\"https://core.telegram.org/bots/features#privacy-mode\">privacy mode</a>. Not supported in channels and for messages sent on behalf of a user account.\n/// </summary>\npublic class ForceReply : ReplyMarkup\n{\n    /// <summary>\n    /// Shows reply interface to the user, as if they manually selected the bot's message and tapped 'Reply'\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ForceReply)]\n    public bool ForceReplyFlag => true;\n\n    /// <summary>\n    /// Optional. The placeholder to be shown in the input field when the reply is active; 1-64 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputFieldPlaceholder)]\n    public string? InputFieldPlaceholder { get; set; }\n\n    /// <summary>\n    /// Optional. Use this parameter if you want to force reply from specific users only. Targets: 1) users that are @mentioned in the <em>text</em> of the <see cref=\"Message\"/> object; 2) if the bot's message is a reply to a message in the same chat and forum topic, sender of the original message.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Selective)]\n    public bool? Selective { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReplyMarkup/InlineKeyboardMarkup.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a> that appears right next to the message it belongs to.\n/// </summary>\npublic class InlineKeyboardMarkup : ReplyMarkup\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InlineKeyboardMarkup\"/> class.\n    /// </summary>\n    /// <param name=\"inlineKeyboard\">Array of button rows, each represented by an Array of <see cref=\"InlineKeyboardButton\"/> objects</param>\n    public InlineKeyboardMarkup(IEnumerable<IEnumerable<InlineKeyboardButton>> inlineKeyboard)\n    {\n        this.InlineKeyboard =\n            inlineKeyboard ?? throw new ArgumentNullException(nameof(inlineKeyboard));\n    }\n\n    /// <summary>\n    /// Array of button rows, each represented by an Array of <see cref=\"InlineKeyboardButton\"/> objects\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineKeyboard)]\n    public IEnumerable<IEnumerable<InlineKeyboardButton>> InlineKeyboard { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReplyMarkup/ReplyKeyboardMarkup.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a <a href=\"https://core.telegram.org/bots/features#keyboards\">custom keyboard</a> with reply options (see <a href=\"https://core.telegram.org/bots/features#keyboards\">Introduction to bots</a> for details and examples). Not supported in channels and for messages sent on behalf of a business account.\n/// </summary>\npublic class ReplyKeyboardMarkup : ReplyMarkup\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ReplyKeyboardMarkup\"/> class.\n    /// </summary>\n    /// <param name=\"keyboard\">Array of button rows, each represented by an Array of <see cref=\"KeyboardButton\"/> objects</param>\n    public ReplyKeyboardMarkup(IEnumerable<IEnumerable<KeyboardButton>> keyboard)\n    {\n        this.Keyboard = keyboard ?? throw new ArgumentNullException(nameof(keyboard));\n    }\n\n    /// <summary>\n    /// Array of button rows, each represented by an Array of <see cref=\"KeyboardButton\"/> objects\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Keyboard)]\n    public IEnumerable<IEnumerable<KeyboardButton>> Keyboard { get; set; }\n\n    /// <summary>\n    /// Optional. Requests clients to always show the keyboard when the regular keyboard is hidden. Defaults to <em>false</em>, in which case the custom keyboard can be hidden and opened with a keyboard icon.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPersistent)]\n    public bool? IsPersistent { get; set; }\n\n    /// <summary>\n    /// Optional. Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to <em>false</em>, in which case the custom keyboard is always of the same height as the app's standard keyboard.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ResizeKeyboard)]\n    public bool? ResizeKeyboard { get; set; }\n\n    /// <summary>\n    /// Optional. Requests clients to hide the keyboard as soon as it's been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat - the user can press a special button in the input field to see the custom keyboard again. Defaults to <em>false</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OneTimeKeyboard)]\n    public bool? OneTimeKeyboard { get; set; }\n\n    /// <summary>\n    /// Optional. The placeholder to be shown in the input field when the keyboard is active; 1-64 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputFieldPlaceholder)]\n    public string? InputFieldPlaceholder { get; set; }\n\n    /// <summary>\n    /// Optional. Use this parameter if you want to show the keyboard to specific users only. Targets: 1) users that are @mentioned in the <em>text</em> of the <see cref=\"Message\"/> object; 2) if the bot's message is a reply to a message in the same chat and forum topic, sender of the original message.<br /><br /><em>Example:</em> A user requests to change the bot's language, bot replies to the request with a keyboard to select the new language. Other users in the group don't see the keyboard.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Selective)]\n    public bool? Selective { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReplyMarkup/ReplyKeyboardRemove.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Upon receiving a message with this object, Telegram clients will remove the current custom keyboard and display the default letter-keyboard. By default, custom keyboards are displayed until a new keyboard is sent by a bot. An exception is made for one-time keyboards that are hidden immediately after the user presses a button (see <see cref=\"ReplyKeyboardMarkup\"/>). Not supported in channels and for messages sent on behalf of a business account.\n/// </summary>\npublic class ReplyKeyboardRemove : ReplyMarkup\n{\n    /// <summary>\n    /// Requests clients to remove the custom keyboard (user will not be able to summon this keyboard; if you want to hide the keyboard from sight but keep it accessible, use <em>one_time_keyboard</em> in <see cref=\"ReplyKeyboardMarkup\"/>)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RemoveKeyboard)]\n    public bool RemoveKeyboard => true;\n\n    /// <summary>\n    /// Optional. Use this parameter if you want to remove the keyboard for specific users only. Targets: 1) users that are @mentioned in the <em>text</em> of the <see cref=\"Message\"/> object; 2) if the bot's message is a reply to a message in the same chat and forum topic, sender of the original message.<br /><br /><em>Example:</em> A user votes in a poll, bot returns confirmation message in reply to the vote and removes the keyboard for that user, while still showing the keyboard with poll options to users who haven't voted yet.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Selective)]\n    public bool? Selective { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReplyMarkup/ReplyMarkup.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove reply keyboard or to force a reply from the user.\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"InlineKeyboardMarkup\"/></description></item>\n/// <item><description><see cref=\"ReplyKeyboardMarkup\"/></description></item>\n/// <item><description><see cref=\"ReplyKeyboardRemove\"/></description></item>\n/// <item><description><see cref=\"ForceReply\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(ReplyMarkupConverter))]\npublic abstract class ReplyMarkup { }\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ReplyParameters.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes reply parameters for the message that is being sent.\n/// </summary>\npublic class ReplyParameters\n{\n    /// <summary>\n    /// Identifier of the message that will be replied to in the current chat, or in the chat <em>chat_id</em> if it is specified\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n\n    /// <summary>\n    /// Optional. If the message to be replied to is from a different chat, unique identifier for the chat or username of the bot, supergroup or channel in the format <em>@username</em>. Not supported for messages sent on behalf of a business account and messages from channel direct messages chats.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the message should be sent even if the specified message to be replied to is not found. Always <em>False</em> for replies in another chat or forum topic. Always <em>True</em> for messages sent on behalf of a business account.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowSendingWithoutReply)]\n    public bool? AllowSendingWithoutReply { get; set; }\n\n    /// <summary>\n    /// Optional. Quoted part of the message to be replied to; 0-1024 characters after entities parsing. The quote must be an exact substring of the message to be replied to, including <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, <em>custom_emoji</em>, and <em>date_time</em> entities. The message will fail to send if the quote isn't found in the original message.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Quote)]\n    public string? Quote { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the quote. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.QuoteParseMode)]\n    public string? QuoteParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. A JSON-serialized list of special entities that appear in the quote. It can be specified instead of <em>quote_parse_mode</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.QuoteEntities)]\n    public IEnumerable<MessageEntity>? QuoteEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Position of the quote in the original message in UTF-16 code units\n    /// </summary>\n    [JsonPropertyName(PropertyNames.QuotePosition)]\n    public int? QuotePosition { get; set; }\n\n    /// <summary>\n    /// Optional. Identifier of the specific checklist task to be replied to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChecklistTaskId)]\n    public int? ChecklistTaskId { get; set; }\n\n    /// <summary>\n    /// Optional. Persistent identifier of the specific poll option to be replied to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PollOptionId)]\n    public string? PollOptionId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/ResponseParameters.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes why a request was unsuccessful.\n/// </summary>\npublic class ResponseParameters\n{\n    /// <summary>\n    /// Optional. The group has been migrated to a supergroup with the specified identifier. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MigrateToChatId)]\n    public long? MigrateToChatId { get; set; }\n\n    /// <summary>\n    /// Optional. In case of exceeding flood control, the number of seconds left to wait before the request can be repeated\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RetryAfter)]\n    public int? RetryAfter { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SentGuestMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes an inline message sent by a guest bot.\n/// </summary>\npublic class SentGuestMessage\n{\n    /// <summary>\n    /// Identifier of the sent inline message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string InlineMessageId { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SentWebAppMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes an inline message sent by a <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> on behalf of a user.\n/// </summary>\npublic class SentWebAppMessage\n{\n    /// <summary>\n    /// Optional. Identifier of the sent inline message. Available only if there is an <a href=\"https://core.telegram.org/bots/api#inlinekeyboardmarkup\">inline keyboard</a> attached to the message.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SharedUser.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about a user that was shared with the bot using a <see cref=\"KeyboardButtonRequestUsers\"/> button.\n/// </summary>\npublic class SharedUser\n{\n    /// <summary>\n    /// Identifier of the shared user. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so 64-bit integers or double-precision float types are safe for storing these identifiers. The bot may not have access to the user and could be unable to use this identifier, unless the user is already known to the bot by some other means.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Optional. First name of the user, if the name was requested by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FirstName)]\n    public string? FirstName { get; set; }\n\n    /// <summary>\n    /// Optional. Last name of the user, if the name was requested by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastName)]\n    public string? LastName { get; set; }\n\n    /// <summary>\n    /// Optional. Username of the user, if the username was requested by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Username)]\n    public string? Username { get; set; }\n\n    /// <summary>\n    /// Optional. Available sizes of the chat photo, if the photo was requested by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public IEnumerable<PhotoSize>? Photo { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StarAmount.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes an amount of Telegram Stars.\n/// </summary>\npublic class StarAmount\n{\n    /// <summary>\n    /// Integer amount of Telegram Stars, rounded to 0; can be negative\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Amount)]\n    public int Amount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of 1/1000000000 shares of Telegram Stars; from -999999999 to 999999999; can be negative if and only if <em>amount</em> is non-positive\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NanostarAmount)]\n    public int? NanostarAmount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Story.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a story.\n/// </summary>\npublic class Story\n{\n    /// <summary>\n    /// Chat that posted the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for the story in the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public int Id { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StoryArea.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a clickable area on a story media.\n/// </summary>\npublic class StoryArea\n{\n    /// <summary>\n    /// Position of the area\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Position)]\n    public StoryAreaPosition Position { get; set; } = null!;\n\n    /// <summary>\n    /// Type of the area\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public StoryAreaType Type { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StoryAreaPosition.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the position of a clickable area within a story.\n/// </summary>\npublic class StoryAreaPosition\n{\n    /// <summary>\n    /// The abscissa of the area's center, as a percentage of the media width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.XPercentage)]\n    public float XPercentage { get; set; }\n\n    /// <summary>\n    /// The ordinate of the area's center, as a percentage of the media height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.YPercentage)]\n    public float YPercentage { get; set; }\n\n    /// <summary>\n    /// The width of the area's rectangle, as a percentage of the media width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WidthPercentage)]\n    public float WidthPercentage { get; set; }\n\n    /// <summary>\n    /// The height of the area's rectangle, as a percentage of the media height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HeightPercentage)]\n    public float HeightPercentage { get; set; }\n\n    /// <summary>\n    /// The clockwise rotation angle of the rectangle, in degrees; 0-360\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RotationAngle)]\n    public float RotationAngle { get; set; }\n\n    /// <summary>\n    /// The radius of the rectangle corner rounding, as a percentage of the media width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CornerRadiusPercentage)]\n    public float CornerRadiusPercentage { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StoryAreaType/StoryAreaType.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the type of a clickable area on a story. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"StoryAreaTypeLocation\"/></description></item>\n/// <item><description><see cref=\"StoryAreaTypeSuggestedReaction\"/></description></item>\n/// <item><description><see cref=\"StoryAreaTypeLink\"/></description></item>\n/// <item><description><see cref=\"StoryAreaTypeWeather\"/></description></item>\n/// <item><description><see cref=\"StoryAreaTypeUniqueGift\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(StoryAreaTypeConverter))]\npublic abstract class StoryAreaType\n{\n    /// <summary>\n    /// Type of the area\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StoryAreaType/StoryAreaTypeLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a story area pointing to an HTTP or tg:// link. Currently, a story can have up to 3 link areas.\n/// </summary>\npublic class StoryAreaTypeLink : StoryAreaType\n{\n    /// <summary>\n    /// Type of the area, always “link”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"link\";\n\n    /// <summary>\n    /// HTTP or tg:// URL to be opened when the area is clicked\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string Url { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StoryAreaType/StoryAreaTypeLocation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a story area pointing to a location. Currently, a story can have up to 10 location areas.\n/// </summary>\npublic class StoryAreaTypeLocation : StoryAreaType\n{\n    /// <summary>\n    /// Type of the area, always “location”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"location\";\n\n    /// <summary>\n    /// Location latitude in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Location longitude in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Optional. Address of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Address)]\n    public LocationAddress? Address { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StoryAreaType/StoryAreaTypeSuggestedReaction.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a story area pointing to a suggested reaction. Currently, a story can have up to 5 suggested reaction areas.\n/// </summary>\npublic class StoryAreaTypeSuggestedReaction : StoryAreaType\n{\n    /// <summary>\n    /// Type of the area, always “suggested_reaction”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"suggested_reaction\";\n\n    /// <summary>\n    /// Type of the reaction\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReactionType)]\n    public ReactionType ReactionType { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the reaction area has a dark background\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsDark)]\n    public bool? IsDark { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if reaction area corner is flipped\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsFlipped)]\n    public bool? IsFlipped { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StoryAreaType/StoryAreaTypeUniqueGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a story area pointing to a unique gift. Currently, a story can have at most 1 unique gift area.\n/// </summary>\npublic class StoryAreaTypeUniqueGift : StoryAreaType\n{\n    /// <summary>\n    /// Type of the area, always “unique_gift”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"unique_gift\";\n\n    /// <summary>\n    /// Unique name of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/StoryAreaType/StoryAreaTypeWeather.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a story area containing weather information. Currently, a story can have up to 3 weather areas.\n/// </summary>\npublic class StoryAreaTypeWeather : StoryAreaType\n{\n    /// <summary>\n    /// Type of the area, always “weather”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"weather\";\n\n    /// <summary>\n    /// Temperature, in degree Celsius\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Temperature)]\n    public float Temperature { get; set; }\n\n    /// <summary>\n    /// Emoji representing the weather\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Emoji)]\n    public string Emoji { get; set; } = null!;\n\n    /// <summary>\n    /// A color of the area background in the ARGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BackgroundColor)]\n    public int BackgroundColor { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SuggestedPostApprovalFailed.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about the failed approval of a suggested post. Currently, only caused by insufficient user funds at the time of approval.\n/// </summary>\npublic class SuggestedPostApprovalFailed\n{\n    /// <summary>\n    /// Optional. Message containing the suggested post whose approval has failed. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostMessage)]\n    public Message? SuggestedPostMessage { get; set; }\n\n    /// <summary>\n    /// Expected price of the post\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Price)]\n    public SuggestedPostPrice Price { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SuggestedPostApproved.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about the approval of a suggested post.\n/// </summary>\npublic class SuggestedPostApproved\n{\n    /// <summary>\n    /// Optional. Message containing the suggested post. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostMessage)]\n    public Message? SuggestedPostMessage { get; set; }\n\n    /// <summary>\n    /// Optional. Amount paid for the post\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Price)]\n    public SuggestedPostPrice? Price { get; set; }\n\n    /// <summary>\n    /// Date when the post will be published\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendDate)]\n    public int SendDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SuggestedPostDeclined.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about the rejection of a suggested post.\n/// </summary>\npublic class SuggestedPostDeclined\n{\n    /// <summary>\n    /// Optional. Message containing the suggested post. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostMessage)]\n    public Message? SuggestedPostMessage { get; set; }\n\n    /// <summary>\n    /// Optional. Comment with which the post was declined\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Comment)]\n    public string? Comment { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SuggestedPostInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Contains information about a suggested post.\n/// </summary>\npublic class SuggestedPostInfo\n{\n    /// <summary>\n    /// State of the suggested post. Currently, it can be one of “pending”, “approved”, “declined”.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.State)]\n    public string State { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Proposed price of the post. If the field is omitted, then the post is unpaid.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Price)]\n    public SuggestedPostPrice? Price { get; set; }\n\n    /// <summary>\n    /// Optional. Proposed send date of the post. If the field is omitted, then the post can be published at any time within 30 days at the sole discretion of the user or administrator who approves it.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendDate)]\n    public int? SendDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SuggestedPostPaid.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about a successful payment for a suggested post.\n/// </summary>\npublic class SuggestedPostPaid\n{\n    /// <summary>\n    /// Optional. Message containing the suggested post. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostMessage)]\n    public Message? SuggestedPostMessage { get; set; }\n\n    /// <summary>\n    /// Currency in which the payment was made. Currently, one of “XTR” for Telegram Stars or “TON” for toncoins\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. The amount of the currency that was received by the channel in nanotoncoins; for payments in toncoins only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Amount)]\n    public int? Amount { get; set; }\n\n    /// <summary>\n    /// Optional. The amount of Telegram Stars that was received by the channel; for payments in Telegram Stars only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StarAmount)]\n    public StarAmount? StarAmount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SuggestedPostParameters.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Contains parameters of a post that is being suggested by the bot.\n/// </summary>\npublic class SuggestedPostParameters\n{\n    /// <summary>\n    /// Optional. Proposed price for the post. If the field is omitted, then the post is unpaid.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Price)]\n    public SuggestedPostPrice? Price { get; set; }\n\n    /// <summary>\n    /// Optional. Proposed send date of the post. If specified, then the date must be between 300 second and 2678400 seconds (30 days) in the future. If the field is omitted, then the post can be published at any time within 30 days at the sole discretion of the user who approves it.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendDate)]\n    public int? SendDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SuggestedPostPrice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes the price of a suggested post.\n/// </summary>\npublic class SuggestedPostPrice\n{\n    /// <summary>\n    /// Currency in which the post will be paid. Currently, must be one of “XTR” for Telegram Stars or “TON” for toncoins\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency { get; set; } = null!;\n\n    /// <summary>\n    /// The amount of the currency that will be paid for the post in the <em>smallest units</em> of the currency, i.e. Telegram Stars or nanotoncoins. Currently, price in Telegram Stars must be between 5 and 100000, and price in nanotoncoins must be between 10000000 and 10000000000000.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Amount)]\n    public int Amount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SuggestedPostRefunded.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about a payment refund for a suggested post.\n/// </summary>\npublic class SuggestedPostRefunded\n{\n    /// <summary>\n    /// Optional. Message containing the suggested post. Note that the <see cref=\"Message\"/> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostMessage)]\n    public Message? SuggestedPostMessage { get; set; }\n\n    /// <summary>\n    /// Reason for the refund. Currently, one of “post_deleted” if the post was deleted within 24 hours of being posted or removed from scheduled messages without being posted, or “payment_refunded” if the payer refunded their payment.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Reason)]\n    public string Reason { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/SwitchInlineQueryChosenChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents an inline button that switches the current user to inline mode in a chosen chat, with an optional default inline query.\n/// </summary>\npublic class SwitchInlineQueryChosenChat\n{\n    /// <summary>\n    /// Optional. The default inline query to be inserted in the input field. If left empty, only the bot's username will be inserted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Query)]\n    public string? Query { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if private chats with users can be chosen\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowUserChats)]\n    public bool? AllowUserChats { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if private chats with bots can be chosen\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowBotChats)]\n    public bool? AllowBotChats { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if group and supergroup chats can be chosen\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowGroupChats)]\n    public bool? AllowGroupChats { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if channel chats can be chosen\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowChannelChats)]\n    public bool? AllowChannelChats { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/TextQuote.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about the quoted part of a message that is replied to by the given message.\n/// </summary>\npublic class TextQuote\n{\n    /// <summary>\n    /// Text of the quoted part of a message that is replied to by the given message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Special entities that appear in the quote. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, <em>custom_emoji</em>, and <em>date_time</em> entities are kept in quotes.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Entities)]\n    public IEnumerable<MessageEntity>? Entities { get; set; }\n\n    /// <summary>\n    /// Approximate quote position in the original message in UTF-16 code units as specified by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Position)]\n    public int Position { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the quote was chosen manually by the message sender. Otherwise, the quote was added automatically by the server.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsManual)]\n    public bool? IsManual { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UniqueGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes a unique gift that was upgraded from a regular gift.\n/// </summary>\npublic class UniqueGift\n{\n    /// <summary>\n    /// Identifier of the regular gift from which the gift was upgraded\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiftId)]\n    public string GiftId { get; set; } = null!;\n\n    /// <summary>\n    /// Human-readable name of the regular gift from which this unique gift was upgraded\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BaseName)]\n    public string BaseName { get; set; } = null!;\n\n    /// <summary>\n    /// Unique name of the gift. This name can be used in <em>https://t.me/nft/...</em> links and story areas\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n\n    /// <summary>\n    /// Unique number of the upgraded gift among gifts upgraded from the same regular gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Number)]\n    public int Number { get; set; }\n\n    /// <summary>\n    /// Model of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Model)]\n    public UniqueGiftModel Model { get; set; } = null!;\n\n    /// <summary>\n    /// Symbol of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Symbol)]\n    public UniqueGiftSymbol Symbol { get; set; } = null!;\n\n    /// <summary>\n    /// Backdrop of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Backdrop)]\n    public UniqueGiftBackdrop Backdrop { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the original regular gift was exclusively purchaseable by Telegram Premium subscribers\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPremium)]\n    public bool? IsPremium { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift was used to craft another gift and isn't available anymore\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsBurned)]\n    public bool? IsBurned { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the gift is assigned from the TON blockchain and can't be resold or transferred in Telegram\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsFromBlockchain)]\n    public bool? IsFromBlockchain { get; set; }\n\n    /// <summary>\n    /// Optional. The color scheme that can be used by the gift's owner for the chat's name, replies to messages and link previews; for business account gifts and gifts that are currently on sale only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Colors)]\n    public UniqueGiftColors? Colors { get; set; }\n\n    /// <summary>\n    /// Optional. Information about the chat that published the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PublisherChat)]\n    public Chat? PublisherChat { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UniqueGiftBackdrop.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the backdrop of a unique gift.\n/// </summary>\npublic class UniqueGiftBackdrop\n{\n    /// <summary>\n    /// Name of the backdrop\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n\n    /// <summary>\n    /// Colors of the backdrop\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Colors)]\n    public UniqueGiftBackdropColors Colors { get; set; } = null!;\n\n    /// <summary>\n    /// The number of unique gifts that receive this backdrop for every 1000 gifts upgraded\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RarityPerMille)]\n    public int RarityPerMille { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UniqueGiftBackdropColors.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the colors of the backdrop of a unique gift.\n/// </summary>\npublic class UniqueGiftBackdropColors\n{\n    /// <summary>\n    /// The color in the center of the backdrop in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CenterColor)]\n    public int CenterColor { get; set; }\n\n    /// <summary>\n    /// The color on the edges of the backdrop in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EdgeColor)]\n    public int EdgeColor { get; set; }\n\n    /// <summary>\n    /// The color to be applied to the symbol in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SymbolColor)]\n    public int SymbolColor { get; set; }\n\n    /// <summary>\n    /// The color for the text on the backdrop in RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextColor)]\n    public int TextColor { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UniqueGiftColors.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about the color scheme for a user's name, message replies and link previews based on a unique gift.\n/// </summary>\npublic class UniqueGiftColors\n{\n    /// <summary>\n    /// Custom emoji identifier of the unique gift's model\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ModelCustomEmojiId)]\n    public string ModelCustomEmojiId { get; set; } = null!;\n\n    /// <summary>\n    /// Custom emoji identifier of the unique gift's symbol\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SymbolCustomEmojiId)]\n    public string SymbolCustomEmojiId { get; set; } = null!;\n\n    /// <summary>\n    /// Main color used in light themes; RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LightThemeMainColor)]\n    public int LightThemeMainColor { get; set; }\n\n    /// <summary>\n    /// List of 1-3 additional colors used in light themes; RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LightThemeOtherColors)]\n    public IEnumerable<int> LightThemeOtherColors { get; set; } = null!;\n\n    /// <summary>\n    /// Main color used in dark themes; RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DarkThemeMainColor)]\n    public int DarkThemeMainColor { get; set; }\n\n    /// <summary>\n    /// List of 1-3 additional colors used in dark themes; RGB format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DarkThemeOtherColors)]\n    public IEnumerable<int> DarkThemeOtherColors { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UniqueGiftInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a service message about a unique gift that was sent or received.\n/// </summary>\npublic class UniqueGiftInfo\n{\n    /// <summary>\n    /// Information about the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gift)]\n    public UniqueGift Gift { get; set; } = null!;\n\n    /// <summary>\n    /// Origin of the gift. Currently, either “upgrade” for gifts upgraded from regular gifts, “transfer” for gifts transferred from other users or channels, “resale” for gifts bought from other users, “gifted_upgrade” for upgrades purchased after the gift was sent, or “offer” for gifts bought or sold through gift purchase offers\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Origin)]\n    public string Origin { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. For gifts bought from other users, the currency in which the payment for the gift was done. Currently, one of “XTR” for Telegram Stars or “TON” for toncoins.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastResaleCurrency)]\n    public string? LastResaleCurrency { get; set; }\n\n    /// <summary>\n    /// Optional. For gifts bought from other users, the price paid for the gift in either Telegram Stars or nanotoncoins\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastResaleAmount)]\n    public int? LastResaleAmount { get; set; }\n\n    /// <summary>\n    /// Optional. Unique identifier of the received gift for the bot; only present for gifts received on behalf of business accounts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OwnedGiftId)]\n    public string? OwnedGiftId { get; set; }\n\n    /// <summary>\n    /// Optional. Number of Telegram Stars that must be paid to transfer the gift; omitted if the bot cannot transfer the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TransferStarCount)]\n    public int? TransferStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. Point in time (Unix timestamp) when the gift can be transferred. If it is in the past, then the gift can be transferred now\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NextTransferDate)]\n    public int? NextTransferDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UniqueGiftModel.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Stickers;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the model of a unique gift.\n/// </summary>\npublic class UniqueGiftModel\n{\n    /// <summary>\n    /// Name of the model\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n\n    /// <summary>\n    /// The sticker that represents the unique gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public Sticker Sticker { get; set; } = null!;\n\n    /// <summary>\n    /// The number of unique gifts that receive this model for every 1000 gift upgrades. Always 0 for crafted gifts.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RarityPerMille)]\n    public int RarityPerMille { get; set; }\n\n    /// <summary>\n    /// Optional. Rarity of the model if it is a crafted model. Currently, can be “uncommon”, “rare”, “epic”, or “legendary”.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Rarity)]\n    public string? Rarity { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UniqueGiftSymbol.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Stickers;\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the symbol shown on the pattern of a unique gift.\n/// </summary>\npublic class UniqueGiftSymbol\n{\n    /// <summary>\n    /// Name of the symbol\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n\n    /// <summary>\n    /// The sticker that represents the unique gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public Sticker Sticker { get; set; } = null!;\n\n    /// <summary>\n    /// The number of unique gifts that receive this model for every 1000 gifts upgraded\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RarityPerMille)]\n    public int RarityPerMille { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/User.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a Telegram user or bot.\n/// </summary>\npublic class User\n{\n    /// <summary>\n    /// Unique identifier for this user or bot. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public long Id { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if this user is a bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsBot)]\n    public bool IsBot { get; set; }\n\n    /// <summary>\n    /// User's or bot's first name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FirstName)]\n    public string FirstName { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. User's or bot's last name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastName)]\n    public string? LastName { get; set; }\n\n    /// <summary>\n    /// Optional. User's or bot's username\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Username)]\n    public string? Username { get; set; }\n\n    /// <summary>\n    /// Optional. <a href=\"https://en.wikipedia.org/wiki/IETF_language_tag\">IETF language tag</a> of the user's language\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LanguageCode)]\n    public string? LanguageCode { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if this user is a Telegram Premium user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPremium)]\n    public bool? IsPremium { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if this user added the bot to the attachment menu\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AddedToAttachmentMenu)]\n    public bool? AddedToAttachmentMenu { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can be invited to groups. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanJoinGroups)]\n    public bool? CanJoinGroups { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if <a href=\"https://core.telegram.org/bots/features#privacy-mode\">privacy mode</a> is disabled for the bot. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanReadAllGroupMessages)]\n    public bool? CanReadAllGroupMessages { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot supports guest queries from chats it is not a member of. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SupportsGuestQueries)]\n    public bool? SupportsGuestQueries { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot supports inline queries. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SupportsInlineQueries)]\n    public bool? SupportsInlineQueries { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot can be connected to a user account to manage it. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanConnectToBusiness)]\n    public bool? CanConnectToBusiness { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot has a main Web App. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasMainWebApp)]\n    public bool? HasMainWebApp { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot has forum topic mode enabled in private chats. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasTopicsEnabled)]\n    public bool? HasTopicsEnabled { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the bot allows users to create and delete topics in private chats. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowsUsersToCreateTopics)]\n    public bool? AllowsUsersToCreateTopics { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if other bots can be created to be controlled by the bot. Returned only in <a href=\"https://core.telegram.org/bots/api#getme\">getMe</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CanManageBots)]\n    public bool? CanManageBots { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UserChatBoosts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a list of boosts added to a chat by a user.\n/// </summary>\npublic class UserChatBoosts\n{\n    /// <summary>\n    /// The list of boosts added to the chat by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Boosts)]\n    public IEnumerable<ChatBoost> Boosts { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UserProfileAudios.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents the audios displayed on a user's profile.\n/// </summary>\npublic class UserProfileAudios\n{\n    /// <summary>\n    /// Total number of profile audios for the target user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalCount)]\n    public int TotalCount { get; set; }\n\n    /// <summary>\n    /// Requested profile audios\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Audios)]\n    public IEnumerable<Audio> Audios { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UserProfilePhotos.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represent a user's profile pictures.\n/// </summary>\npublic class UserProfilePhotos\n{\n    /// <summary>\n    /// Total number of profile pictures the target user has\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalCount)]\n    public int TotalCount { get; set; }\n\n    /// <summary>\n    /// Requested profile pictures (in up to 4 sizes each)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photos)]\n    public IEnumerable<IEnumerable<PhotoSize>> Photos { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UserRating.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object describes the rating of a user based on their Telegram Star spendings.\n/// </summary>\npublic class UserRating\n{\n    /// <summary>\n    /// Current level of the user, indicating their reliability when purchasing digital goods and services. A higher level suggests a more trustworthy customer; a negative level is likely reason for concern.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Level)]\n    public int Level { get; set; }\n\n    /// <summary>\n    /// Numerical value of the user's rating; the higher the rating, the better\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Rating)]\n    public int Rating { get; set; }\n\n    /// <summary>\n    /// The rating value required to get the current level\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CurrentLevelRating)]\n    public int CurrentLevelRating { get; set; }\n\n    /// <summary>\n    /// Optional. The rating value required to get to the next level; omitted if the maximum level was reached\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NextLevelRating)]\n    public int? NextLevelRating { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/UsersShared.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object contains information about the users whose identifiers were shared with the bot using a <see cref=\"KeyboardButtonRequestUsers\"/> button.\n/// </summary>\npublic class UsersShared\n{\n    /// <summary>\n    /// Identifier of the request\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestId)]\n    public int RequestId { get; set; }\n\n    /// <summary>\n    /// Information about users shared with the bot.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Users)]\n    public IEnumerable<SharedUser> Users { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Venue.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a venue.\n/// </summary>\npublic class Venue\n{\n    /// <summary>\n    /// Venue location. Can't be a live location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public Location Location { get; set; } = null!;\n\n    /// <summary>\n    /// Name of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Address of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Address)]\n    public string Address { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Foursquare identifier of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareId)]\n    public string? FoursquareId { get; set; }\n\n    /// <summary>\n    /// Optional. Foursquare type of the venue. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareType)]\n    public string? FoursquareType { get; set; }\n\n    /// <summary>\n    /// Optional. Google Places identifier of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceId)]\n    public string? GooglePlaceId { get; set; }\n\n    /// <summary>\n    /// Optional. Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceType)]\n    public string? GooglePlaceType { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Video.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a video file.\n/// </summary>\npublic class Video\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Video width as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int Width { get; set; }\n\n    /// <summary>\n    /// Video height as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int Height { get; set; }\n\n    /// <summary>\n    /// Duration of the video in seconds as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Video thumbnail\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public PhotoSize? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Available sizes of the cover of the video in the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Cover)]\n    public IEnumerable<PhotoSize>? Cover { get; set; }\n\n    /// <summary>\n    /// Optional. Timestamp in seconds from which the video will play in the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StartTimestamp)]\n    public int? StartTimestamp { get; set; }\n\n    /// <summary>\n    /// Optional. List of available qualities of the video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Qualities)]\n    public IEnumerable<VideoQuality>? Qualities { get; set; }\n\n    /// <summary>\n    /// Optional. Original filename as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileName)]\n    public string? FileName { get; set; }\n\n    /// <summary>\n    /// Optional. MIME type of the file as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MimeType)]\n    public string? MimeType { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/VideoChatEnded.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a video chat ended in the chat.\n/// </summary>\npublic class VideoChatEnded\n{\n    /// <summary>\n    /// Video chat duration in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int Duration { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/VideoChatParticipantsInvited.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about new members invited to a video chat.\n/// </summary>\npublic class VideoChatParticipantsInvited\n{\n    /// <summary>\n    /// New members that were invited to the video chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Users)]\n    public IEnumerable<User> Users { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/VideoChatScheduled.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a video chat scheduled in the chat.\n/// </summary>\npublic class VideoChatScheduled\n{\n    /// <summary>\n    /// Point in time (Unix timestamp) when the video chat is supposed to be started by a chat administrator\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StartDate)]\n    public int StartDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/VideoChatStarted.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a video chat started in the chat. Currently holds no information.\n/// </summary>\npublic class VideoChatStarted { }\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/VideoNote.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a <a href=\"https://telegram.org/blog/video-messages-and-telescope\">video message</a> (available in Telegram apps as of <a href=\"https://telegram.org/blog/video-messages-and-telescope\">v.4.0</a>).\n/// </summary>\npublic class VideoNote\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Video width and height (diameter of the video message) as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Length)]\n    public int Length { get; set; }\n\n    /// <summary>\n    /// Duration of the video in seconds as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int Duration { get; set; }\n\n    /// <summary>\n    /// Optional. Video thumbnail\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public PhotoSize? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/VideoQuality.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a video file of a specific quality.\n/// </summary>\npublic class VideoQuality\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Video width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int Width { get; set; }\n\n    /// <summary>\n    /// Video height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int Height { get; set; }\n\n    /// <summary>\n    /// Codec that was used to encode the video, for example, “h264”, “h265”, or “av01”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Codec)]\n    public string Codec { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/Voice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a voice note.\n/// </summary>\npublic class Voice\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Duration of the audio in seconds as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Duration)]\n    public int Duration { get; set; }\n\n    /// <summary>\n    /// Optional. MIME type of the file as defined by the sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MimeType)]\n    public string? MimeType { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/WebAppData.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes data sent from a <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> to the bot.\n/// </summary>\npublic class WebAppData\n{\n    /// <summary>\n    /// The data. Be aware that a bad client can send arbitrary data in this field.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Data)]\n    public string Data { get; set; } = null!;\n\n    /// <summary>\n    /// Text of the <em>web_app</em> keyboard button from which the Web App was opened. Be aware that a bad client can send arbitrary data in this field.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ButtonText)]\n    public string ButtonText { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/WebAppInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// Describes a <a href=\"https://core.telegram.org/bots/webapps\">Web App</a>.\n/// </summary>\npublic class WebAppInfo\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"WebAppInfo\"/> class.\n    /// </summary>\n    /// <param name=\"url\">An HTTPS URL of a Web App to be opened with additional data as specified in <a href=\"https://core.telegram.org/bots/webapps#initializing-mini-apps\">Initializing Web Apps</a></param>\n    public WebAppInfo(string url)\n    {\n        this.Url = url ?? throw new ArgumentNullException(nameof(url));\n    }\n\n    /// <summary>\n    /// An HTTPS URL of a Web App to be opened with additional data as specified in <a href=\"https://core.telegram.org/bots/webapps#initializing-mini-apps\">Initializing Web Apps</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string Url { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/AvailableTypes/WriteAccessAllowed.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.AvailableTypes;\n\n/// <summary>\n/// This object represents a service message about a user allowing a bot to write messages after adding it to the attachment menu, launching a Web App from a link, or accepting an explicit request from a Web App sent by the method <a href=\"https://core.telegram.org/bots/webapps#initializing-mini-apps\">requestWriteAccess</a>.\n/// </summary>\npublic class WriteAccessAllowed\n{\n    /// <summary>\n    /// Optional. <em>True</em>, if the access was granted after the user accepted an explicit request from a Web App sent by the method <a href=\"https://core.telegram.org/bots/webapps#initializing-mini-apps\">requestWriteAccess</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FromRequest)]\n    public bool? FromRequest { get; set; }\n\n    /// <summary>\n    /// Optional. Name of the Web App, if the access was granted when the Web App was launched from a link\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WebAppName)]\n    public string? WebAppName { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the access was granted when the bot was added to the attachment or side menu\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FromAttachmentMenu)]\n    public bool? FromAttachmentMenu { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/BotRequestException.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Exception generated when a request to Telegram Bot API got an error response.\n/// </summary>=\n/// <param name=\"errorCode\">Error code.</param>\n/// <param name=\"description\">Description.</param>\n/// <param name=\"parameters\">Parameters.</param>\npublic sealed class BotRequestException(\n    int errorCode,\n    string description,\n    ResponseParameters? parameters\n) : Exception(description)\n{\n    /// <summary>Error code.</summary>\n    public int ErrorCode { get; } = errorCode;\n\n    /// <summary>Error description.</summary>\n    public string Description { get; } = description;\n\n    /// <summary>Parameters.</summary>\n    public ResponseParameters? Parameters { get; } = parameters;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/BotResponse.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Represents the bot's response to the request.\n/// </summary>\n/// <typeparam name=\"TResult\">Result type.</typeparam>\npublic sealed class BotResponse<TResult>\n{\n    /// <summary>\n    /// True, if the request was successful, otherwise false.\n    /// </summary>\n    [JsonPropertyName(\"ok\")]\n    public bool Ok { get; set; }\n\n    /// <summary>\n    /// Result.\n    /// </summary>\n    [JsonPropertyName(\"result\")]\n    public TResult? Result { get; set; }\n\n    /// <summary>\n    /// Error code.\n    /// </summary>\n    [JsonPropertyName(\"error_code\")]\n    public int? ErrorCode { get; set; }\n\n    /// <summary>\n    /// Error description.\n    /// </summary>\n    [JsonPropertyName(\"description\")]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// A <see cref=\"ResponseParameters\"/> object containing additional information about the error.\n    /// </summary>\n    [JsonPropertyName(\"parameters\")]\n    public ResponseParameters? Parameters { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/ChatActions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Provides the available actions to be used when sending a chat action.\n/// </summary>\npublic static class ChatActions\n{\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n    public const string Typing = \"typing\";\n    public const string UploadPhoto = \"upload_photo\";\n    public const string RecordVideo = \"record_video\";\n    public const string UploadVideo = \"upload_video\";\n    public const string RecordVoice = \"record_voice\";\n    public const string UploadVoice = \"upload_voice\";\n    public const string UploadDocument = \"upload_document\";\n    public const string FindLocation = \"find_location\";\n    public const string RecordVideoNote = \"record_video_note\";\n    public const string UploadVideoNote = \"upload_video_note\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/ChatTypes.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines all the types of telegram chats.\n/// </summary>\npublic static class ChatTypes\n{\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n    public const string Sender = \"sender\";\n    public const string Private = \"private\";\n    public const string Group = \"group\";\n    public const string Supergroup = \"supergroup\";\n    public const string Channel = \"channel\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/FormatStyles.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines all available parse modes.\n/// </summary>\n/// <remarks>\n/// See <see href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</see> for more information.\n/// </remarks>\npublic static class FormatStyles\n{\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n    public const string HTML = \"HTML\";\n    public const string Markdown = \"Markdown\";\n    public const string MarkdownV2 = \"MarkdownV2\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/InlineKeyboardButtonTypes.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines all available button types.\n/// </summary>\npublic static class InlineKeyboardButtonTypes\n{\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n    public const string Url = PropertyNames.Url;\n    public const string CallbackData = PropertyNames.CallbackData;\n    public const string WebApp = PropertyNames.WebApp;\n    public const string LoginUrl = PropertyNames.LoginUrl;\n    public const string SwitchInlineQuery = PropertyNames.SwitchInlineQuery;\n    public const string SwitchInlineQueryCurrentChat = PropertyNames.SwitchInlineQueryCurrentChat;\n    public const string SwitchInlineQueryChosenChat = PropertyNames.SwitchInlineQueryChosenChat;\n    public const string CopyText = PropertyNames.CopyText;\n    public const string CallbackGame = PropertyNames.CallbackGame;\n    public const string Pay = PropertyNames.Pay;\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/MessageEntityTypes.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines all available entity types.\n/// </summary>\n/// <remarks>\n/// Currently, can be “mention” (@username), “hashtag” (#hashtag), “cashtag” ($USD), “bot_command” (/start@jobs_bot), “url” (https://telegram.org), “email” (do-not-reply@telegram.org), “phone_number” (+1-212-555-0123), “bold” (bold text), “italic” (italic text), “underline” (underlined text), “strikethrough” (strikethrough text), “spoiler” (spoiler message), “blockquote” (block quotation), “code” (monowidth string), “pre” (monowidth block), “text_link” (for clickable text URLs), “text_mention” (for users without usernames), “custom_emoji” (for inline custom emoji stickers).\n/// </remarks>\npublic static class MessageEntityTypes\n{\n    /// <summary>\n    /// “mention” (@username)\n    /// </summary>\n    public const string Mention = \"mention\";\n\n    /// <summary>\n    /// “hashtag” (#hashtag)\n    /// </summary>\n    public const string Hashtag = \"hashtag\";\n\n    /// <summary>\n    /// “cashtag” ($USD)\n    /// </summary>\n    public const string Cashtag = \"cashtag\";\n\n    /// <summary>\n    /// “bot_command” (/start@jobs_bot)\n    /// </summary>\n    public const string BotCommand = \"bot_command\";\n\n    /// <summary>\n    /// “url” (https://telegram.org)\n    /// </summary>\n    public const string Url = \"url\";\n\n    /// <summary>\n    /// “email” (do-not-reply@telegram.org)\n    /// </summary>\n    public const string Email = \"email\";\n\n    /// <summary>\n    /// “phone_number” (+1-212-555-0123)\n    /// </summary>\n    public const string PhoneNumber = \"phone_number\";\n\n    /// <summary>\n    /// “bold” (bold text)\n    /// </summary>\n    public const string Bold = \"bold\";\n\n    /// <summary>\n    /// “italic” (italic text)\n    /// </summary>\n    public const string Italic = \"italic\";\n\n    /// <summary>\n    /// “underline” (underlined text)\n    /// </summary>\n    public const string Underline = \"underline\";\n\n    /// <summary>\n    /// “strikethrough” (strikethrough text)\n    /// </summary>\n    public const string Strikethrough = \"strikethrough\";\n\n    /// <summary>\n    /// “spoiler” (spoiler message)\n    /// </summary>\n    public const string Spoiler = \"spoiler\";\n\n    /// <summary>\n    /// “blockquote” (block quotation)\n    /// </summary>\n    public const string Blockquote = \"blockquote\";\n\n    /// <summary>\n    /// “collapsed-by-default” (block quotation)\n    /// </summary>\n    public const string ExpandableBlockquote = \"expandable_blockquote\";\n\n    /// <summary>\n    /// “code” (monowidth string)\n    /// </summary>\n    public const string Code = \"code\";\n\n    /// <summary>\n    /// “pre” (monowidth block)\n    /// </summary>\n    public const string Pre = \"pre\";\n\n    /// <summary>\n    /// “text_link” (for clickable text URLs)\n    /// </summary>\n    public const string TextLink = \"text_link\";\n\n    /// <summary>\n    /// “text_mention” (for users without usernames)\n    /// </summary>\n    public const string TextMention = \"text_mention\";\n\n    /// <summary>\n    /// “custom_emoji” (for inline custom emoji stickers)\n    /// </summary>\n    public const string CustomEmoji = \"custom_emoji\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/PollTypes.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines all available poll types.\n/// </summary>\npublic static class PollTypes\n{\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n    public const string Quiz = \"quiz\";\n    public const string Regular = \"regular\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/Stickers/StickerFormats.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// List of available sticker formats.\n/// </summary>\npublic static class StickerFormats\n{\n    /// <summary>\n    /// Static sticker.\n    /// </summary>\n    public const string Static = \"static\";\n\n    /// <summary>\n    /// Animated sticker.\n    /// </summary>\n    public const string Animated = \"animated\";\n\n    /// <summary>\n    /// Video sticker.\n    /// </summary>\n    public const string Video = \"video\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/Stickers/StickerTypes.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// List of available sticker types.\n/// </summary>\npublic static class StickerTypes\n{\n    /// <summary>\n    /// Regular sticker.\n    /// </summary>\n    public const string Regular = \"regular\";\n\n    /// <summary>\n    /// Mask sticker.\n    /// </summary>\n    public const string Mask = \"mask\";\n\n    /// <summary>\n    /// Custom emoji sticker.\n    /// </summary>\n    public const string CustomEmoji = \"custom_emoji\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Constants/UpdateTypes.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// Defines all the types of updates that can be received.\n/// </summary>\npublic sealed class UpdateTypes\n{\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n    public const string Message = PropertyNames.Message;\n    public const string EditedMessage = PropertyNames.EditedMessage;\n    public const string ChannelPost = PropertyNames.ChannelPost;\n    public const string EditedChannelPost = PropertyNames.EditedChannelPost;\n    public const string BusinessConnection = PropertyNames.BusinessConnection;\n    public const string BusinessMessage = PropertyNames.BusinessMessage;\n    public const string EditedBusinessMessage = PropertyNames.EditedBusinessMessage;\n    public const string DeletedBusinessMessages = PropertyNames.DeletedBusinessMessages;\n    public const string MessageReaction = PropertyNames.MessageReaction;\n    public const string MessageReactionCount = PropertyNames.MessageReactionCount;\n    public const string InlineQuery = PropertyNames.InlineQuery;\n    public const string ChosenInlineResult = PropertyNames.ChosenInlineResult;\n    public const string CallbackQuery = PropertyNames.CallbackQuery;\n    public const string ShippingQuery = PropertyNames.ShippingQuery;\n    public const string PreCheckoutQuery = PropertyNames.PreCheckoutQuery;\n    public const string Poll = PropertyNames.Poll;\n    public const string PollAnswer = PropertyNames.PollAnswer;\n    public const string MyChatMember = PropertyNames.MyChatMember;\n    public const string ChatMember = PropertyNames.ChatMember;\n    public const string ChatJoinRequest = PropertyNames.ChatJoinRequest;\n    public const string ChatBoost = PropertyNames.ChatBoost;\n    public const string RemovedChatBoost = PropertyNames.RemovedChatBoost;\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/BackgroundFillConverter.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"BackgroundFill\"/> to or from JSON.\n/// </summary>\npublic sealed class BackgroundFillConverter : DiscriminatorJsonConverter<BackgroundFill>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/BackgroundTypeConverter.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"BackgroundType\"/> to or from JSON.\n/// </summary>\npublic sealed class BackgroundTypeConverter : DiscriminatorJsonConverter<BackgroundType>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/BotCommandScopeConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"BotCommandScope\"/> to or from JSON.\n/// </summary>\npublic sealed class BotCommandScopeConverter : DiscriminatorJsonConverter<BotCommandScope>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/ChatBoostSourceConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Text.Json;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n///     Converts an <see cref=\"ChatBoostSource\" /> to or from JSON.\n/// </summary>\npublic sealed class ChatBoostSourceConverter : JsonConverter<ChatBoostSource>\n{\n    /// <summary>\n    ///     Reads and converts the JSON to type <see cref=\"ChatBoostSource\" />.\n    /// </summary>\n    /// <param name=\"reader\">The reader.</param>\n    /// <param name=\"typeToConvert\">The type to convert.</param>\n    /// <param name=\"options\">An object that specifies serialization options to use.</param>\n    /// <returns>The converted value.</returns>\n    public override ChatBoostSource? Read(\n        ref Utf8JsonReader reader,\n        Type typeToConvert,\n        JsonSerializerOptions options\n    )\n    {\n        JsonDocument? jsonDoc = JsonSerializer.Deserialize<JsonDocument>(ref reader, options)!;\n        bool isValid = jsonDoc.RootElement.TryGetProperty(\n            PropertyNames.Source,\n            out JsonElement prop\n        );\n        string? rawText = jsonDoc.RootElement.GetRawText();\n        if (isValid)\n        {\n            if (prop.ValueKind != JsonValueKind.String)\n            {\n                throw new JsonException(\n                    $\"Property type of {PropertyNames.Source} must be a String.\"\n                );\n            }\n\n            string? source = prop.GetString();\n            return source switch\n            {\n                \"gift_code\" => JsonSerializer.Deserialize<ChatBoostSourceGiftCode>(\n                    rawText,\n                    options\n                ),\n                \"giveaway\" => JsonSerializer.Deserialize<ChatBoostSourceGiveaway>(rawText, options),\n                \"premium\" => JsonSerializer.Deserialize<ChatBoostSourcePremium>(rawText, options),\n                _ => throw new JsonException(\"Json object is not a valid ChatBoostSource.\"),\n            };\n        }\n\n        throw new JsonException($\"Missing required property: {PropertyNames.Source}\");\n    }\n\n    /// <summary>\n    ///     Writes a <see cref=\"ChatBoostSource\" /> object as JSON.\n    /// </summary>\n    /// <param name=\"writer\">The writer to write to.</param>\n    /// <param name=\"value\">The value to convert to JSON.</param>\n    /// <param name=\"options\">An object that specifies serialization options to use.</param>\n    public override void Write(\n        Utf8JsonWriter writer,\n        ChatBoostSource value,\n        JsonSerializerOptions options\n    )\n    {\n        if (value == null)\n        {\n            throw new ArgumentNullException(nameof(value));\n        }\n\n        Type? type = value.GetType();\n        JsonSerializer.Serialize(writer, value, type, options);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/ChatMemberConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>Converts an <see cref=\"ChatMember\"/> to or from JSON.</summary>\npublic sealed class ChatMemberConverter : DiscriminatorJsonConverter<ChatMember>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Status;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/DiscriminatorJsonConverter.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.Serialization;\nusing System.Text.Json;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Custom JSON converter that provides a way to retrieve the type of a class from a discriminator value.\n/// </summary>\n/// <typeparam name=\"T\"></typeparam>\npublic abstract class DiscriminatorJsonConverter<T> : JsonConverter<T>\n    where T : class\n{\n    /// <summary>\n    /// Gets the name of the property that contains the discriminator value.\n    /// </summary>\n    public abstract string PropertyName { get; }\n\n    private static ReadOnlyDictionary<string, IEnumerable<Type>>? discriminatorMapping;\n\n    /// <inheritdoc />\n    public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)\n    {\n        if (value == null)\n        {\n            throw new ArgumentNullException(nameof(value));\n        }\n        var type = value.GetType();\n        JsonSerializer.Serialize(writer, value, type, options);\n    }\n\n    /// <inheritdoc />\n    public override T? Read(\n        ref Utf8JsonReader reader,\n        Type typeToConvert,\n        JsonSerializerOptions options\n    )\n    {\n        var jsonDoc = JsonSerializer.Deserialize<JsonDocument>(ref reader, options)!;\n        var prop = jsonDoc.RootElement.GetProperty(this.PropertyName);\n        var rawText = jsonDoc.RootElement.GetRawText();\n        var discriminatorValue =\n            prop.GetString()\n            ?? throw new JsonException($\"Property type of {this.PropertyName} must be a String.\");\n\n        // Load mapping if it hasn't been loaded yet\n        discriminatorMapping ??= LoadDiscriminatorMapping(this.PropertyName);\n\n        if (discriminatorMapping.TryGetValue(discriminatorValue, out var types))\n        {\n            Type type;\n            if (types.Count() > 1)\n            {\n                // Select the type with more propertie present in the json\n                type = types\n                    .OrderByDescending(t =>\n                    {\n                        var properties = t.GetProperties()\n                            .Where(p => p.GetCustomAttribute<JsonPropertyNameAttribute>() != null);\n                        var count = 0;\n                        foreach (var property in properties)\n                        {\n                            var propertyName = property\n                                .GetCustomAttribute<JsonPropertyNameAttribute>()\n                                ?.Name;\n                            if (\n                                !string.IsNullOrEmpty(propertyName)\n                                && jsonDoc.RootElement.TryGetProperty(property.Name, out _)\n                            )\n                            {\n                                count++;\n                            }\n                        }\n                        return count;\n                    })\n                    .First();\n            }\n            else\n            {\n                type = types.First();\n            }\n\n            var @object =\n                JsonSerializer.Deserialize(rawText, type, options)\n                ?? throw new JsonException($\"Json object is not a valid {type.Name}.\");\n            return (T)@object;\n        }\n\n        throw new InvalidOperationException(\n            $\"Cannot find type for discriminator value {discriminatorValue}\"\n        );\n    }\n\n    private static ReadOnlyDictionary<string, IEnumerable<Type>> LoadDiscriminatorMapping(\n        string propertyName\n    )\n    {\n        // Get all classes that inherit from T\n        var classes = typeof(T).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(T)));\n        // Create a dictionary of the discriminator values and the corresponding type\n        var mappings = new Dictionary<string, IEnumerable<Type>>();\n        foreach (var c in classes)\n        {\n            // Creates a new instance of the class without calling the constructor\n            var instance = FormatterServices.GetUninitializedObject(c);\n            // Try to get the discriminator value\n            var discriminator = c.GetProperties()\n                .FirstOrDefault(p =>\n                    p.GetCustomAttribute<JsonPropertyNameAttribute>()?.Name == propertyName\n                )\n                ?.GetValue(instance);\n            if (discriminator is string discriminatorValue)\n            {\n                if (mappings.TryGetValue(discriminatorValue, out IEnumerable<Type>? value))\n                {\n                    var types = value.Concat([c]);\n                    mappings[discriminatorValue] = types;\n                }\n                else\n                {\n                    mappings.Add(discriminatorValue, [c]);\n                }\n                continue;\n            }\n\n            throw new InvalidOperationException($\"Cannot get discriminator value from {c.Name}\");\n        }\n\n        return new ReadOnlyDictionary<string, IEnumerable<Type>>(mappings);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/InlineQueryResultConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.InlineMode;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>Converts an <see cref=\"InlineQueryResult\"/> to or from JSON.</summary>\npublic sealed class InlineQueryResultConverter : DiscriminatorJsonConverter<InlineQueryResult>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/InputMediaConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"InputMedia\"/> to or from JSON.\n/// </summary>\npublic sealed class InputMediaConverter : DiscriminatorJsonConverter<InputMedia>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/InputMessageContentConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Text.Json;\nusing Telegram.BotAPI.InlineMode;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n///     Converts an <see cref=\"InputMessageContent\" /> to or from JSON.\n/// </summary>\npublic sealed class InputMessageContentConverter : JsonConverter<InputMessageContent>\n{\n    /// <summary>\n    ///     Reads and converts the JSON to type <see cref=\"InputMessageContent\" />.\n    /// </summary>\n    /// <param name=\"reader\">The reader.</param>\n    /// <param name=\"typeToConvert\">The type to convert.</param>\n    /// <param name=\"options\">An object that specifies serialization options to use.</param>\n    /// <returns>The converted value.</returns>\n    public override InputMessageContent? Read(\n        ref Utf8JsonReader reader,\n        Type typeToConvert,\n        JsonSerializerOptions options\n    )\n    {\n        JsonDocument? jsonDoc = JsonSerializer.Deserialize<JsonDocument>(ref reader, options)!;\n        string? rawText = jsonDoc.RootElement.GetRawText();\n        if (jsonDoc.RootElement.TryGetProperty(PropertyNames.MessageText, out JsonElement _))\n        {\n            return JsonSerializer.Deserialize<InputTextMessageContent>(rawText, options);\n        }\n\n        if (jsonDoc.RootElement.TryGetProperty(PropertyNames.Latitude, out JsonElement _))\n        {\n            if (jsonDoc.RootElement.TryGetProperty(PropertyNames.Address, out JsonElement _))\n            {\n                return JsonSerializer.Deserialize<InputVenueMessageContent>(rawText, options);\n            }\n\n            return JsonSerializer.Deserialize<InputLocationMessageContent>(rawText, options);\n        }\n\n        if (jsonDoc.RootElement.TryGetProperty(PropertyNames.PhoneNumber, out JsonElement _))\n        {\n            return JsonSerializer.Deserialize<InputContactMessageContent>(rawText, options);\n        }\n\n        if (jsonDoc.RootElement.TryGetProperty(PropertyNames.Payload, out JsonElement _))\n        {\n            return JsonSerializer.Deserialize<InputInvoiceMessageContent>(rawText, options);\n        }\n\n        throw new JsonException(\"Json object is not a valid InputMessageContent.\");\n    }\n\n    /// <summary>\n    ///     Writes a <see cref=\"InputMessageContent\" /> object as JSON.\n    /// </summary>\n    /// <param name=\"writer\">The writer to write to.</param>\n    /// <param name=\"value\">The value to convert to JSON.</param>\n    /// <param name=\"options\">An object that specifies serialization options to use.</param>\n    public override void Write(\n        Utf8JsonWriter writer,\n        InputMessageContent value,\n        JsonSerializerOptions options\n    )\n    {\n        if (value == null)\n        {\n            throw new ArgumentNullException(nameof(value));\n        }\n\n        Type? type = value.GetType();\n        JsonSerializer.Serialize(writer, value, type, options);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/InputPaidMediaConverter.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"InputPaidMedia\"/> to or from JSON.\n/// </summary>\npublic sealed class InputPaidMediaConverter : DiscriminatorJsonConverter<InputPaidMedia>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/InputProfilePhotoConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>Converts an <see cref=\"InputProfilePhoto\"/> to or from JSON.</summary>\npublic sealed class InputProfilePhotoConverter : DiscriminatorJsonConverter<InputProfilePhoto>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/InputStoryContentConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>Converts an <see cref=\"InputStoryContent\"/> to or from JSON.</summary>\npublic sealed class InputStoryContentConverter : DiscriminatorJsonConverter<InputStoryContent>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/MaybeInaccessibleMessageConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Text.Json;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n///     Converts an <see cref=\"MaybeInaccessibleMessage\" /> to or from JSON.\n/// </summary>\npublic sealed class MaybeInaccessibleMessageConverter : JsonConverter<MaybeInaccessibleMessage>\n{\n    /// <summary>\n    ///     Reads and converts the JSON to type <see cref=\"MaybeInaccessibleMessage\" />.\n    /// </summary>\n    /// <param name=\"reader\">The reader.</param>\n    /// <param name=\"typeToConvert\">The type to convert.</param>\n    /// <param name=\"options\">An object that specifies serialization options to use.</param>\n    /// <returns>The converted value.</returns>\n    public override MaybeInaccessibleMessage? Read(\n        ref Utf8JsonReader reader,\n        Type typeToConvert,\n        JsonSerializerOptions options\n    )\n    {\n        JsonDocument? jsonDoc = JsonSerializer.Deserialize<JsonDocument>(ref reader, options)!;\n        bool isValid = jsonDoc.RootElement.TryGetProperty(PropertyNames.Date, out JsonElement prop);\n        string? rawText = jsonDoc.RootElement.GetRawText();\n        if (isValid)\n        {\n            uint date = prop.GetUInt32();\n            if (date == 0)\n            {\n                return JsonSerializer.Deserialize<InaccessibleMessage>(rawText, options);\n            }\n\n            return JsonSerializer.Deserialize<Message>(rawText, options);\n        }\n\n        throw new JsonException($\"Missing required property: {PropertyNames.Date}\");\n    }\n\n    /// <summary>\n    ///     Writes a <see cref=\"MaybeInaccessibleMessage\" /> object as JSON.\n    /// </summary>\n    /// <param name=\"writer\">The writer to write to.</param>\n    /// <param name=\"value\">The value to convert to JSON.</param>\n    /// <param name=\"options\">An object that specifies serialization options to use.</param>\n    public override void Write(\n        Utf8JsonWriter writer,\n        MaybeInaccessibleMessage value,\n        JsonSerializerOptions options\n    )\n    {\n        if (value == null)\n        {\n            throw new ArgumentNullException(nameof(value));\n        }\n\n        Type? type = value.GetType();\n        JsonSerializer.Serialize(writer, value, type, options);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/MenuButtonConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>Converts an <see cref=\"MenuButton\"/> to or from JSON.</summary>\npublic sealed class MenuButtonConverter : DiscriminatorJsonConverter<MenuButton>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/MessageOriginConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"MessageOrigin\"/> to or from JSON.\n/// </summary>\npublic sealed class MessageOriginConverter : DiscriminatorJsonConverter<MessageOrigin>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/OwnedGiftConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>Converts an <see cref=\"OwnedGift\"/> to or from JSON.</summary>\npublic sealed class OwnedGiftConverter : DiscriminatorJsonConverter<OwnedGift>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/PaidMediaConverter.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"PaidMedia\"/> to or from JSON.\n/// </summary>\npublic sealed class PaidMediaConverter : DiscriminatorJsonConverter<PaidMedia>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/PassportElementErrorConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.TelegramPassport;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"PassportElementError\"/> to or from JSON.\n/// </summary>\npublic sealed class PassportElementErrorConverter : DiscriminatorJsonConverter<PassportElementError>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Source;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/ReactionTypeConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"ReactionType\"/> to or from JSON.\n/// </summary>\npublic sealed class ReactionTypeConverter : DiscriminatorJsonConverter<ReactionType>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/ReplyMarkupConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Text.Json;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n///     Converts an <see cref=\"ReplyMarkup\" /> to or from JSON.\n/// </summary>\npublic sealed class ReplyMarkupConverter : JsonConverter<ReplyMarkup>\n{\n    /// <summary>\n    ///     Reads and converts the JSON to type <see cref=\"ReplyMarkup\" />.\n    /// </summary>\n    /// <param name=\"reader\">The reader.</param>\n    /// <param name=\"typeToConvert\">The type to convert.</param>\n    /// <param name=\"options\">An object that specifies serialization options to use.</param>\n    /// <returns>The converted value.</returns>\n    public override ReplyMarkup? Read(\n        ref Utf8JsonReader reader,\n        Type typeToConvert,\n        JsonSerializerOptions options\n    )\n    {\n        JsonElement replymarkup = JsonSerializer.Deserialize<JsonElement>(ref reader, options)!;\n        string? rawText = replymarkup.GetRawText();\n        if (replymarkup.TryGetProperty(PropertyNames.ForceReply, out _))\n        {\n            return JsonSerializer.Deserialize<ForceReply>(rawText, options);\n        }\n\n        if (replymarkup.TryGetProperty(PropertyNames.Keyboard, out _))\n        {\n            return JsonSerializer.Deserialize<ReplyKeyboardMarkup>(rawText, options);\n        }\n\n        if (replymarkup.TryGetProperty(PropertyNames.InlineKeyboard, out _))\n        {\n            return JsonSerializer.Deserialize<InlineKeyboardMarkup>(rawText, options);\n        }\n\n        if (replymarkup.TryGetProperty(PropertyNames.RemoveKeyboard, out _))\n        {\n            return JsonSerializer.Deserialize<ReplyKeyboardRemove>(rawText, options);\n        }\n\n        throw new JsonException(\"Json object is not a valid reply markup.\");\n    }\n\n    /// <summary>\n    ///     Writes a <see cref=\"ReplyMarkup\" /> object as JSON.\n    /// </summary>\n    /// <param name=\"writer\">The writer to write to.</param>\n    /// <param name=\"value\">The value to convert to JSON.</param>\n    /// <param name=\"options\">An object that specifies serialization options to use.</param>\n    public override void Write(\n        Utf8JsonWriter writer,\n        ReplyMarkup value,\n        JsonSerializerOptions options\n    )\n    {\n        if (value == null)\n        {\n            throw new ArgumentNullException(nameof(value));\n        }\n\n        Type? type = value.GetType();\n        JsonSerializer.Serialize(writer, value, type, options);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/RevenueWithdrawalStateConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.Payments;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"RevenueWithdrawalState\"/> to or from JSON.\n/// </summary>\npublic sealed class RevenueWithdrawalStateConverter\n    : DiscriminatorJsonConverter<RevenueWithdrawalState>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/StoryAreaTypeConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>Converts an <see cref=\"StoryAreaType\"/> to or from JSON.</summary>\npublic sealed class StoryAreaTypeConverter : DiscriminatorJsonConverter<StoryAreaType>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Converters/TransactionPartnerConverter.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.Payments;\n\nnamespace Telegram.BotAPI.Converters;\n\n/// <summary>\n/// Converts an <see cref=\"TransactionPartner\"/> to or from JSON.\n/// </summary>\npublic sealed class TransactionPartnerConverter : DiscriminatorJsonConverter<TransactionPartner>\n{\n    /// <inheritdoc />\n    public override string PropertyName => PropertyNames.Type;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Games/Args/SendGameArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Games;\n\n/// <summary>\n/// Represents the arguments of the \"SendGame\" method.\n/// </summary>\npublic class SendGameArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendGameArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em>. Games can't be sent to channel direct messages chats and channel chats.</param>\n    /// <param name=\"gameShortName\">Short name of the game, serves as the unique identifier for the game. Set up your games via <a href=\"https://t.me/botfather\">@BotFather</a>.</param>\n    public SendGameArgs(long chatId, string gameShortName)\n    {\n        this.ChatId = chatId;\n        this.GameShortName =\n            gameShortName ?? throw new ArgumentNullException(nameof(gameShortName));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendGameArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em>. Games can't be sent to channel direct messages chats and channel chats.</param>\n    /// <param name=\"gameShortName\">Short name of the game, serves as the unique identifier for the game. Set up your games via <a href=\"https://t.me/botfather\">@BotFather</a>.</param>\n    public SendGameArgs(string chatId, string gameShortName)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.GameShortName =\n            gameShortName ?? throw new ArgumentNullException(nameof(gameShortName));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot in the format <em>@username</em>. Games can't be sent to channel direct messages chats and channel chats.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Short name of the game, serves as the unique identifier for the game. Set up your games via <a href=\"https://t.me/botfather\">@BotFather</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GameShortName)]\n    public string GameShortName { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Games/Args/SetGameScoreArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Games;\n\n/// <summary>\n/// Represents the arguments of the \"SetGameScore\" method.\n/// </summary>\npublic class SetGameScoreArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetGameScoreArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">User identifier</param>\n    /// <param name=\"score\">New score, must be non-negative</param>\n    public SetGameScoreArgs(long userId, int score)\n    {\n        this.UserId = userId;\n        this.Score = score;\n    }\n\n    /// <summary>\n    /// User identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// New score, must be non-negative\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Score)]\n    public int Score { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Force)]\n    public bool? Force { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the game message should not be automatically edited to include the current scoreboard\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableEditMessage)]\n    public bool? DisableEditMessage { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public long? ChatId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Identifier of the sent message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int? MessageId { get; set; }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Games/CallbackGame.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Games;\n\n/// <summary>\n/// A placeholder, currently holds no information. Use <a href=\"https://t.me/botfather\">BotFather</a> to set up your game.\n/// </summary>\npublic class CallbackGame { }\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Games/Game.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Games;\n\n/// <summary>\n/// This object represents a game. Use BotFather to create and edit games, their short names will act as unique identifiers.\n/// </summary>\npublic class Game\n{\n    /// <summary>\n    /// Title of the game\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Description of the game\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string Description { get; set; } = null!;\n\n    /// <summary>\n    /// Photo that will be displayed in the game message in chats.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public IEnumerable<PhotoSize> Photo { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Brief description of the game or high scores included in the game message. Can be automatically edited to include current high scores for the game when the bot calls <a href=\"https://core.telegram.org/bots/api#setgamescore\">setGameScore</a>, or manually edited using <a href=\"https://core.telegram.org/bots/api#editmessagetext\">editMessageText</a>. 0-4096 characters.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Optional. Special entities that appear in <em>text</em>, such as usernames, URLs, bot commands, etc.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Animation that will be displayed in the game message in chats. Upload via <a href=\"https://t.me/botfather\">BotFather</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Animation)]\n    public Animation? Animation { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Games/GameHighScore.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Games;\n\n/// <summary>\n/// This object represents one row of the high scores table for a game.\n/// </summary>\npublic class GameHighScore\n{\n    /// <summary>\n    /// Position in high score table for the game\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Position)]\n    public int Position { get; set; }\n\n    /// <summary>\n    /// User\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User User { get; set; } = null!;\n\n    /// <summary>\n    /// Score\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Score)]\n    public int Score { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Games/getGameHighScores.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Games;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class GamesExtensions\n{\n    /// <summary>\n    /// Use this method to get data for high score tables. Will return the score of the specified user and several of their neighbors in a game. Returns an Array of <see cref=\"GameHighScore\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Target user id</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the sent message</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<GameHighScore> GetGameHighScores(\n        this ITelegramBotClient client,\n        long userId,\n        long? chatId = null,\n        int? messageId = null,\n        string? inlineMessageId = null\n    ) =>\n        client\n            .GetGameHighScoresAsync(userId, chatId, messageId, inlineMessageId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to get data for high score tables. Will return the score of the specified user and several of their neighbors in a game. Returns an Array of <see cref=\"GameHighScore\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Target user id</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the sent message</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<GameHighScore>> GetGameHighScoresAsync(\n        this ITelegramBotClient client,\n        long userId,\n        long? chatId = null,\n        int? messageId = null,\n        string? inlineMessageId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n        if (chatId is not null)\n        {\n            args.Add(PropertyNames.ChatId, chatId);\n        }\n        if (messageId is not null)\n        {\n            args.Add(PropertyNames.MessageId, messageId);\n        }\n        if (inlineMessageId is not null)\n        {\n            args.Add(PropertyNames.InlineMessageId, inlineMessageId);\n        }\n\n        return client.CallMethodAsync<IEnumerable<GameHighScore>>(\n            MethodNames.GetGameHighScores,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Games/sendGame.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Games;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class GamesExtensions\n{\n    /// <summary>\n    /// Use this method to send a game. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendGame\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendGame(this ITelegramBotClient client, SendGameArgs args) =>\n        client.SendGameAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send a game. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendGame\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendGameAsync(\n        this ITelegramBotClient client,\n        SendGameArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendGame, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send a game. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em>. Games can't be sent to channel direct messages chats and channel chats.</param>\n    /// <param name=\"gameShortName\">Short name of the game, serves as the unique identifier for the game. Set up your games via <a href=\"https://t.me/botfather\">@BotFather</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendGame(\n        this ITelegramBotClient client,\n        long chatId,\n        string gameShortName,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendGameAsync(\n                chatId,\n                gameShortName,\n                businessConnectionId,\n                messageThreadId,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send a game. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em>. Games can't be sent to channel direct messages chats and channel chats.</param>\n    /// <param name=\"gameShortName\">Short name of the game, serves as the unique identifier for the game. Set up your games via <a href=\"https://t.me/botfather\">@BotFather</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendGameAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string gameShortName,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.GameShortName,\n                gameShortName ?? throw new ArgumentNullException(nameof(gameShortName))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendGame, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send a game. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em>. Games can't be sent to channel direct messages chats and channel chats.</param>\n    /// <param name=\"gameShortName\">Short name of the game, serves as the unique identifier for the game. Set up your games via <a href=\"https://t.me/botfather\">@BotFather</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendGame(\n        this ITelegramBotClient client,\n        string chatId,\n        string gameShortName,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendGameAsync(\n                chatId,\n                gameShortName,\n                businessConnectionId,\n                messageThreadId,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send a game. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em>. Games can't be sent to channel direct messages chats and channel chats.</param>\n    /// <param name=\"gameShortName\">Short name of the game, serves as the unique identifier for the game. Set up your games via <a href=\"https://t.me/botfather\">@BotFather</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendGameAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string gameShortName,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.GameShortName,\n                gameShortName ?? throw new ArgumentNullException(nameof(gameShortName))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendGame, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Games/setGameScore.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Games;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class GamesExtensions\n{\n    /// <summary>\n    /// Use this method to set the score of the specified user in a game message. On success, if the message is not an inline message, the <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Returns an error, if the new score is not greater than the user's current score in the chat and <em>force</em> is <em>False</em>.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetGameScore\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static TResult SetGameScore<TResult>(\n        this ITelegramBotClient client,\n        SetGameScoreArgs args\n    ) => client.SetGameScoreAsync<TResult>(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set the score of the specified user in a game message. On success, if the message is not an inline message, the <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Returns an error, if the new score is not greater than the user's current score in the chat and <em>force</em> is <em>False</em>.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetGameScore\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<TResult> SetGameScoreAsync<TResult>(\n        this ITelegramBotClient client,\n        SetGameScoreArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<TResult>(MethodNames.SetGameScore, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to set the score of the specified user in a game message. On success, if the message is not an inline message, the <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Returns an error, if the new score is not greater than the user's current score in the chat and <em>force</em> is <em>False</em>.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier</param>\n    /// <param name=\"score\">New score, must be non-negative</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the sent message</param>\n    /// <param name=\"force\">Pass <em>True</em> if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters</param>\n    /// <param name=\"disableEditMessage\">Pass <em>True</em> if the game message should not be automatically edited to include the current scoreboard</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SetGameScore(\n        this ITelegramBotClient client,\n        long userId,\n        int score,\n        long chatId,\n        int messageId,\n        bool? force = null,\n        bool? disableEditMessage = null\n    ) =>\n        client\n            .SetGameScoreAsync(userId, score, chatId, messageId, force, disableEditMessage)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to set the score of the specified user in a game message. On success, if the message is not an inline message, the <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Returns an error, if the new score is not greater than the user's current score in the chat and <em>force</em> is <em>False</em>.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier</param>\n    /// <param name=\"score\">New score, must be non-negative</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the sent message</param>\n    /// <param name=\"force\">Pass <em>True</em> if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters</param>\n    /// <param name=\"disableEditMessage\">Pass <em>True</em> if the game message should not be automatically edited to include the current scoreboard</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SetGameScoreAsync(\n        this ITelegramBotClient client,\n        long userId,\n        int score,\n        long chatId,\n        int messageId,\n        bool? force = null,\n        bool? disableEditMessage = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Score, score },\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (force is not null)\n        {\n            args.Add(PropertyNames.Force, force);\n        }\n        if (disableEditMessage is not null)\n        {\n            args.Add(PropertyNames.DisableEditMessage, disableEditMessage);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SetGameScore, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to set the score of the specified user in a game message. On success, if the message is not an inline message, the <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Returns an error, if the new score is not greater than the user's current score in the chat and <em>force</em> is <em>False</em>.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier</param>\n    /// <param name=\"score\">New score, must be non-negative</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"force\">Pass <em>True</em> if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters</param>\n    /// <param name=\"disableEditMessage\">Pass <em>True</em> if the game message should not be automatically edited to include the current scoreboard</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetGameScore(\n        this ITelegramBotClient client,\n        long userId,\n        int score,\n        string inlineMessageId,\n        bool? force = null,\n        bool? disableEditMessage = null\n    ) =>\n        client\n            .SetGameScoreAsync(userId, score, inlineMessageId, force, disableEditMessage)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to set the score of the specified user in a game message. On success, if the message is not an inline message, the <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Returns an error, if the new score is not greater than the user's current score in the chat and <em>force</em> is <em>False</em>.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier</param>\n    /// <param name=\"score\">New score, must be non-negative</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"force\">Pass <em>True</em> if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters</param>\n    /// <param name=\"disableEditMessage\">Pass <em>True</em> if the game message should not be automatically edited to include the current scoreboard</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetGameScoreAsync(\n        this ITelegramBotClient client,\n        long userId,\n        int score,\n        string inlineMessageId,\n        bool? force = null,\n        bool? disableEditMessage = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Score, score },\n            {\n                PropertyNames.InlineMessageId,\n                inlineMessageId ?? throw new ArgumentNullException(nameof(inlineMessageId))\n            },\n        };\n        if (force is not null)\n        {\n            args.Add(PropertyNames.Force, force);\n        }\n        if (disableEditMessage is not null)\n        {\n            args.Add(PropertyNames.DisableEditMessage, disableEditMessage);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetGameScore, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/GettingUpdates/Args/GetUpdatesArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// Represents the arguments of the \"GetUpdates\" method.\n/// </summary>\npublic class GetUpdatesArgs\n{\n    /// <summary>\n    /// Identifier of the first update to be returned. Must be greater by one than the highest among the identifiers of previously received updates. By default, updates starting with the earliest unconfirmed update are returned. An update is considered confirmed as soon as <a href=\"https://core.telegram.org/bots/api#getupdates\">getUpdates</a> is called with an <em>offset</em> higher than its <em>update_id</em>. The negative offset can be specified to retrieve updates starting from <em>-offset</em> update from the end of the updates queue. All previous updates will be forgotten.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Offset)]\n    public int? Offset { get; set; }\n\n    /// <summary>\n    /// Limits the number of updates to be retrieved. Values between 1-100 are accepted. Defaults to 100.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Limit)]\n    public int? Limit { get; set; }\n\n    /// <summary>\n    /// Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be positive, short polling should be used for testing purposes only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Timeout)]\n    public int? Timeout { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of the update types you want your bot to receive. For example, specify <em>[\"message\", \"edited_channel_post\", \"callback_query\"]</em> to only receive updates of these types. See <see cref=\"Update\"/> for a complete list of available update types. Specify an empty list to receive all update types except <em>chat_member</em>, <em>message_reaction</em>, and <em>message_reaction_count</em> (default). If not specified, the previous setting will be used.<br /><br />Please note that this parameter doesn't affect updates created before the call to getUpdates, so unwanted updates may be received for a short period of time.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowedUpdates)]\n    public IEnumerable<string>? AllowedUpdates { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/GettingUpdates/Args/SetWebhookArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// Represents the arguments of the \"SetWebhook\" method.\n/// </summary>\npublic class SetWebhookArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetWebhookArgs\"/> class.\n    /// </summary>\n    /// <param name=\"url\">HTTPS URL to send updates to. Use an empty string to remove webhook integration</param>\n    public SetWebhookArgs(string url)\n    {\n        this.Url = url ?? throw new ArgumentNullException(nameof(url));\n    }\n\n    /// <summary>\n    /// HTTPS URL to send updates to. Use an empty string to remove webhook integration\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string Url { get; set; }\n\n    /// <summary>\n    /// Upload your public key certificate so that the root certificate in use can be checked. See our <a href=\"https://core.telegram.org/bots/self-signed\">self-signed guide</a> for details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Certificate)]\n    public InputFile? Certificate { get; set; }\n\n    /// <summary>\n    /// The fixed IP address which will be used to send webhook requests instead of the IP address resolved through DNS\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IpAddress)]\n    public string? IpAddress { get; set; }\n\n    /// <summary>\n    /// The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery, 1-100. Defaults to <em>40</em>. Use lower values to limit the load on your bot's server, and higher values to increase your bot's throughput.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaxConnections)]\n    public int? MaxConnections { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of the update types you want your bot to receive. For example, specify <em>[\"message\", \"edited_channel_post\", \"callback_query\"]</em> to only receive updates of these types. See <see cref=\"Update\"/> for a complete list of available update types. Specify an empty list to receive all update types except <em>chat_member</em>, <em>message_reaction</em>, and <em>message_reaction_count</em> (default). If not specified, the previous setting will be used.<br />Please note that this parameter doesn't affect updates created before the call to the setWebhook, so unwanted updates may be received for a short period of time.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowedUpdates)]\n    public IEnumerable<string>? AllowedUpdates { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to drop all pending updates\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DropPendingUpdates)]\n    public bool? DropPendingUpdates { get; set; }\n\n    /// <summary>\n    /// A secret token to be sent in a header “X-Telegram-Bot-Api-Secret-Token” in every webhook request, 1-256 characters. Only characters <em>A-Z</em>, <em>a-z</em>, <em>0-9</em>, <em>_</em> and <em>-</em> are allowed. The header is useful to ensure that the request comes from a webhook set by you.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SecretToken)]\n    public string? SecretToken { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/GettingUpdates/Update.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.InlineMode;\nusing Telegram.BotAPI.Payments;\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// This <a href=\"https://core.telegram.org/bots/api#available-types\">object</a> represents an incoming update.<br />At most <strong>one</strong> of the optional fields can be present in any given update.\n/// </summary>\npublic class Update\n{\n    /// <summary>\n    /// The update's unique identifier. Update identifiers start from a certain positive number and increase sequentially. This identifier becomes especially handy if you're using <a href=\"https://core.telegram.org/bots/api#setwebhook\">webhooks</a>, since it allows you to ignore repeated updates or to restore the correct update sequence, should they get out of order. If there are no new updates for at least a week, then identifier of the next update will be chosen randomly instead of sequentially.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UpdateId)]\n    public int UpdateId { get; set; }\n\n    /// <summary>\n    /// Optional. New incoming message of any kind - text, photo, sticker, etc.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Message)]\n    public Message? Message { get; set; }\n\n    /// <summary>\n    /// Optional. New version of a message that is known to the bot and was edited. This update may at times be triggered by changes to message fields that are either unavailable or not actively used by your bot.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EditedMessage)]\n    public Message? EditedMessage { get; set; }\n\n    /// <summary>\n    /// Optional. New incoming channel post of any kind - text, photo, sticker, etc.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChannelPost)]\n    public Message? ChannelPost { get; set; }\n\n    /// <summary>\n    /// Optional. New version of a channel post that is known to the bot and was edited. This update may at times be triggered by changes to message fields that are either unavailable or not actively used by your bot.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EditedChannelPost)]\n    public Message? EditedChannelPost { get; set; }\n\n    /// <summary>\n    /// Optional. The bot was connected to or disconnected from a business account, or a user edited an existing connection with the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnection)]\n    public BusinessConnection? BusinessConnection { get; set; }\n\n    /// <summary>\n    /// Optional. New message from a connected business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessMessage)]\n    public Message? BusinessMessage { get; set; }\n\n    /// <summary>\n    /// Optional. New version of a message from a connected business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EditedBusinessMessage)]\n    public Message? EditedBusinessMessage { get; set; }\n\n    /// <summary>\n    /// Optional. Messages were deleted from a connected business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DeletedBusinessMessages)]\n    public BusinessMessagesDeleted? DeletedBusinessMessages { get; set; }\n\n    /// <summary>\n    /// Optional. New guest message. The bot can use the field <em>Message.guest_query_id</em> and the method <a href=\"https://core.telegram.org/bots/api#answerguestquery\">answerGuestQuery</a> to send a message in response.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GuestMessage)]\n    public Message? GuestMessage { get; set; }\n\n    /// <summary>\n    /// Optional. A reaction to a message was changed by a user. The bot must be an administrator in the chat and must explicitly specify <em>\"message_reaction\"</em> in the list of <em>allowed_updates</em> to receive these updates. The update isn't received for reactions set by bots.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageReaction)]\n    public MessageReactionUpdated? MessageReaction { get; set; }\n\n    /// <summary>\n    /// Optional. Reactions to a message with anonymous reactions were changed. The bot must be an administrator in the chat and must explicitly specify <em>\"message_reaction_count\"</em> in the list of <em>allowed_updates</em> to receive these updates. The updates are grouped and can be sent with delay up to a few minutes.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageReactionCount)]\n    public MessageReactionCountUpdated? MessageReactionCount { get; set; }\n\n    /// <summary>\n    /// Optional. New incoming <a href=\"https://core.telegram.org/bots/api#inline-mode\">inline</a> query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineQuery)]\n    public InlineQuery? InlineQuery { get; set; }\n\n    /// <summary>\n    /// Optional. The result of an <a href=\"https://core.telegram.org/bots/api#inline-mode\">inline</a> query that was chosen by a user and sent to their chat partner. Please see our documentation on the <a href=\"https://core.telegram.org/bots/inline#collecting-feedback\">feedback collecting</a> for details on how to enable these updates for your bot.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChosenInlineResult)]\n    public ChosenInlineResult? ChosenInlineResult { get; set; }\n\n    /// <summary>\n    /// Optional. New incoming callback query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CallbackQuery)]\n    public CallbackQuery? CallbackQuery { get; set; }\n\n    /// <summary>\n    /// Optional. New incoming shipping query. Only for invoices with flexible price\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShippingQuery)]\n    public ShippingQuery? ShippingQuery { get; set; }\n\n    /// <summary>\n    /// Optional. New incoming pre-checkout query. Contains full information about checkout\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PreCheckoutQuery)]\n    public PreCheckoutQuery? PreCheckoutQuery { get; set; }\n\n    /// <summary>\n    /// Optional. A user purchased paid media with a non-empty payload sent by the bot in a non-channel chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PurchasedPaidMedia)]\n    public PaidMediaPurchased? PurchasedPaidMedia { get; set; }\n\n    /// <summary>\n    /// Optional. New poll state. Bots receive only updates about manually stopped polls and polls, which are sent by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Poll)]\n    public Poll? Poll { get; set; }\n\n    /// <summary>\n    /// Optional. A user changed their answer in a non-anonymous poll. Bots receive new votes only in polls that were sent by the bot itself.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PollAnswer)]\n    public PollAnswer? PollAnswer { get; set; }\n\n    /// <summary>\n    /// Optional. The bot's chat member status was updated in a chat. For private chats, this update is received only when the bot is blocked or unblocked by the user.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MyChatMember)]\n    public ChatMemberUpdated? MyChatMember { get; set; }\n\n    /// <summary>\n    /// Optional. A chat member's status was updated in a chat. The bot must be an administrator in the chat and must explicitly specify <em>\"chat_member\"</em> in the list of <em>allowed_updates</em> to receive these updates.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatMember)]\n    public ChatMemberUpdated? ChatMember { get; set; }\n\n    /// <summary>\n    /// Optional. A request to join the chat has been sent. The bot must have the <em>can_invite_users</em> administrator right in the chat to receive these updates.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatJoinRequest)]\n    public ChatJoinRequest? ChatJoinRequest { get; set; }\n\n    /// <summary>\n    /// Optional. A chat boost was added or changed. The bot must be an administrator in the chat to receive these updates.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatBoost)]\n    public ChatBoostUpdated? ChatBoost { get; set; }\n\n    /// <summary>\n    /// Optional. A boost was removed from a chat. The bot must be an administrator in the chat to receive these updates.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RemovedChatBoost)]\n    public ChatBoostRemoved? RemovedChatBoost { get; set; }\n\n    /// <summary>\n    /// Optional. A new bot was created to be managed by the bot, or token or owner of a managed bot was changed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ManagedBot)]\n    public ManagedBotUpdated? ManagedBot { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/GettingUpdates/WebhookInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// Describes the current status of a webhook.\n/// </summary>\npublic class WebhookInfo\n{\n    /// <summary>\n    /// Webhook URL, may be empty if webhook is not set up\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string Url { get; set; } = null!;\n\n    /// <summary>\n    /// <em>True</em>, if a custom certificate was provided for webhook certificate checks\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HasCustomCertificate)]\n    public bool HasCustomCertificate { get; set; }\n\n    /// <summary>\n    /// Number of updates awaiting delivery\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PendingUpdateCount)]\n    public int PendingUpdateCount { get; set; }\n\n    /// <summary>\n    /// Optional. Currently used webhook IP address\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IpAddress)]\n    public string? IpAddress { get; set; }\n\n    /// <summary>\n    /// Optional. Unix time for the most recent error that happened when trying to deliver an update via webhook\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastErrorDate)]\n    public int? LastErrorDate { get; set; }\n\n    /// <summary>\n    /// Optional. Error message in human-readable format for the most recent error that happened when trying to deliver an update via webhook\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastErrorMessage)]\n    public string? LastErrorMessage { get; set; }\n\n    /// <summary>\n    /// Optional. Unix time of the most recent error that happened when trying to synchronize available updates with Telegram datacenters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastSynchronizationErrorDate)]\n    public int? LastSynchronizationErrorDate { get; set; }\n\n    /// <summary>\n    /// Optional. The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaxConnections)]\n    public int? MaxConnections { get; set; }\n\n    /// <summary>\n    /// Optional. A list of update types the bot is subscribed to. Defaults to all update types except <em>chat_member</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowedUpdates)]\n    public IEnumerable<string>? AllowedUpdates { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/GettingUpdates/deleteWebhook.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class GettingUpdatesExtensions\n{\n    /// <summary>\n    /// Use this method to remove webhook integration if you decide to switch back to <a href=\"https://core.telegram.org/bots/api#getupdates\">getUpdates</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"dropPendingUpdates\">Pass <em>True</em> to drop all pending updates</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteWebhook(\n        this ITelegramBotClient client,\n        bool? dropPendingUpdates = null\n    ) => client.DeleteWebhookAsync(dropPendingUpdates).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to remove webhook integration if you decide to switch back to <a href=\"https://core.telegram.org/bots/api#getupdates\">getUpdates</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"dropPendingUpdates\">Pass <em>True</em> to drop all pending updates</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteWebhookAsync(\n        this ITelegramBotClient client,\n        bool? dropPendingUpdates = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (dropPendingUpdates is not null)\n        {\n            args.Add(PropertyNames.DropPendingUpdates, dropPendingUpdates);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteWebhook, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/GettingUpdates/getUpdates.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class GettingUpdatesExtensions\n{\n    /// <summary>\n    /// Use this method to receive incoming updates using long polling (<a href=\"https://en.wikipedia.org/wiki/Push_technology#Long_polling\">wiki</a>). Returns an Array of <see cref=\"Update\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetUpdates\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Update> GetUpdates(\n        this ITelegramBotClient client,\n        GetUpdatesArgs args\n    ) => client.GetUpdatesAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to receive incoming updates using long polling (<a href=\"https://en.wikipedia.org/wiki/Push_technology#Long_polling\">wiki</a>). Returns an Array of <see cref=\"Update\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetUpdates\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Update>> GetUpdatesAsync(\n        this ITelegramBotClient client,\n        GetUpdatesArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<IEnumerable<Update>>(\n            MethodNames.GetUpdates,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to receive incoming updates using long polling (<a href=\"https://en.wikipedia.org/wiki/Push_technology#Long_polling\">wiki</a>). Returns an Array of <see cref=\"Update\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"offset\">Identifier of the first update to be returned. Must be greater by one than the highest among the identifiers of previously received updates. By default, updates starting with the earliest unconfirmed update are returned. An update is considered confirmed as soon as <a href=\"https://core.telegram.org/bots/api#getupdates\">getUpdates</a> is called with an <em>offset</em> higher than its <em>update_id</em>. The negative offset can be specified to retrieve updates starting from <em>-offset</em> update from the end of the updates queue. All previous updates will be forgotten.</param>\n    /// <param name=\"limit\">Limits the number of updates to be retrieved. Values between 1-100 are accepted. Defaults to 100.</param>\n    /// <param name=\"timeout\">Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be positive, short polling should be used for testing purposes only.</param>\n    /// <param name=\"allowedUpdates\">A JSON-serialized list of the update types you want your bot to receive. For example, specify <em>[\"message\", \"edited_channel_post\", \"callback_query\"]</em> to only receive updates of these types. See <see cref=\"Update\"/> for a complete list of available update types. Specify an empty list to receive all update types except <em>chat_member</em>, <em>message_reaction</em>, and <em>message_reaction_count</em> (default). If not specified, the previous setting will be used.<br /><br />Please note that this parameter doesn't affect updates created before the call to getUpdates, so unwanted updates may be received for a short period of time.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Update> GetUpdates(\n        this ITelegramBotClient client,\n        int? offset = null,\n        int? limit = null,\n        int? timeout = null,\n        IEnumerable<string>? allowedUpdates = null\n    ) => client.GetUpdatesAsync(offset, limit, timeout, allowedUpdates).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to receive incoming updates using long polling (<a href=\"https://en.wikipedia.org/wiki/Push_technology#Long_polling\">wiki</a>). Returns an Array of <see cref=\"Update\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"offset\">Identifier of the first update to be returned. Must be greater by one than the highest among the identifiers of previously received updates. By default, updates starting with the earliest unconfirmed update are returned. An update is considered confirmed as soon as <a href=\"https://core.telegram.org/bots/api#getupdates\">getUpdates</a> is called with an <em>offset</em> higher than its <em>update_id</em>. The negative offset can be specified to retrieve updates starting from <em>-offset</em> update from the end of the updates queue. All previous updates will be forgotten.</param>\n    /// <param name=\"limit\">Limits the number of updates to be retrieved. Values between 1-100 are accepted. Defaults to 100.</param>\n    /// <param name=\"timeout\">Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be positive, short polling should be used for testing purposes only.</param>\n    /// <param name=\"allowedUpdates\">A JSON-serialized list of the update types you want your bot to receive. For example, specify <em>[\"message\", \"edited_channel_post\", \"callback_query\"]</em> to only receive updates of these types. See <see cref=\"Update\"/> for a complete list of available update types. Specify an empty list to receive all update types except <em>chat_member</em>, <em>message_reaction</em>, and <em>message_reaction_count</em> (default). If not specified, the previous setting will be used.<br /><br />Please note that this parameter doesn't affect updates created before the call to getUpdates, so unwanted updates may be received for a short period of time.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Update>> GetUpdatesAsync(\n        this ITelegramBotClient client,\n        int? offset = null,\n        int? limit = null,\n        int? timeout = null,\n        IEnumerable<string>? allowedUpdates = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n        if (timeout is not null)\n        {\n            args.Add(PropertyNames.Timeout, timeout);\n        }\n        if (allowedUpdates is not null)\n        {\n            args.Add(PropertyNames.AllowedUpdates, allowedUpdates);\n        }\n\n        return client.CallMethodAsync<IEnumerable<Update>>(\n            MethodNames.GetUpdates,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/GettingUpdates/getWebhookInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class GettingUpdatesExtensions\n{\n    /// <summary>\n    /// Use this method to get current webhook status. Requires no parameters. On success, returns a <see cref=\"WebhookInfo\"/> object. If the bot is using <a href=\"https://core.telegram.org/bots/api#getupdates\">getUpdates</a>, will return an object with the <em>url</em> field empty.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static WebhookInfo GetWebhookInfo(this ITelegramBotClient client) =>\n        client.GetWebhookInfoAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get current webhook status. Requires no parameters. On success, returns a <see cref=\"WebhookInfo\"/> object. If the bot is using <a href=\"https://core.telegram.org/bots/api#getupdates\">getUpdates</a>, will return an object with the <em>url</em> field empty.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<WebhookInfo> GetWebhookInfoAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<WebhookInfo>(\n            MethodNames.GetWebhookInfo,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/GettingUpdates/setWebhook.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.GettingUpdates;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class GettingUpdatesExtensions\n{\n    /// <summary>\n    /// Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized <see cref=\"Update\"/>. In case of an unsuccessful request (a request with response <a href=\"https://en.wikipedia.org/wiki/List_of_HTTP_status_codes\">HTTP status code</a> different from <em>2XY</em>), we will repeat the request and give up after a reasonable amount of attempts. Returns <em>True</em> on success.\n    /// If you'd like to make sure that the webhook was set by you, you can specify secret data in the parameter <em>secret_token</em>. If specified, the request will contain a header “X-Telegram-Bot-Api-Secret-Token” with the secret token as content.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetWebhook\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetWebhook(this ITelegramBotClient client, SetWebhookArgs args) =>\n        client.SetWebhookAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized <see cref=\"Update\"/>. In case of an unsuccessful request (a request with response <a href=\"https://en.wikipedia.org/wiki/List_of_HTTP_status_codes\">HTTP status code</a> different from <em>2XY</em>), we will repeat the request and give up after a reasonable amount of attempts. Returns <em>True</em> on success.\n    /// If you'd like to make sure that the webhook was set by you, you can specify secret data in the parameter <em>secret_token</em>. If specified, the request will contain a header “X-Telegram-Bot-Api-Secret-Token” with the secret token as content.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetWebhook\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetWebhookAsync(\n        this ITelegramBotClient client,\n        SetWebhookArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetWebhook, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized <see cref=\"Update\"/>. In case of an unsuccessful request (a request with response <a href=\"https://en.wikipedia.org/wiki/List_of_HTTP_status_codes\">HTTP status code</a> different from <em>2XY</em>), we will repeat the request and give up after a reasonable amount of attempts. Returns <em>True</em> on success.\n    /// If you'd like to make sure that the webhook was set by you, you can specify secret data in the parameter <em>secret_token</em>. If specified, the request will contain a header “X-Telegram-Bot-Api-Secret-Token” with the secret token as content.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"url\">HTTPS URL to send updates to. Use an empty string to remove webhook integration</param>\n    /// <param name=\"certificate\">Upload your public key certificate so that the root certificate in use can be checked. See our <a href=\"https://core.telegram.org/bots/self-signed\">self-signed guide</a> for details.</param>\n    /// <param name=\"ipAddress\">The fixed IP address which will be used to send webhook requests instead of the IP address resolved through DNS</param>\n    /// <param name=\"maxConnections\">The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery, 1-100. Defaults to <em>40</em>. Use lower values to limit the load on your bot's server, and higher values to increase your bot's throughput.</param>\n    /// <param name=\"allowedUpdates\">A JSON-serialized list of the update types you want your bot to receive. For example, specify <em>[\"message\", \"edited_channel_post\", \"callback_query\"]</em> to only receive updates of these types. See <see cref=\"Update\"/> for a complete list of available update types. Specify an empty list to receive all update types except <em>chat_member</em>, <em>message_reaction</em>, and <em>message_reaction_count</em> (default). If not specified, the previous setting will be used.<br />Please note that this parameter doesn't affect updates created before the call to the setWebhook, so unwanted updates may be received for a short period of time.</param>\n    /// <param name=\"dropPendingUpdates\">Pass <em>True</em> to drop all pending updates</param>\n    /// <param name=\"secretToken\">A secret token to be sent in a header “X-Telegram-Bot-Api-Secret-Token” in every webhook request, 1-256 characters. Only characters <em>A-Z</em>, <em>a-z</em>, <em>0-9</em>, <em>_</em> and <em>-</em> are allowed. The header is useful to ensure that the request comes from a webhook set by you.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetWebhook(\n        this ITelegramBotClient client,\n        string url,\n        InputFile? certificate = null,\n        string? ipAddress = null,\n        int? maxConnections = null,\n        IEnumerable<string>? allowedUpdates = null,\n        bool? dropPendingUpdates = null,\n        string? secretToken = null\n    ) =>\n        client\n            .SetWebhookAsync(\n                url,\n                certificate,\n                ipAddress,\n                maxConnections,\n                allowedUpdates,\n                dropPendingUpdates,\n                secretToken\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized <see cref=\"Update\"/>. In case of an unsuccessful request (a request with response <a href=\"https://en.wikipedia.org/wiki/List_of_HTTP_status_codes\">HTTP status code</a> different from <em>2XY</em>), we will repeat the request and give up after a reasonable amount of attempts. Returns <em>True</em> on success.\n    /// If you'd like to make sure that the webhook was set by you, you can specify secret data in the parameter <em>secret_token</em>. If specified, the request will contain a header “X-Telegram-Bot-Api-Secret-Token” with the secret token as content.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"url\">HTTPS URL to send updates to. Use an empty string to remove webhook integration</param>\n    /// <param name=\"certificate\">Upload your public key certificate so that the root certificate in use can be checked. See our <a href=\"https://core.telegram.org/bots/self-signed\">self-signed guide</a> for details.</param>\n    /// <param name=\"ipAddress\">The fixed IP address which will be used to send webhook requests instead of the IP address resolved through DNS</param>\n    /// <param name=\"maxConnections\">The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery, 1-100. Defaults to <em>40</em>. Use lower values to limit the load on your bot's server, and higher values to increase your bot's throughput.</param>\n    /// <param name=\"allowedUpdates\">A JSON-serialized list of the update types you want your bot to receive. For example, specify <em>[\"message\", \"edited_channel_post\", \"callback_query\"]</em> to only receive updates of these types. See <see cref=\"Update\"/> for a complete list of available update types. Specify an empty list to receive all update types except <em>chat_member</em>, <em>message_reaction</em>, and <em>message_reaction_count</em> (default). If not specified, the previous setting will be used.<br />Please note that this parameter doesn't affect updates created before the call to the setWebhook, so unwanted updates may be received for a short period of time.</param>\n    /// <param name=\"dropPendingUpdates\">Pass <em>True</em> to drop all pending updates</param>\n    /// <param name=\"secretToken\">A secret token to be sent in a header “X-Telegram-Bot-Api-Secret-Token” in every webhook request, 1-256 characters. Only characters <em>A-Z</em>, <em>a-z</em>, <em>0-9</em>, <em>_</em> and <em>-</em> are allowed. The header is useful to ensure that the request comes from a webhook set by you.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetWebhookAsync(\n        this ITelegramBotClient client,\n        string url,\n        InputFile? certificate = null,\n        string? ipAddress = null,\n        int? maxConnections = null,\n        IEnumerable<string>? allowedUpdates = null,\n        bool? dropPendingUpdates = null,\n        string? secretToken = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Url, url ?? throw new ArgumentNullException(nameof(url)) },\n        };\n        if (certificate is not null)\n        {\n            args.Add(PropertyNames.Certificate, certificate);\n        }\n        if (ipAddress is not null)\n        {\n            args.Add(PropertyNames.IpAddress, ipAddress);\n        }\n        if (maxConnections is not null)\n        {\n            args.Add(PropertyNames.MaxConnections, maxConnections);\n        }\n        if (allowedUpdates is not null)\n        {\n            args.Add(PropertyNames.AllowedUpdates, allowedUpdates);\n        }\n        if (dropPendingUpdates is not null)\n        {\n            args.Add(PropertyNames.DropPendingUpdates, dropPendingUpdates);\n        }\n        if (secretToken is not null)\n        {\n            args.Add(PropertyNames.SecretToken, secretToken);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SetWebhook, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/Args/AnswerInlineQueryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents the arguments of the \"AnswerInlineQuery\" method.\n/// </summary>\npublic class AnswerInlineQueryArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"AnswerInlineQueryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"inlineQueryId\">Unique identifier for the answered query</param>\n    /// <param name=\"results\">A JSON-serialized array of results for the inline query</param>\n    public AnswerInlineQueryArgs(string inlineQueryId, IEnumerable<InlineQueryResult> results)\n    {\n        this.InlineQueryId =\n            inlineQueryId ?? throw new ArgumentNullException(nameof(inlineQueryId));\n        this.Results = results ?? throw new ArgumentNullException(nameof(results));\n    }\n\n    /// <summary>\n    /// Unique identifier for the answered query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineQueryId)]\n    public string InlineQueryId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized array of results for the inline query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Results)]\n    public IEnumerable<InlineQueryResult> Results { get; set; }\n\n    /// <summary>\n    /// The maximum amount of time in seconds that the result of the inline query may be cached on the server. Defaults to 300.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CacheTime)]\n    public int? CacheTime { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if results may be cached on the server side only for the user that sent the query. By default, results may be returned to any user who sends the same query.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPersonal)]\n    public bool? IsPersonal { get; set; }\n\n    /// <summary>\n    /// Pass the offset that a client should send in the next query with the same text to receive more results. Pass an empty string if there are no more results or if you don't support pagination. Offset length can't exceed 64 bytes.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NextOffset)]\n    public string? NextOffset { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object describing a button to be shown above inline query results\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Button)]\n    public InlineQueryResultsButton? Button { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/ChosenInlineResult.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a <a href=\"https://core.telegram.org/bots/api#inlinequeryresult\">result</a> of an inline query that was chosen by the user and sent to their chat partner.\n/// </summary>\npublic class ChosenInlineResult\n{\n    /// <summary>\n    /// The unique identifier for the result that was chosen\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ResultId)]\n    public string ResultId { get; set; } = null!;\n\n    /// <summary>\n    /// The user that chose the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User From { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Sender location, only for bots that require user location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public Location? Location { get; set; }\n\n    /// <summary>\n    /// Optional. Identifier of the sent inline message. Available only if there is an <a href=\"https://core.telegram.org/bots/api#inlinekeyboardmarkup\">inline keyboard</a> attached to the message. Will be also received in <a href=\"https://core.telegram.org/bots/api#callbackquery\">callback queries</a> and can be used to <a href=\"https://core.telegram.org/bots/api#updating-messages\">edit</a> the message.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n\n    /// <summary>\n    /// The query that was used to obtain the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Query)]\n    public string Query { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// This object represents an incoming inline query. When the user sends an empty query, your bot could return some default or trending results.\n/// </summary>\npublic class InlineQuery\n{\n    /// <summary>\n    /// Unique identifier for this query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Sender\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User From { get; set; } = null!;\n\n    /// <summary>\n    /// Text of the query (up to 256 characters)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Query)]\n    public string Query { get; set; } = null!;\n\n    /// <summary>\n    /// Offset of the results to be returned, can be controlled by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Offset)]\n    public string Offset { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Type of the chat from which the inline query was sent. Can be either “sender” for a private chat with the inline query sender, “private”, “group”, “supergroup”, or “channel”. The chat type should be always known for requests sent from official clients and most third-party clients, unless the request was sent from a secret chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatType)]\n    public string? ChatType { get; set; }\n\n    /// <summary>\n    /// Optional. Sender location, only for bots that request user location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Location)]\n    public Location? Location { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResult.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// This object represents one result of an inline query. Telegram clients currently support results of the following 20 types:\n/// <strong>Note:</strong> All URLs passed in inline query results will be available to end users and therefore must be assumed to be <strong>public</strong>.\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"InlineQueryResultCachedAudio\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultCachedDocument\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultCachedGif\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultCachedMpeg4Gif\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultCachedPhoto\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultCachedSticker\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultCachedVideo\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultCachedVoice\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultArticle\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultAudio\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultContact\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultGame\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultDocument\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultGif\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultLocation\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultMpeg4Gif\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultPhoto\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultVenue\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultVideo\"/></description></item>\n/// <item><description><see cref=\"InlineQueryResultVoice\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(InlineQueryResultConverter))]\npublic abstract class InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n\n    /// <summary>\n    /// Unique identifier for this result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public abstract string Id { get; set; }\n\n    /// <summary>\n    /// Optional. <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">Inline keyboard</a> attached to the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultArticle.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to an article or web page.\n/// </summary>\npublic class InlineQueryResultArticle : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>article</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"article\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 Bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Title of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Content of the message to be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent InputMessageContent { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. URL of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string? Url { get; set; }\n\n    /// <summary>\n    /// Optional. Short description of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Url of the thumbnail for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string? ThumbnailUrl { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailWidth)]\n    public int? ThumbnailWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailHeight)]\n    public int? ThumbnailHeight { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultAudio.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to an MP3 audio file. By default, this audio file will be sent by the user. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the audio.\n/// </summary>\npublic class InlineQueryResultAudio : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>audio</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"audio\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid URL for the audio file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AudioUrl)]\n    public string AudioUrl { get; set; } = null!;\n\n    /// <summary>\n    /// Title\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Caption, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Performer\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Performer)]\n    public string? Performer { get; set; }\n\n    /// <summary>\n    /// Optional. Audio duration in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AudioDuration)]\n    public int? AudioDuration { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the audio\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultCachedAudio.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to an MP3 audio file stored on the Telegram servers. By default, this audio file will be sent by the user. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the audio.\n/// </summary>\npublic class InlineQueryResultCachedAudio : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>audio</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"audio\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid file identifier for the audio file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AudioFileId)]\n    public string AudioFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Caption, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the audio caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the audio\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultCachedDocument.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a file stored on the Telegram servers. By default, this file will be sent by the user with an optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the file.\n/// </summary>\npublic class InlineQueryResultCachedDocument : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>document</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"document\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// A valid file identifier for the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DocumentFileId)]\n    public string DocumentFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Short description of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the document to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultCachedGif.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to an animated GIF file stored on the Telegram servers. By default, this animated GIF file will be sent by the user with an optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with specified content instead of the animation.\n/// </summary>\npublic class InlineQueryResultCachedGif : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>gif</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"gif\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid file identifier for the GIF file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GifFileId)]\n    public string GifFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the GIF file to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the GIF animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultCachedMpeg4Gif.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a video animation (H.264/MPEG-4 AVC video without sound) stored on the Telegram servers. By default, this animated MPEG-4 file will be sent by the user with an optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the animation.\n/// </summary>\npublic class InlineQueryResultCachedMpeg4Gif : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>mpeg4_gif</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"mpeg4_gif\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid file identifier for the MPEG4 file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Mpeg4FileId)]\n    public string Mpeg4FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the MPEG-4 file to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the video animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultCachedPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a photo stored on the Telegram servers. By default, this photo will be sent by the user with an optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the photo.\n/// </summary>\npublic class InlineQueryResultCachedPhoto : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>photo</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"photo\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid file identifier of the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoFileId)]\n    public string PhotoFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Short description of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the photo to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultCachedSticker.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a sticker stored on the Telegram servers. By default, this sticker will be sent by the user. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the sticker.\n/// </summary>\npublic class InlineQueryResultCachedSticker : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>sticker</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"sticker\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid file identifier of the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StickerFileId)]\n    public string StickerFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultCachedVideo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a video file stored on the Telegram servers. By default, this video file will be sent by the user with an optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the video.\n/// </summary>\npublic class InlineQueryResultCachedVideo : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>video</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"video\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid file identifier for the video file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoFileId)]\n    public string VideoFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Short description of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the video to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultCachedVoice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a voice message stored on the Telegram servers. By default, this voice message will be sent by the user. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the voice message.\n/// </summary>\npublic class InlineQueryResultCachedVoice : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>voice</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"voice\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid file identifier for the voice message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VoiceFileId)]\n    public string VoiceFileId { get; set; } = null!;\n\n    /// <summary>\n    /// Voice message title\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Caption, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the voice message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultContact.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a contact with a phone number. By default, this contact will be sent by the user. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the contact.\n/// </summary>\npublic class InlineQueryResultContact : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>contact</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"contact\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 Bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Contact's phone number\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhoneNumber)]\n    public string PhoneNumber { get; set; } = null!;\n\n    /// <summary>\n    /// Contact's first name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FirstName)]\n    public string FirstName { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Contact's last name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastName)]\n    public string? LastName { get; set; }\n\n    /// <summary>\n    /// Optional. Additional data about the contact in the form of a <a href=\"https://en.wikipedia.org/wiki/VCard\">vCard</a>, 0-2048 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Vcard)]\n    public string? Vcard { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the contact\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n\n    /// <summary>\n    /// Optional. Url of the thumbnail for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string? ThumbnailUrl { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailWidth)]\n    public int? ThumbnailWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailHeight)]\n    public int? ThumbnailHeight { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultDocument.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a file. By default, this file will be sent by the user with an optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the file. Currently, only <strong>.PDF</strong> and <strong>.ZIP</strong> files can be sent using this method.\n/// </summary>\npublic class InlineQueryResultDocument : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>document</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"document\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Caption of the document to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the document caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// A valid URL for the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DocumentUrl)]\n    public string DocumentUrl { get; set; } = null!;\n\n    /// <summary>\n    /// MIME type of the content of the file, either “application/pdf” or “application/zip”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MimeType)]\n    public string MimeType { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Short description of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n\n    /// <summary>\n    /// Optional. URL of the thumbnail (JPEG only) for the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string? ThumbnailUrl { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailWidth)]\n    public int? ThumbnailWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailHeight)]\n    public int? ThumbnailHeight { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultGame.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.Games;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a <see cref=\"Game\"/>.\n/// </summary>\npublic class InlineQueryResultGame : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>game</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"game\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Short name of the game\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GameShortName)]\n    public string GameShortName { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultGif.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to an animated GIF file. By default, this animated GIF file will be sent by the user with optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the animation.\n/// </summary>\npublic class InlineQueryResultGif : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>gif</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"gif\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid URL for the GIF file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GifUrl)]\n    public string GifUrl { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Width of the GIF\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GifWidth)]\n    public int? GifWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Height of the GIF\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GifHeight)]\n    public int? GifHeight { get; set; }\n\n    /// <summary>\n    /// Optional. Duration of the GIF in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GifDuration)]\n    public int? GifDuration { get; set; }\n\n    /// <summary>\n    /// URL of the static (JPEG or GIF) or animated (MPEG4) thumbnail for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string ThumbnailUrl { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. MIME type of the thumbnail, must be one of “image/jpeg”, “image/gif”, or “video/mp4”. Defaults to “image/jpeg”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailMimeType)]\n    public string? ThumbnailMimeType { get; set; }\n\n    /// <summary>\n    /// Optional. Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the GIF file to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the GIF animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultLocation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a location on a map. By default, the location will be sent by the user. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the location.\n/// </summary>\npublic class InlineQueryResultLocation : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>location</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"location\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 Bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Location latitude in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Location longitude in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Location title\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. The radius of uncertainty for the location, measured in meters; 0-1500\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HorizontalAccuracy)]\n    public float? HorizontalAccuracy { get; set; }\n\n    /// <summary>\n    /// Optional. Period in seconds during which the location can be updated, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePeriod)]\n    public int? LivePeriod { get; set; }\n\n    /// <summary>\n    /// Optional. For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Heading)]\n    public int? Heading { get; set; }\n\n    /// <summary>\n    /// Optional. For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProximityAlertRadius)]\n    public int? ProximityAlertRadius { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n\n    /// <summary>\n    /// Optional. Url of the thumbnail for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string? ThumbnailUrl { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailWidth)]\n    public int? ThumbnailWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailHeight)]\n    public int? ThumbnailHeight { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultMpeg4Gif.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a video animation (H.264/MPEG-4 AVC video without sound). By default, this animated MPEG-4 file will be sent by the user with optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the animation.\n/// </summary>\npublic class InlineQueryResultMpeg4Gif : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>mpeg4_gif</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"mpeg4_gif\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid URL for the MPEG4 file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Mpeg4Url)]\n    public string Mpeg4Url { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Video width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Mpeg4Width)]\n    public int? Mpeg4Width { get; set; }\n\n    /// <summary>\n    /// Optional. Video height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Mpeg4Height)]\n    public int? Mpeg4Height { get; set; }\n\n    /// <summary>\n    /// Optional. Video duration in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Mpeg4Duration)]\n    public int? Mpeg4Duration { get; set; }\n\n    /// <summary>\n    /// URL of the static (JPEG or GIF) or animated (MPEG4) thumbnail for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string ThumbnailUrl { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. MIME type of the thumbnail, must be one of “image/jpeg”, “image/gif”, or “video/mp4”. Defaults to “image/jpeg”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailMimeType)]\n    public string? ThumbnailMimeType { get; set; }\n\n    /// <summary>\n    /// Optional. Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the MPEG-4 file to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the video animation\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultPhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a photo. By default, this photo will be sent by the user with optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the photo.\n/// </summary>\npublic class InlineQueryResultPhoto : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>photo</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"photo\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid URL of the photo. Photo must be in <strong>JPEG</strong> format. Photo size must not exceed 5MB\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoUrl)]\n    public string PhotoUrl { get; set; } = null!;\n\n    /// <summary>\n    /// URL of the thumbnail for the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string ThumbnailUrl { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Width of the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoWidth)]\n    public int? PhotoWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Height of the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoHeight)]\n    public int? PhotoHeight { get; set; }\n\n    /// <summary>\n    /// Optional. Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string? Title { get; set; }\n\n    /// <summary>\n    /// Optional. Short description of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Caption of the photo to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the photo caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the photo\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultVenue.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a venue. By default, the venue will be sent by the user. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the venue.\n/// </summary>\npublic class InlineQueryResultVenue : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>venue</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"venue\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 Bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Latitude of the venue location in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude of the venue location in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Title of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Address of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Address)]\n    public string Address { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Foursquare identifier of the venue if known\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareId)]\n    public string? FoursquareId { get; set; }\n\n    /// <summary>\n    /// Optional. Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareType)]\n    public string? FoursquareType { get; set; }\n\n    /// <summary>\n    /// Optional. Google Places identifier of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceId)]\n    public string? GooglePlaceId { get; set; }\n\n    /// <summary>\n    /// Optional. Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceType)]\n    public string? GooglePlaceType { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n\n    /// <summary>\n    /// Optional. Url of the thumbnail for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string? ThumbnailUrl { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailWidth)]\n    public int? ThumbnailWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Thumbnail height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailHeight)]\n    public int? ThumbnailHeight { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultVideo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a page containing an embedded video player or a video file. By default, this video file will be sent by the user with an optional caption. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the video.\n/// </summary>\npublic class InlineQueryResultVideo : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>video</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"video\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid URL for the embedded video player or video file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoUrl)]\n    public string VideoUrl { get; set; } = null!;\n\n    /// <summary>\n    /// MIME type of the content of the video URL, “text/html” or “video/mp4”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MimeType)]\n    public string MimeType { get; set; } = null!;\n\n    /// <summary>\n    /// URL of the thumbnail (JPEG only) for the video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ThumbnailUrl)]\n    public string ThumbnailUrl { get; set; } = null!;\n\n    /// <summary>\n    /// Title for the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Caption of the video to be sent, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the video caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em>, if the caption must be shown above the message media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Video width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoWidth)]\n    public int? VideoWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Video height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoHeight)]\n    public int? VideoHeight { get; set; }\n\n    /// <summary>\n    /// Optional. Video duration in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VideoDuration)]\n    public int? VideoDuration { get; set; }\n\n    /// <summary>\n    /// Optional. Short description of the result\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string? Description { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the video. This field is <strong>required</strong> if InlineQueryResultVideo is used to send an HTML-page as a result (e.g., a YouTube video).\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResult/InlineQueryResultVoice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents a link to a voice recording in an .OGG container encoded with OPUS. By default, this voice recording will be sent by the user. Alternatively, you can use <em>input_message_content</em> to send a message with the specified content instead of the the voice message.\n/// </summary>\npublic class InlineQueryResultVoice : InlineQueryResult\n{\n    /// <summary>\n    /// Type of the result, must be <em>voice</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"voice\";\n\n    /// <summary>\n    /// Unique identifier for this result, 1-64 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public override string Id { get; set; } = null!;\n\n    /// <summary>\n    /// A valid URL for the voice recording\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VoiceUrl)]\n    public string VoiceUrl { get; set; } = null!;\n\n    /// <summary>\n    /// Recording title\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Caption, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the voice message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Optional. Recording duration in seconds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.VoiceDuration)]\n    public int? VoiceDuration { get; set; }\n\n    /// <summary>\n    /// Optional. Content of the message to be sent instead of the voice recording\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InputMessageContent)]\n    public InputMessageContent? InputMessageContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InlineQueryResultsButton.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// This object represents a button to be shown above inline query results. You <strong>must</strong> use exactly one of the optional fields.\n/// </summary>\npublic class InlineQueryResultsButton\n{\n    /// <summary>\n    /// Label text on the button\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Description of the <a href=\"https://core.telegram.org/bots/webapps\">Web App</a> that will be launched when the user presses the button. The Web App will be able to switch back to the inline mode using the method <a href=\"https://core.telegram.org/bots/webapps#initializing-mini-apps\">switchInlineQuery</a> inside the Web App.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WebApp)]\n    public WebAppInfo? WebApp { get; set; }\n\n    /// <summary>\n    /// Optional. <a href=\"https://core.telegram.org/bots/features#deep-linking\">Deep-linking</a> parameter for the /start message sent to the bot when a user presses the button. 1-64 characters, only <em>A-Z</em>, <em>a-z</em>, <em>0-9</em>, <em>_</em> and <em>-</em> are allowed.<br /><br /><em>Example:</em> An inline bot that sends YouTube videos can ask the user to connect the bot to their YouTube account to adapt search results accordingly. To do this, it displays a 'Connect your YouTube account' button above the results, or even before showing any. The user presses the button, switches to a private chat with the bot and, in doing so, passes a start parameter that instructs the bot to return an OAuth link. Once done, the bot can offer a <a href=\"https://core.telegram.org/bots/api#inlinekeyboardmarkup\">switch_inline</a> button so that the user can easily return to the chat where they wanted to use the bot's inline capabilities.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StartParameter)]\n    public string? StartParameter { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InputMessageContent/InputContactMessageContent.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#inputmessagecontent\">content</a> of a contact message to be sent as the result of an inline query.\n/// </summary>\npublic class InputContactMessageContent : InputMessageContent\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputContactMessageContent\"/> class.\n    /// </summary>\n    /// <param name=\"phoneNumber\">Contact's phone number</param>\n    /// <param name=\"firstName\">Contact's first name</param>\n    public InputContactMessageContent(string phoneNumber, string firstName)\n    {\n        this.PhoneNumber = phoneNumber ?? throw new ArgumentNullException(nameof(phoneNumber));\n        this.FirstName = firstName ?? throw new ArgumentNullException(nameof(firstName));\n    }\n\n    /// <summary>\n    /// Contact's phone number\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhoneNumber)]\n    public string PhoneNumber { get; set; }\n\n    /// <summary>\n    /// Contact's first name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FirstName)]\n    public string FirstName { get; set; }\n\n    /// <summary>\n    /// Optional. Contact's last name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LastName)]\n    public string? LastName { get; set; }\n\n    /// <summary>\n    /// Optional. Additional data about the contact in the form of a <a href=\"https://en.wikipedia.org/wiki/VCard\">vCard</a>, 0-2048 bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Vcard)]\n    public string? Vcard { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InputMessageContent/InputInvoiceMessageContent.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Payments;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#inputmessagecontent\">content</a> of an invoice message to be sent as the result of an inline query.\n/// </summary>\npublic class InputInvoiceMessageContent : InputMessageContent\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputInvoiceMessageContent\"/> class.\n    /// </summary>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    public InputInvoiceMessageContent(\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices\n    )\n    {\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Description = description ?? throw new ArgumentNullException(nameof(description));\n        this.Payload = payload ?? throw new ArgumentNullException(nameof(payload));\n        this.Currency = currency ?? throw new ArgumentNullException(nameof(currency));\n        this.Prices = prices ?? throw new ArgumentNullException(nameof(prices));\n    }\n\n    /// <summary>\n    /// Product name, 1-32 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; }\n\n    /// <summary>\n    /// Product description, 1-255 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string Description { get; set; }\n\n    /// <summary>\n    /// Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Payload)]\n    public string Payload { get; set; }\n\n    /// <summary>\n    /// Optional. Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProviderToken)]\n    public string? ProviderToken { get; set; }\n\n    /// <summary>\n    /// Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency { get; set; }\n\n    /// <summary>\n    /// Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Prices)]\n    public IEnumerable<LabeledPrice> Prices { get; set; }\n\n    /// <summary>\n    /// Optional. The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaxTipAmount)]\n    public int? MaxTipAmount { get; set; }\n\n    /// <summary>\n    /// Optional. A JSON-serialized array of suggested amounts of tip in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedTipAmounts)]\n    public IEnumerable<int>? SuggestedTipAmounts { get; set; }\n\n    /// <summary>\n    /// Optional. A JSON-serialized object for data about the invoice, which will be shared with the payment provider. A detailed description of the required fields should be provided by the payment provider.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProviderData)]\n    public string? ProviderData { get; set; }\n\n    /// <summary>\n    /// Optional. URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoUrl)]\n    public string? PhotoUrl { get; set; }\n\n    /// <summary>\n    /// Optional. Photo size in bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoSize)]\n    public int? PhotoSize { get; set; }\n\n    /// <summary>\n    /// Optional. Photo width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoWidth)]\n    public int? PhotoWidth { get; set; }\n\n    /// <summary>\n    /// Optional. Photo height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoHeight)]\n    public int? PhotoHeight { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedName)]\n    public bool? NeedName { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedPhoneNumber)]\n    public bool? NeedPhoneNumber { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedEmail)]\n    public bool? NeedEmail { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedShippingAddress)]\n    public bool? NeedShippingAddress { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendPhoneNumberToProvider)]\n    public bool? SendPhoneNumberToProvider { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendEmailToProvider)]\n    public bool? SendEmailToProvider { get; set; }\n\n    /// <summary>\n    /// Optional. Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsFlexible)]\n    public bool? IsFlexible { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InputMessageContent/InputLocationMessageContent.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#inputmessagecontent\">content</a> of a location message to be sent as the result of an inline query.\n/// </summary>\npublic class InputLocationMessageContent : InputMessageContent\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputLocationMessageContent\"/> class.\n    /// </summary>\n    /// <param name=\"latitude\">Latitude of the location in degrees</param>\n    /// <param name=\"longitude\">Longitude of the location in degrees</param>\n    public InputLocationMessageContent(float latitude, float longitude)\n    {\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n    }\n\n    /// <summary>\n    /// Latitude of the location in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude of the location in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Optional. The radius of uncertainty for the location, measured in meters; 0-1500\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HorizontalAccuracy)]\n    public float? HorizontalAccuracy { get; set; }\n\n    /// <summary>\n    /// Optional. Period in seconds during which the location can be updated, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePeriod)]\n    public int? LivePeriod { get; set; }\n\n    /// <summary>\n    /// Optional. For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Heading)]\n    public int? Heading { get; set; }\n\n    /// <summary>\n    /// Optional. For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProximityAlertRadius)]\n    public int? ProximityAlertRadius { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InputMessageContent/InputMessageContent.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// This object represents the content of a message to be sent as a result of an inline query. Telegram clients currently support the following 5 types:\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"InputTextMessageContent\"/></description></item>\n/// <item><description><see cref=\"InputLocationMessageContent\"/></description></item>\n/// <item><description><see cref=\"InputVenueMessageContent\"/></description></item>\n/// <item><description><see cref=\"InputContactMessageContent\"/></description></item>\n/// <item><description><see cref=\"InputInvoiceMessageContent\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(InputMessageContentConverter))]\npublic abstract class InputMessageContent { }\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InputMessageContent/InputTextMessageContent.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#inputmessagecontent\">content</a> of a text message to be sent as the result of an inline query.\n/// </summary>\npublic class InputTextMessageContent : InputMessageContent\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputTextMessageContent\"/> class.\n    /// </summary>\n    /// <param name=\"messageText\">Text of the message to be sent, 1-4096 characters</param>\n    public InputTextMessageContent(string messageText)\n    {\n        this.MessageText = messageText ?? throw new ArgumentNullException(nameof(messageText));\n    }\n\n    /// <summary>\n    /// Text of the message to be sent, 1-4096 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageText)]\n    public string MessageText { get; set; }\n\n    /// <summary>\n    /// Optional. Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// Optional. List of special entities that appear in message text, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Entities)]\n    public IEnumerable<MessageEntity>? Entities { get; set; }\n\n    /// <summary>\n    /// Optional. Link preview generation options for the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LinkPreviewOptions)]\n    public LinkPreviewOptions? LinkPreviewOptions { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/InputMessageContent/InputVenueMessageContent.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Represents the <a href=\"https://core.telegram.org/bots/api#inputmessagecontent\">content</a> of a venue message to be sent as the result of an inline query.\n/// </summary>\npublic class InputVenueMessageContent : InputMessageContent\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"InputVenueMessageContent\"/> class.\n    /// </summary>\n    /// <param name=\"latitude\">Latitude of the venue in degrees</param>\n    /// <param name=\"longitude\">Longitude of the venue in degrees</param>\n    /// <param name=\"title\">Name of the venue</param>\n    /// <param name=\"address\">Address of the venue</param>\n    public InputVenueMessageContent(float latitude, float longitude, string title, string address)\n    {\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Address = address ?? throw new ArgumentNullException(nameof(address));\n    }\n\n    /// <summary>\n    /// Latitude of the venue in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude of the venue in degrees\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// Name of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; }\n\n    /// <summary>\n    /// Address of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Address)]\n    public string Address { get; set; }\n\n    /// <summary>\n    /// Optional. Foursquare identifier of the venue, if known\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareId)]\n    public string? FoursquareId { get; set; }\n\n    /// <summary>\n    /// Optional. Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FoursquareType)]\n    public string? FoursquareType { get; set; }\n\n    /// <summary>\n    /// Optional. Google Places identifier of the venue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceId)]\n    public string? GooglePlaceId { get; set; }\n\n    /// <summary>\n    /// Optional. Google Places type of the venue. (See <a href=\"https://developers.google.com/places/web-service/supported_types\">supported types</a>.)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GooglePlaceType)]\n    public string? GooglePlaceType { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/InlineMode/answerInlineQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.InlineMode;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class InlineModeExtensions\n{\n    /// <summary>\n    /// Use this method to send answers to an inline query. On success, <em>True</em> is returned.<br />No more than <strong>50</strong> results per query are allowed.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerInlineQuery\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AnswerInlineQuery(\n        this ITelegramBotClient client,\n        AnswerInlineQueryArgs args\n    ) => client.AnswerInlineQueryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send answers to an inline query. On success, <em>True</em> is returned.<br />No more than <strong>50</strong> results per query are allowed.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerInlineQuery\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AnswerInlineQueryAsync(\n        this ITelegramBotClient client,\n        AnswerInlineQueryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.AnswerInlineQuery, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send answers to an inline query. On success, <em>True</em> is returned.<br />No more than <strong>50</strong> results per query are allowed.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineQueryId\">Unique identifier for the answered query</param>\n    /// <param name=\"results\">A JSON-serialized array of results for the inline query</param>\n    /// <param name=\"cacheTime\">The maximum amount of time in seconds that the result of the inline query may be cached on the server. Defaults to 300.</param>\n    /// <param name=\"isPersonal\">Pass <em>True</em> if results may be cached on the server side only for the user that sent the query. By default, results may be returned to any user who sends the same query.</param>\n    /// <param name=\"nextOffset\">Pass the offset that a client should send in the next query with the same text to receive more results. Pass an empty string if there are no more results or if you don't support pagination. Offset length can't exceed 64 bytes.</param>\n    /// <param name=\"button\">A JSON-serialized object describing a button to be shown above inline query results</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AnswerInlineQuery(\n        this ITelegramBotClient client,\n        string inlineQueryId,\n        IEnumerable<InlineQueryResult> results,\n        int? cacheTime = null,\n        bool? isPersonal = null,\n        string? nextOffset = null,\n        InlineQueryResultsButton? button = null\n    ) =>\n        client\n            .AnswerInlineQueryAsync(\n                inlineQueryId,\n                results,\n                cacheTime,\n                isPersonal,\n                nextOffset,\n                button\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send answers to an inline query. On success, <em>True</em> is returned.<br />No more than <strong>50</strong> results per query are allowed.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineQueryId\">Unique identifier for the answered query</param>\n    /// <param name=\"results\">A JSON-serialized array of results for the inline query</param>\n    /// <param name=\"cacheTime\">The maximum amount of time in seconds that the result of the inline query may be cached on the server. Defaults to 300.</param>\n    /// <param name=\"isPersonal\">Pass <em>True</em> if results may be cached on the server side only for the user that sent the query. By default, results may be returned to any user who sends the same query.</param>\n    /// <param name=\"nextOffset\">Pass the offset that a client should send in the next query with the same text to receive more results. Pass an empty string if there are no more results or if you don't support pagination. Offset length can't exceed 64 bytes.</param>\n    /// <param name=\"button\">A JSON-serialized object describing a button to be shown above inline query results</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AnswerInlineQueryAsync(\n        this ITelegramBotClient client,\n        string inlineQueryId,\n        IEnumerable<InlineQueryResult> results,\n        int? cacheTime = null,\n        bool? isPersonal = null,\n        string? nextOffset = null,\n        InlineQueryResultsButton? button = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.InlineQueryId,\n                inlineQueryId ?? throw new ArgumentNullException(nameof(inlineQueryId))\n            },\n            { PropertyNames.Results, results ?? throw new ArgumentNullException(nameof(results)) },\n        };\n        if (cacheTime is not null)\n        {\n            args.Add(PropertyNames.CacheTime, cacheTime);\n        }\n        if (isPersonal is not null)\n        {\n            args.Add(PropertyNames.IsPersonal, isPersonal);\n        }\n        if (nextOffset is not null)\n        {\n            args.Add(PropertyNames.NextOffset, nextOffset);\n        }\n        if (button is not null)\n        {\n            args.Add(PropertyNames.Button, button);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.AnswerInlineQuery, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/MethodNames.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines all the method names used by methods in the Telegram Bot API.\n/// </summary>\npublic static partial class MethodNames\n{\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n    public const string AddStickerToSet = \"addStickerToSet\";\n    public const string AnswerCallbackQuery = \"answerCallbackQuery\";\n    public const string AnswerGuestQuery = \"answerGuestQuery\";\n    public const string AnswerInlineQuery = \"answerInlineQuery\";\n    public const string AnswerPreCheckoutQuery = \"answerPreCheckoutQuery\";\n    public const string AnswerShippingQuery = \"answerShippingQuery\";\n    public const string AnswerWebAppQuery = \"answerWebAppQuery\";\n    public const string ApproveChatJoinRequest = \"approveChatJoinRequest\";\n    public const string ApproveSuggestedPost = \"approveSuggestedPost\";\n    public const string BanChatMember = \"banChatMember\";\n    public const string BanChatSenderChat = \"banChatSenderChat\";\n    public const string Close = \"close\";\n    public const string CloseForumTopic = \"closeForumTopic\";\n    public const string CloseGeneralForumTopic = \"closeGeneralForumTopic\";\n    public const string ConvertGiftToStars = \"convertGiftToStars\";\n    public const string CopyMessage = \"copyMessage\";\n    public const string CopyMessages = \"copyMessages\";\n    public const string CreateChatInviteLink = \"createChatInviteLink\";\n    public const string CreateChatSubscriptionInviteLink = \"createChatSubscriptionInviteLink\";\n    public const string CreateForumTopic = \"createForumTopic\";\n    public const string CreateInvoiceLink = \"createInvoiceLink\";\n    public const string CreateNewStickerSet = \"createNewStickerSet\";\n    public const string DeclineChatJoinRequest = \"declineChatJoinRequest\";\n    public const string DeclineSuggestedPost = \"declineSuggestedPost\";\n    public const string DeleteAllMessageReactions = \"deleteAllMessageReactions\";\n    public const string DeleteBusinessMessages = \"deleteBusinessMessages\";\n    public const string DeleteChatPhoto = \"deleteChatPhoto\";\n    public const string DeleteChatStickerSet = \"deleteChatStickerSet\";\n    public const string DeleteForumTopic = \"deleteForumTopic\";\n    public const string DeleteMessage = \"deleteMessage\";\n    public const string DeleteMessageReaction = \"deleteMessageReaction\";\n    public const string DeleteMessages = \"deleteMessages\";\n    public const string DeleteMyCommands = \"deleteMyCommands\";\n    public const string DeleteStickerFromSet = \"deleteStickerFromSet\";\n    public const string DeleteStickerSet = \"deleteStickerSet\";\n    public const string DeleteStory = \"deleteStory\";\n    public const string DeleteWebhook = \"deleteWebhook\";\n    public const string EditChatInviteLink = \"editChatInviteLink\";\n    public const string EditChatSubscriptionInviteLink = \"editChatSubscriptionInviteLink\";\n    public const string EditForumTopic = \"editForumTopic\";\n    public const string EditGeneralForumTopic = \"editGeneralForumTopic\";\n    public const string EditMessageCaption = \"editMessageCaption\";\n    public const string EditMessageChecklist = \"editMessageChecklist\";\n    public const string EditMessageLiveLocation = \"editMessageLiveLocation\";\n    public const string EditMessageMedia = \"editMessageMedia\";\n    public const string EditMessageReplyMarkup = \"editMessageReplyMarkup\";\n    public const string EditMessageText = \"editMessageText\";\n    public const string EditStory = \"editStory\";\n    public const string EditUserStarSubscription = \"editUserStarSubscription\";\n    public const string ExportChatInviteLink = \"exportChatInviteLink\";\n    public const string ForwardMessage = \"forwardMessage\";\n    public const string ForwardMessages = \"forwardMessages\";\n    public const string GetAvailableGifts = \"getAvailableGifts\";\n    public const string GetBusinessAccountGifts = \"getBusinessAccountGifts\";\n    public const string GetBusinessAccountStarBalance = \"getBusinessAccountStarBalance\";\n    public const string GetBusinessConnection = \"getBusinessConnection\";\n    public const string GetChat = \"getChat\";\n    public const string GetChatAdministrators = \"getChatAdministrators\";\n    public const string GetChatGifts = \"getChatGifts\";\n    public const string GetChatMember = \"getChatMember\";\n    public const string GetChatMemberCount = \"getChatMemberCount\";\n    public const string GetChatMenuButton = \"getChatMenuButton\";\n    public const string GetCustomEmojiStickers = \"getCustomEmojiStickers\";\n    public const string GetFile = \"getFile\";\n    public const string GetForumTopicIconStickers = \"getForumTopicIconStickers\";\n    public const string GetGameHighScores = \"getGameHighScores\";\n    public const string GetManagedBotAccessSettings = \"getManagedBotAccessSettings\";\n    public const string GetManagedBotToken = \"getManagedBotToken\";\n    public const string GetMe = \"getMe\";\n    public const string GetMyCommands = \"getMyCommands\";\n    public const string GetMyDefaultAdministratorRights = \"getMyDefaultAdministratorRights\";\n    public const string GetMyDescription = \"getMyDescription\";\n    public const string GetMyName = \"getMyName\";\n    public const string GetMyShortDescription = \"getMyShortDescription\";\n    public const string GetMyStarBalance = \"getMyStarBalance\";\n    public const string GetStarTransactions = \"getStarTransactions\";\n    public const string GetStickerSet = \"getStickerSet\";\n    public const string GetUpdates = \"getUpdates\";\n    public const string GetUserChatBoosts = \"getUserChatBoosts\";\n    public const string GetUserGifts = \"getUserGifts\";\n    public const string GetUserPersonalChatMessages = \"getUserPersonalChatMessages\";\n    public const string GetUserProfileAudios = \"getUserProfileAudios\";\n    public const string GetUserProfilePhotos = \"getUserProfilePhotos\";\n    public const string GetWebhookInfo = \"getWebhookInfo\";\n    public const string GiftPremiumSubscription = \"giftPremiumSubscription\";\n    public const string HideGeneralForumTopic = \"hideGeneralForumTopic\";\n    public const string LeaveChat = \"leaveChat\";\n    public const string LogOut = \"logOut\";\n    public const string PinChatMessage = \"pinChatMessage\";\n    public const string PostStory = \"postStory\";\n    public const string PromoteChatMember = \"promoteChatMember\";\n    public const string ReadBusinessMessage = \"readBusinessMessage\";\n    public const string RefundStarPayment = \"refundStarPayment\";\n    public const string RemoveBusinessAccountProfilePhoto = \"removeBusinessAccountProfilePhoto\";\n    public const string RemoveChatVerification = \"removeChatVerification\";\n    public const string RemoveMyProfilePhoto = \"removeMyProfilePhoto\";\n    public const string RemoveUserVerification = \"removeUserVerification\";\n    public const string ReopenForumTopic = \"reopenForumTopic\";\n    public const string ReopenGeneralForumTopic = \"reopenGeneralForumTopic\";\n    public const string ReplaceManagedBotToken = \"replaceManagedBotToken\";\n    public const string ReplaceStickerInSet = \"replaceStickerInSet\";\n    public const string RepostStory = \"repostStory\";\n    public const string RestrictChatMember = \"restrictChatMember\";\n    public const string RevokeChatInviteLink = \"revokeChatInviteLink\";\n    public const string SavePreparedInlineMessage = \"savePreparedInlineMessage\";\n    public const string SavePreparedKeyboardButton = \"savePreparedKeyboardButton\";\n    public const string SendAnimation = \"sendAnimation\";\n    public const string SendAudio = \"sendAudio\";\n    public const string SendChatAction = \"sendChatAction\";\n    public const string SendChecklist = \"sendChecklist\";\n    public const string SendContact = \"sendContact\";\n    public const string SendDice = \"sendDice\";\n    public const string SendDocument = \"sendDocument\";\n    public const string SendGame = \"sendGame\";\n    public const string SendGift = \"sendGift\";\n    public const string SendInvoice = \"sendInvoice\";\n    public const string SendLivePhoto = \"sendLivePhoto\";\n    public const string SendLocation = \"sendLocation\";\n    public const string SendMediaGroup = \"sendMediaGroup\";\n    public const string SendMessage = \"sendMessage\";\n    public const string SendMessageDraft = \"sendMessageDraft\";\n    public const string SendPaidMedia = \"sendPaidMedia\";\n    public const string SendPhoto = \"sendPhoto\";\n    public const string SendPoll = \"sendPoll\";\n    public const string SendSticker = \"sendSticker\";\n    public const string SendVenue = \"sendVenue\";\n    public const string SendVideo = \"sendVideo\";\n    public const string SendVideoNote = \"sendVideoNote\";\n    public const string SendVoice = \"sendVoice\";\n    public const string SetBusinessAccountBio = \"setBusinessAccountBio\";\n    public const string SetBusinessAccountGiftSettings = \"setBusinessAccountGiftSettings\";\n    public const string SetBusinessAccountName = \"setBusinessAccountName\";\n    public const string SetBusinessAccountProfilePhoto = \"setBusinessAccountProfilePhoto\";\n    public const string SetBusinessAccountUsername = \"setBusinessAccountUsername\";\n    public const string SetChatAdministratorCustomTitle = \"setChatAdministratorCustomTitle\";\n    public const string SetChatDescription = \"setChatDescription\";\n    public const string SetChatMemberTag = \"setChatMemberTag\";\n    public const string SetChatMenuButton = \"setChatMenuButton\";\n    public const string SetChatPermissions = \"setChatPermissions\";\n    public const string SetChatPhoto = \"setChatPhoto\";\n    public const string SetChatStickerSet = \"setChatStickerSet\";\n    public const string SetChatTitle = \"setChatTitle\";\n    public const string SetCustomEmojiStickerSetThumbnail = \"setCustomEmojiStickerSetThumbnail\";\n    public const string SetGameScore = \"setGameScore\";\n    public const string SetManagedBotAccessSettings = \"setManagedBotAccessSettings\";\n    public const string SetMessageReaction = \"setMessageReaction\";\n    public const string SetMyCommands = \"setMyCommands\";\n    public const string SetMyDefaultAdministratorRights = \"setMyDefaultAdministratorRights\";\n    public const string SetMyDescription = \"setMyDescription\";\n    public const string SetMyName = \"setMyName\";\n    public const string SetMyProfilePhoto = \"setMyProfilePhoto\";\n    public const string SetMyShortDescription = \"setMyShortDescription\";\n    public const string SetPassportDataErrors = \"setPassportDataErrors\";\n    public const string SetStickerEmojiList = \"setStickerEmojiList\";\n    public const string SetStickerKeywords = \"setStickerKeywords\";\n    public const string SetStickerMaskPosition = \"setStickerMaskPosition\";\n    public const string SetStickerPositionInSet = \"setStickerPositionInSet\";\n    public const string SetStickerSetThumbnail = \"setStickerSetThumbnail\";\n    public const string SetStickerSetTitle = \"setStickerSetTitle\";\n    public const string SetUserEmojiStatus = \"setUserEmojiStatus\";\n    public const string SetWebhook = \"setWebhook\";\n    public const string StopMessageLiveLocation = \"stopMessageLiveLocation\";\n    public const string StopPoll = \"stopPoll\";\n    public const string TransferBusinessAccountStars = \"transferBusinessAccountStars\";\n    public const string TransferGift = \"transferGift\";\n    public const string UnbanChatMember = \"unbanChatMember\";\n    public const string UnbanChatSenderChat = \"unbanChatSenderChat\";\n    public const string UnhideGeneralForumTopic = \"unhideGeneralForumTopic\";\n    public const string UnpinAllChatMessages = \"unpinAllChatMessages\";\n    public const string UnpinAllForumTopicMessages = \"unpinAllForumTopicMessages\";\n    public const string UnpinAllGeneralForumTopicMessages = \"unpinAllGeneralForumTopicMessages\";\n    public const string UnpinChatMessage = \"unpinChatMessage\";\n    public const string UpgradeGift = \"upgradeGift\";\n    public const string UploadStickerFile = \"uploadStickerFile\";\n    public const string VerifyChat = \"verifyChat\";\n    public const string VerifyUser = \"verifyUser\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/AffiliateInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Contains information about the affiliate that received a commission via this transaction.\n/// </summary>\npublic class AffiliateInfo\n{\n    /// <summary>\n    /// Optional. The bot or the user that received an affiliate commission if it was received by a bot or a user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AffiliateUser)]\n    public User? AffiliateUser { get; set; }\n\n    /// <summary>\n    /// Optional. The chat that received an affiliate commission if it was received by a chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AffiliateChat)]\n    public Chat? AffiliateChat { get; set; }\n\n    /// <summary>\n    /// The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by the bot from referred users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CommissionPerMille)]\n    public int CommissionPerMille { get; set; }\n\n    /// <summary>\n    /// Integer amount of Telegram Stars received by the affiliate from the transaction, rounded to 0; can be negative for refunds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Amount)]\n    public int Amount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of 1/1000000000 shares of Telegram Stars received by the affiliate; from -999999999 to 999999999; can be negative for refunds\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NanostarAmount)]\n    public int? NanostarAmount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/Args/AnswerShippingQueryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Represents the arguments of the \"AnswerShippingQuery\" method.\n/// </summary>\npublic class AnswerShippingQueryArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"AnswerShippingQueryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"shippingQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"ok\">Pass <em>True</em> if delivery to the specified address is possible and <em>False</em> if there are any problems (for example, if delivery to the specified address is not possible)</param>\n    public AnswerShippingQueryArgs(string shippingQueryId, bool ok)\n    {\n        this.ShippingQueryId =\n            shippingQueryId ?? throw new ArgumentNullException(nameof(shippingQueryId));\n        this.Ok = ok;\n    }\n\n    /// <summary>\n    /// Unique identifier for the query to be answered\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShippingQueryId)]\n    public string ShippingQueryId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if delivery to the specified address is possible and <em>False</em> if there are any problems (for example, if delivery to the specified address is not possible)\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Ok)]\n    public bool Ok { get; set; }\n\n    /// <summary>\n    /// Required if <em>ok</em> is <em>True</em>. A JSON-serialized array of available shipping options.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShippingOptions)]\n    public IEnumerable<ShippingOption>? ShippingOptions { get; set; }\n\n    /// <summary>\n    /// Required if <em>ok</em> is <em>False</em>. Error message in human readable form that explains why it is impossible to complete the order (e.g. “Sorry, delivery to your desired address is unavailable”). Telegram will display this message to the user.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ErrorMessage)]\n    public string? ErrorMessage { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/Args/CreateInvoiceLinkArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Represents the arguments of the \"CreateInvoiceLink\" method.\n/// </summary>\npublic class CreateInvoiceLinkArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CreateInvoiceLinkArgs\"/> class.\n    /// </summary>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    public CreateInvoiceLinkArgs(\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices\n    )\n    {\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Description = description ?? throw new ArgumentNullException(nameof(description));\n        this.Payload = payload ?? throw new ArgumentNullException(nameof(payload));\n        this.Currency = currency ?? throw new ArgumentNullException(nameof(currency));\n        this.Prices = prices ?? throw new ArgumentNullException(nameof(prices));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the link will be created. For payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a> only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Product name, 1-32 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; }\n\n    /// <summary>\n    /// Product description, 1-255 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string Description { get; set; }\n\n    /// <summary>\n    /// Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Payload)]\n    public string Payload { get; set; }\n\n    /// <summary>\n    /// Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProviderToken)]\n    public string? ProviderToken { get; set; }\n\n    /// <summary>\n    /// Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency { get; set; }\n\n    /// <summary>\n    /// Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Prices)]\n    public IEnumerable<LabeledPrice> Prices { get; set; }\n\n    /// <summary>\n    /// The number of seconds the subscription will be active for before the next payment. The currency must be set to “XTR” (Telegram Stars) if the parameter is used. Currently, it must always be 2592000 (30 days) if specified. Any number of subscriptions can be active for a given bot at the same time, including multiple concurrent subscriptions from the same user. Subscription price must no exceed 10000 Telegram Stars.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SubscriptionPeriod)]\n    public int? SubscriptionPeriod { get; set; }\n\n    /// <summary>\n    /// The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaxTipAmount)]\n    public int? MaxTipAmount { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized array of suggested amounts of tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedTipAmounts)]\n    public IEnumerable<int>? SuggestedTipAmounts { get; set; }\n\n    /// <summary>\n    /// JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProviderData)]\n    public string? ProviderData { get; set; }\n\n    /// <summary>\n    /// URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoUrl)]\n    public string? PhotoUrl { get; set; }\n\n    /// <summary>\n    /// Photo size in bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoSize)]\n    public int? PhotoSize { get; set; }\n\n    /// <summary>\n    /// Photo width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoWidth)]\n    public int? PhotoWidth { get; set; }\n\n    /// <summary>\n    /// Photo height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoHeight)]\n    public int? PhotoHeight { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedName)]\n    public bool? NeedName { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedPhoneNumber)]\n    public bool? NeedPhoneNumber { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedEmail)]\n    public bool? NeedEmail { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedShippingAddress)]\n    public bool? NeedShippingAddress { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendPhoneNumberToProvider)]\n    public bool? SendPhoneNumberToProvider { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendEmailToProvider)]\n    public bool? SendEmailToProvider { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsFlexible)]\n    public bool? IsFlexible { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/Args/SendInvoiceArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Represents the arguments of the \"SendInvoice\" method.\n/// </summary>\npublic class SendInvoiceArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendInvoiceArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    public SendInvoiceArgs(\n        long chatId,\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices\n    )\n    {\n        this.ChatId = chatId;\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Description = description ?? throw new ArgumentNullException(nameof(description));\n        this.Payload = payload ?? throw new ArgumentNullException(nameof(payload));\n        this.Currency = currency ?? throw new ArgumentNullException(nameof(currency));\n        this.Prices = prices ?? throw new ArgumentNullException(nameof(prices));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendInvoiceArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    public SendInvoiceArgs(\n        string chatId,\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices\n    )\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Description = description ?? throw new ArgumentNullException(nameof(description));\n        this.Payload = payload ?? throw new ArgumentNullException(nameof(payload));\n        this.Currency = currency ?? throw new ArgumentNullException(nameof(currency));\n        this.Prices = prices ?? throw new ArgumentNullException(nameof(prices));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Product name, 1-32 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; }\n\n    /// <summary>\n    /// Product description, 1-255 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string Description { get; set; }\n\n    /// <summary>\n    /// Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Payload)]\n    public string Payload { get; set; }\n\n    /// <summary>\n    /// Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProviderToken)]\n    public string? ProviderToken { get; set; }\n\n    /// <summary>\n    /// Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency { get; set; }\n\n    /// <summary>\n    /// Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Prices)]\n    public IEnumerable<LabeledPrice> Prices { get; set; }\n\n    /// <summary>\n    /// The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaxTipAmount)]\n    public int? MaxTipAmount { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized array of suggested amounts of tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedTipAmounts)]\n    public IEnumerable<int>? SuggestedTipAmounts { get; set; }\n\n    /// <summary>\n    /// Unique deep-linking parameter. If left empty, <strong>forwarded copies</strong> of the sent message will have a <em>Pay</em> button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a <em>URL</em> button with a deep link to the bot (instead of a <em>Pay</em> button), with the value used as the start parameter\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StartParameter)]\n    public string? StartParameter { get; set; }\n\n    /// <summary>\n    /// JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProviderData)]\n    public string? ProviderData { get; set; }\n\n    /// <summary>\n    /// URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoUrl)]\n    public string? PhotoUrl { get; set; }\n\n    /// <summary>\n    /// Photo size in bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoSize)]\n    public int? PhotoSize { get; set; }\n\n    /// <summary>\n    /// Photo width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoWidth)]\n    public int? PhotoWidth { get; set; }\n\n    /// <summary>\n    /// Photo height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhotoHeight)]\n    public int? PhotoHeight { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedName)]\n    public bool? NeedName { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedPhoneNumber)]\n    public bool? NeedPhoneNumber { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedEmail)]\n    public bool? NeedEmail { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedShippingAddress)]\n    public bool? NeedShippingAddress { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendPhoneNumberToProvider)]\n    public bool? SendPhoneNumberToProvider { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SendEmailToProvider)]\n    public bool? SendEmailToProvider { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsFlexible)]\n    public bool? IsFlexible { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Pay <em>total price</em>' button will be shown. If not empty, the first button must be a Pay button.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/Invoice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object contains basic information about an invoice.\n/// </summary>\npublic class Invoice\n{\n    /// <summary>\n    /// Product name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Product description\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Description)]\n    public string Description { get; set; } = null!;\n\n    /// <summary>\n    /// Unique bot deep-linking parameter that can be used to generate this invoice\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StartParameter)]\n    public string StartParameter { get; set; } = null!;\n\n    /// <summary>\n    /// Three-letter ISO 4217 <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">currency</a> code, or “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency { get; set; } = null!;\n\n    /// <summary>\n    /// Total price in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a price of <em>US$ 1.45</em> pass <em>amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalAmount)]\n    public int TotalAmount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/LabeledPrice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object represents a portion of the price for goods or services.\n/// </summary>\npublic class LabeledPrice\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"LabeledPrice\"/> class.\n    /// </summary>\n    /// <param name=\"label\">Portion label</param>\n    /// <param name=\"amount\">Price of the product in the <em>smallest units</em> of the <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">currency</a> (integer, <strong>not</strong> float/double). For example, for a price of <em>US$ 1.45</em> pass <em>amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).</param>\n    public LabeledPrice(string label, int amount)\n    {\n        this.Label = label ?? throw new ArgumentNullException(nameof(label));\n        this.Amount = amount;\n    }\n\n    /// <summary>\n    /// Portion label\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Label)]\n    public string Label { get; set; }\n\n    /// <summary>\n    /// Price of the product in the <em>smallest units</em> of the <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">currency</a> (integer, <strong>not</strong> float/double). For example, for a price of <em>US$ 1.45</em> pass <em>amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Amount)]\n    public int Amount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/OrderInfo.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object represents information about an order.\n/// </summary>\npublic class OrderInfo\n{\n    /// <summary>\n    /// Optional. User name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string? Name { get; set; }\n\n    /// <summary>\n    /// Optional. User's phone number\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhoneNumber)]\n    public string? PhoneNumber { get; set; }\n\n    /// <summary>\n    /// Optional. User email\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Email)]\n    public string? Email { get; set; }\n\n    /// <summary>\n    /// Optional. User shipping address\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShippingAddress)]\n    public ShippingAddress? ShippingAddress { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/PaidMediaPurchased.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object contains information about a paid media purchase.\n/// </summary>\npublic class PaidMediaPurchased\n{\n    /// <summary>\n    /// User who purchased the media\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User From { get; set; } = null!;\n\n    /// <summary>\n    /// Bot-specified paid media payload\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMediaPayload)]\n    public string PaidMediaPayload { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/PreCheckoutQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object contains information about an incoming pre-checkout query.\n/// </summary>\npublic class PreCheckoutQuery\n{\n    /// <summary>\n    /// Unique query identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// User who sent the query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User From { get; set; } = null!;\n\n    /// <summary>\n    /// Three-letter ISO 4217 <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">currency</a> code, or “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency { get; set; } = null!;\n\n    /// <summary>\n    /// Total price in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a price of <em>US$ 1.45</em> pass <em>amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalAmount)]\n    public int TotalAmount { get; set; }\n\n    /// <summary>\n    /// Bot-specified invoice payload\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InvoicePayload)]\n    public string InvoicePayload { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Identifier of the shipping option chosen by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShippingOptionId)]\n    public string? ShippingOptionId { get; set; }\n\n    /// <summary>\n    /// Optional. Order information provided by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OrderInfo)]\n    public OrderInfo? OrderInfo { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/RefundedPayment.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object contains basic information about a refunded payment.\n/// </summary>\npublic class RefundedPayment\n{\n    /// <summary>\n    /// Three-letter ISO 4217 <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">currency</a> code, or “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>. Currently, always “XTR”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency => \"XTR\";\n\n    /// <summary>\n    /// Total refunded price in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a price of <em>US$ 1.45</em>, <em>total_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalAmount)]\n    public int TotalAmount { get; set; }\n\n    /// <summary>\n    /// Bot-specified invoice payload\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InvoicePayload)]\n    public string InvoicePayload { get; set; } = null!;\n\n    /// <summary>\n    /// Telegram payment identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TelegramPaymentChargeId)]\n    public string TelegramPaymentChargeId { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Provider payment identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProviderPaymentChargeId)]\n    public string? ProviderPaymentChargeId { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/RevenueWithdrawalState/RevenueWithdrawalState.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object describes the state of a revenue withdrawal operation. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"RevenueWithdrawalStatePending\"/></description></item>\n/// <item><description><see cref=\"RevenueWithdrawalStateSucceeded\"/></description></item>\n/// <item><description><see cref=\"RevenueWithdrawalStateFailed\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(RevenueWithdrawalStateConverter))]\npublic abstract class RevenueWithdrawalState\n{\n    /// <summary>\n    /// Type of the state\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/RevenueWithdrawalState/RevenueWithdrawalStateFailed.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// The withdrawal failed and the transaction was refunded.\n/// </summary>\npublic class RevenueWithdrawalStateFailed : RevenueWithdrawalState\n{\n    /// <summary>\n    /// Type of the state, always “failed”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"failed\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/RevenueWithdrawalState/RevenueWithdrawalStatePending.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// The withdrawal is in progress.\n/// </summary>\npublic class RevenueWithdrawalStatePending : RevenueWithdrawalState\n{\n    /// <summary>\n    /// Type of the state, always “pending”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"pending\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/RevenueWithdrawalState/RevenueWithdrawalStateSucceeded.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// The withdrawal succeeded.\n/// </summary>\npublic class RevenueWithdrawalStateSucceeded : RevenueWithdrawalState\n{\n    /// <summary>\n    /// Type of the state, always “succeeded”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"succeeded\";\n\n    /// <summary>\n    /// Date the withdrawal was completed in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public int Date { get; set; }\n\n    /// <summary>\n    /// An HTTPS URL that can be used to see transaction details\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Url)]\n    public string Url { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/ShippingAddress.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object represents a shipping address.\n/// </summary>\npublic class ShippingAddress\n{\n    /// <summary>\n    /// Two-letter <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\">ISO 3166-1 alpha-2</a> country code\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CountryCode)]\n    public string CountryCode { get; set; } = null!;\n\n    /// <summary>\n    /// State, if applicable\n    /// </summary>\n    [JsonPropertyName(PropertyNames.State)]\n    public string State { get; set; } = null!;\n\n    /// <summary>\n    /// City\n    /// </summary>\n    [JsonPropertyName(PropertyNames.City)]\n    public string City { get; set; } = null!;\n\n    /// <summary>\n    /// First line for the address\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StreetLine1)]\n    public string StreetLine1 { get; set; } = null!;\n\n    /// <summary>\n    /// Second line for the address\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StreetLine2)]\n    public string StreetLine2 { get; set; } = null!;\n\n    /// <summary>\n    /// Address post code\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PostCode)]\n    public string PostCode { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/ShippingOption.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object represents one shipping option.\n/// </summary>\npublic class ShippingOption\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ShippingOption\"/> class.\n    /// </summary>\n    /// <param name=\"id\">Shipping option identifier</param>\n    /// <param name=\"title\">Option title</param>\n    /// <param name=\"prices\">List of price portions</param>\n    public ShippingOption(string id, string title, IEnumerable<LabeledPrice> prices)\n    {\n        this.Id = id ?? throw new ArgumentNullException(nameof(id));\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Prices = prices ?? throw new ArgumentNullException(nameof(prices));\n    }\n\n    /// <summary>\n    /// Shipping option identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; }\n\n    /// <summary>\n    /// Option title\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; }\n\n    /// <summary>\n    /// List of price portions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Prices)]\n    public IEnumerable<LabeledPrice> Prices { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/ShippingQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object contains information about an incoming shipping query.\n/// </summary>\npublic class ShippingQuery\n{\n    /// <summary>\n    /// Unique query identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// User who sent the query\n    /// </summary>\n    [JsonPropertyName(PropertyNames.From)]\n    public User From { get; set; } = null!;\n\n    /// <summary>\n    /// Bot-specified invoice payload\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InvoicePayload)]\n    public string InvoicePayload { get; set; } = null!;\n\n    /// <summary>\n    /// User specified shipping address\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShippingAddress)]\n    public ShippingAddress ShippingAddress { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/StarTransaction.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Describes a Telegram Star transaction. Note that if the buyer initiates a chargeback with the payment provider from whom they acquired Stars (e.g., Apple, Google) following this transaction, the refunded Stars will be deducted from the bot's balance. This is outside of Telegram's control.\n/// </summary>\npublic class StarTransaction\n{\n    /// <summary>\n    /// Unique identifier of the transaction. Coincides with the identifier of the original transaction for refund transactions. Coincides with <em>SuccessfulPayment.telegram_payment_charge_id</em> for successful incoming payments from users.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// Integer amount of Telegram Stars transferred by the transaction\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Amount)]\n    public int Amount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of 1/1000000000 shares of Telegram Stars transferred by the transaction; from 0 to 999999999\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NanostarAmount)]\n    public int? NanostarAmount { get; set; }\n\n    /// <summary>\n    /// Date the transaction was created in Unix time\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Date)]\n    public int Date { get; set; }\n\n    /// <summary>\n    /// Optional. Source of an incoming transaction (e.g., a user purchasing goods or services, Fragment refunding a failed withdrawal). Only for incoming transactions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public TransactionPartner? Source { get; set; }\n\n    /// <summary>\n    /// Optional. Receiver of an outgoing transaction (e.g., a user for a purchase refund, Fragment for a withdrawal). Only for outgoing transactions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Receiver)]\n    public TransactionPartner? Receiver { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/StarTransactions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Contains a list of Telegram Star transactions.\n/// </summary>\npublic class StarTransactions\n{\n    /// <summary>\n    /// The list of transactions\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Transactions)]\n    public IEnumerable<StarTransaction> Transactions { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/SuccessfulPayment.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object contains basic information about a successful payment. Note that if the buyer initiates a chargeback with the relevant payment provider following this transaction, the funds may be debited from your balance. This is outside of Telegram's control.\n/// </summary>\npublic class SuccessfulPayment\n{\n    /// <summary>\n    /// Three-letter ISO 4217 <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">currency</a> code, or “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Currency)]\n    public string Currency { get; set; } = null!;\n\n    /// <summary>\n    /// Total price in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a price of <em>US$ 1.45</em> pass <em>amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalAmount)]\n    public int TotalAmount { get; set; }\n\n    /// <summary>\n    /// Bot-specified invoice payload\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InvoicePayload)]\n    public string InvoicePayload { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Expiration date of the subscription, in Unix time; for recurring payments only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SubscriptionExpirationDate)]\n    public int? SubscriptionExpirationDate { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the payment is a recurring payment for a subscription\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsRecurring)]\n    public bool? IsRecurring { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the payment is the first payment for a subscription\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsFirstRecurring)]\n    public bool? IsFirstRecurring { get; set; }\n\n    /// <summary>\n    /// Optional. Identifier of the shipping option chosen by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShippingOptionId)]\n    public string? ShippingOptionId { get; set; }\n\n    /// <summary>\n    /// Optional. Order information provided by the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OrderInfo)]\n    public OrderInfo? OrderInfo { get; set; }\n\n    /// <summary>\n    /// Telegram payment identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TelegramPaymentChargeId)]\n    public string TelegramPaymentChargeId { get; set; } = null!;\n\n    /// <summary>\n    /// Provider payment identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProviderPaymentChargeId)]\n    public string ProviderPaymentChargeId { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/TransactionPartner/TransactionPartner.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// This object describes the source of a transaction, or its recipient for outgoing transactions. Currently, it can be one of\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"TransactionPartnerUser\"/></description></item>\n/// <item><description><see cref=\"TransactionPartnerChat\"/></description></item>\n/// <item><description><see cref=\"TransactionPartnerAffiliateProgram\"/></description></item>\n/// <item><description><see cref=\"TransactionPartnerFragment\"/></description></item>\n/// <item><description><see cref=\"TransactionPartnerTelegramAds\"/></description></item>\n/// <item><description><see cref=\"TransactionPartnerTelegramApi\"/></description></item>\n/// <item><description><see cref=\"TransactionPartnerOther\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(TransactionPartnerConverter))]\npublic abstract class TransactionPartner\n{\n    /// <summary>\n    /// Type of the transaction partner\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/TransactionPartner/TransactionPartnerAffiliateProgram.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Describes the affiliate program that issued the affiliate commission received via this transaction.\n/// </summary>\npublic class TransactionPartnerAffiliateProgram : TransactionPartner\n{\n    /// <summary>\n    /// Type of the transaction partner, always “affiliate_program”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"affiliate_program\";\n\n    /// <summary>\n    /// Optional. Information about the bot that sponsored the affiliate program\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SponsorUser)]\n    public User? SponsorUser { get; set; }\n\n    /// <summary>\n    /// The number of Telegram Stars received by the bot for each 1000 Telegram Stars received by the affiliate program sponsor from referred users\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CommissionPerMille)]\n    public int CommissionPerMille { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/TransactionPartner/TransactionPartnerChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Describes a transaction with a chat.\n/// </summary>\npublic class TransactionPartnerChat : TransactionPartner\n{\n    /// <summary>\n    /// Type of the transaction partner, always “chat”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"chat\";\n\n    /// <summary>\n    /// Information about the chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Chat)]\n    public Chat Chat { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. The gift sent to the chat by the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gift)]\n    public Gift? Gift { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/TransactionPartner/TransactionPartnerFragment.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Describes a withdrawal transaction with Fragment.\n/// </summary>\npublic class TransactionPartnerFragment : TransactionPartner\n{\n    /// <summary>\n    /// Type of the transaction partner, always “fragment”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"fragment\";\n\n    /// <summary>\n    /// Optional. State of the transaction if the transaction is outgoing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.WithdrawalState)]\n    public RevenueWithdrawalState? WithdrawalState { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/TransactionPartner/TransactionPartnerOther.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Describes a transaction with an unknown source or recipient.\n/// </summary>\npublic class TransactionPartnerOther : TransactionPartner\n{\n    /// <summary>\n    /// Type of the transaction partner, always “other”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"other\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/TransactionPartner/TransactionPartnerTelegramAds.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Describes a withdrawal transaction to the Telegram Ads platform.\n/// </summary>\npublic class TransactionPartnerTelegramAds : TransactionPartner\n{\n    /// <summary>\n    /// Type of the transaction partner, always “telegram_ads”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"telegram_ads\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/TransactionPartner/TransactionPartnerTelegramApi.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Describes a transaction with payment for <a href=\"https://core.telegram.org/bots/api#paid-broadcasts\">paid broadcasting</a>.\n/// </summary>\npublic class TransactionPartnerTelegramApi : TransactionPartner\n{\n    /// <summary>\n    /// Type of the transaction partner, always “telegram_api”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"telegram_api\";\n\n    /// <summary>\n    /// The number of successful requests that exceeded regular limits and were therefore billed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RequestCount)]\n    public int RequestCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/TransactionPartner/TransactionPartnerUser.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Describes a transaction with a user.\n/// </summary>\npublic class TransactionPartnerUser : TransactionPartner\n{\n    /// <summary>\n    /// Type of the transaction partner, always “user”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type => \"user\";\n\n    /// <summary>\n    /// Type of the transaction, currently one of “invoice_payment” for payments via invoices, “paid_media_payment” for payments for paid media, “gift_purchase” for gifts sent by the bot, “premium_purchase” for Telegram Premium subscriptions gifted by the bot, “business_account_transfer” for direct transfers from managed business accounts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TransactionType)]\n    public string TransactionType { get; set; } = null!;\n\n    /// <summary>\n    /// Information about the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.User)]\n    public User User { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Information about the affiliate that received a commission via this transaction. Can be available only for “invoice_payment” and “paid_media_payment” transactions.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Affiliate)]\n    public AffiliateInfo? Affiliate { get; set; }\n\n    /// <summary>\n    /// Optional. Bot-specified invoice payload. Can be available only for “invoice_payment” transactions.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InvoicePayload)]\n    public string? InvoicePayload { get; set; }\n\n    /// <summary>\n    /// Optional. The duration of the paid subscription. Can be available only for “invoice_payment” transactions.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SubscriptionPeriod)]\n    public int? SubscriptionPeriod { get; set; }\n\n    /// <summary>\n    /// Optional. Information about the paid media bought by the user; for “paid_media_payment” transactions only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMedia)]\n    public IEnumerable<PaidMedia>? PaidMedia { get; set; }\n\n    /// <summary>\n    /// Optional. Bot-specified paid media payload. Can be available only for “paid_media_payment” transactions.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PaidMediaPayload)]\n    public string? PaidMediaPayload { get; set; }\n\n    /// <summary>\n    /// Optional. The gift sent to the user by the bot; for “gift_purchase” transactions only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gift)]\n    public Gift? Gift { get; set; }\n\n    /// <summary>\n    /// Optional. Number of months the gifted Telegram Premium subscription will be active for; for “premium_purchase” transactions only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PremiumSubscriptionDuration)]\n    public int? PremiumSubscriptionDuration { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/answerPreCheckoutQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class PaymentsExtensions\n{\n    /// <summary>\n    /// Once the user has confirmed their payment and shipping details, the Bot API sends the final confirmation in the form of an <see cref=\"Update\"/> with the field <em>pre_checkout_query</em>. Use this method to respond to such pre-checkout queries. On success, <em>True</em> is returned. <strong>Note:</strong> The Bot API must receive an answer within 10 seconds after the pre-checkout query was sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"preCheckoutQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"ok\">Specify <em>True</em> if everything is alright (goods are available, etc.) and the bot is ready to proceed with the order. Use <em>False</em> if there are any problems.</param>\n    /// <param name=\"errorMessage\">Required if <em>ok</em> is <em>False</em>. Error message in human readable form that explains the reason for failure to proceed with the checkout (e.g. \"Sorry, somebody just bought the last of our amazing black T-shirts while you were busy filling out your payment details. Please choose a different color or garment!\"). Telegram will display this message to the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AnswerPreCheckoutQuery(\n        this ITelegramBotClient client,\n        string preCheckoutQueryId,\n        bool ok,\n        string? errorMessage = null\n    ) =>\n        client\n            .AnswerPreCheckoutQueryAsync(preCheckoutQueryId, ok, errorMessage)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Once the user has confirmed their payment and shipping details, the Bot API sends the final confirmation in the form of an <see cref=\"Update\"/> with the field <em>pre_checkout_query</em>. Use this method to respond to such pre-checkout queries. On success, <em>True</em> is returned. <strong>Note:</strong> The Bot API must receive an answer within 10 seconds after the pre-checkout query was sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"preCheckoutQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"ok\">Specify <em>True</em> if everything is alright (goods are available, etc.) and the bot is ready to proceed with the order. Use <em>False</em> if there are any problems.</param>\n    /// <param name=\"errorMessage\">Required if <em>ok</em> is <em>False</em>. Error message in human readable form that explains the reason for failure to proceed with the checkout (e.g. \"Sorry, somebody just bought the last of our amazing black T-shirts while you were busy filling out your payment details. Please choose a different color or garment!\"). Telegram will display this message to the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AnswerPreCheckoutQueryAsync(\n        this ITelegramBotClient client,\n        string preCheckoutQueryId,\n        bool ok,\n        string? errorMessage = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.PreCheckoutQueryId,\n                preCheckoutQueryId ?? throw new ArgumentNullException(nameof(preCheckoutQueryId))\n            },\n            { PropertyNames.Ok, ok },\n        };\n        if (errorMessage is not null)\n        {\n            args.Add(PropertyNames.ErrorMessage, errorMessage);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.AnswerPreCheckoutQuery,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/answerShippingQuery.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class PaymentsExtensions\n{\n    /// <summary>\n    /// If you sent an invoice requesting a shipping address and the parameter <em>is_flexible</em> was specified, the Bot API will send an <see cref=\"Update\"/> with a <em>shipping_query</em> field to the bot. Use this method to reply to shipping queries. On success, <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerShippingQuery\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AnswerShippingQuery(\n        this ITelegramBotClient client,\n        AnswerShippingQueryArgs args\n    ) => client.AnswerShippingQueryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// If you sent an invoice requesting a shipping address and the parameter <em>is_flexible</em> was specified, the Bot API will send an <see cref=\"Update\"/> with a <em>shipping_query</em> field to the bot. Use this method to reply to shipping queries. On success, <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AnswerShippingQuery\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AnswerShippingQueryAsync(\n        this ITelegramBotClient client,\n        AnswerShippingQueryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.AnswerShippingQuery,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// If you sent an invoice requesting a shipping address and the parameter <em>is_flexible</em> was specified, the Bot API will send an <see cref=\"Update\"/> with a <em>shipping_query</em> field to the bot. Use this method to reply to shipping queries. On success, <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"shippingQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"ok\">Pass <em>True</em> if delivery to the specified address is possible and <em>False</em> if there are any problems (for example, if delivery to the specified address is not possible)</param>\n    /// <param name=\"shippingOptions\">Required if <em>ok</em> is <em>True</em>. A JSON-serialized array of available shipping options.</param>\n    /// <param name=\"errorMessage\">Required if <em>ok</em> is <em>False</em>. Error message in human readable form that explains why it is impossible to complete the order (e.g. “Sorry, delivery to your desired address is unavailable”). Telegram will display this message to the user.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AnswerShippingQuery(\n        this ITelegramBotClient client,\n        string shippingQueryId,\n        bool ok,\n        IEnumerable<ShippingOption>? shippingOptions = null,\n        string? errorMessage = null\n    ) =>\n        client\n            .AnswerShippingQueryAsync(shippingQueryId, ok, shippingOptions, errorMessage)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// If you sent an invoice requesting a shipping address and the parameter <em>is_flexible</em> was specified, the Bot API will send an <see cref=\"Update\"/> with a <em>shipping_query</em> field to the bot. Use this method to reply to shipping queries. On success, <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"shippingQueryId\">Unique identifier for the query to be answered</param>\n    /// <param name=\"ok\">Pass <em>True</em> if delivery to the specified address is possible and <em>False</em> if there are any problems (for example, if delivery to the specified address is not possible)</param>\n    /// <param name=\"shippingOptions\">Required if <em>ok</em> is <em>True</em>. A JSON-serialized array of available shipping options.</param>\n    /// <param name=\"errorMessage\">Required if <em>ok</em> is <em>False</em>. Error message in human readable form that explains why it is impossible to complete the order (e.g. “Sorry, delivery to your desired address is unavailable”). Telegram will display this message to the user.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AnswerShippingQueryAsync(\n        this ITelegramBotClient client,\n        string shippingQueryId,\n        bool ok,\n        IEnumerable<ShippingOption>? shippingOptions = null,\n        string? errorMessage = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.ShippingQueryId,\n                shippingQueryId ?? throw new ArgumentNullException(nameof(shippingQueryId))\n            },\n            { PropertyNames.Ok, ok },\n        };\n        if (shippingOptions is not null)\n        {\n            args.Add(PropertyNames.ShippingOptions, shippingOptions);\n        }\n        if (errorMessage is not null)\n        {\n            args.Add(PropertyNames.ErrorMessage, errorMessage);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.AnswerShippingQuery,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/createInvoiceLink.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class PaymentsExtensions\n{\n    /// <summary>\n    /// Use this method to create a link for an invoice. Returns the created invoice link as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CreateInvoiceLink\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static string CreateInvoiceLink(\n        this ITelegramBotClient client,\n        CreateInvoiceLinkArgs args\n    ) => client.CreateInvoiceLinkAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to create a link for an invoice. Returns the created invoice link as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CreateInvoiceLink\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<string> CreateInvoiceLinkAsync(\n        this ITelegramBotClient client,\n        CreateInvoiceLinkArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<string>(\n            MethodNames.CreateInvoiceLink,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to create a link for an invoice. Returns the created invoice link as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the link will be created. For payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a> only.</param>\n    /// <param name=\"providerToken\">Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"subscriptionPeriod\">The number of seconds the subscription will be active for before the next payment. The currency must be set to “XTR” (Telegram Stars) if the parameter is used. Currently, it must always be 2592000 (30 days) if specified. Any number of subscriptions can be active for a given bot at the same time, including multiple concurrent subscriptions from the same user. Subscription price must no exceed 10000 Telegram Stars.</param>\n    /// <param name=\"maxTipAmount\">The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"suggestedTipAmounts\">A JSON-serialized array of suggested amounts of tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.</param>\n    /// <param name=\"providerData\">JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.</param>\n    /// <param name=\"photoUrl\">URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service.</param>\n    /// <param name=\"photoSize\">Photo size in bytes</param>\n    /// <param name=\"photoWidth\">Photo width</param>\n    /// <param name=\"photoHeight\">Photo height</param>\n    /// <param name=\"needName\">Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needPhoneNumber\">Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needEmail\">Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needShippingAddress\">Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendPhoneNumberToProvider\">Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendEmailToProvider\">Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"isFlexible\">Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static string CreateInvoiceLink(\n        this ITelegramBotClient client,\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices,\n        string? businessConnectionId = null,\n        string? providerToken = null,\n        int? subscriptionPeriod = null,\n        int? maxTipAmount = null,\n        IEnumerable<int>? suggestedTipAmounts = null,\n        string? providerData = null,\n        string? photoUrl = null,\n        int? photoSize = null,\n        int? photoWidth = null,\n        int? photoHeight = null,\n        bool? needName = null,\n        bool? needPhoneNumber = null,\n        bool? needEmail = null,\n        bool? needShippingAddress = null,\n        bool? sendPhoneNumberToProvider = null,\n        bool? sendEmailToProvider = null,\n        bool? isFlexible = null\n    ) =>\n        client\n            .CreateInvoiceLinkAsync(\n                title,\n                description,\n                payload,\n                currency,\n                prices,\n                businessConnectionId,\n                providerToken,\n                subscriptionPeriod,\n                maxTipAmount,\n                suggestedTipAmounts,\n                providerData,\n                photoUrl,\n                photoSize,\n                photoWidth,\n                photoHeight,\n                needName,\n                needPhoneNumber,\n                needEmail,\n                needShippingAddress,\n                sendPhoneNumberToProvider,\n                sendEmailToProvider,\n                isFlexible\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to create a link for an invoice. Returns the created invoice link as <em>String</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the link will be created. For payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a> only.</param>\n    /// <param name=\"providerToken\">Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"subscriptionPeriod\">The number of seconds the subscription will be active for before the next payment. The currency must be set to “XTR” (Telegram Stars) if the parameter is used. Currently, it must always be 2592000 (30 days) if specified. Any number of subscriptions can be active for a given bot at the same time, including multiple concurrent subscriptions from the same user. Subscription price must no exceed 10000 Telegram Stars.</param>\n    /// <param name=\"maxTipAmount\">The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"suggestedTipAmounts\">A JSON-serialized array of suggested amounts of tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.</param>\n    /// <param name=\"providerData\">JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.</param>\n    /// <param name=\"photoUrl\">URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service.</param>\n    /// <param name=\"photoSize\">Photo size in bytes</param>\n    /// <param name=\"photoWidth\">Photo width</param>\n    /// <param name=\"photoHeight\">Photo height</param>\n    /// <param name=\"needName\">Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needPhoneNumber\">Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needEmail\">Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needShippingAddress\">Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendPhoneNumberToProvider\">Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendEmailToProvider\">Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"isFlexible\">Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<string> CreateInvoiceLinkAsync(\n        this ITelegramBotClient client,\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices,\n        string? businessConnectionId = null,\n        string? providerToken = null,\n        int? subscriptionPeriod = null,\n        int? maxTipAmount = null,\n        IEnumerable<int>? suggestedTipAmounts = null,\n        string? providerData = null,\n        string? photoUrl = null,\n        int? photoSize = null,\n        int? photoWidth = null,\n        int? photoHeight = null,\n        bool? needName = null,\n        bool? needPhoneNumber = null,\n        bool? needEmail = null,\n        bool? needShippingAddress = null,\n        bool? sendPhoneNumberToProvider = null,\n        bool? sendEmailToProvider = null,\n        bool? isFlexible = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n            {\n                PropertyNames.Description,\n                description ?? throw new ArgumentNullException(nameof(description))\n            },\n            { PropertyNames.Payload, payload ?? throw new ArgumentNullException(nameof(payload)) },\n            {\n                PropertyNames.Currency,\n                currency ?? throw new ArgumentNullException(nameof(currency))\n            },\n            { PropertyNames.Prices, prices ?? throw new ArgumentNullException(nameof(prices)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (providerToken is not null)\n        {\n            args.Add(PropertyNames.ProviderToken, providerToken);\n        }\n        if (subscriptionPeriod is not null)\n        {\n            args.Add(PropertyNames.SubscriptionPeriod, subscriptionPeriod);\n        }\n        if (maxTipAmount is not null)\n        {\n            args.Add(PropertyNames.MaxTipAmount, maxTipAmount);\n        }\n        if (suggestedTipAmounts is not null)\n        {\n            args.Add(PropertyNames.SuggestedTipAmounts, suggestedTipAmounts);\n        }\n        if (providerData is not null)\n        {\n            args.Add(PropertyNames.ProviderData, providerData);\n        }\n        if (photoUrl is not null)\n        {\n            args.Add(PropertyNames.PhotoUrl, photoUrl);\n        }\n        if (photoSize is not null)\n        {\n            args.Add(PropertyNames.PhotoSize, photoSize);\n        }\n        if (photoWidth is not null)\n        {\n            args.Add(PropertyNames.PhotoWidth, photoWidth);\n        }\n        if (photoHeight is not null)\n        {\n            args.Add(PropertyNames.PhotoHeight, photoHeight);\n        }\n        if (needName is not null)\n        {\n            args.Add(PropertyNames.NeedName, needName);\n        }\n        if (needPhoneNumber is not null)\n        {\n            args.Add(PropertyNames.NeedPhoneNumber, needPhoneNumber);\n        }\n        if (needEmail is not null)\n        {\n            args.Add(PropertyNames.NeedEmail, needEmail);\n        }\n        if (needShippingAddress is not null)\n        {\n            args.Add(PropertyNames.NeedShippingAddress, needShippingAddress);\n        }\n        if (sendPhoneNumberToProvider is not null)\n        {\n            args.Add(PropertyNames.SendPhoneNumberToProvider, sendPhoneNumberToProvider);\n        }\n        if (sendEmailToProvider is not null)\n        {\n            args.Add(PropertyNames.SendEmailToProvider, sendEmailToProvider);\n        }\n        if (isFlexible is not null)\n        {\n            args.Add(PropertyNames.IsFlexible, isFlexible);\n        }\n\n        return client.CallMethodAsync<string>(\n            MethodNames.CreateInvoiceLink,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/editUserStarSubscription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class PaymentsExtensions\n{\n    /// <summary>\n    /// Allows the bot to cancel or re-enable extension of a subscription paid in Telegram Stars. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Identifier of the user whose subscription will be edited</param>\n    /// <param name=\"telegramPaymentChargeId\">Telegram payment identifier for the subscription</param>\n    /// <param name=\"isCanceled\">Pass <em>True</em> to cancel extension of the user subscription; the subscription must be active up to the end of the current subscription period. Pass <em>False</em> to allow the user to re-enable a subscription that was previously canceled by the bot.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditUserStarSubscription(\n        this ITelegramBotClient client,\n        long userId,\n        string telegramPaymentChargeId,\n        bool isCanceled\n    ) =>\n        client\n            .EditUserStarSubscriptionAsync(userId, telegramPaymentChargeId, isCanceled)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Allows the bot to cancel or re-enable extension of a subscription paid in Telegram Stars. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Identifier of the user whose subscription will be edited</param>\n    /// <param name=\"telegramPaymentChargeId\">Telegram payment identifier for the subscription</param>\n    /// <param name=\"isCanceled\">Pass <em>True</em> to cancel extension of the user subscription; the subscription must be active up to the end of the current subscription period. Pass <em>False</em> to allow the user to re-enable a subscription that was previously canceled by the bot.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditUserStarSubscriptionAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string telegramPaymentChargeId,\n        bool isCanceled,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            {\n                PropertyNames.TelegramPaymentChargeId,\n                telegramPaymentChargeId\n                    ?? throw new ArgumentNullException(nameof(telegramPaymentChargeId))\n            },\n            { PropertyNames.IsCanceled, isCanceled },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.EditUserStarSubscription,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/getMyStarBalance.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class PaymentsExtensions\n{\n    /// <summary>\n    /// A method to get the current Telegram Stars balance of the bot. Requires no parameters. On success, returns a <see cref=\"StarAmount\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static StarAmount GetMyStarBalance(this ITelegramBotClient client) =>\n        client.GetMyStarBalanceAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// A method to get the current Telegram Stars balance of the bot. Requires no parameters. On success, returns a <see cref=\"StarAmount\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<StarAmount> GetMyStarBalanceAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<StarAmount>(\n            MethodNames.GetMyStarBalance,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/getStarTransactions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class PaymentsExtensions\n{\n    /// <summary>\n    /// Returns the bot's Telegram Star transactions in chronological order. On success, returns a <see cref=\"StarTransactions\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"offset\">Number of transactions to skip in the response</param>\n    /// <param name=\"limit\">The maximum number of transactions to be retrieved. Values between 1-100 are accepted. Defaults to 100.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static StarTransactions GetStarTransactions(\n        this ITelegramBotClient client,\n        int? offset = null,\n        int? limit = null\n    ) => client.GetStarTransactionsAsync(offset, limit).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the bot's Telegram Star transactions in chronological order. On success, returns a <see cref=\"StarTransactions\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"offset\">Number of transactions to skip in the response</param>\n    /// <param name=\"limit\">The maximum number of transactions to be retrieved. Values between 1-100 are accepted. Defaults to 100.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<StarTransactions> GetStarTransactionsAsync(\n        this ITelegramBotClient client,\n        int? offset = null,\n        int? limit = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { };\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n\n        return client.CallMethodAsync<StarTransactions>(\n            MethodNames.GetStarTransactions,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/refundStarPayment.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class PaymentsExtensions\n{\n    /// <summary>\n    /// Refunds a successful payment in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Identifier of the user whose payment will be refunded</param>\n    /// <param name=\"telegramPaymentChargeId\">Telegram payment identifier</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RefundStarPayment(\n        this ITelegramBotClient client,\n        long userId,\n        string telegramPaymentChargeId\n    ) => client.RefundStarPaymentAsync(userId, telegramPaymentChargeId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Refunds a successful payment in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Identifier of the user whose payment will be refunded</param>\n    /// <param name=\"telegramPaymentChargeId\">Telegram payment identifier</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RefundStarPaymentAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string telegramPaymentChargeId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            {\n                PropertyNames.TelegramPaymentChargeId,\n                telegramPaymentChargeId\n                    ?? throw new ArgumentNullException(nameof(telegramPaymentChargeId))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.RefundStarPayment, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Payments/sendInvoice.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Payments;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class PaymentsExtensions\n{\n    /// <summary>\n    /// Use this method to send invoices. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendInvoice\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendInvoice(this ITelegramBotClient client, SendInvoiceArgs args) =>\n        client.SendInvoiceAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send invoices. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendInvoice\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendInvoiceAsync(\n        this ITelegramBotClient client,\n        SendInvoiceArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendInvoice, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send invoices. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"providerToken\">Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"maxTipAmount\">The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"suggestedTipAmounts\">A JSON-serialized array of suggested amounts of tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.</param>\n    /// <param name=\"startParameter\">Unique deep-linking parameter. If left empty, <strong>forwarded copies</strong> of the sent message will have a <em>Pay</em> button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a <em>URL</em> button with a deep link to the bot (instead of a <em>Pay</em> button), with the value used as the start parameter</param>\n    /// <param name=\"providerData\">JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.</param>\n    /// <param name=\"photoUrl\">URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.</param>\n    /// <param name=\"photoSize\">Photo size in bytes</param>\n    /// <param name=\"photoWidth\">Photo width</param>\n    /// <param name=\"photoHeight\">Photo height</param>\n    /// <param name=\"needName\">Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needPhoneNumber\">Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needEmail\">Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needShippingAddress\">Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendPhoneNumberToProvider\">Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendEmailToProvider\">Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"isFlexible\">Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Pay <em>total price</em>' button will be shown. If not empty, the first button must be a Pay button.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendInvoice(\n        this ITelegramBotClient client,\n        long chatId,\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? providerToken = null,\n        int? maxTipAmount = null,\n        IEnumerable<int>? suggestedTipAmounts = null,\n        string? startParameter = null,\n        string? providerData = null,\n        string? photoUrl = null,\n        int? photoSize = null,\n        int? photoWidth = null,\n        int? photoHeight = null,\n        bool? needName = null,\n        bool? needPhoneNumber = null,\n        bool? needEmail = null,\n        bool? needShippingAddress = null,\n        bool? sendPhoneNumberToProvider = null,\n        bool? sendEmailToProvider = null,\n        bool? isFlexible = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendInvoiceAsync(\n                chatId,\n                title,\n                description,\n                payload,\n                currency,\n                prices,\n                messageThreadId,\n                directMessagesTopicId,\n                providerToken,\n                maxTipAmount,\n                suggestedTipAmounts,\n                startParameter,\n                providerData,\n                photoUrl,\n                photoSize,\n                photoWidth,\n                photoHeight,\n                needName,\n                needPhoneNumber,\n                needEmail,\n                needShippingAddress,\n                sendPhoneNumberToProvider,\n                sendEmailToProvider,\n                isFlexible,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send invoices. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"providerToken\">Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"maxTipAmount\">The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"suggestedTipAmounts\">A JSON-serialized array of suggested amounts of tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.</param>\n    /// <param name=\"startParameter\">Unique deep-linking parameter. If left empty, <strong>forwarded copies</strong> of the sent message will have a <em>Pay</em> button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a <em>URL</em> button with a deep link to the bot (instead of a <em>Pay</em> button), with the value used as the start parameter</param>\n    /// <param name=\"providerData\">JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.</param>\n    /// <param name=\"photoUrl\">URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.</param>\n    /// <param name=\"photoSize\">Photo size in bytes</param>\n    /// <param name=\"photoWidth\">Photo width</param>\n    /// <param name=\"photoHeight\">Photo height</param>\n    /// <param name=\"needName\">Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needPhoneNumber\">Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needEmail\">Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needShippingAddress\">Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendPhoneNumberToProvider\">Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendEmailToProvider\">Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"isFlexible\">Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Pay <em>total price</em>' button will be shown. If not empty, the first button must be a Pay button.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendInvoiceAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? providerToken = null,\n        int? maxTipAmount = null,\n        IEnumerable<int>? suggestedTipAmounts = null,\n        string? startParameter = null,\n        string? providerData = null,\n        string? photoUrl = null,\n        int? photoSize = null,\n        int? photoWidth = null,\n        int? photoHeight = null,\n        bool? needName = null,\n        bool? needPhoneNumber = null,\n        bool? needEmail = null,\n        bool? needShippingAddress = null,\n        bool? sendPhoneNumberToProvider = null,\n        bool? sendEmailToProvider = null,\n        bool? isFlexible = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n            {\n                PropertyNames.Description,\n                description ?? throw new ArgumentNullException(nameof(description))\n            },\n            { PropertyNames.Payload, payload ?? throw new ArgumentNullException(nameof(payload)) },\n            {\n                PropertyNames.Currency,\n                currency ?? throw new ArgumentNullException(nameof(currency))\n            },\n            { PropertyNames.Prices, prices ?? throw new ArgumentNullException(nameof(prices)) },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (providerToken is not null)\n        {\n            args.Add(PropertyNames.ProviderToken, providerToken);\n        }\n        if (maxTipAmount is not null)\n        {\n            args.Add(PropertyNames.MaxTipAmount, maxTipAmount);\n        }\n        if (suggestedTipAmounts is not null)\n        {\n            args.Add(PropertyNames.SuggestedTipAmounts, suggestedTipAmounts);\n        }\n        if (startParameter is not null)\n        {\n            args.Add(PropertyNames.StartParameter, startParameter);\n        }\n        if (providerData is not null)\n        {\n            args.Add(PropertyNames.ProviderData, providerData);\n        }\n        if (photoUrl is not null)\n        {\n            args.Add(PropertyNames.PhotoUrl, photoUrl);\n        }\n        if (photoSize is not null)\n        {\n            args.Add(PropertyNames.PhotoSize, photoSize);\n        }\n        if (photoWidth is not null)\n        {\n            args.Add(PropertyNames.PhotoWidth, photoWidth);\n        }\n        if (photoHeight is not null)\n        {\n            args.Add(PropertyNames.PhotoHeight, photoHeight);\n        }\n        if (needName is not null)\n        {\n            args.Add(PropertyNames.NeedName, needName);\n        }\n        if (needPhoneNumber is not null)\n        {\n            args.Add(PropertyNames.NeedPhoneNumber, needPhoneNumber);\n        }\n        if (needEmail is not null)\n        {\n            args.Add(PropertyNames.NeedEmail, needEmail);\n        }\n        if (needShippingAddress is not null)\n        {\n            args.Add(PropertyNames.NeedShippingAddress, needShippingAddress);\n        }\n        if (sendPhoneNumberToProvider is not null)\n        {\n            args.Add(PropertyNames.SendPhoneNumberToProvider, sendPhoneNumberToProvider);\n        }\n        if (sendEmailToProvider is not null)\n        {\n            args.Add(PropertyNames.SendEmailToProvider, sendEmailToProvider);\n        }\n        if (isFlexible is not null)\n        {\n            args.Add(PropertyNames.IsFlexible, isFlexible);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendInvoice, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send invoices. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"providerToken\">Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"maxTipAmount\">The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"suggestedTipAmounts\">A JSON-serialized array of suggested amounts of tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.</param>\n    /// <param name=\"startParameter\">Unique deep-linking parameter. If left empty, <strong>forwarded copies</strong> of the sent message will have a <em>Pay</em> button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a <em>URL</em> button with a deep link to the bot (instead of a <em>Pay</em> button), with the value used as the start parameter</param>\n    /// <param name=\"providerData\">JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.</param>\n    /// <param name=\"photoUrl\">URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.</param>\n    /// <param name=\"photoSize\">Photo size in bytes</param>\n    /// <param name=\"photoWidth\">Photo width</param>\n    /// <param name=\"photoHeight\">Photo height</param>\n    /// <param name=\"needName\">Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needPhoneNumber\">Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needEmail\">Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needShippingAddress\">Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendPhoneNumberToProvider\">Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendEmailToProvider\">Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"isFlexible\">Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Pay <em>total price</em>' button will be shown. If not empty, the first button must be a Pay button.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendInvoice(\n        this ITelegramBotClient client,\n        string chatId,\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? providerToken = null,\n        int? maxTipAmount = null,\n        IEnumerable<int>? suggestedTipAmounts = null,\n        string? startParameter = null,\n        string? providerData = null,\n        string? photoUrl = null,\n        int? photoSize = null,\n        int? photoWidth = null,\n        int? photoHeight = null,\n        bool? needName = null,\n        bool? needPhoneNumber = null,\n        bool? needEmail = null,\n        bool? needShippingAddress = null,\n        bool? sendPhoneNumberToProvider = null,\n        bool? sendEmailToProvider = null,\n        bool? isFlexible = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendInvoiceAsync(\n                chatId,\n                title,\n                description,\n                payload,\n                currency,\n                prices,\n                messageThreadId,\n                directMessagesTopicId,\n                providerToken,\n                maxTipAmount,\n                suggestedTipAmounts,\n                startParameter,\n                providerData,\n                photoUrl,\n                photoSize,\n                photoWidth,\n                photoHeight,\n                needName,\n                needPhoneNumber,\n                needEmail,\n                needShippingAddress,\n                sendPhoneNumberToProvider,\n                sendEmailToProvider,\n                isFlexible,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send invoices. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"title\">Product name, 1-32 characters</param>\n    /// <param name=\"description\">Product description, 1-255 characters</param>\n    /// <param name=\"payload\">Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use it for your internal processes.</param>\n    /// <param name=\"currency\">Three-letter ISO 4217 currency code, see <a href=\"https://core.telegram.org/bots/payments#supported-currencies\">more on currencies</a>. Pass “XTR” for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"prices\">Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"providerToken\">Payment provider token, obtained via <a href=\"https://t.me/botfather\">@BotFather</a>. Pass an empty string for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"maxTipAmount\">The maximum accepted amount for tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). For example, for a maximum tip of <em>US$ 1.45</em> pass <em>max_tip_amount = 145</em>. See the <em>exp</em> parameter in <a href=\"https://core.telegram.org/bots/payments/currencies.json\">currencies.json</a>, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"suggestedTipAmounts\">A JSON-serialized array of suggested amounts of tips in the <em>smallest units</em> of the currency (integer, <strong>not</strong> float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed <em>max_tip_amount</em>.</param>\n    /// <param name=\"startParameter\">Unique deep-linking parameter. If left empty, <strong>forwarded copies</strong> of the sent message will have a <em>Pay</em> button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a <em>URL</em> button with a deep link to the bot (instead of a <em>Pay</em> button), with the value used as the start parameter</param>\n    /// <param name=\"providerData\">JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.</param>\n    /// <param name=\"photoUrl\">URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.</param>\n    /// <param name=\"photoSize\">Photo size in bytes</param>\n    /// <param name=\"photoWidth\">Photo width</param>\n    /// <param name=\"photoHeight\">Photo height</param>\n    /// <param name=\"needName\">Pass <em>True</em> if you require the user's full name to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needPhoneNumber\">Pass <em>True</em> if you require the user's phone number to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needEmail\">Pass <em>True</em> if you require the user's email address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"needShippingAddress\">Pass <em>True</em> if you require the user's shipping address to complete the order. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendPhoneNumberToProvider\">Pass <em>True</em> if the user's phone number should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"sendEmailToProvider\">Pass <em>True</em> if the user's email address should be sent to the provider. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"isFlexible\">Pass <em>True</em> if the final price depends on the shipping method. Ignored for payments in <a href=\"https://t.me/BotNews/90\">Telegram Stars</a>.</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>. If empty, one 'Pay <em>total price</em>' button will be shown. If not empty, the first button must be a Pay button.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendInvoiceAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string title,\n        string description,\n        string payload,\n        string currency,\n        IEnumerable<LabeledPrice> prices,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? providerToken = null,\n        int? maxTipAmount = null,\n        IEnumerable<int>? suggestedTipAmounts = null,\n        string? startParameter = null,\n        string? providerData = null,\n        string? photoUrl = null,\n        int? photoSize = null,\n        int? photoWidth = null,\n        int? photoHeight = null,\n        bool? needName = null,\n        bool? needPhoneNumber = null,\n        bool? needEmail = null,\n        bool? needShippingAddress = null,\n        bool? sendPhoneNumberToProvider = null,\n        bool? sendEmailToProvider = null,\n        bool? isFlexible = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n            {\n                PropertyNames.Description,\n                description ?? throw new ArgumentNullException(nameof(description))\n            },\n            { PropertyNames.Payload, payload ?? throw new ArgumentNullException(nameof(payload)) },\n            {\n                PropertyNames.Currency,\n                currency ?? throw new ArgumentNullException(nameof(currency))\n            },\n            { PropertyNames.Prices, prices ?? throw new ArgumentNullException(nameof(prices)) },\n        };\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (providerToken is not null)\n        {\n            args.Add(PropertyNames.ProviderToken, providerToken);\n        }\n        if (maxTipAmount is not null)\n        {\n            args.Add(PropertyNames.MaxTipAmount, maxTipAmount);\n        }\n        if (suggestedTipAmounts is not null)\n        {\n            args.Add(PropertyNames.SuggestedTipAmounts, suggestedTipAmounts);\n        }\n        if (startParameter is not null)\n        {\n            args.Add(PropertyNames.StartParameter, startParameter);\n        }\n        if (providerData is not null)\n        {\n            args.Add(PropertyNames.ProviderData, providerData);\n        }\n        if (photoUrl is not null)\n        {\n            args.Add(PropertyNames.PhotoUrl, photoUrl);\n        }\n        if (photoSize is not null)\n        {\n            args.Add(PropertyNames.PhotoSize, photoSize);\n        }\n        if (photoWidth is not null)\n        {\n            args.Add(PropertyNames.PhotoWidth, photoWidth);\n        }\n        if (photoHeight is not null)\n        {\n            args.Add(PropertyNames.PhotoHeight, photoHeight);\n        }\n        if (needName is not null)\n        {\n            args.Add(PropertyNames.NeedName, needName);\n        }\n        if (needPhoneNumber is not null)\n        {\n            args.Add(PropertyNames.NeedPhoneNumber, needPhoneNumber);\n        }\n        if (needEmail is not null)\n        {\n            args.Add(PropertyNames.NeedEmail, needEmail);\n        }\n        if (needShippingAddress is not null)\n        {\n            args.Add(PropertyNames.NeedShippingAddress, needShippingAddress);\n        }\n        if (sendPhoneNumberToProvider is not null)\n        {\n            args.Add(PropertyNames.SendPhoneNumberToProvider, sendPhoneNumberToProvider);\n        }\n        if (sendEmailToProvider is not null)\n        {\n            args.Add(PropertyNames.SendEmailToProvider, sendEmailToProvider);\n        }\n        if (isFlexible is not null)\n        {\n            args.Add(PropertyNames.IsFlexible, isFlexible);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendInvoice, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/PropertyNames.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Defines all the property names used by models and methods in the Telegram Bot API.\n/// </summary>\npublic static partial class PropertyNames\n{\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n    public const string AccentColorId = \"accent_color_id\";\n    public const string AcceptedGiftTypes = \"accepted_gift_types\";\n    public const string Action = \"action\";\n    public const string ActivePeriod = \"active_period\";\n    public const string ActiveUsernames = \"active_usernames\";\n    public const string ActorChat = \"actor_chat\";\n    public const string ActorChatId = \"actor_chat_id\";\n    public const string AddDate = \"add_date\";\n    public const string AddedByChat = \"added_by_chat\";\n    public const string AddedByUser = \"added_by_user\";\n    public const string AddedToAttachmentMenu = \"added_to_attachment_menu\";\n    public const string AddedUserIds = \"added_user_ids\";\n    public const string AddedUsers = \"added_users\";\n    public const string AdditionDate = \"addition_date\";\n    public const string AdditionalChatCount = \"additional_chat_count\";\n    public const string Address = \"address\";\n    public const string Affiliate = \"affiliate\";\n    public const string AffiliateChat = \"affiliate_chat\";\n    public const string AffiliateUser = \"affiliate_user\";\n    public const string AllowAddingOptions = \"allow_adding_options\";\n    public const string AllowBotChats = \"allow_bot_chats\";\n    public const string AllowChannelChats = \"allow_channel_chats\";\n    public const string AllowGroupChats = \"allow_group_chats\";\n    public const string AllowPaidBroadcast = \"allow_paid_broadcast\";\n    public const string AllowSendingWithoutReply = \"allow_sending_without_reply\";\n    public const string AllowUserChats = \"allow_user_chats\";\n    public const string AllowedUpdates = \"allowed_updates\";\n    public const string AllowsMultipleAnswers = \"allows_multiple_answers\";\n    public const string AllowsRevoting = \"allows_revoting\";\n    public const string AllowsUsersToCreateTopics = \"allows_users_to_create_topics\";\n    public const string Amount = \"amount\";\n    public const string Animation = \"animation\";\n    public const string AreDirectMessagesEnabled = \"are_direct_messages_enabled\";\n    public const string Areas = \"areas\";\n    public const string Audio = \"audio\";\n    public const string AudioDuration = \"audio_duration\";\n    public const string AudioFileId = \"audio_file_id\";\n    public const string AudioUrl = \"audio_url\";\n    public const string Audios = \"audios\";\n    public const string AuthorSignature = \"author_signature\";\n    public const string AvailableReactions = \"available_reactions\";\n    public const string Backdrop = \"backdrop\";\n    public const string Background = \"background\";\n    public const string BackgroundColor = \"background_color\";\n    public const string BackgroundCustomEmojiId = \"background_custom_emoji_id\";\n    public const string BaseName = \"base_name\";\n    public const string BigFileId = \"big_file_id\";\n    public const string BigFileUniqueId = \"big_file_unique_id\";\n    public const string Bio = \"bio\";\n    public const string Birthdate = \"birthdate\";\n    public const string Boost = \"boost\";\n    public const string BoostAdded = \"boost_added\";\n    public const string BoostCount = \"boost_count\";\n    public const string BoostId = \"boost_id\";\n    public const string Boosts = \"boosts\";\n    public const string Bot = \"bot\";\n    public const string BotAdministratorRights = \"bot_administrator_rights\";\n    public const string BotIsMember = \"bot_is_member\";\n    public const string BotUsername = \"bot_username\";\n    public const string BottomColor = \"bottom_color\";\n    public const string BusinessConnection = \"business_connection\";\n    public const string BusinessConnectionId = \"business_connection_id\";\n    public const string BusinessIntro = \"business_intro\";\n    public const string BusinessLocation = \"business_location\";\n    public const string BusinessMessage = \"business_message\";\n    public const string BusinessOpeningHours = \"business_opening_hours\";\n    public const string Button = \"button\";\n    public const string ButtonText = \"button_text\";\n    public const string CacheTime = \"cache_time\";\n    public const string CallbackData = \"callback_data\";\n    public const string CallbackGame = \"callback_game\";\n    public const string CallbackQuery = \"callback_query\";\n    public const string CallbackQueryId = \"callback_query_id\";\n    public const string CanAddWebPagePreviews = \"can_add_web_page_previews\";\n    public const string CanBeEdited = \"can_be_edited\";\n    public const string CanBeTransferred = \"can_be_transferred\";\n    public const string CanBeUpgraded = \"can_be_upgraded\";\n    public const string CanChangeGiftSettings = \"can_change_gift_settings\";\n    public const string CanChangeInfo = \"can_change_info\";\n    public const string CanConnectToBusiness = \"can_connect_to_business\";\n    public const string CanConvertGiftsToStars = \"can_convert_gifts_to_stars\";\n    public const string CanDeleteAllMessages = \"can_delete_all_messages\";\n    public const string CanDeleteMessages = \"can_delete_messages\";\n    public const string CanDeleteSentMessages = \"can_delete_sent_messages\";\n    public const string CanDeleteStories = \"can_delete_stories\";\n    public const string CanEditBio = \"can_edit_bio\";\n    public const string CanEditMessages = \"can_edit_messages\";\n    public const string CanEditName = \"can_edit_name\";\n    public const string CanEditProfilePhoto = \"can_edit_profile_photo\";\n    public const string CanEditStories = \"can_edit_stories\";\n    public const string CanEditTag = \"can_edit_tag\";\n    public const string CanEditUsername = \"can_edit_username\";\n    public const string CanInviteUsers = \"can_invite_users\";\n    public const string CanJoinGroups = \"can_join_groups\";\n    public const string CanManageBots = \"can_manage_bots\";\n    public const string CanManageChat = \"can_manage_chat\";\n    public const string CanManageDirectMessages = \"can_manage_direct_messages\";\n    public const string CanManageStories = \"can_manage_stories\";\n    public const string CanManageTags = \"can_manage_tags\";\n    public const string CanManageTopics = \"can_manage_topics\";\n    public const string CanManageVideoChats = \"can_manage_video_chats\";\n    public const string CanPinMessages = \"can_pin_messages\";\n    public const string CanPostMessages = \"can_post_messages\";\n    public const string CanPostStories = \"can_post_stories\";\n    public const string CanPromoteMembers = \"can_promote_members\";\n    public const string CanReactToMessages = \"can_react_to_messages\";\n    public const string CanReadAllGroupMessages = \"can_read_all_group_messages\";\n    public const string CanReadMessages = \"can_read_messages\";\n    public const string CanReply = \"can_reply\";\n    public const string CanRestrictMembers = \"can_restrict_members\";\n    public const string CanSendAudios = \"can_send_audios\";\n    public const string CanSendDocuments = \"can_send_documents\";\n    public const string CanSendMessages = \"can_send_messages\";\n    public const string CanSendOtherMessages = \"can_send_other_messages\";\n    public const string CanSendPaidMedia = \"can_send_paid_media\";\n    public const string CanSendPhotos = \"can_send_photos\";\n    public const string CanSendPolls = \"can_send_polls\";\n    public const string CanSendVideoNotes = \"can_send_video_notes\";\n    public const string CanSendVideos = \"can_send_videos\";\n    public const string CanSendVoiceNotes = \"can_send_voice_notes\";\n    public const string CanSetStickerSet = \"can_set_sticker_set\";\n    public const string CanTransferAndUpgradeGifts = \"can_transfer_and_upgrade_gifts\";\n    public const string CanTransferStars = \"can_transfer_stars\";\n    public const string CanViewGiftsAndStars = \"can_view_gifts_and_stars\";\n    public const string Caption = \"caption\";\n    public const string CaptionEntities = \"caption_entities\";\n    public const string CenterColor = \"center_color\";\n    public const string Certificate = \"certificate\";\n    public const string ChannelChatCreated = \"channel_chat_created\";\n    public const string ChannelPost = \"channel_post\";\n    public const string Chat = \"chat\";\n    public const string ChatBackgroundSet = \"chat_background_set\";\n    public const string ChatBoost = \"chat_boost\";\n    public const string ChatHasUsername = \"chat_has_username\";\n    public const string ChatId = \"chat_id\";\n    public const string ChatInstance = \"chat_instance\";\n    public const string ChatIsChannel = \"chat_is_channel\";\n    public const string ChatIsCreated = \"chat_is_created\";\n    public const string ChatIsForum = \"chat_is_forum\";\n    public const string ChatJoinRequest = \"chat_join_request\";\n    public const string ChatMember = \"chat_member\";\n    public const string ChatOwnerChanged = \"chat_owner_changed\";\n    public const string ChatOwnerLeft = \"chat_owner_left\";\n    public const string ChatShared = \"chat_shared\";\n    public const string ChatType = \"chat_type\";\n    public const string Chats = \"chats\";\n    public const string Checklist = \"checklist\";\n    public const string ChecklistMessage = \"checklist_message\";\n    public const string ChecklistTaskId = \"checklist_task_id\";\n    public const string ChecklistTasksAdded = \"checklist_tasks_added\";\n    public const string ChecklistTasksDone = \"checklist_tasks_done\";\n    public const string ChosenInlineResult = \"chosen_inline_result\";\n    public const string City = \"city\";\n    public const string CloseDate = \"close_date\";\n    public const string ClosingMinute = \"closing_minute\";\n    public const string Codec = \"codec\";\n    public const string Color = \"color\";\n    public const string Colors = \"colors\";\n    public const string Command = \"command\";\n    public const string Commands = \"commands\";\n    public const string Comment = \"comment\";\n    public const string CommissionPerMille = \"commission_per_mille\";\n    public const string CompletedByChat = \"completed_by_chat\";\n    public const string CompletedByUser = \"completed_by_user\";\n    public const string CompletionDate = \"completion_date\";\n    public const string ConnectedWebsite = \"connected_website\";\n    public const string Contact = \"contact\";\n    public const string Content = \"content\";\n    public const string ConvertStarCount = \"convert_star_count\";\n    public const string CopyText = \"copy_text\";\n    public const string CornerRadiusPercentage = \"corner_radius_percentage\";\n    public const string CorrectOptionIds = \"correct_option_ids\";\n    public const string CountryCode = \"country_code\";\n    public const string CountryCodes = \"country_codes\";\n    public const string Cover = \"cover\";\n    public const string CoverFrameTimestamp = \"cover_frame_timestamp\";\n    public const string CreatesJoinRequest = \"creates_join_request\";\n    public const string Creator = \"creator\";\n    public const string Credentials = \"credentials\";\n    public const string Currency = \"currency\";\n    public const string CurrentLevelRating = \"current_level_rating\";\n    public const string CustomDescription = \"custom_description\";\n    public const string CustomEmojiId = \"custom_emoji_id\";\n    public const string CustomEmojiIds = \"custom_emoji_ids\";\n    public const string CustomEmojiStickerSetName = \"custom_emoji_sticker_set_name\";\n    public const string CustomTitle = \"custom_title\";\n    public const string DarkThemeDimming = \"dark_theme_dimming\";\n    public const string DarkThemeMainColor = \"dark_theme_main_color\";\n    public const string DarkThemeOtherColors = \"dark_theme_other_colors\";\n    public const string Data = \"data\";\n    public const string DataHash = \"data_hash\";\n    public const string Date = \"date\";\n    public const string DateTimeFormat = \"date_time_format\";\n    public const string Day = \"day\";\n    public const string DeleteChatPhoto = \"delete_chat_photo\";\n    public const string DeletedBusinessMessages = \"deleted_business_messages\";\n    public const string Description = \"description\";\n    public const string DescriptionEntities = \"description_entities\";\n    public const string DescriptionParseMode = \"description_parse_mode\";\n    public const string Dice = \"dice\";\n    public const string DirectMessagePriceChanged = \"direct_message_price_changed\";\n    public const string DirectMessageStarCount = \"direct_message_star_count\";\n    public const string DirectMessagesTopic = \"direct_messages_topic\";\n    public const string DirectMessagesTopicId = \"direct_messages_topic_id\";\n    public const string DisableContentTypeDetection = \"disable_content_type_detection\";\n    public const string DisableEditMessage = \"disable_edit_message\";\n    public const string DisableNotification = \"disable_notification\";\n    public const string Distance = \"distance\";\n    public const string Document = \"document\";\n    public const string DocumentFileId = \"document_file_id\";\n    public const string DocumentUrl = \"document_url\";\n    public const string DraftId = \"draft_id\";\n    public const string DropPendingUpdates = \"drop_pending_updates\";\n    public const string Duration = \"duration\";\n    public const string EdgeColor = \"edge_color\";\n    public const string EditDate = \"edit_date\";\n    public const string EditedBusinessMessage = \"edited_business_message\";\n    public const string EditedChannelPost = \"edited_channel_post\";\n    public const string EditedMessage = \"edited_message\";\n    public const string EffectId = \"effect_id\";\n    public const string ElementHash = \"element_hash\";\n    public const string Email = \"email\";\n    public const string Emoji = \"emoji\";\n    public const string EmojiList = \"emoji_list\";\n    public const string EmojiStatusCustomEmojiId = \"emoji_status_custom_emoji_id\";\n    public const string EmojiStatusExpirationDate = \"emoji_status_expiration_date\";\n    public const string Entities = \"entities\";\n    public const string ErrorMessage = \"error_message\";\n    public const string Errors = \"errors\";\n    public const string ExcludeFromBlockchain = \"exclude_from_blockchain\";\n    public const string ExcludeLimited = \"exclude_limited\";\n    public const string ExcludeLimitedNonUpgradable = \"exclude_limited_non_upgradable\";\n    public const string ExcludeLimitedUpgradable = \"exclude_limited_upgradable\";\n    public const string ExcludeSaved = \"exclude_saved\";\n    public const string ExcludeUnique = \"exclude_unique\";\n    public const string ExcludeUnlimited = \"exclude_unlimited\";\n    public const string ExcludeUnsaved = \"exclude_unsaved\";\n    public const string ExpirationDate = \"expiration_date\";\n    public const string ExpireDate = \"expire_date\";\n    public const string Explanation = \"explanation\";\n    public const string ExplanationEntities = \"explanation_entities\";\n    public const string ExplanationMedia = \"explanation_media\";\n    public const string ExplanationParseMode = \"explanation_parse_mode\";\n    public const string ExternalReply = \"external_reply\";\n    public const string FieldName = \"field_name\";\n    public const string FileDate = \"file_date\";\n    public const string FileHash = \"file_hash\";\n    public const string FileHashes = \"file_hashes\";\n    public const string FileId = \"file_id\";\n    public const string FileName = \"file_name\";\n    public const string FilePath = \"file_path\";\n    public const string FileSize = \"file_size\";\n    public const string FileUniqueId = \"file_unique_id\";\n    public const string Files = \"files\";\n    public const string Fill = \"fill\";\n    public const string FirstName = \"first_name\";\n    public const string FirstProfileAudio = \"first_profile_audio\";\n    public const string ForChannels = \"for_channels\";\n    public const string Force = \"force\";\n    public const string ForceReply = \"force_reply\";\n    public const string Format = \"format\";\n    public const string ForumTopicClosed = \"forum_topic_closed\";\n    public const string ForumTopicCreated = \"forum_topic_created\";\n    public const string ForumTopicEdited = \"forum_topic_edited\";\n    public const string ForumTopicReopened = \"forum_topic_reopened\";\n    public const string ForwardOrigin = \"forward_origin\";\n    public const string ForwardText = \"forward_text\";\n    public const string FoursquareId = \"foursquare_id\";\n    public const string FoursquareType = \"foursquare_type\";\n    public const string From = \"from\";\n    public const string FromAttachmentMenu = \"from_attachment_menu\";\n    public const string FromChatId = \"from_chat_id\";\n    public const string FromRequest = \"from_request\";\n    public const string FromStoryId = \"from_story_id\";\n    public const string FrontSide = \"front_side\";\n    public const string Game = \"game\";\n    public const string GameShortName = \"game_short_name\";\n    public const string GeneralForumTopicHidden = \"general_forum_topic_hidden\";\n    public const string GeneralForumTopicUnhidden = \"general_forum_topic_unhidden\";\n    public const string GifDuration = \"gif_duration\";\n    public const string GifFileId = \"gif_file_id\";\n    public const string GifHeight = \"gif_height\";\n    public const string GifUrl = \"gif_url\";\n    public const string GifWidth = \"gif_width\";\n    public const string Gift = \"gift\";\n    public const string GiftId = \"gift_id\";\n    public const string GiftUpgradeSent = \"gift_upgrade_sent\";\n    public const string Gifts = \"gifts\";\n    public const string GiftsFromChannels = \"gifts_from_channels\";\n    public const string Giveaway = \"giveaway\";\n    public const string GiveawayCompleted = \"giveaway_completed\";\n    public const string GiveawayCreated = \"giveaway_created\";\n    public const string GiveawayMessage = \"giveaway_message\";\n    public const string GiveawayMessageId = \"giveaway_message_id\";\n    public const string GiveawayWinners = \"giveaway_winners\";\n    public const string GooglePlaceId = \"google_place_id\";\n    public const string GooglePlaceType = \"google_place_type\";\n    public const string GroupChatCreated = \"group_chat_created\";\n    public const string GuestBotCallerChat = \"guest_bot_caller_chat\";\n    public const string GuestBotCallerUser = \"guest_bot_caller_user\";\n    public const string GuestMessage = \"guest_message\";\n    public const string GuestQueryId = \"guest_query_id\";\n    public const string HasAggressiveAntiSpamEnabled = \"has_aggressive_anti_spam_enabled\";\n    public const string HasColors = \"has_colors\";\n    public const string HasCustomCertificate = \"has_custom_certificate\";\n    public const string HasHiddenMembers = \"has_hidden_members\";\n    public const string HasMainWebApp = \"has_main_web_app\";\n    public const string HasMediaSpoiler = \"has_media_spoiler\";\n    public const string HasPrivateForwards = \"has_private_forwards\";\n    public const string HasProtectedContent = \"has_protected_content\";\n    public const string HasPublicWinners = \"has_public_winners\";\n    public const string HasRestrictedVoiceAndVideoMessages =\n        \"has_restricted_voice_and_video_messages\";\n    public const string HasSpoiler = \"has_spoiler\";\n    public const string HasTopicsEnabled = \"has_topics_enabled\";\n    public const string HasVisibleHistory = \"has_visible_history\";\n    public const string Hash = \"hash\";\n    public const string Heading = \"heading\";\n    public const string Height = \"height\";\n    public const string HeightPercentage = \"height_percentage\";\n    public const string HideResultsUntilCloses = \"hide_results_until_closes\";\n    public const string HorizontalAccuracy = \"horizontal_accuracy\";\n    public const string IconColor = \"icon_color\";\n    public const string IconCustomEmojiId = \"icon_custom_emoji_id\";\n    public const string Id = \"id\";\n    public const string InlineKeyboard = \"inline_keyboard\";\n    public const string InlineMessageId = \"inline_message_id\";\n    public const string InlineQuery = \"inline_query\";\n    public const string InlineQueryId = \"inline_query_id\";\n    public const string InputFieldPlaceholder = \"input_field_placeholder\";\n    public const string InputMessageContent = \"input_message_content\";\n    public const string Intensity = \"intensity\";\n    public const string InviteLink = \"invite_link\";\n    public const string Invoice = \"invoice\";\n    public const string InvoicePayload = \"invoice_payload\";\n    public const string IpAddress = \"ip_address\";\n    public const string IsAccessRestricted = \"is_access_restricted\";\n    public const string IsAnimated = \"is_animated\";\n    public const string IsAnimation = \"is_animation\";\n    public const string IsAnonymous = \"is_anonymous\";\n    public const string IsAutomaticForward = \"is_automatic_forward\";\n    public const string IsBig = \"is_big\";\n    public const string IsBlurred = \"is_blurred\";\n    public const string IsBot = \"is_bot\";\n    public const string IsBurned = \"is_burned\";\n    public const string IsCanceled = \"is_canceled\";\n    public const string IsClosed = \"is_closed\";\n    public const string IsDark = \"is_dark\";\n    public const string IsDirectMessages = \"is_direct_messages\";\n    public const string IsDisabled = \"is_disabled\";\n    public const string IsEnabled = \"is_enabled\";\n    public const string IsFirstRecurring = \"is_first_recurring\";\n    public const string IsFlexible = \"is_flexible\";\n    public const string IsFlipped = \"is_flipped\";\n    public const string IsForum = \"is_forum\";\n    public const string IsFromBlockchain = \"is_from_blockchain\";\n    public const string IsFromOffline = \"is_from_offline\";\n    public const string IsInverted = \"is_inverted\";\n    public const string IsManual = \"is_manual\";\n    public const string IsMember = \"is_member\";\n    public const string IsMoving = \"is_moving\";\n    public const string IsNameImplicit = \"is_name_implicit\";\n    public const string IsPaidPost = \"is_paid_post\";\n    public const string IsPersistent = \"is_persistent\";\n    public const string IsPersonal = \"is_personal\";\n    public const string IsPremium = \"is_premium\";\n    public const string IsPrimary = \"is_primary\";\n    public const string IsPrivate = \"is_private\";\n    public const string IsPublic = \"is_public\";\n    public const string IsRecurring = \"is_recurring\";\n    public const string IsRevoked = \"is_revoked\";\n    public const string IsSaved = \"is_saved\";\n    public const string IsStarGiveaway = \"is_star_giveaway\";\n    public const string IsTopicMessage = \"is_topic_message\";\n    public const string IsUnclaimed = \"is_unclaimed\";\n    public const string IsUpgradeSeparate = \"is_upgrade_separate\";\n    public const string IsVideo = \"is_video\";\n    public const string JoinByRequest = \"join_by_request\";\n    public const string JoinToSendMessages = \"join_to_send_messages\";\n    public const string KeepOriginalDetails = \"keep_original_details\";\n    public const string Keyboard = \"keyboard\";\n    public const string Keywords = \"keywords\";\n    public const string Label = \"label\";\n    public const string Language = \"language\";\n    public const string LanguageCode = \"language_code\";\n    public const string LastErrorDate = \"last_error_date\";\n    public const string LastErrorMessage = \"last_error_message\";\n    public const string LastName = \"last_name\";\n    public const string LastResaleAmount = \"last_resale_amount\";\n    public const string LastResaleCurrency = \"last_resale_currency\";\n    public const string LastSynchronizationErrorDate = \"last_synchronization_error_date\";\n    public const string Latitude = \"latitude\";\n    public const string LeftChatMember = \"left_chat_member\";\n    public const string Length = \"length\";\n    public const string Level = \"level\";\n    public const string LightThemeMainColor = \"light_theme_main_color\";\n    public const string LightThemeOtherColors = \"light_theme_other_colors\";\n    public const string Limit = \"limit\";\n    public const string LimitedGifts = \"limited_gifts\";\n    public const string LinkPreviewOptions = \"link_preview_options\";\n    public const string LinkedChatId = \"linked_chat_id\";\n    public const string LivePeriod = \"live_period\";\n    public const string LivePhoto = \"live_photo\";\n    public const string Location = \"location\";\n    public const string LoginUrl = \"login_url\";\n    public const string Longitude = \"longitude\";\n    public const string MainFrameTimestamp = \"main_frame_timestamp\";\n    public const string ManagedBot = \"managed_bot\";\n    public const string ManagedBotCreated = \"managed_bot_created\";\n    public const string MarkedAsDoneTaskIds = \"marked_as_done_task_ids\";\n    public const string MarkedAsNotDoneTaskIds = \"marked_as_not_done_task_ids\";\n    public const string MaskPosition = \"mask_position\";\n    public const string MaxConnections = \"max_connections\";\n    public const string MaxQuantity = \"max_quantity\";\n    public const string MaxReactionCount = \"max_reaction_count\";\n    public const string MaxTipAmount = \"max_tip_amount\";\n    public const string Media = \"media\";\n    public const string MediaGroupId = \"media_group_id\";\n    public const string MemberLimit = \"member_limit\";\n    public const string MembersOnly = \"members_only\";\n    public const string MenuButton = \"menu_button\";\n    public const string Message = \"message\";\n    public const string MessageAutoDeleteTime = \"message_auto_delete_time\";\n    public const string MessageAutoDeleteTimerChanged = \"message_auto_delete_timer_changed\";\n    public const string MessageEffectId = \"message_effect_id\";\n    public const string MessageId = \"message_id\";\n    public const string MessageIds = \"message_ids\";\n    public const string MessageReaction = \"message_reaction\";\n    public const string MessageReactionCount = \"message_reaction_count\";\n    public const string MessageText = \"message_text\";\n    public const string MessageThreadId = \"message_thread_id\";\n    public const string MigrateFromChatId = \"migrate_from_chat_id\";\n    public const string MigrateToChatId = \"migrate_to_chat_id\";\n    public const string MimeType = \"mime_type\";\n    public const string Model = \"model\";\n    public const string ModelCustomEmojiId = \"model_custom_emoji_id\";\n    public const string Month = \"month\";\n    public const string MonthCount = \"month_count\";\n    public const string Mpeg4Duration = \"mpeg4_duration\";\n    public const string Mpeg4FileId = \"mpeg4_file_id\";\n    public const string Mpeg4Height = \"mpeg4_height\";\n    public const string Mpeg4Url = \"mpeg4_url\";\n    public const string Mpeg4Width = \"mpeg4_width\";\n    public const string MyChatMember = \"my_chat_member\";\n    public const string Name = \"name\";\n    public const string NanostarAmount = \"nanostar_amount\";\n    public const string NeedEmail = \"need_email\";\n    public const string NeedName = \"need_name\";\n    public const string NeedPhoneNumber = \"need_phone_number\";\n    public const string NeedShippingAddress = \"need_shipping_address\";\n    public const string NeedsRepainting = \"needs_repainting\";\n    public const string NewChatMember = \"new_chat_member\";\n    public const string NewChatMembers = \"new_chat_members\";\n    public const string NewChatPhoto = \"new_chat_photo\";\n    public const string NewChatTitle = \"new_chat_title\";\n    public const string NewOwner = \"new_owner\";\n    public const string NewOwnerChatId = \"new_owner_chat_id\";\n    public const string NewReaction = \"new_reaction\";\n    public const string NextLevelRating = \"next_level_rating\";\n    public const string NextOffset = \"next_offset\";\n    public const string NextTransferDate = \"next_transfer_date\";\n    public const string Number = \"number\";\n    public const string Offset = \"offset\";\n    public const string Ok = \"ok\";\n    public const string OldChatMember = \"old_chat_member\";\n    public const string OldReaction = \"old_reaction\";\n    public const string OldSticker = \"old_sticker\";\n    public const string OneTimeKeyboard = \"one_time_keyboard\";\n    public const string OnlyIfBanned = \"only_if_banned\";\n    public const string OnlyNewMembers = \"only_new_members\";\n    public const string OpenPeriod = \"open_period\";\n    public const string OpeningHours = \"opening_hours\";\n    public const string OpeningMinute = \"opening_minute\";\n    public const string OptionIds = \"option_ids\";\n    public const string OptionPersistentId = \"option_persistent_id\";\n    public const string OptionPersistentIds = \"option_persistent_ids\";\n    public const string OptionText = \"option_text\";\n    public const string OptionTextEntities = \"option_text_entities\";\n    public const string Options = \"options\";\n    public const string OrderInfo = \"order_info\";\n    public const string Origin = \"origin\";\n    public const string OthersCanAddTasks = \"others_can_add_tasks\";\n    public const string OthersCanMarkTasksAsDone = \"others_can_mark_tasks_as_done\";\n    public const string OwnedGiftId = \"owned_gift_id\";\n    public const string PaidMedia = \"paid_media\";\n    public const string PaidMediaPayload = \"paid_media_payload\";\n    public const string PaidMessagePriceChanged = \"paid_message_price_changed\";\n    public const string PaidMessageStarCount = \"paid_message_star_count\";\n    public const string PaidStarCount = \"paid_star_count\";\n    public const string ParentChat = \"parent_chat\";\n    public const string ParseMode = \"parse_mode\";\n    public const string PassportData = \"passport_data\";\n    public const string Pay = \"pay\";\n    public const string PayForUpgrade = \"pay_for_upgrade\";\n    public const string Payload = \"payload\";\n    public const string PendingJoinRequestCount = \"pending_join_request_count\";\n    public const string PendingUpdateCount = \"pending_update_count\";\n    public const string Performer = \"performer\";\n    public const string Permissions = \"permissions\";\n    public const string PersistentId = \"persistent_id\";\n    public const string PersonalChat = \"personal_chat\";\n    public const string PersonalRemainingCount = \"personal_remaining_count\";\n    public const string PersonalTotalCount = \"personal_total_count\";\n    public const string PhoneNumber = \"phone_number\";\n    public const string Photo = \"photo\";\n    public const string PhotoFileId = \"photo_file_id\";\n    public const string PhotoHeight = \"photo_height\";\n    public const string PhotoSize = \"photo_size\";\n    public const string PhotoUrl = \"photo_url\";\n    public const string PhotoWidth = \"photo_width\";\n    public const string Photos = \"photos\";\n    public const string PinnedMessage = \"pinned_message\";\n    public const string Point = \"point\";\n    public const string Poll = \"poll\";\n    public const string PollAnswer = \"poll_answer\";\n    public const string PollId = \"poll_id\";\n    public const string PollMessage = \"poll_message\";\n    public const string PollOptionAdded = \"poll_option_added\";\n    public const string PollOptionDeleted = \"poll_option_deleted\";\n    public const string PollOptionId = \"poll_option_id\";\n    public const string Position = \"position\";\n    public const string PostCode = \"post_code\";\n    public const string PostToChatPage = \"post_to_chat_page\";\n    public const string PreCheckoutQuery = \"pre_checkout_query\";\n    public const string PreCheckoutQueryId = \"pre_checkout_query_id\";\n    public const string PreferLargeMedia = \"prefer_large_media\";\n    public const string PreferSmallMedia = \"prefer_small_media\";\n    public const string PremiumAnimation = \"premium_animation\";\n    public const string PremiumSubscription = \"premium_subscription\";\n    public const string PremiumSubscriptionDuration = \"premium_subscription_duration\";\n    public const string PremiumSubscriptionMonthCount = \"premium_subscription_month_count\";\n    public const string PrepaidUpgradeStarCount = \"prepaid_upgrade_star_count\";\n    public const string Price = \"price\";\n    public const string Prices = \"prices\";\n    public const string PrizeDescription = \"prize_description\";\n    public const string PrizeStarCount = \"prize_star_count\";\n    public const string ProfileAccentColorId = \"profile_accent_color_id\";\n    public const string ProfileBackgroundCustomEmojiId = \"profile_background_custom_emoji_id\";\n    public const string ProtectContent = \"protect_content\";\n    public const string ProviderData = \"provider_data\";\n    public const string ProviderPaymentChargeId = \"provider_payment_charge_id\";\n    public const string ProviderToken = \"provider_token\";\n    public const string ProximityAlertRadius = \"proximity_alert_radius\";\n    public const string ProximityAlertTriggered = \"proximity_alert_triggered\";\n    public const string PublisherChat = \"publisher_chat\";\n    public const string PurchasedPaidMedia = \"purchased_paid_media\";\n    public const string Qualities = \"qualities\";\n    public const string Query = \"query\";\n    public const string Question = \"question\";\n    public const string QuestionEntities = \"question_entities\";\n    public const string QuestionParseMode = \"question_parse_mode\";\n    public const string Quote = \"quote\";\n    public const string QuoteEntities = \"quote_entities\";\n    public const string QuoteParseMode = \"quote_parse_mode\";\n    public const string QuotePosition = \"quote_position\";\n    public const string Rarity = \"rarity\";\n    public const string RarityPerMille = \"rarity_per_mille\";\n    public const string Rating = \"rating\";\n    public const string Reaction = \"reaction\";\n    public const string ReactionType = \"reaction_type\";\n    public const string Reactions = \"reactions\";\n    public const string Reason = \"reason\";\n    public const string Receiver = \"receiver\";\n    public const string RefundedPayment = \"refunded_payment\";\n    public const string RemainingCount = \"remaining_count\";\n    public const string RemoveCaption = \"remove_caption\";\n    public const string RemoveDate = \"remove_date\";\n    public const string RemoveKeyboard = \"remove_keyboard\";\n    public const string RemovedChatBoost = \"removed_chat_boost\";\n    public const string ReplyMarkup = \"reply_markup\";\n    public const string ReplyParameters = \"reply_parameters\";\n    public const string ReplyToChecklistTaskId = \"reply_to_checklist_task_id\";\n    public const string ReplyToMessage = \"reply_to_message\";\n    public const string ReplyToPollOptionId = \"reply_to_poll_option_id\";\n    public const string ReplyToStory = \"reply_to_story\";\n    public const string RequestChat = \"request_chat\";\n    public const string RequestContact = \"request_contact\";\n    public const string RequestCount = \"request_count\";\n    public const string RequestId = \"request_id\";\n    public const string RequestLocation = \"request_location\";\n    public const string RequestManagedBot = \"request_managed_bot\";\n    public const string RequestName = \"request_name\";\n    public const string RequestPhoto = \"request_photo\";\n    public const string RequestPoll = \"request_poll\";\n    public const string RequestTitle = \"request_title\";\n    public const string RequestUsername = \"request_username\";\n    public const string RequestUsers = \"request_users\";\n    public const string RequestWriteAccess = \"request_write_access\";\n    public const string ResizeKeyboard = \"resize_keyboard\";\n    public const string Result = \"result\";\n    public const string ResultId = \"result_id\";\n    public const string Results = \"results\";\n    public const string RetryAfter = \"retry_after\";\n    public const string ReturnBots = \"return_bots\";\n    public const string ReverseSide = \"reverse_side\";\n    public const string RevokeMessages = \"revoke_messages\";\n    public const string Rights = \"rights\";\n    public const string RotationAngle = \"rotation_angle\";\n    public const string Scale = \"scale\";\n    public const string Scope = \"scope\";\n    public const string Score = \"score\";\n    public const string Secret = \"secret\";\n    public const string SecretToken = \"secret_token\";\n    public const string Selective = \"selective\";\n    public const string Selfie = \"selfie\";\n    public const string SendDate = \"send_date\";\n    public const string SendEmailToProvider = \"send_email_to_provider\";\n    public const string SendPhoneNumberToProvider = \"send_phone_number_to_provider\";\n    public const string SenderBoostCount = \"sender_boost_count\";\n    public const string SenderBusinessBot = \"sender_business_bot\";\n    public const string SenderChat = \"sender_chat\";\n    public const string SenderChatId = \"sender_chat_id\";\n    public const string SenderTag = \"sender_tag\";\n    public const string SenderUser = \"sender_user\";\n    public const string SenderUserName = \"sender_user_name\";\n    public const string SetName = \"set_name\";\n    public const string ShippingAddress = \"shipping_address\";\n    public const string ShippingOptionId = \"shipping_option_id\";\n    public const string ShippingOptions = \"shipping_options\";\n    public const string ShippingQuery = \"shipping_query\";\n    public const string ShippingQueryId = \"shipping_query_id\";\n    public const string ShortDescription = \"short_description\";\n    public const string ShowAboveText = \"show_above_text\";\n    public const string ShowAlert = \"show_alert\";\n    public const string ShowCaptionAboveMedia = \"show_caption_above_media\";\n    public const string ShowGiftButton = \"show_gift_button\";\n    public const string ShuffleOptions = \"shuffle_options\";\n    public const string SlowModeDelay = \"slow_mode_delay\";\n    public const string SmallFileId = \"small_file_id\";\n    public const string SmallFileUniqueId = \"small_file_unique_id\";\n    public const string SortByPrice = \"sort_by_price\";\n    public const string Source = \"source\";\n    public const string SponsorUser = \"sponsor_user\";\n    public const string StarAmount = \"star_amount\";\n    public const string StarCount = \"star_count\";\n    public const string StartDate = \"start_date\";\n    public const string StartParameter = \"start_parameter\";\n    public const string StartTimestamp = \"start_timestamp\";\n    public const string State = \"state\";\n    public const string Status = \"status\";\n    public const string Sticker = \"sticker\";\n    public const string StickerFileId = \"sticker_file_id\";\n    public const string StickerFormat = \"sticker_format\";\n    public const string StickerSetName = \"sticker_set_name\";\n    public const string StickerType = \"sticker_type\";\n    public const string Stickers = \"stickers\";\n    public const string Story = \"story\";\n    public const string StoryId = \"story_id\";\n    public const string Street = \"street\";\n    public const string StreetLine1 = \"street_line1\";\n    public const string StreetLine2 = \"street_line2\";\n    public const string Style = \"style\";\n    public const string SubscriptionExpirationDate = \"subscription_expiration_date\";\n    public const string SubscriptionPeriod = \"subscription_period\";\n    public const string SubscriptionPrice = \"subscription_price\";\n    public const string SuccessfulPayment = \"successful_payment\";\n    public const string SuggestedName = \"suggested_name\";\n    public const string SuggestedPostApprovalFailed = \"suggested_post_approval_failed\";\n    public const string SuggestedPostApproved = \"suggested_post_approved\";\n    public const string SuggestedPostDeclined = \"suggested_post_declined\";\n    public const string SuggestedPostInfo = \"suggested_post_info\";\n    public const string SuggestedPostMessage = \"suggested_post_message\";\n    public const string SuggestedPostPaid = \"suggested_post_paid\";\n    public const string SuggestedPostParameters = \"suggested_post_parameters\";\n    public const string SuggestedPostRefunded = \"suggested_post_refunded\";\n    public const string SuggestedTipAmounts = \"suggested_tip_amounts\";\n    public const string SuggestedUsername = \"suggested_username\";\n    public const string SupergroupChatCreated = \"supergroup_chat_created\";\n    public const string SupportsGuestQueries = \"supports_guest_queries\";\n    public const string SupportsInlineQueries = \"supports_inline_queries\";\n    public const string SupportsStreaming = \"supports_streaming\";\n    public const string SwitchInlineQuery = \"switch_inline_query\";\n    public const string SwitchInlineQueryChosenChat = \"switch_inline_query_chosen_chat\";\n    public const string SwitchInlineQueryCurrentChat = \"switch_inline_query_current_chat\";\n    public const string Symbol = \"symbol\";\n    public const string SymbolColor = \"symbol_color\";\n    public const string SymbolCustomEmojiId = \"symbol_custom_emoji_id\";\n    public const string Tag = \"tag\";\n    public const string Tasks = \"tasks\";\n    public const string TelegramPaymentChargeId = \"telegram_payment_charge_id\";\n    public const string Temperature = \"temperature\";\n    public const string Text = \"text\";\n    public const string TextColor = \"text_color\";\n    public const string TextEntities = \"text_entities\";\n    public const string TextParseMode = \"text_parse_mode\";\n    public const string ThemeName = \"theme_name\";\n    public const string Thumbnail = \"thumbnail\";\n    public const string ThumbnailHeight = \"thumbnail_height\";\n    public const string ThumbnailMimeType = \"thumbnail_mime_type\";\n    public const string ThumbnailUrl = \"thumbnail_url\";\n    public const string ThumbnailWidth = \"thumbnail_width\";\n    public const string TimeZoneName = \"time_zone_name\";\n    public const string Timeout = \"timeout\";\n    public const string Title = \"title\";\n    public const string TitleEntities = \"title_entities\";\n    public const string TopColor = \"top_color\";\n    public const string TopicId = \"topic_id\";\n    public const string TotalAmount = \"total_amount\";\n    public const string TotalCount = \"total_count\";\n    public const string TotalVoterCount = \"total_voter_count\";\n    public const string TransactionType = \"transaction_type\";\n    public const string Transactions = \"transactions\";\n    public const string TransferStarCount = \"transfer_star_count\";\n    public const string Translation = \"translation\";\n    public const string Traveler = \"traveler\";\n    public const string Type = \"type\";\n    public const string UnclaimedPrizeCount = \"unclaimed_prize_count\";\n    public const string UniqueGift = \"unique_gift\";\n    public const string UniqueGiftColors = \"unique_gift_colors\";\n    public const string UniqueGiftNumber = \"unique_gift_number\";\n    public const string UniqueGiftVariantCount = \"unique_gift_variant_count\";\n    public const string UniqueGifts = \"unique_gifts\";\n    public const string UnixTime = \"unix_time\";\n    public const string UnlimitedGifts = \"unlimited_gifts\";\n    public const string UnrestrictBoostCount = \"unrestrict_boost_count\";\n    public const string UntilDate = \"until_date\";\n    public const string UpdateId = \"update_id\";\n    public const string UpgradeStarCount = \"upgrade_star_count\";\n    public const string Url = \"url\";\n    public const string UseIndependentChatPermissions = \"use_independent_chat_permissions\";\n    public const string User = \"user\";\n    public const string UserAdministratorRights = \"user_administrator_rights\";\n    public const string UserChatId = \"user_chat_id\";\n    public const string UserId = \"user_id\";\n    public const string UserIsBot = \"user_is_bot\";\n    public const string UserIsPremium = \"user_is_premium\";\n    public const string Username = \"username\";\n    public const string Users = \"users\";\n    public const string UsersShared = \"users_shared\";\n    public const string Value = \"value\";\n    public const string Vcard = \"vcard\";\n    public const string Venue = \"venue\";\n    public const string ViaBot = \"via_bot\";\n    public const string ViaChatFolderInviteLink = \"via_chat_folder_invite_link\";\n    public const string ViaJoinRequest = \"via_join_request\";\n    public const string Video = \"video\";\n    public const string VideoChatEnded = \"video_chat_ended\";\n    public const string VideoChatParticipantsInvited = \"video_chat_participants_invited\";\n    public const string VideoChatScheduled = \"video_chat_scheduled\";\n    public const string VideoChatStarted = \"video_chat_started\";\n    public const string VideoDuration = \"video_duration\";\n    public const string VideoFileId = \"video_file_id\";\n    public const string VideoHeight = \"video_height\";\n    public const string VideoNote = \"video_note\";\n    public const string VideoStartTimestamp = \"video_start_timestamp\";\n    public const string VideoUrl = \"video_url\";\n    public const string VideoWidth = \"video_width\";\n    public const string Voice = \"voice\";\n    public const string VoiceDuration = \"voice_duration\";\n    public const string VoiceFileId = \"voice_file_id\";\n    public const string VoiceUrl = \"voice_url\";\n    public const string VoterChat = \"voter_chat\";\n    public const string VoterCount = \"voter_count\";\n    public const string WasRefunded = \"was_refunded\";\n    public const string Watcher = \"watcher\";\n    public const string WebApp = \"web_app\";\n    public const string WebAppData = \"web_app_data\";\n    public const string WebAppName = \"web_app_name\";\n    public const string WebAppQueryId = \"web_app_query_id\";\n    public const string Width = \"width\";\n    public const string WidthPercentage = \"width_percentage\";\n    public const string WinnerCount = \"winner_count\";\n    public const string Winners = \"winners\";\n    public const string WinnersSelectionDate = \"winners_selection_date\";\n    public const string WithdrawalState = \"withdrawal_state\";\n    public const string WriteAccessAllowed = \"write_access_allowed\";\n    public const string XPercentage = \"x_percentage\";\n    public const string XShift = \"x_shift\";\n    public const string YPercentage = \"y_percentage\";\n    public const string YShift = \"y_shift\";\n    public const string Year = \"year\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/README.md",
    "content": "# Telegram.BotAPI\n\n[![Compatible with Bot API v10.0](https://img.shields.io/badge/Bot%20API%20version-v10.0-blue?style=flat-square)](https://core.telegram.org/bots/api#april-3-2026)\n\n**Telegram.BotAPI** is one of the most complete libraries available to interact with the Telegram Bot API in your .NET projects. Free and open source.\n\nIt contains all the methods and types available in the Bot API 10.0 released on May 8, 2026.\n\n---\n\n## Features\n\n- Contains pre-defined methods for all Bot API 10.0 methods.\n- Contains classes for each object type used in the Bot API 10.0.\n- Sync and async methods.\n- Uses [System.Text.Json](https://www.nuget.org/packages/System.Text.Json/).\n\n---\n\n## How to use\n\nFirst, get your **bot token** from [BotFather](https://t.me/BotFather) and use it to create a new instance of `Telegram.BotAPI.TelegramBotClient` as follows.\n\n```CSharp\nusing Telegram.BotAPI;\n\nvar botToken = \"bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\";\n// You need a TelegramBotClient instance if you want access to the Bot API methods.\nvar client = new TelegramBotClient(botToken);\n```\n\nThe methods and types are organized in namespaces according to their corresponding section on the [Official Bot API website](https://core.telegram.org/bots/api). So if you want to use a method or type, you must first include the corresponding namespace.\n\nCurrently the following namespaces are available:\n\n| Name                             | Description                                        |\n| :------------------------------- | :------------------------------------------------- |\n| Telegram.BotAPI                  | Contains the TelegramBotClient and other utilities |\n| Telegram.BotAPI.GettingUpdates   | Contains methods and types for getting updates     |\n| Telegram.BotAPI.AvailableTypes   | Contains available types                           |\n| Telegram.BotAPI.AvailableMethods | Contains available methods                         |\n| Telegram.BotAPI.UpdatingMessages | Contains methods and types for updating messages   |\n| Telegram.BotAPI.Stickers         | Contains methods and types for stickers            |\n| Telegram.BotAPI.InlineMode       | Contains methods and types for inline mode         |\n| Telegram.BotAPI.Payments         | Contains methods and types for payments            |\n| Telegram.BotAPI.TelegramPassport | Contains methods and types for Telegram Passport   |\n| Telegram.BotAPI.Games            | Contains methods and types for games               |\n\nOnce the namespaces are included, you are ready to start managing your bot. For example, you can use the [getMe](https://core.telegram.org/bots/api#getme) method to get basic information about your bot.\n\n```CSharp\nusing Telegram.BotAPI.AvailableMethods;\n\nvar me = client.GetMe();\nConsole.WriteLine(\"My name is {0}.\", me.FirstName);\n```\n\n## Getting updates\n\nEvery time a user interacts with a bot, bot will receive a new update. Updates contain information about user events, such as a new message or when a button is clicked. If you want your bot to reply to a message, then your bot must be able to get updates first.\n\nCurrently, there are two ways to get updates: [Long Polling](#long-polling) and [webhooks](#webhooks).\n\n### Long Polling\n\nTo get updates using **Long Polling**, you must create a perpetual loop and check for updates using the getUpdates method. After all updates have been processed, you must mark them as read by setting the offset parameter to a value greater than the id of the last update. See the follow example:\n\n```CSharp\nusing System.Linq;\nusing Telegram.BotAPI.GettingUpdates;\n\nvar updates = client.GetUpdates();\nwhile (true)\n{\n    if (updates.Any())\n    {\n        foreach (var update in updates)\n        {\n            // Process update\n        }\n        var offset = updates.Last().UpdateId + 1;\n        updates = client.GetUpdates(offset);\n    }\n    else\n    {\n        updates = client.GetUpdates();\n    }\n}\n```\n\n### Webhooks\n\nTo receive updates through webhook, you must create a web application. In your ASP NET application, create a new api controller for your bot and define a function to receive the update as shown below.\n\n```CSharp\nusing Telegram.BotAPI.GettingUpdates;\n\n[HttpPost]\npublic IActionResult Post(\n    // The secret token is optional, but it's highly recommended to use it.\n    [FromHeader(Name = \"X-Telegram-Bot-Api-Secret-Token\")] string secretToken,\n    [FromBody] Update update)\n{\n    if (update is null)\n    {\n        return BadRequest();\n    }\n    // Check if the secret token is valid\n    // Process your update\n    return Ok();\n}\n```\n\nAt the beginning of your application, you need to register your webhook using the API. In this way, Telegram will send new updates to your API controller. See the example below:\n\n```CSharp\napi.DeleteWebhook(true); // Delete old webhook\napi.SetWebhook(\"https://example.com/<controller path>\"); // Set new webhook\n```\n\n> It's high recommended to configurate a secret token to access the api controller through the setWebhook method. This will prevent third parties from accessing your api controller.\n> Using a webhook will disable the `getUpdates` method. Use `deleteWebhook` to enable it again.\n\n## Sending messages\n\nSending messages is the simplest and most important task of a bot. See the following example for sending text messages.\n\n```CSharp\nusing Telegram.BotAPI.AvailableMethods;\n\nlong chatId = update.Message.Chat.Id; // Target chat Id\napi.SendMessage(chatId, \"Hello World!\"); // Send a message\n```\n\nYour bot can also send multimedia messages like photos, gifs, videos, and others. See [Available methods](https://core.telegram.org/bots/api#available-methods) for learn more.\n\n## Uploading files\n\nYou can also send attached files using InputFile objects. You have two ways to do it: By using an InputFile object directly or by using a dictionary of InputFile objects.\n\n### Option 1\n\n```CSharp\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.AvailableMethods;\n\nvar file = new InputFile(filebytes, \"file.zip\");\n// Upload document\napi.SendDocument(chatId, file);\n```\n\n### Option 2\n\n```CSharp\nusing Telegram.BotAPI;\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.AvailableMethods;\n\nvar file = new InputFile(filebytes, \"file.zip\");\nvar files = new Dictionary<string, InputFile>() {\n    { \"file56\", file }\n};\n// Upload document\napi.SendDocument(chatId, \"attach://file56\", files: files);\n```\n\n## Making custom requests\n\nThe library already includes all types and methods available in the Bot API. However, if you want to use your own types or if you want to be the first one to use new features when they are released, you can use the `CallMethod` and/or `CallMethodDirect` methods defined in the ITelegramBotClient instance.\n\n```CSharp\nvar args = new Dictionary<string, object>() {\n    { \"chat_id\", 123456789 },\n    { \"text\", \"Hello World!\" }\n};\n// Message is the type you want to use to deserialize the response result. It can be an in-built type or a custom type created by you.\nvar message = client.CallMethod<Message>(\"sendMessage\", args);\n```\n\nThe previous method is used by all extension methods defined in the library. You can also create your own extension methods to make custom requests if you want.\n\n```CSharp\npublic static class TelegramBotClientExtensions\n{\n    public static Message SendHelloWorld(this ITelegramBotClient client, long chatId)\n    {\n        var args = new Dictionary<string, object>() {\n            { \"chat_id\", chatId },\n            { \"text\", \"Hello World!\" }\n        };\n        return client.CallMethod<Message>(\"sendMessage\", args);\n    }\n}\n```\n\nThe library also includes the classes `MethodNames` and `PropertyNames` that contain the names of all methods and properties.\n\nThe `CallMethod` will trigger an exception if the response status code is not OK. If you don't like this behavior, you can use the `CallMethodDirect` method instead.\n\n```CSharp\nvar args = new Dictionary<string, object>() {\n    { \"chat_id\", 123456789 },\n    { \"text\", \"Hello World!\" }\n};\n// BotResponse<Message>\nvar response = client.CallMethodDirect<Message>(\"sendMessage\", args);\n```\n\nYou'll get a `BotResponse<T>` object as a response. This object contains the status code, the deserialized result or null (if error), the error description and also some error parameters if available.\n\n---\n\n## Examples\n\nYou can see more examples [here](https://github.com/Eptagone/Telegram.BotAPI/tree/main/src/Telegram.BotAPI.Examples).\n\n## License\n\n[MIT](https://github.com/Eptagone/Telegram.BotAPI/blob/main/LICENSE)\n\n## Release notes\n\n[See release notes](https://github.com/Eptagone/Telegram.BotAPI/releases)\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/AddStickerToSetArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"AddStickerToSet\" method.\n/// </summary>\npublic class AddStickerToSetArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"AddStickerToSetArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">User identifier of sticker set owner</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"sticker\">A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set isn't changed.</param>\n    public AddStickerToSetArgs(long userId, string name, InputSticker sticker)\n    {\n        this.UserId = userId;\n        this.Name = name ?? throw new ArgumentNullException(nameof(name));\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n    }\n\n    /// <summary>\n    /// User identifier of sticker set owner\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Sticker set name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set isn't changed.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public InputSticker Sticker { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/CreateNewStickerSetArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"CreateNewStickerSet\" method.\n/// </summary>\npublic class CreateNewStickerSetArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CreateNewStickerSetArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">User identifier of created sticker set owner</param>\n    /// <param name=\"name\">Short name of sticker set, to be used in <em>t.me/addstickers/</em> URLs (e.g., <em>animals</em>). Can contain only English letters, digits and underscores. Must begin with a letter, can't contain consecutive underscores and must end in <em>\"_by_&lt;bot_username&gt;\"</em>. <em>&lt;bot_username&gt;</em> is case insensitive. 1-64 characters.</param>\n    /// <param name=\"title\">Sticker set title, 1-64 characters</param>\n    /// <param name=\"stickers\">A JSON-serialized list of 1-50 initial stickers to be added to the sticker set</param>\n    public CreateNewStickerSetArgs(\n        long userId,\n        string name,\n        string title,\n        IEnumerable<InputSticker> stickers\n    )\n    {\n        this.UserId = userId;\n        this.Name = name ?? throw new ArgumentNullException(nameof(name));\n        this.Title = title ?? throw new ArgumentNullException(nameof(title));\n        this.Stickers = stickers ?? throw new ArgumentNullException(nameof(stickers));\n    }\n\n    /// <summary>\n    /// User identifier of created sticker set owner\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Short name of sticker set, to be used in <em>t.me/addstickers/</em> URLs (e.g., <em>animals</em>). Can contain only English letters, digits and underscores. Must begin with a letter, can't contain consecutive underscores and must end in <em>\"_by_&lt;bot_username&gt;\"</em>. <em>&lt;bot_username&gt;</em> is case insensitive. 1-64 characters.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; }\n\n    /// <summary>\n    /// Sticker set title, 1-64 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 1-50 initial stickers to be added to the sticker set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Stickers)]\n    public IEnumerable<InputSticker> Stickers { get; set; }\n\n    /// <summary>\n    /// Type of stickers in the set, pass “regular”, “mask”, or “custom_emoji”. By default, a regular sticker set is created.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StickerType)]\n    public string? StickerType { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if stickers in the sticker set must be repainted to the color of text when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context; for custom emoji sticker sets only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedsRepainting)]\n    public bool? NeedsRepainting { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/GetCustomEmojiStickersArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"GetCustomEmojiStickers\" method.\n/// </summary>\npublic class GetCustomEmojiStickersArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"GetCustomEmojiStickersArgs\"/> class.\n    /// </summary>\n    /// <param name=\"customEmojiIds\">A JSON-serialized list of custom emoji identifiers. At most 200 custom emoji identifiers can be specified.</param>\n    public GetCustomEmojiStickersArgs(IEnumerable<string> customEmojiIds)\n    {\n        this.CustomEmojiIds =\n            customEmojiIds ?? throw new ArgumentNullException(nameof(customEmojiIds));\n    }\n\n    /// <summary>\n    /// A JSON-serialized list of custom emoji identifiers. At most 200 custom emoji identifiers can be specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CustomEmojiIds)]\n    public IEnumerable<string> CustomEmojiIds { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/ReplaceStickerInSetArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"ReplaceStickerInSet\" method.\n/// </summary>\npublic class ReplaceStickerInSetArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ReplaceStickerInSetArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">User identifier of the sticker set owner</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"oldSticker\">File identifier of the replaced sticker</param>\n    /// <param name=\"sticker\">A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set remains unchanged.</param>\n    public ReplaceStickerInSetArgs(\n        long userId,\n        string name,\n        string oldSticker,\n        InputSticker sticker\n    )\n    {\n        this.UserId = userId;\n        this.Name = name ?? throw new ArgumentNullException(nameof(name));\n        this.OldSticker = oldSticker ?? throw new ArgumentNullException(nameof(oldSticker));\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n    }\n\n    /// <summary>\n    /// User identifier of the sticker set owner\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Sticker set name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; }\n\n    /// <summary>\n    /// File identifier of the replaced sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.OldSticker)]\n    public string OldSticker { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set remains unchanged.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public InputSticker Sticker { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/SendGiftArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"SendGift\" method.\n/// </summary>\npublic class SendGiftArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendGiftArgs\"/> class.\n    /// </summary>\n    /// <param name=\"giftId\">Identifier of the gift</param>\n    public SendGiftArgs(string giftId)\n    {\n        this.GiftId = giftId ?? throw new ArgumentNullException(nameof(giftId));\n    }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long? UserId { get; set; }\n\n    /// <summary>\n    /// Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@channelusername</em>) that will receive the gift.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Identifier of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiftId)]\n    public string GiftId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PayForUpgrade)]\n    public bool? PayForUpgrade { get; set; }\n\n    /// <summary>\n    /// Text that will be shown along with the gift; 0-128 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextParseMode)]\n    public string? TextParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/SendStickerArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"SendSticker\" method.\n/// </summary>\npublic class SendStickerArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendStickerArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    public SendStickerArgs(long chatId, InputFile sticker)\n    {\n        this.ChatId = chatId;\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendStickerArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    public SendStickerArgs(long chatId, string sticker)\n    {\n        this.ChatId = chatId;\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendStickerArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    public SendStickerArgs(string chatId, InputFile sticker)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendStickerArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    public SendStickerArgs(string chatId, string sticker)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageThreadId)]\n    public int? MessageThreadId { get; set; }\n\n    /// <summary>\n    /// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DirectMessagesTopicId)]\n    public int? DirectMessagesTopicId { get; set; }\n\n    /// <summary>\n    /// Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public object Sticker { get; set; }\n\n    /// <summary>\n    /// Emoji associated with the sticker; only for just uploaded stickers\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Emoji)]\n    public string? Emoji { get; set; }\n\n    /// <summary>\n    /// Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DisableNotification)]\n    public bool? DisableNotification { get; set; }\n\n    /// <summary>\n    /// Protects the contents of the sent message from forwarding and saving\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AllowPaidBroadcast)]\n    public bool? AllowPaidBroadcast { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the message effect to be added to the message; for private chats only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageEffectId)]\n    public string? MessageEffectId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SuggestedPostParameters)]\n    public SuggestedPostParameters? SuggestedPostParameters { get; set; }\n\n    /// <summary>\n    /// Description of the message to reply to\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyParameters)]\n    public ReplyParameters? ReplyParameters { get; set; }\n\n    /// <summary>\n    /// Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public object? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/SetStickerEmojiListArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"SetStickerEmojiList\" method.\n/// </summary>\npublic class SetStickerEmojiListArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetStickerEmojiListArgs\"/> class.\n    /// </summary>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"emojiList\">A JSON-serialized list of 1-20 emoji associated with the sticker</param>\n    public SetStickerEmojiListArgs(string sticker, IEnumerable<string> emojiList)\n    {\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n        this.EmojiList = emojiList ?? throw new ArgumentNullException(nameof(emojiList));\n    }\n\n    /// <summary>\n    /// File identifier of the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public string Sticker { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 1-20 emoji associated with the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EmojiList)]\n    public IEnumerable<string> EmojiList { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/SetStickerKeywordsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"SetStickerKeywords\" method.\n/// </summary>\npublic class SetStickerKeywordsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetStickerKeywordsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    public SetStickerKeywordsArgs(string sticker)\n    {\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n    }\n\n    /// <summary>\n    /// File identifier of the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public string Sticker { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 0-20 search keywords for the sticker with total length of up to 64 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Keywords)]\n    public IEnumerable<string>? Keywords { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/SetStickerMaskPositionArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"SetStickerMaskPosition\" method.\n/// </summary>\npublic class SetStickerMaskPositionArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetStickerMaskPositionArgs\"/> class.\n    /// </summary>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    public SetStickerMaskPositionArgs(string sticker)\n    {\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n    }\n\n    /// <summary>\n    /// File identifier of the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public string Sticker { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object with the position where the mask should be placed on faces. Omit the parameter to remove the mask position.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaskPosition)]\n    public MaskPosition? MaskPosition { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/SetStickerSetThumbnailArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"SetStickerSetThumbnail\" method.\n/// </summary>\npublic class SetStickerSetThumbnailArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetStickerSetThumbnailArgs\"/> class.\n    /// </summary>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"userId\">User identifier of the sticker set owner</param>\n    /// <param name=\"format\">Format of the thumbnail, must be one of “static” for a <strong>.WEBP</strong> or <strong>.PNG</strong> image, “animated” for a <strong>.TGS</strong> animation, or “video” for a <strong>.WEBM</strong> video</param>\n    public SetStickerSetThumbnailArgs(string name, long userId, string format)\n    {\n        this.Name = name ?? throw new ArgumentNullException(nameof(name));\n        this.UserId = userId;\n        this.Format = format ?? throw new ArgumentNullException(nameof(format));\n    }\n\n    /// <summary>\n    /// Sticker set name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; }\n\n    /// <summary>\n    /// User identifier of the sticker set owner\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// A <strong>.WEBP</strong> or <strong>.PNG</strong> image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a <strong>.TGS</strong> animation with a thumbnail up to 32 kilobytes in size (see <a href=\"/stickers#animation-requirements\"></a><a href=\"https://core.telegram.org/stickers#animation-requirements\">https://core.telegram.org/stickers#animation-requirements</a> for animated sticker technical requirements), or a <strong>.WEBM</strong> video with the thumbnail up to 32 kilobytes in size; see <a href=\"/stickers#video-requirements\"></a><a href=\"https://core.telegram.org/stickers#video-requirements\">https://core.telegram.org/stickers#video-requirements</a> for video sticker technical requirements. Pass a <em>file_id</em> as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public object? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Format of the thumbnail, must be one of “static” for a <strong>.WEBP</strong> or <strong>.PNG</strong> image, “animated” for a <strong>.TGS</strong> animation, or “video” for a <strong>.WEBM</strong> video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Format)]\n    public string Format { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Args/UploadStickerFileArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Represents the arguments of the \"UploadStickerFile\" method.\n/// </summary>\npublic class UploadStickerFileArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"UploadStickerFileArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">User identifier of sticker file owner</param>\n    /// <param name=\"sticker\">A file with the sticker in .WEBP, .PNG, .TGS, or .WEBM format. See <a href=\"/stickers\"></a><a href=\"https://core.telegram.org/stickers\">https://core.telegram.org/stickers</a> for technical requirements. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"stickerFormat\">Format of the sticker, must be one of “static”, “animated”, “video”</param>\n    public UploadStickerFileArgs(long userId, InputFile sticker, string stickerFormat)\n    {\n        this.UserId = userId;\n        this.Sticker = sticker ?? throw new ArgumentNullException(nameof(sticker));\n        this.StickerFormat =\n            stickerFormat ?? throw new ArgumentNullException(nameof(stickerFormat));\n    }\n\n    /// <summary>\n    /// User identifier of sticker file owner\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// A file with the sticker in .WEBP, .PNG, .TGS, or .WEBM format. See <a href=\"/stickers\"></a><a href=\"https://core.telegram.org/stickers\">https://core.telegram.org/stickers</a> for technical requirements. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public InputFile Sticker { get; set; }\n\n    /// <summary>\n    /// Format of the sticker, must be one of “static”, “animated”, “video”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StickerFormat)]\n    public string StickerFormat { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Gift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// This object represents a gift that can be sent by the bot.\n/// </summary>\npublic class Gift\n{\n    /// <summary>\n    /// Unique identifier of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Id)]\n    public string Id { get; set; } = null!;\n\n    /// <summary>\n    /// The sticker that represents the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public Sticker Sticker { get; set; } = null!;\n\n    /// <summary>\n    /// The number of Telegram Stars that must be paid to send the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StarCount)]\n    public int StarCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of Telegram Stars that must be paid to upgrade the gift to a unique one\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UpgradeStarCount)]\n    public int? UpgradeStarCount { get; set; }\n\n    /// <summary>\n    /// Optional. The total number of the gifts of this type that can be sent; for limited gifts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TotalCount)]\n    public int? TotalCount { get; set; }\n\n    /// <summary>\n    /// Optional. The number of remaining gifts of this type that can be sent; for limited gifts only\n    /// </summary>\n    [JsonPropertyName(PropertyNames.RemainingCount)]\n    public int? RemainingCount { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Gifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// This object represent a list of gifts.\n/// </summary>\npublic class Gifts\n{\n    /// <summary>\n    /// The list of gifts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Gifts)]\n    public IEnumerable<Gift> GiftList { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/InputSticker.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// This object describes a sticker to be added to a sticker set.\n/// </summary>\npublic class InputSticker\n{\n    /// <summary>\n    /// The added sticker. Pass a <em>file_id</em> as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or pass “attach://&lt;file_attach_name&gt;” to upload a new file using multipart/form-data under &lt;file_attach_name&gt; name. Animated and video stickers can't be uploaded via HTTP URL. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Sticker)]\n    public string Sticker { get; set; } = null!;\n\n    /// <summary>\n    /// Format of the added sticker, must be one of “static” for a <strong>.WEBP</strong> or <strong>.PNG</strong> image, “animated” for a <strong>.TGS</strong> animation, “video” for a <strong>.WEBM</strong> video\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Format)]\n    public string Format { get; set; } = null!;\n\n    /// <summary>\n    /// List of 1-20 emoji associated with the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.EmojiList)]\n    public IEnumerable<string> EmojiList { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Position where the mask should be placed on faces. For “mask” stickers only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaskPosition)]\n    public MaskPosition? MaskPosition { get; set; }\n\n    /// <summary>\n    /// Optional. List of 0-20 search keywords for the sticker with total length of up to 64 characters. For “regular” and “custom_emoji” stickers only.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Keywords)]\n    public IEnumerable<string>? Keywords { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/MaskPosition.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// This object describes the position on faces where a mask should be placed by default.\n/// </summary>\npublic class MaskPosition\n{\n    /// <summary>\n    /// The part of the face relative to which the mask should be placed. One of “forehead”, “eyes”, “mouth”, or “chin”.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Point)]\n    public string Point { get; set; } = null!;\n\n    /// <summary>\n    /// Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. For example, choosing -1.0 will place mask just to the left of the default mask position.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.XShift)]\n    public float XShift { get; set; }\n\n    /// <summary>\n    /// Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. For example, 1.0 will place the mask just below the default mask position.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.YShift)]\n    public float YShift { get; set; }\n\n    /// <summary>\n    /// Mask scaling coefficient. For example, 2.0 means double size.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Scale)]\n    public float Scale { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/Sticker.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// This object represents a sticker.\n/// </summary>\npublic class Sticker\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// Type of the sticker, currently one of “regular”, “mask”, “custom_emoji”. The type of the sticker is independent from its format, which is determined by the fields <em>is_animated</em> and <em>is_video</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Sticker width\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Width)]\n    public int Width { get; set; }\n\n    /// <summary>\n    /// Sticker height\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Height)]\n    public int Height { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the sticker is <a href=\"https://telegram.org/blog/animated-stickers\">animated</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsAnimated)]\n    public bool IsAnimated { get; set; }\n\n    /// <summary>\n    /// <em>True</em>, if the sticker is a <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video sticker</a>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsVideo)]\n    public bool IsVideo { get; set; }\n\n    /// <summary>\n    /// Optional. Sticker thumbnail in the .WEBP or .JPG format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public PhotoSize? Thumbnail { get; set; }\n\n    /// <summary>\n    /// Optional. Emoji associated with the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Emoji)]\n    public string? Emoji { get; set; }\n\n    /// <summary>\n    /// Optional. Name of the sticker set to which the sticker belongs\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SetName)]\n    public string? SetName { get; set; }\n\n    /// <summary>\n    /// Optional. For premium regular stickers, premium animation for the sticker\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PremiumAnimation)]\n    public File? PremiumAnimation { get; set; }\n\n    /// <summary>\n    /// Optional. For mask stickers, the position where the mask should be placed\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MaskPosition)]\n    public MaskPosition? MaskPosition { get; set; }\n\n    /// <summary>\n    /// Optional. For custom emoji stickers, unique identifier of the custom emoji\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CustomEmojiId)]\n    public string? CustomEmojiId { get; set; }\n\n    /// <summary>\n    /// Optional. <em>True</em>, if the sticker must be repainted to a text color in messages, the color of the Telegram Premium badge in emoji status, white color on chat photos, or another appropriate color in other places\n    /// </summary>\n    [JsonPropertyName(PropertyNames.NeedsRepainting)]\n    public bool? NeedsRepainting { get; set; }\n\n    /// <summary>\n    /// Optional. File size in bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long? FileSize { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/StickerSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// This object represents a sticker set.\n/// </summary>\npublic class StickerSet\n{\n    /// <summary>\n    /// Sticker set name\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Name)]\n    public string Name { get; set; } = null!;\n\n    /// <summary>\n    /// Sticker set title\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Title)]\n    public string Title { get; set; } = null!;\n\n    /// <summary>\n    /// Type of stickers in the set, currently one of “regular”, “mask”, “custom_emoji”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StickerType)]\n    public string StickerType { get; set; } = null!;\n\n    /// <summary>\n    /// List of all set stickers\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Stickers)]\n    public IEnumerable<Sticker> Stickers { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Sticker set thumbnail in the .WEBP, .TGS, or .WEBM format\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Thumbnail)]\n    public PhotoSize? Thumbnail { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/addStickerToSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to add a new sticker to a set created by the bot. Emoji sticker sets can have up to 200 stickers. Other sticker sets can have up to 120 stickers. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AddStickerToSet\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AddStickerToSet(this ITelegramBotClient client, AddStickerToSetArgs args) =>\n        client.AddStickerToSetAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to add a new sticker to a set created by the bot. Emoji sticker sets can have up to 200 stickers. Other sticker sets can have up to 120 stickers. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"AddStickerToSet\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AddStickerToSetAsync(\n        this ITelegramBotClient client,\n        AddStickerToSetArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.AddStickerToSet, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to add a new sticker to a set created by the bot. Emoji sticker sets can have up to 200 stickers. Other sticker sets can have up to 120 stickers. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of sticker set owner</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"sticker\">A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set isn't changed.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool AddStickerToSet(\n        this ITelegramBotClient client,\n        long userId,\n        string name,\n        InputSticker sticker\n    ) => client.AddStickerToSetAsync(userId, name, sticker).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to add a new sticker to a set created by the bot. Emoji sticker sets can have up to 200 stickers. Other sticker sets can have up to 120 stickers. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of sticker set owner</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"sticker\">A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set isn't changed.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> AddStickerToSetAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string name,\n        InputSticker sticker,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.AddStickerToSet, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/createNewStickerSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to create a new sticker set owned by a user. The bot will be able to edit the sticker set thus created. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CreateNewStickerSet\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool CreateNewStickerSet(\n        this ITelegramBotClient client,\n        CreateNewStickerSetArgs args\n    ) => client.CreateNewStickerSetAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to create a new sticker set owned by a user. The bot will be able to edit the sticker set thus created. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"CreateNewStickerSet\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> CreateNewStickerSetAsync(\n        this ITelegramBotClient client,\n        CreateNewStickerSetArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.CreateNewStickerSet,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to create a new sticker set owned by a user. The bot will be able to edit the sticker set thus created. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of created sticker set owner</param>\n    /// <param name=\"name\">Short name of sticker set, to be used in <em>t.me/addstickers/</em> URLs (e.g., <em>animals</em>). Can contain only English letters, digits and underscores. Must begin with a letter, can't contain consecutive underscores and must end in <em>\"_by_&lt;bot_username&gt;\"</em>. <em>&lt;bot_username&gt;</em> is case insensitive. 1-64 characters.</param>\n    /// <param name=\"title\">Sticker set title, 1-64 characters</param>\n    /// <param name=\"stickers\">A JSON-serialized list of 1-50 initial stickers to be added to the sticker set</param>\n    /// <param name=\"stickerType\">Type of stickers in the set, pass “regular”, “mask”, or “custom_emoji”. By default, a regular sticker set is created.</param>\n    /// <param name=\"needsRepainting\">Pass <em>True</em> if stickers in the sticker set must be repainted to the color of text when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context; for custom emoji sticker sets only</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool CreateNewStickerSet(\n        this ITelegramBotClient client,\n        long userId,\n        string name,\n        string title,\n        IEnumerable<InputSticker> stickers,\n        string? stickerType = null,\n        bool? needsRepainting = null\n    ) =>\n        client\n            .CreateNewStickerSetAsync(userId, name, title, stickers, stickerType, needsRepainting)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to create a new sticker set owned by a user. The bot will be able to edit the sticker set thus created. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of created sticker set owner</param>\n    /// <param name=\"name\">Short name of sticker set, to be used in <em>t.me/addstickers/</em> URLs (e.g., <em>animals</em>). Can contain only English letters, digits and underscores. Must begin with a letter, can't contain consecutive underscores and must end in <em>\"_by_&lt;bot_username&gt;\"</em>. <em>&lt;bot_username&gt;</em> is case insensitive. 1-64 characters.</param>\n    /// <param name=\"title\">Sticker set title, 1-64 characters</param>\n    /// <param name=\"stickers\">A JSON-serialized list of 1-50 initial stickers to be added to the sticker set</param>\n    /// <param name=\"stickerType\">Type of stickers in the set, pass “regular”, “mask”, or “custom_emoji”. By default, a regular sticker set is created.</param>\n    /// <param name=\"needsRepainting\">Pass <em>True</em> if stickers in the sticker set must be repainted to the color of text when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context; for custom emoji sticker sets only</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> CreateNewStickerSetAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string name,\n        string title,\n        IEnumerable<InputSticker> stickers,\n        string? stickerType = null,\n        bool? needsRepainting = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n            {\n                PropertyNames.Stickers,\n                stickers ?? throw new ArgumentNullException(nameof(stickers))\n            },\n        };\n        if (stickerType is not null)\n        {\n            args.Add(PropertyNames.StickerType, stickerType);\n        }\n        if (needsRepainting is not null)\n        {\n            args.Add(PropertyNames.NeedsRepainting, needsRepainting);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.CreateNewStickerSet,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/deleteStickerFromSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to delete a sticker from a set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteStickerFromSet(this ITelegramBotClient client, string sticker) =>\n        client.DeleteStickerFromSetAsync(sticker).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a sticker from a set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteStickerFromSetAsync(\n        this ITelegramBotClient client,\n        string sticker,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteStickerFromSet,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/deleteStickerSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to delete a sticker set that was created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteStickerSet(this ITelegramBotClient client, string name) =>\n        client.DeleteStickerSetAsync(name).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a sticker set that was created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteStickerSetAsync(\n        this ITelegramBotClient client,\n        string name,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteStickerSet, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/getAvailableGifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Returns the list of gifts that can be sent by the bot to users and channel chats. Requires no parameters. Returns a <see cref=\"Gifts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Gifts GetAvailableGifts(this ITelegramBotClient client) =>\n        client.GetAvailableGiftsAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the list of gifts that can be sent by the bot to users and channel chats. Requires no parameters. Returns a <see cref=\"Gifts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Gifts> GetAvailableGiftsAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Gifts>(\n            MethodNames.GetAvailableGifts,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/getCustomEmojiStickers.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to get information about custom emoji stickers by their identifiers. Returns an Array of <see cref=\"Sticker\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetCustomEmojiStickers\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Sticker> GetCustomEmojiStickers(\n        this ITelegramBotClient client,\n        GetCustomEmojiStickersArgs args\n    ) => client.GetCustomEmojiStickersAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get information about custom emoji stickers by their identifiers. Returns an Array of <see cref=\"Sticker\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetCustomEmojiStickers\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Sticker>> GetCustomEmojiStickersAsync(\n        this ITelegramBotClient client,\n        GetCustomEmojiStickersArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<IEnumerable<Sticker>>(\n            MethodNames.GetCustomEmojiStickers,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to get information about custom emoji stickers by their identifiers. Returns an Array of <see cref=\"Sticker\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"customEmojiIds\">A JSON-serialized list of custom emoji identifiers. At most 200 custom emoji identifiers can be specified.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static IEnumerable<Sticker> GetCustomEmojiStickers(\n        this ITelegramBotClient client,\n        IEnumerable<string> customEmojiIds\n    ) => client.GetCustomEmojiStickersAsync(customEmojiIds).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get information about custom emoji stickers by their identifiers. Returns an Array of <see cref=\"Sticker\"/> objects.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"customEmojiIds\">A JSON-serialized list of custom emoji identifiers. At most 200 custom emoji identifiers can be specified.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<IEnumerable<Sticker>> GetCustomEmojiStickersAsync(\n        this ITelegramBotClient client,\n        IEnumerable<string> customEmojiIds,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.CustomEmojiIds,\n                customEmojiIds ?? throw new ArgumentNullException(nameof(customEmojiIds))\n            },\n        };\n\n        return client.CallMethodAsync<IEnumerable<Sticker>>(\n            MethodNames.GetCustomEmojiStickers,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/getStickerSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to get a sticker set. On success, a <see cref=\"StickerSet\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Name of the sticker set</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static StickerSet GetStickerSet(this ITelegramBotClient client, string name) =>\n        client.GetStickerSetAsync(name).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to get a sticker set. On success, a <see cref=\"StickerSet\"/> object is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Name of the sticker set</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<StickerSet> GetStickerSetAsync(\n        this ITelegramBotClient client,\n        string name,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n        };\n\n        return client.CallMethodAsync<StickerSet>(\n            MethodNames.GetStickerSet,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/removeChatVerification.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveChatVerification(this ITelegramBotClient client, long chatId) =>\n        client.RemoveChatVerificationAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveChatVerificationAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveChatVerification,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveChatVerification(this ITelegramBotClient client, string chatId) =>\n        client.RemoveChatVerificationAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveChatVerificationAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveChatVerification,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/removeUserVerification.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Removes verification from a user who is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveUserVerification(this ITelegramBotClient client, long userId) =>\n        client.RemoveUserVerificationAsync(userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a user who is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveUserVerificationAsync(\n        this ITelegramBotClient client,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveUserVerification,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/replaceStickerInSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to replace an existing sticker in a sticker set with a new one. The method is equivalent to calling <a href=\"https://core.telegram.org/bots/api#deletestickerfromset\">deleteStickerFromSet</a>, then <a href=\"https://core.telegram.org/bots/api#addstickertoset\">addStickerToSet</a>, then <a href=\"https://core.telegram.org/bots/api#setstickerpositioninset\">setStickerPositionInSet</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"ReplaceStickerInSet\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ReplaceStickerInSet(\n        this ITelegramBotClient client,\n        ReplaceStickerInSetArgs args\n    ) => client.ReplaceStickerInSetAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to replace an existing sticker in a sticker set with a new one. The method is equivalent to calling <a href=\"https://core.telegram.org/bots/api#deletestickerfromset\">deleteStickerFromSet</a>, then <a href=\"https://core.telegram.org/bots/api#addstickertoset\">addStickerToSet</a>, then <a href=\"https://core.telegram.org/bots/api#setstickerpositioninset\">setStickerPositionInSet</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"ReplaceStickerInSet\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ReplaceStickerInSetAsync(\n        this ITelegramBotClient client,\n        ReplaceStickerInSetArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ReplaceStickerInSet,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to replace an existing sticker in a sticker set with a new one. The method is equivalent to calling <a href=\"https://core.telegram.org/bots/api#deletestickerfromset\">deleteStickerFromSet</a>, then <a href=\"https://core.telegram.org/bots/api#addstickertoset\">addStickerToSet</a>, then <a href=\"https://core.telegram.org/bots/api#setstickerpositioninset\">setStickerPositionInSet</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the sticker set owner</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"oldSticker\">File identifier of the replaced sticker</param>\n    /// <param name=\"sticker\">A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set remains unchanged.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ReplaceStickerInSet(\n        this ITelegramBotClient client,\n        long userId,\n        string name,\n        string oldSticker,\n        InputSticker sticker\n    ) =>\n        client.ReplaceStickerInSetAsync(userId, name, oldSticker, sticker).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to replace an existing sticker in a sticker set with a new one. The method is equivalent to calling <a href=\"https://core.telegram.org/bots/api#deletestickerfromset\">deleteStickerFromSet</a>, then <a href=\"https://core.telegram.org/bots/api#addstickertoset\">addStickerToSet</a>, then <a href=\"https://core.telegram.org/bots/api#setstickerpositioninset\">setStickerPositionInSet</a>. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of the sticker set owner</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"oldSticker\">File identifier of the replaced sticker</param>\n    /// <param name=\"sticker\">A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set remains unchanged.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ReplaceStickerInSetAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string name,\n        string oldSticker,\n        InputSticker sticker,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n            {\n                PropertyNames.OldSticker,\n                oldSticker ?? throw new ArgumentNullException(nameof(oldSticker))\n            },\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ReplaceStickerInSet,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/sendGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendGift\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendGift(this ITelegramBotClient client, SendGiftArgs args) =>\n        client.SendGiftAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendGift\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendGiftAsync(\n        this ITelegramBotClient client,\n        SendGiftArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendGift, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"giftId\">Identifier of the gift</param>\n    /// <param name=\"userId\">Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.</param>\n    /// <param name=\"chatId\">Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@channelusername</em>) that will receive the gift.</param>\n    /// <param name=\"payForUpgrade\">Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver</param>\n    /// <param name=\"text\">Text that will be shown along with the gift; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendGift(\n        this ITelegramBotClient client,\n        string giftId,\n        long? userId = null,\n        long? chatId = null,\n        bool? payForUpgrade = null,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null\n    ) =>\n        client\n            .SendGiftAsync(giftId, userId, chatId, payForUpgrade, text, textParseMode, textEntities)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"giftId\">Identifier of the gift</param>\n    /// <param name=\"userId\">Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.</param>\n    /// <param name=\"chatId\">Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@channelusername</em>) that will receive the gift.</param>\n    /// <param name=\"payForUpgrade\">Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver</param>\n    /// <param name=\"text\">Text that will be shown along with the gift; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendGiftAsync(\n        this ITelegramBotClient client,\n        string giftId,\n        long? userId = null,\n        long? chatId = null,\n        bool? payForUpgrade = null,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.GiftId, giftId ?? throw new ArgumentNullException(nameof(giftId)) },\n        };\n        if (userId is not null)\n        {\n            args.Add(PropertyNames.UserId, userId);\n        }\n        if (chatId is not null)\n        {\n            args.Add(PropertyNames.ChatId, chatId);\n        }\n        if (payForUpgrade is not null)\n        {\n            args.Add(PropertyNames.PayForUpgrade, payForUpgrade);\n        }\n        if (text is not null)\n        {\n            args.Add(PropertyNames.Text, text);\n        }\n        if (textParseMode is not null)\n        {\n            args.Add(PropertyNames.TextParseMode, textParseMode);\n        }\n        if (textEntities is not null)\n        {\n            args.Add(PropertyNames.TextEntities, textEntities);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendGift, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/sendSticker.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendSticker\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendSticker(this ITelegramBotClient client, SendStickerArgs args) =>\n        client.SendStickerAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendSticker\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendStickerAsync(\n        this ITelegramBotClient client,\n        SendStickerArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendSticker, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji associated with the sticker; only for just uploaded stickers</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendSticker(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile sticker,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendStickerAsync(\n                chatId,\n                sticker,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                emoji,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji associated with the sticker; only for just uploaded stickers</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendStickerAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        InputFile sticker,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (emoji is not null)\n        {\n            args.Add(PropertyNames.Emoji, emoji);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendSticker, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji associated with the sticker; only for just uploaded stickers</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendSticker(\n        this ITelegramBotClient client,\n        long chatId,\n        string sticker,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendStickerAsync(\n                chatId,\n                sticker,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                emoji,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji associated with the sticker; only for just uploaded stickers</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendStickerAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string sticker,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (emoji is not null)\n        {\n            args.Add(PropertyNames.Emoji, emoji);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendSticker, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji associated with the sticker; only for just uploaded stickers</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendSticker(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile sticker,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendStickerAsync(\n                chatId,\n                sticker,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                emoji,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji associated with the sticker; only for just uploaded stickers</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendStickerAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        InputFile sticker,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (emoji is not null)\n        {\n            args.Add(PropertyNames.Emoji, emoji);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendSticker, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji associated with the sticker; only for just uploaded stickers</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message SendSticker(\n        this ITelegramBotClient client,\n        string chatId,\n        string sticker,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .SendStickerAsync(\n                chatId,\n                sticker,\n                businessConnectionId,\n                messageThreadId,\n                directMessagesTopicId,\n                emoji,\n                disableNotification,\n                protectContent,\n                allowPaidBroadcast,\n                messageEffectId,\n                suggestedPostParameters,\n                replyParameters,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to send static .WEBP, <a href=\"https://telegram.org/blog/animated-stickers\">animated</a> .TGS, or <a href=\"https://telegram.org/blog/video-stickers-better-reactions\">video</a> .WEBM stickers. On success, the sent <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"sticker\">Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Video and animated stickers can't be sent via an HTTP URL.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"messageThreadId\">Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only</param>\n    /// <param name=\"directMessagesTopicId\">Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat</param>\n    /// <param name=\"emoji\">Emoji associated with the sticker; only for just uploaded stickers</param>\n    /// <param name=\"disableNotification\">Sends the message <a href=\"https://telegram.org/blog/channels-2-0#silent-messages\">silently</a>. Users will receive a notification with no sound.</param>\n    /// <param name=\"protectContent\">Protects the contents of the sent message from forwarding and saving</param>\n    /// <param name=\"allowPaidBroadcast\">Pass <em>True</em> to allow up to 1000 messages per second, ignoring <a href=\"https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once\">broadcasting limits</a> for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.</param>\n    /// <param name=\"messageEffectId\">Unique identifier of the message effect to be added to the message; for private chats only</param>\n    /// <param name=\"suggestedPostParameters\">A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.</param>\n    /// <param name=\"replyParameters\">Description of the message to reply to</param>\n    /// <param name=\"replyMarkup\">Additional interface options. A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>, <a href=\"https://core.telegram.org/bots/features#keyboards\">custom reply keyboard</a>, instructions to remove a reply keyboard or to force a reply from the user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> SendStickerAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string sticker,\n        string? businessConnectionId = null,\n        int? messageThreadId = null,\n        int? directMessagesTopicId = null,\n        string? emoji = null,\n        bool? disableNotification = null,\n        bool? protectContent = null,\n        bool? allowPaidBroadcast = null,\n        string? messageEffectId = null,\n        SuggestedPostParameters? suggestedPostParameters = null,\n        ReplyParameters? replyParameters = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (messageThreadId is not null)\n        {\n            args.Add(PropertyNames.MessageThreadId, messageThreadId);\n        }\n        if (directMessagesTopicId is not null)\n        {\n            args.Add(PropertyNames.DirectMessagesTopicId, directMessagesTopicId);\n        }\n        if (emoji is not null)\n        {\n            args.Add(PropertyNames.Emoji, emoji);\n        }\n        if (disableNotification is not null)\n        {\n            args.Add(PropertyNames.DisableNotification, disableNotification);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n        if (allowPaidBroadcast is not null)\n        {\n            args.Add(PropertyNames.AllowPaidBroadcast, allowPaidBroadcast);\n        }\n        if (messageEffectId is not null)\n        {\n            args.Add(PropertyNames.MessageEffectId, messageEffectId);\n        }\n        if (suggestedPostParameters is not null)\n        {\n            args.Add(PropertyNames.SuggestedPostParameters, suggestedPostParameters);\n        }\n        if (replyParameters is not null)\n        {\n            args.Add(PropertyNames.ReplyParameters, replyParameters);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(MethodNames.SendSticker, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/setCustomEmojiStickerSetThumbnail.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to set the thumbnail of a custom emoji sticker set. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"customEmojiId\">Custom emoji identifier of a sticker from the sticker set; pass an empty string to drop the thumbnail and use the first sticker as the thumbnail.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetCustomEmojiStickerSetThumbnail(\n        this ITelegramBotClient client,\n        string name,\n        string? customEmojiId = null\n    ) =>\n        client.SetCustomEmojiStickerSetThumbnailAsync(name, customEmojiId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set the thumbnail of a custom emoji sticker set. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"customEmojiId\">Custom emoji identifier of a sticker from the sticker set; pass an empty string to drop the thumbnail and use the first sticker as the thumbnail.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetCustomEmojiStickerSetThumbnailAsync(\n        this ITelegramBotClient client,\n        string name,\n        string? customEmojiId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n        };\n        if (customEmojiId is not null)\n        {\n            args.Add(PropertyNames.CustomEmojiId, customEmojiId);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetCustomEmojiStickerSetThumbnail,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/setStickerEmojiList.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to change the list of emoji assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetStickerEmojiList\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerEmojiList(\n        this ITelegramBotClient client,\n        SetStickerEmojiListArgs args\n    ) => client.SetStickerEmojiListAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the list of emoji assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetStickerEmojiList\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerEmojiListAsync(\n        this ITelegramBotClient client,\n        SetStickerEmojiListArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerEmojiList,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to change the list of emoji assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"emojiList\">A JSON-serialized list of 1-20 emoji associated with the sticker</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerEmojiList(\n        this ITelegramBotClient client,\n        string sticker,\n        IEnumerable<string> emojiList\n    ) => client.SetStickerEmojiListAsync(sticker, emojiList).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the list of emoji assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"emojiList\">A JSON-serialized list of 1-20 emoji associated with the sticker</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerEmojiListAsync(\n        this ITelegramBotClient client,\n        string sticker,\n        IEnumerable<string> emojiList,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n            {\n                PropertyNames.EmojiList,\n                emojiList ?? throw new ArgumentNullException(nameof(emojiList))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerEmojiList,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/setStickerKeywords.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to change search keywords assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetStickerKeywords\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerKeywords(\n        this ITelegramBotClient client,\n        SetStickerKeywordsArgs args\n    ) => client.SetStickerKeywordsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change search keywords assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetStickerKeywords\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerKeywordsAsync(\n        this ITelegramBotClient client,\n        SetStickerKeywordsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerKeywords,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to change search keywords assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"keywords\">A JSON-serialized list of 0-20 search keywords for the sticker with total length of up to 64 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerKeywords(\n        this ITelegramBotClient client,\n        string sticker,\n        IEnumerable<string>? keywords = null\n    ) => client.SetStickerKeywordsAsync(sticker, keywords).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change search keywords assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"keywords\">A JSON-serialized list of 0-20 search keywords for the sticker with total length of up to 64 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerKeywordsAsync(\n        this ITelegramBotClient client,\n        string sticker,\n        IEnumerable<string>? keywords = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n        if (keywords is not null)\n        {\n            args.Add(PropertyNames.Keywords, keywords);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerKeywords,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/setStickerMaskPosition.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to change the <a href=\"https://core.telegram.org/bots/api#maskposition\">mask position</a> of a mask sticker. The sticker must belong to a sticker set that was created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetStickerMaskPosition\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerMaskPosition(\n        this ITelegramBotClient client,\n        SetStickerMaskPositionArgs args\n    ) => client.SetStickerMaskPositionAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the <a href=\"https://core.telegram.org/bots/api#maskposition\">mask position</a> of a mask sticker. The sticker must belong to a sticker set that was created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetStickerMaskPosition\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerMaskPositionAsync(\n        this ITelegramBotClient client,\n        SetStickerMaskPositionArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerMaskPosition,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to change the <a href=\"https://core.telegram.org/bots/api#maskposition\">mask position</a> of a mask sticker. The sticker must belong to a sticker set that was created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"maskPosition\">A JSON-serialized object with the position where the mask should be placed on faces. Omit the parameter to remove the mask position.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerMaskPosition(\n        this ITelegramBotClient client,\n        string sticker,\n        MaskPosition? maskPosition = null\n    ) => client.SetStickerMaskPositionAsync(sticker, maskPosition).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to change the <a href=\"https://core.telegram.org/bots/api#maskposition\">mask position</a> of a mask sticker. The sticker must belong to a sticker set that was created by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"maskPosition\">A JSON-serialized object with the position where the mask should be placed on faces. Omit the parameter to remove the mask position.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerMaskPositionAsync(\n        this ITelegramBotClient client,\n        string sticker,\n        MaskPosition? maskPosition = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n        };\n        if (maskPosition is not null)\n        {\n            args.Add(PropertyNames.MaskPosition, maskPosition);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerMaskPosition,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/setStickerPositionInSet.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to move a sticker in a set created by the bot to a specific position. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"position\">New sticker position in the set, zero-based</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerPositionInSet(\n        this ITelegramBotClient client,\n        string sticker,\n        int position\n    ) => client.SetStickerPositionInSetAsync(sticker, position).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to move a sticker in a set created by the bot to a specific position. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"sticker\">File identifier of the sticker</param>\n    /// <param name=\"position\">New sticker position in the set, zero-based</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerPositionInSetAsync(\n        this ITelegramBotClient client,\n        string sticker,\n        int position,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n            { PropertyNames.Position, position },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerPositionInSet,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/setStickerSetThumbnail.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to set the thumbnail of a regular or mask sticker set. The format of the thumbnail file must match the format of the stickers in the set. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetStickerSetThumbnail\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerSetThumbnail(\n        this ITelegramBotClient client,\n        SetStickerSetThumbnailArgs args\n    ) => client.SetStickerSetThumbnailAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set the thumbnail of a regular or mask sticker set. The format of the thumbnail file must match the format of the stickers in the set. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetStickerSetThumbnail\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerSetThumbnailAsync(\n        this ITelegramBotClient client,\n        SetStickerSetThumbnailArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerSetThumbnail,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to set the thumbnail of a regular or mask sticker set. The format of the thumbnail file must match the format of the stickers in the set. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"userId\">User identifier of the sticker set owner</param>\n    /// <param name=\"format\">Format of the thumbnail, must be one of “static” for a <strong>.WEBP</strong> or <strong>.PNG</strong> image, “animated” for a <strong>.TGS</strong> animation, or “video” for a <strong>.WEBM</strong> video</param>\n    /// <param name=\"thumbnail\">A <strong>.WEBP</strong> or <strong>.PNG</strong> image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a <strong>.TGS</strong> animation with a thumbnail up to 32 kilobytes in size (see <a href=\"/stickers#animation-requirements\"></a><a href=\"https://core.telegram.org/stickers#animation-requirements\">https://core.telegram.org/stickers#animation-requirements</a> for animated sticker technical requirements), or a <strong>.WEBM</strong> video with the thumbnail up to 32 kilobytes in size; see <a href=\"/stickers#video-requirements\"></a><a href=\"https://core.telegram.org/stickers#video-requirements\">https://core.telegram.org/stickers#video-requirements</a> for video sticker technical requirements. Pass a <em>file_id</em> as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerSetThumbnail(\n        this ITelegramBotClient client,\n        string name,\n        long userId,\n        string format,\n        InputFile? thumbnail = null\n    ) =>\n        client\n            .SetStickerSetThumbnailAsync(name, userId, format, thumbnail)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to set the thumbnail of a regular or mask sticker set. The format of the thumbnail file must match the format of the stickers in the set. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"userId\">User identifier of the sticker set owner</param>\n    /// <param name=\"format\">Format of the thumbnail, must be one of “static” for a <strong>.WEBP</strong> or <strong>.PNG</strong> image, “animated” for a <strong>.TGS</strong> animation, or “video” for a <strong>.WEBM</strong> video</param>\n    /// <param name=\"thumbnail\">A <strong>.WEBP</strong> or <strong>.PNG</strong> image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a <strong>.TGS</strong> animation with a thumbnail up to 32 kilobytes in size (see <a href=\"/stickers#animation-requirements\"></a><a href=\"https://core.telegram.org/stickers#animation-requirements\">https://core.telegram.org/stickers#animation-requirements</a> for animated sticker technical requirements), or a <strong>.WEBM</strong> video with the thumbnail up to 32 kilobytes in size; see <a href=\"/stickers#video-requirements\"></a><a href=\"https://core.telegram.org/stickers#video-requirements\">https://core.telegram.org/stickers#video-requirements</a> for video sticker technical requirements. Pass a <em>file_id</em> as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a>. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerSetThumbnailAsync(\n        this ITelegramBotClient client,\n        string name,\n        long userId,\n        string format,\n        InputFile? thumbnail = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Format, format ?? throw new ArgumentNullException(nameof(format)) },\n        };\n        if (thumbnail is not null)\n        {\n            args.Add(PropertyNames.Thumbnail, thumbnail);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerSetThumbnail,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/setStickerSetTitle.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to set the title of a created sticker set. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"title\">Sticker set title, 1-64 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetStickerSetTitle(\n        this ITelegramBotClient client,\n        string name,\n        string title\n    ) => client.SetStickerSetTitleAsync(name, title).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to set the title of a created sticker set. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"name\">Sticker set name</param>\n    /// <param name=\"title\">Sticker set title, 1-64 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetStickerSetTitleAsync(\n        this ITelegramBotClient client,\n        string name,\n        string title,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.Name, name ?? throw new ArgumentNullException(nameof(name)) },\n            { PropertyNames.Title, title ?? throw new ArgumentNullException(nameof(title)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetStickerSetTitle,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/uploadStickerFile.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Use this method to upload a file with a sticker for later use in the <a href=\"https://core.telegram.org/bots/api#createnewstickerset\">createNewStickerSet</a>, <a href=\"https://core.telegram.org/bots/api#addstickertoset\">addStickerToSet</a>, or <a href=\"https://core.telegram.org/bots/api#replacestickerinset\">replaceStickerInSet</a> methods (the file can be used multiple times). Returns the uploaded <see cref=\"File\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"UploadStickerFile\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static File UploadStickerFile(\n        this ITelegramBotClient client,\n        UploadStickerFileArgs args\n    ) => client.UploadStickerFileAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to upload a file with a sticker for later use in the <a href=\"https://core.telegram.org/bots/api#createnewstickerset\">createNewStickerSet</a>, <a href=\"https://core.telegram.org/bots/api#addstickertoset\">addStickerToSet</a>, or <a href=\"https://core.telegram.org/bots/api#replacestickerinset\">replaceStickerInSet</a> methods (the file can be used multiple times). Returns the uploaded <see cref=\"File\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"UploadStickerFile\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<File> UploadStickerFileAsync(\n        this ITelegramBotClient client,\n        UploadStickerFileArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<File>(MethodNames.UploadStickerFile, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to upload a file with a sticker for later use in the <a href=\"https://core.telegram.org/bots/api#createnewstickerset\">createNewStickerSet</a>, <a href=\"https://core.telegram.org/bots/api#addstickertoset\">addStickerToSet</a>, or <a href=\"https://core.telegram.org/bots/api#replacestickerinset\">replaceStickerInSet</a> methods (the file can be used multiple times). Returns the uploaded <see cref=\"File\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of sticker file owner</param>\n    /// <param name=\"sticker\">A file with the sticker in .WEBP, .PNG, .TGS, or .WEBM format. See <a href=\"/stickers\"></a><a href=\"https://core.telegram.org/stickers\">https://core.telegram.org/stickers</a> for technical requirements. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"stickerFormat\">Format of the sticker, must be one of “static”, “animated”, “video”</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static File UploadStickerFile(\n        this ITelegramBotClient client,\n        long userId,\n        InputFile sticker,\n        string stickerFormat\n    ) => client.UploadStickerFileAsync(userId, sticker, stickerFormat).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to upload a file with a sticker for later use in the <a href=\"https://core.telegram.org/bots/api#createnewstickerset\">createNewStickerSet</a>, <a href=\"https://core.telegram.org/bots/api#addstickertoset\">addStickerToSet</a>, or <a href=\"https://core.telegram.org/bots/api#replacestickerinset\">replaceStickerInSet</a> methods (the file can be used multiple times). Returns the uploaded <see cref=\"File\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier of sticker file owner</param>\n    /// <param name=\"sticker\">A file with the sticker in .WEBP, .PNG, .TGS, or .WEBM format. See <a href=\"/stickers\"></a><a href=\"https://core.telegram.org/stickers\">https://core.telegram.org/stickers</a> for technical requirements. <a href=\"https://core.telegram.org/bots/api#sending-files\">More information on Sending Files »</a></param>\n    /// <param name=\"stickerFormat\">Format of the sticker, must be one of “static”, “animated”, “video”</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<File> UploadStickerFileAsync(\n        this ITelegramBotClient client,\n        long userId,\n        InputFile sticker,\n        string stickerFormat,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Sticker, sticker ?? throw new ArgumentNullException(nameof(sticker)) },\n            {\n                PropertyNames.StickerFormat,\n                stickerFormat ?? throw new ArgumentNullException(nameof(stickerFormat))\n            },\n        };\n\n        return client.CallMethodAsync<File>(MethodNames.UploadStickerFile, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/verifyChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyChat(\n        this ITelegramBotClient client,\n        long chatId,\n        string? customDescription = null\n    ) => client.VerifyChatAsync(chatId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyChatAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyChat, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyChat(\n        this ITelegramBotClient client,\n        string chatId,\n        string? customDescription = null\n    ) => client.VerifyChatAsync(chatId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyChatAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyChat, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Stickers/verifyUser.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.Stickers;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class StickersExtensions\n{\n    /// <summary>\n    /// Verifies a user <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyUser(\n        this ITelegramBotClient client,\n        long userId,\n        string? customDescription = null\n    ) => client.VerifyUserAsync(userId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a user <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyUserAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyUser, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Telegram.BotAPI.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <Version>10.0.0</Version>\n    <PackageId>$(AssemblyName)</PackageId>\n    <Authors>Quetzal Rivera</Authors>\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n    <RootNamespace>Telegram.BotAPI</RootNamespace>\n    <Copyright>Quetzal Rivera 2026 ©</Copyright>\n    <NeutralLanguage>en</NeutralLanguage>\n    <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>\n    <Description>A very complete library to use Telegram Bot API in your NET project. Full\n      support for Bot API v10.0 (May 8, 2026).\n      - Contains all classes and methods available from the Bot API.\n    </Description>\n    <PackageTags>Telegram;Bot;API</PackageTags>\n    <Title>Telegram.BotAPI</Title>\n    <SignAssembly>false</SignAssembly>\n    <AssemblyOriginatorKeyFile>Telegram.BotAPI.pfx</AssemblyOriginatorKeyFile>\n    <LangVersion>latest</LangVersion>\n    <Product>$(AssemblyName)</Product>\n    <PackageLicenseFile>LICENSE</PackageLicenseFile>\n    <RepositoryUrl>https://github.com/Eptagone/Telegram.BotAPI</RepositoryUrl>\n    <PackageIcon>packicon.png</PackageIcon>\n    <PackageProjectUrl>https://github.com/Eptagone/Telegram.BotAPI</PackageProjectUrl>\n    <RepositoryType></RepositoryType>\n    <AssemblyName>Telegram.BotAPI</AssemblyName>\n    <PackageReleaseNotes>Updated to Bot API v10.0</PackageReleaseNotes>\n    <EnableNETAnalyzers>true</EnableNETAnalyzers>\n    <AnalysisLevel>latest-recommended</AnalysisLevel>\n    <PackageReadmeFile>README.md</PackageReadmeFile>\n    <EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Text.Json\" Version=\"10.0.7\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Include=\"..\\..\\..\\LICENSE\">\n      <Pack>True</Pack>\n      <PackagePath></PackagePath>\n    </None>\n    <None Include=\"packicon.png\">\n      <Pack>True</Pack>\n      <PackagePath></PackagePath>\n    </None>\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"README\">\n      <Pack>True</Pack>\n      <PackagePath>\\</PackagePath>\n    </None>\n    <None Update=\"README.md\">\n      <Pack>True</Pack>\n      <PackagePath>\\</PackagePath>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramBotClient.API.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Collections;\nusing System.IO;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.Json;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI;\n\npublic partial class TelegramBotClient : ITelegramBotClient\n{\n    internal static readonly JsonSerializerOptions SerializerOptions = new()\n    {\n        DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,\n    };\n\n    private async Task<TResult?> CallApiMethodAndGetResultAsync<TResult>(\n        string method,\n        object? args = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        BotResponse<TResult>? response = null;\n\n        do\n        {\n            if (response is not null)\n            {\n                int retryAfter = response.Parameters?.RetryAfter ?? 1;\n                await Task.Delay(retryAfter * 1000, cancellationToken).ConfigureAwait(false);\n            }\n\n            response = await this.CallApiMethodAsync<TResult>(method, args, cancellationToken)\n                .ConfigureAwait(false);\n        }\n        // Try again and again if the error code is 429 (Too Many Requests and AutoRetryOnRateLimit is true)\n        while (response.ErrorCode == 429 && this.options.AutoRetryOnRateLimit);\n\n        if (response.Ok)\n        {\n            return response.Result;\n        }\n\n        if (this.options.IgnoreBotExceptions)\n        {\n            return default;\n        }\n\n        if (response.ErrorCode is null || response.Description is null)\n        {\n            throw new JsonException(\"Cannot deserialize the response error.\");\n        }\n\n        throw new BotRequestException(\n            (int)response.ErrorCode,\n            response.Description,\n            response.Parameters\n        );\n    }\n\n    private async Task<BotResponse<TReturn>> CallApiMethodAsync<TReturn>(\n        string method,\n        object? args = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        string requestUri = this.options.UseTestEnvironment\n            ? $\"bot{this.options.BotToken}/test/{method}\"\n            : $\"bot{this.options.BotToken}/{method}\";\n\n        if (this.options.HttpClient.BaseAddress?.AbsoluteUri != this.options.ServerAddress)\n        {\n            requestUri = $\"{this.options.ServerAddress}/{requestUri}\";\n        }\n\n        HttpRequestMessage requestMessage;\n\n        if (args is null)\n        {\n            requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUri);\n        }\n        else if (args.GetType().IsPrimitive || args is string)\n        {\n            throw new ArgumentException(\"The method arguments must be an object.\");\n        }\n        else if (args is Stream streamArgs)\n        {\n            StreamContent content = new(streamArgs);\n            content.Headers.ContentType = new MediaTypeHeaderValue(\"application/json\");\n            requestMessage = new HttpRequestMessage(HttpMethod.Post, requestUri)\n            {\n                Content = content,\n            };\n        }\n        else if (ArgsHasFiles(args))\n        {\n            MultipartFormDataContent content = CreateFormDataFromObject(args);\n            requestMessage = new HttpRequestMessage(HttpMethod.Post, requestUri)\n            {\n                Content = content,\n            };\n        }\n        else\n        {\n            MemoryStream stream = new();\n            await JsonSerializer\n                .SerializeAsync(stream, args, args.GetType(), SerializerOptions, cancellationToken)\n                .ConfigureAwait(false);\n            stream.Seek(0, SeekOrigin.Begin);\n            StreamContent content = new(stream);\n            content.Headers.ContentType = new MediaTypeHeaderValue(\"application/json\");\n            requestMessage = new HttpRequestMessage(HttpMethod.Post, requestUri)\n            {\n                Content = content,\n            };\n        }\n\n        HttpResponseMessage? response = await this\n            .options.HttpClient.SendAsync(requestMessage, cancellationToken)\n            .ConfigureAwait(false);\n\n        try\n        {\n            response.EnsureSuccessStatusCode();\n        }\n        catch (HttpRequestException)\n        {\n            if (response.Content.Headers.ContentType.MediaType != \"application/json\")\n            {\n                throw;\n            }\n        }\n\n        Stream? responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);\n        BotResponse<TReturn>? botResponse = await JsonSerializer\n            .DeserializeAsync<BotResponse<TReturn>>(\n                responseStream,\n                SerializerOptions,\n                cancellationToken\n            )\n            .ConfigureAwait(false);\n\n        return botResponse ?? throw new JsonException(\"Cannot deserialize the response.\");\n    }\n\n    private static MultipartFormDataContent CreateFormDataFromObject(object args)\n    {\n        MultipartFormDataContent content = new(Guid.NewGuid().ToString() + DateTime.UtcNow.Ticks);\n\n        // If the value is an enumerable, add each item to the content.\n        if (args is IDictionary<string, object> dictionary)\n        {\n            foreach (KeyValuePair<string, object> item in dictionary)\n            {\n                if (item.Value is null)\n                {\n                    continue;\n                }\n\n                if (item.Value.GetType().IsPrimitive || item.Value is string)\n                {\n                    content.Add(new StringContent(item.Value.ToString()), item.Key);\n                }\n                else\n                {\n                    switch (item.Value)\n                    {\n                        case InputFile inputFile:\n                            content.Add(inputFile.Content, item.Key, inputFile.Filename);\n                            break;\n                        case IDictionary<string, InputFile> files:\n                        {\n                            foreach (KeyValuePair<string, InputFile> file in files)\n                            {\n                                content.Add(file.Value.Content, file.Key, file.Value.Filename);\n                            }\n\n                            break;\n                        }\n                        default:\n                        {\n                            string json = JsonSerializer.Serialize(item.Value, SerializerOptions);\n                            content.Add(new StringContent(json, Encoding.UTF8), item.Key);\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        else\n        {\n            PropertyInfo[] properties = args.GetType().GetProperties();\n\n            foreach (PropertyInfo? property in properties)\n            {\n                object? value = property.GetValue(args);\n                if (value is null)\n                {\n                    continue;\n                }\n\n                JsonPropertyNameAttribute? jsonAttribute =\n                    property.GetCustomAttribute<JsonPropertyNameAttribute>();\n                if (jsonAttribute is not null)\n                {\n                    if (value.GetType().IsPrimitive || value is string)\n                    {\n                        content.Add(new StringContent(value.ToString()), jsonAttribute.Name);\n                    }\n                    else if (value is InputFile inputFile)\n                    {\n                        content.Add(inputFile.Content, jsonAttribute.Name, inputFile.Filename);\n                    }\n                    else\n                    {\n                        string json = JsonSerializer.Serialize(value, SerializerOptions);\n                        content.Add(new StringContent(json, Encoding.UTF8), jsonAttribute.Name);\n                    }\n                }\n                else\n                {\n                    if (value is not IDictionary<string, InputFile> files)\n                    {\n                        continue;\n                    }\n\n                    foreach (KeyValuePair<string, InputFile> file in files)\n                    {\n                        content.Add(file.Value.Content, file.Key, file.Value.Filename);\n                    }\n                }\n            }\n        }\n\n        return content;\n    }\n\n    private static bool ArgsHasFiles(object args)\n    {\n        if (args is IEnumerable)\n        {\n            if (args is not IDictionary<string, object> items)\n            {\n                return false;\n            }\n\n            foreach (KeyValuePair<string, object> item in items)\n            {\n                switch (item.Value)\n                {\n                    case IDictionary<string, InputFile> files when files.Any():\n                    case InputFile:\n                        return true;\n                }\n            }\n        }\n        else\n        {\n            PropertyInfo[] properties = args.GetType().GetProperties();\n\n            foreach (PropertyInfo? property in properties)\n            {\n                object? value = property.GetValue(args);\n                if (value is null || value.GetType().IsPrimitive || value is string)\n                {\n                    continue;\n                }\n\n                switch (value)\n                {\n                    case InputFile:\n                    case IDictionary<string, InputFile> files when files.Any():\n                        return true;\n                }\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramBotClient.ITelegramBotClient.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\npublic partial class TelegramBotClient : ITelegramBotClient\n{\n    /// <inheritdoc/>\n    TelegramBotClientOptions ITelegramBotClient.Options => this.options;\n\n    /// <inheritdoc/>\n    public TResult CallMethod<TResult>(string method, object? args = null) =>\n        this.CallApiMethodAndGetResultAsync<TResult>(method, args).GetAwaiter().GetResult()!;\n\n    /// <inheritdoc/>\n    public Task<TResult> CallMethodAsync<TResult>(\n        string method,\n        object? args = null,\n        CancellationToken cancellationToken = default\n    ) => this.CallApiMethodAndGetResultAsync<TResult>(method, args, cancellationToken)!;\n\n    /// <inheritdoc/>\n    public BotResponse<TReturn> CallMethodDirect<TReturn>(string method, object? args = null) =>\n        this.CallApiMethodAsync<TReturn>(method, args).GetAwaiter().GetResult();\n\n    /// <inheritdoc/>\n    public Task<BotResponse<TReturn>> CallMethodDirectAsync<TReturn>(\n        string method,\n        object? args = null,\n        CancellationToken cancellationToken = default\n    ) => this.CallApiMethodAsync<TReturn>(method, args, cancellationToken);\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramBotClient.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\n#region AUTHOR\n\n/*\n * ┌────────────────────────────────────────────────────────────────────────────┐\n * │   █████████████████████████████████████████████████████████████████████\t│\n * │  =======================================================================\t│\n * │   Author: Quetzal Rivera                                             \t\t│\n * │   Email: QuetzalDeveloper@outlook.com                               \t\t│\n * │   Project: Telegram.BotAPI                                           \t\t│\n * │   Creation Date: 13-12-2019                                           \t\t│\n * │   Description: Library to access and interact with the Telegram Bot API. \t│\n * │  =======================================================================\t│\n * └────────────────────────────────────────────────────────────────────────────┘\n */\n\n#endregion\n\nusing System.Net.Http;\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Provides a client for sending requests to the Telegram Bot API.\n/// </summary>\n/// <param name=\"options\">Options for the <see cref=\"TelegramBotClient\" />.</param>\npublic partial class TelegramBotClient(TelegramBotClientOptions options) : ITelegramBotClient\n{\n    private readonly TelegramBotClientOptions options = options;\n\n    /// <summary>\n    ///     Initialize a new instance of the <see cref=\"TelegramBotClient\" /> class.\n    /// </summary>\n    /// <param name=\"botToken\">\n    ///     Token granted by <a href=\"https://t.me/BotFather\">BotFather</a>. Required to access the Telegram\n    ///     bot API.\n    /// </param>\n    public TelegramBotClient(string botToken)\n        : this(new TelegramBotClientOptions(botToken)) { }\n\n    /// <summary>\n    ///     Initialize a new instance of the <see cref=\"TelegramBotClient\" /> class.\n    /// </summary>\n    /// <param name=\"botToken\">\n    ///     Token granted by <a href=\"https://t.me/BotFather\">BotFather</a>. Required to access the Telegram\n    ///     bot API.\n    /// </param>\n    /// <param name=\"httpClient\">Optional. Provide a specific HttpClient for this instance of BotClient.</param>\n    [Obsolete(\"Specify the httpClient in the options instead\")]\n    public TelegramBotClient(string botToken, HttpClient? httpClient)\n        : this(new TelegramBotClientOptions(botToken))\n    {\n        if (httpClient is not null)\n        {\n            this.options.HttpClient = httpClient;\n        }\n    }\n\n    /// <summary>\n    ///     Initialize a new instance of the <see cref=\"TelegramBotClient\" /> class.\n    /// </summary>\n    /// <param name=\"options\">Options for the <see cref=\"TelegramBotClient\" />.</param>\n    /// <param name=\"httpClient\">Optional. Provide a specific HttpClient for this instance of BotClient.</param>\n    [Obsolete(\"Specify the httpClient in the options instead\")]\n    public TelegramBotClient(TelegramBotClientOptions options, HttpClient? httpClient)\n        : this(options)\n    {\n        if (httpClient is not null)\n        {\n            this.options.HttpClient = httpClient;\n        }\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramBotClientOptions.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Net.Http;\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// Options for a <see cref=\"TelegramBotClient\"/>.\n/// </summary>\n#pragma warning disable CA1001 // Types that own disposable fields should be disposable\npublic record TelegramBotClientOptions\n#pragma warning restore CA1001 // Types that own disposable fields should be disposable\n{\n    /// <summary>\n    /// Default server address to send bot request.\n    /// </summary>\n    public const string BaseServerAddress = \"https://api.telegram.org\";\n\n    private bool isUsingCustomHttpClient;\n    private HttpClient httpClient;\n    private string serverAddress = BaseServerAddress;\n\n    /// <summary>\n    /// Initialize a Telegram Bot Client.\n    /// </summary>\n    /// <param name=\"botToken\">Token granted by <a href=\"https://t.me/BotFather\">BotFather</a>. Required to access the Telegram bot API.</param>\n    /// <param name=\"httpClient\">Provide a specific HttpClient for this instance of bot client.</param>\n    public TelegramBotClientOptions(string botToken, HttpClient? httpClient = null)\n    {\n        this.BotToken = botToken;\n        this.httpClient =\n            httpClient ?? new HttpClient { BaseAddress = new Uri(this.serverAddress) };\n        if (httpClient is not null)\n        {\n            this.isUsingCustomHttpClient = true;\n        }\n    }\n\n    /// <summary>\n    /// Set true if you want methods to automatically retry the request when the server returns a 429 (Too Many Requests) error.\n    /// Default value is false.\n    /// </summary>\n    public bool AutoRetryOnRateLimit { get; set; }\n\n    /// <summary>\n    /// Token granted by <a href=\"https://t.me/BotFather\">BotFather</a>.\n    /// Required to access the Telegram bot API.\n    /// </summary>\n    public string BotToken { get; }\n\n    /// <summary>\n    /// Provide a specific HttpClient for this instance of bot client.\n    /// </summary>\n    public HttpClient HttpClient\n    {\n        get => this.httpClient;\n        set\n        {\n            this.httpClient = value;\n            this.isUsingCustomHttpClient = true;\n        }\n    }\n\n    /// <summary>\n    /// Set true if you want methods to return a default value when bot requests are rejected instead of throwing a <see cref=\"BotRequestException\"/>.\n    /// Default value is false.\n    /// </summary>\n    /// <remarks>\n    /// This feature was added for specific testing purposes. For example, running the bot in fairly unstable environments.\n    /// It's not recommended to use this feature in production environments. All exceptions should be handled properly.\n    /// </remarks>\n    public bool IgnoreBotExceptions { get; set; }\n\n    /// <summary>\n    /// The server address to send bot request.\n    /// Default value is: https://api.telegram.org\n    /// </summary>\n    /// <remarks>\n    /// Change this parameter if you're using your own <a href=\"https://core.telegram.org/bots/api#using-a-local-bot-api-server\">Local Bot API Server</a>.\n    /// </remarks>\n    public string ServerAddress\n    {\n        get => this.serverAddress;\n        set\n        {\n            if (!Uri.TryCreate(value, UriKind.Absolute, out _))\n            {\n                throw new ArgumentException(\"The value must be a valid Uri.\", nameof(value));\n            }\n            this.serverAddress = value;\n            if (!this.isUsingCustomHttpClient)\n            {\n                this.httpClient = new HttpClient { BaseAddress = new Uri(this.serverAddress) };\n            }\n        }\n    }\n\n    /// <summary>\n    /// True if the current client is using the Test Environment.\n    /// If true, all requests methods will be prefixed with \"/test\".\n    /// Default value is false.\n    /// </summary>\n    public bool UseTestEnvironment { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramConstants.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI;\n\n/// <summary>\n/// This class contains some constant values used by Telegram.\n/// </summary>\npublic static class TelegramConstants\n{\n    /// <summary>\n    /// Unique identifier for the anonymous bot.\n    /// </summary>\n    public const long GroupAnonymousBotId = 1087968824;\n\n    /// <summary>\n    /// Unique identifier for the telegram user.\n    /// </summary>\n    public const long TelegramId = 777000;\n\n    /// <summary>\n    /// Header name for the telegram bot api token in the request.\n    /// </summary>\n    public const string XTelegramBotApiSecretToken = \"X-Telegram-Bot-Api-Secret-Token\";\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/Args/SetPassportDataErrorsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents the arguments of the \"SetPassportDataErrors\" method.\n/// </summary>\npublic class SetPassportDataErrorsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetPassportDataErrorsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">User identifier</param>\n    /// <param name=\"errors\">A JSON-serialized array describing the errors</param>\n    public SetPassportDataErrorsArgs(long userId, IEnumerable<PassportElementError> errors)\n    {\n        this.UserId = userId;\n        this.Errors = errors ?? throw new ArgumentNullException(nameof(errors));\n    }\n\n    /// <summary>\n    /// User identifier\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized array describing the errors\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Errors)]\n    public IEnumerable<PassportElementError> Errors { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/EncryptedCredentials.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Describes data required for decrypting and authenticating <see cref=\"EncryptedPassportElement\"/>. See the <a href=\"https://core.telegram.org/passport#receiving-information\">Telegram Passport Documentation</a> for a complete description of the data decryption and authentication processes.\n/// </summary>\npublic class EncryptedCredentials\n{\n    /// <summary>\n    /// Base64-encoded encrypted JSON-serialized data with unique user's payload, data hashes and secrets required for <see cref=\"EncryptedPassportElement\"/> decryption and authentication\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Data)]\n    public string Data { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded data hash for data authentication\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Hash)]\n    public string Hash { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded secret, encrypted with the bot's public RSA key, required for data decryption\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Secret)]\n    public string Secret { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/EncryptedPassportElement.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Describes documents or other Telegram Passport elements shared with the bot by the user.\n/// </summary>\npublic class EncryptedPassportElement\n{\n    /// <summary>\n    /// Element type. One of “personal_details”, “passport”, “driver_license”, “identity_card”, “internal_passport”, “address”, “utility_bill”, “bank_statement”, “rental_agreement”, “passport_registration”, “temporary_registration”, “phone_number”, “email”.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Optional. Base64-encoded encrypted Telegram Passport element data provided by the user; available only for “personal_details”, “passport”, “driver_license”, “identity_card”, “internal_passport” and “address” types. Can be decrypted and verified using the accompanying <see cref=\"EncryptedCredentials\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Data)]\n    public string? Data { get; set; }\n\n    /// <summary>\n    /// Optional. User's verified phone number; available only for “phone_number” type\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PhoneNumber)]\n    public string? PhoneNumber { get; set; }\n\n    /// <summary>\n    /// Optional. User's verified email address; available only for “email” type\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Email)]\n    public string? Email { get; set; }\n\n    /// <summary>\n    /// Optional. Array of encrypted files with documents provided by the user; available only for “utility_bill”, “bank_statement”, “rental_agreement”, “passport_registration” and “temporary_registration” types. Files can be decrypted and verified using the accompanying <see cref=\"EncryptedCredentials\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Files)]\n    public IEnumerable<PassportFile>? Files { get; set; }\n\n    /// <summary>\n    /// Optional. Encrypted file with the front side of the document, provided by the user; available only for “passport”, “driver_license”, “identity_card” and “internal_passport”. The file can be decrypted and verified using the accompanying <see cref=\"EncryptedCredentials\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FrontSide)]\n    public PassportFile? FrontSide { get; set; }\n\n    /// <summary>\n    /// Optional. Encrypted file with the reverse side of the document, provided by the user; available only for “driver_license” and “identity_card”. The file can be decrypted and verified using the accompanying <see cref=\"EncryptedCredentials\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReverseSide)]\n    public PassportFile? ReverseSide { get; set; }\n\n    /// <summary>\n    /// Optional. Encrypted file with the selfie of the user holding a document, provided by the user; available if requested for “passport”, “driver_license”, “identity_card” and “internal_passport”. The file can be decrypted and verified using the accompanying <see cref=\"EncryptedCredentials\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Selfie)]\n    public PassportFile? Selfie { get; set; }\n\n    /// <summary>\n    /// Optional. Array of encrypted files with translated versions of documents provided by the user; available if requested for “passport”, “driver_license”, “identity_card”, “internal_passport”, “utility_bill”, “bank_statement”, “rental_agreement”, “passport_registration” and “temporary_registration” types. Files can be decrypted and verified using the accompanying <see cref=\"EncryptedCredentials\"/>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Translation)]\n    public IEnumerable<PassportFile>? Translation { get; set; }\n\n    /// <summary>\n    /// Base64-encoded element hash for using in <see cref=\"PassportElementErrorUnspecified\"/>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Hash)]\n    public string Hash { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportData.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Describes Telegram Passport data shared with the bot by the user.\n/// </summary>\npublic class PassportData\n{\n    /// <summary>\n    /// Array with information about documents and other Telegram Passport elements that was shared with the bot\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Data)]\n    public IEnumerable<EncryptedPassportElement> Data { get; set; } = null!;\n\n    /// <summary>\n    /// Encrypted credentials required to decrypt the data\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Credentials)]\n    public EncryptedCredentials Credentials { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementError.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.Converters;\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// This object represents an error in the Telegram Passport element which was submitted that should be resolved by the user. It should be one of:\n/// <list type=\"bullet\">\n/// <item><description><see cref=\"PassportElementErrorDataField\"/></description></item>\n/// <item><description><see cref=\"PassportElementErrorFrontSide\"/></description></item>\n/// <item><description><see cref=\"PassportElementErrorReverseSide\"/></description></item>\n/// <item><description><see cref=\"PassportElementErrorSelfie\"/></description></item>\n/// <item><description><see cref=\"PassportElementErrorFile\"/></description></item>\n/// <item><description><see cref=\"PassportElementErrorFiles\"/></description></item>\n/// <item><description><see cref=\"PassportElementErrorTranslationFile\"/></description></item>\n/// <item><description><see cref=\"PassportElementErrorTranslationFiles\"/></description></item>\n/// <item><description><see cref=\"PassportElementErrorUnspecified\"/></description></item>\n/// </list>\n/// </summary>\n[JsonConverter(typeof(PassportElementErrorConverter))]\npublic abstract class PassportElementError\n{\n    /// <summary>\n    /// Error source\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public abstract string Source { get; }\n\n    /// <summary>\n    /// No description available\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public abstract string Type { get; set; }\n\n    /// <summary>\n    /// Error message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Message)]\n    public string Message { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorDataField.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue in one of the data fields that was provided by the user. The error is considered resolved when the field's value changes.\n/// </summary>\npublic class PassportElementErrorDataField : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>data</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"data\";\n\n    /// <summary>\n    /// The section of the user's Telegram Passport which has the error, one of “personal_details”, “passport”, “driver_license”, “identity_card”, “internal_passport”, “address”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Name of the data field which has the error\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FieldName)]\n    public string FieldName { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded data hash\n    /// </summary>\n    [JsonPropertyName(PropertyNames.DataHash)]\n    public string DataHash { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorFile.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue with a document scan. The error is considered resolved when the file with the document scan changes.\n/// </summary>\npublic class PassportElementErrorFile : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>file</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"file\";\n\n    /// <summary>\n    /// The section of the user's Telegram Passport which has the issue, one of “utility_bill”, “bank_statement”, “rental_agreement”, “passport_registration”, “temporary_registration”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded file hash\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileHash)]\n    public string FileHash { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorFiles.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue with a list of scans. The error is considered resolved when the list of files containing the scans changes.\n/// </summary>\npublic class PassportElementErrorFiles : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>files</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"files\";\n\n    /// <summary>\n    /// The section of the user's Telegram Passport which has the issue, one of “utility_bill”, “bank_statement”, “rental_agreement”, “passport_registration”, “temporary_registration”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// List of base64-encoded file hashes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileHashes)]\n    public IEnumerable<string> FileHashes { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorFrontSide.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue with the front side of a document. The error is considered resolved when the file with the front side of the document changes.\n/// </summary>\npublic class PassportElementErrorFrontSide : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>front_side</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"front_side\";\n\n    /// <summary>\n    /// The section of the user's Telegram Passport which has the issue, one of “passport”, “driver_license”, “identity_card”, “internal_passport”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded hash of the file with the front side of the document\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileHash)]\n    public string FileHash { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorReverseSide.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue with the reverse side of a document. The error is considered resolved when the file with reverse side of the document changes.\n/// </summary>\npublic class PassportElementErrorReverseSide : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>reverse_side</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"reverse_side\";\n\n    /// <summary>\n    /// The section of the user's Telegram Passport which has the issue, one of “driver_license”, “identity_card”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded hash of the file with the reverse side of the document\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileHash)]\n    public string FileHash { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorSelfie.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue with the selfie with a document. The error is considered resolved when the file with the selfie changes.\n/// </summary>\npublic class PassportElementErrorSelfie : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>selfie</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"selfie\";\n\n    /// <summary>\n    /// The section of the user's Telegram Passport which has the issue, one of “passport”, “driver_license”, “identity_card”, “internal_passport”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded hash of the file with the selfie\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileHash)]\n    public string FileHash { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorTranslationFile.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue with one of the files that constitute the translation of a document. The error is considered resolved when the file changes.\n/// </summary>\npublic class PassportElementErrorTranslationFile : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>translation_file</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"translation_file\";\n\n    /// <summary>\n    /// Type of element of the user's Telegram Passport which has the issue, one of “passport”, “driver_license”, “identity_card”, “internal_passport”, “utility_bill”, “bank_statement”, “rental_agreement”, “passport_registration”, “temporary_registration”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded file hash\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileHash)]\n    public string FileHash { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorTranslationFiles.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue with the translated version of a document. The error is considered resolved when a file with the document translation change.\n/// </summary>\npublic class PassportElementErrorTranslationFiles : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>translation_files</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"translation_files\";\n\n    /// <summary>\n    /// Type of element of the user's Telegram Passport which has the issue, one of “passport”, “driver_license”, “identity_card”, “internal_passport”, “utility_bill”, “bank_statement”, “rental_agreement”, “passport_registration”, “temporary_registration”\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// List of base64-encoded file hashes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileHashes)]\n    public IEnumerable<string> FileHashes { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportElementError/PassportElementErrorUnspecified.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Represents an issue in an unspecified place. The error is considered resolved when new data is added.\n/// </summary>\npublic class PassportElementErrorUnspecified : PassportElementError\n{\n    /// <summary>\n    /// Error source, must be <em>unspecified</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Source)]\n    public override string Source => \"unspecified\";\n\n    /// <summary>\n    /// Type of element of the user's Telegram Passport which has the issue\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Type)]\n    public override string Type { get; set; } = null!;\n\n    /// <summary>\n    /// Base64-encoded element hash\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ElementHash)]\n    public string ElementHash { get; set; } = null!;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/PassportFile.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// This object represents a file uploaded to Telegram Passport. Currently all Telegram Passport files are in JPEG format when decrypted and don't exceed 10MB.\n/// </summary>\npublic class PassportFile\n{\n    /// <summary>\n    /// Identifier for this file, which can be used to download or reuse the file\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileId)]\n    public string FileId { get; set; } = null!;\n\n    /// <summary>\n    /// Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileUniqueId)]\n    public string FileUniqueId { get; set; } = null!;\n\n    /// <summary>\n    /// File size in bytes\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileSize)]\n    public long FileSize { get; set; }\n\n    /// <summary>\n    /// Unix time when the file was uploaded\n    /// </summary>\n    [JsonPropertyName(PropertyNames.FileDate)]\n    public int FileDate { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/TelegramPassport/setPassportDataErrors.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.TelegramPassport;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class TelegramPassportExtensions\n{\n    /// <summary>\n    /// Informs a user that some of the Telegram Passport elements they provided contains errors. The user will not be able to re-submit their Passport to you until the errors are fixed (the contents of the field for which you returned the error must change). Returns <em>True</em> on success.\n    /// Use this if the data submitted by the user doesn't satisfy the standards your service requires for any reason. For example, if a birthday date seems invalid, a submitted document is blurry, a scan shows evidence of tampering, etc. Supply some details in the error message to make sure the user knows how to correct the issues.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetPassportDataErrors\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetPassportDataErrors(\n        this ITelegramBotClient client,\n        SetPassportDataErrorsArgs args\n    ) => client.SetPassportDataErrorsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Informs a user that some of the Telegram Passport elements they provided contains errors. The user will not be able to re-submit their Passport to you until the errors are fixed (the contents of the field for which you returned the error must change). Returns <em>True</em> on success.\n    /// Use this if the data submitted by the user doesn't satisfy the standards your service requires for any reason. For example, if a birthday date seems invalid, a submitted document is blurry, a scan shows evidence of tampering, etc. Supply some details in the error message to make sure the user knows how to correct the issues.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetPassportDataErrors\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetPassportDataErrorsAsync(\n        this ITelegramBotClient client,\n        SetPassportDataErrorsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetPassportDataErrors,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Informs a user that some of the Telegram Passport elements they provided contains errors. The user will not be able to re-submit their Passport to you until the errors are fixed (the contents of the field for which you returned the error must change). Returns <em>True</em> on success.\n    /// Use this if the data submitted by the user doesn't satisfy the standards your service requires for any reason. For example, if a birthday date seems invalid, a submitted document is blurry, a scan shows evidence of tampering, etc. Supply some details in the error message to make sure the user knows how to correct the issues.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier</param>\n    /// <param name=\"errors\">A JSON-serialized array describing the errors</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetPassportDataErrors(\n        this ITelegramBotClient client,\n        long userId,\n        IEnumerable<PassportElementError> errors\n    ) => client.SetPassportDataErrorsAsync(userId, errors).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Informs a user that some of the Telegram Passport elements they provided contains errors. The user will not be able to re-submit their Passport to you until the errors are fixed (the contents of the field for which you returned the error must change). Returns <em>True</em> on success.\n    /// Use this if the data submitted by the user doesn't satisfy the standards your service requires for any reason. For example, if a birthday date seems invalid, a submitted document is blurry, a scan shows evidence of tampering, etc. Supply some details in the error message to make sure the user knows how to correct the issues.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">User identifier</param>\n    /// <param name=\"errors\">A JSON-serialized array describing the errors</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetPassportDataErrorsAsync(\n        this ITelegramBotClient client,\n        long userId,\n        IEnumerable<PassportElementError> errors,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.Errors, errors ?? throw new ArgumentNullException(nameof(errors)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetPassportDataErrors,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/DeleteBusinessMessagesArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"DeleteBusinessMessages\" method.\n/// </summary>\npublic class DeleteBusinessMessagesArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"DeleteBusinessMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to delete the messages</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must be from the same chat. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    public DeleteBusinessMessagesArgs(string businessConnectionId, IEnumerable<int> messageIds)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which to delete the messages\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must be from the same chat. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageIds)]\n    public IEnumerable<int> MessageIds { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/DeleteMessagesArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"DeleteMessages\" method.\n/// </summary>\npublic class DeleteMessagesArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"DeleteMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    public DeleteMessagesArgs(long chatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId;\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"DeleteMessagesArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    public DeleteMessagesArgs(string chatId, IEnumerable<int> messageIds)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.MessageIds = messageIds ?? throw new ArgumentNullException(nameof(messageIds));\n    }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of 1-100 identifiers of messages to delete. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageIds)]\n    public IEnumerable<int> MessageIds { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/EditMessageCaptionArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"EditMessageCaption\" method.\n/// </summary>\npublic class EditMessageCaptionArgs\n{\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message to be edited was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int? MessageId { get; set; }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n\n    /// <summary>\n    /// New caption of the message, 0-1024 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if the caption must be shown above the message media. Supported only for animation, photo and video messages.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowCaptionAboveMedia)]\n    public bool? ShowCaptionAboveMedia { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/EditMessageChecklistArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"EditMessageChecklist\" method.\n/// </summary>\npublic class EditMessageChecklistArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditMessageChecklistArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Unique identifier for the target message</param>\n    /// <param name=\"checklist\">A JSON-serialized object for the new checklist</param>\n    public EditMessageChecklistArgs(\n        string businessConnectionId,\n        long chatId,\n        int messageId,\n        InputChecklist checklist\n    )\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.ChatId = chatId;\n        this.MessageId = messageId;\n        this.Checklist = checklist ?? throw new ArgumentNullException(nameof(checklist));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditMessageChecklistArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Unique identifier for the target message</param>\n    /// <param name=\"checklist\">A JSON-serialized object for the new checklist</param>\n    public EditMessageChecklistArgs(\n        string businessConnectionId,\n        string chatId,\n        int messageId,\n        InputChecklist checklist\n    )\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.MessageId = messageId;\n        this.Checklist = checklist ?? throw new ArgumentNullException(nameof(checklist));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message will be sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for the new checklist\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Checklist)]\n    public InputChecklist Checklist { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for the new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a> for the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/EditMessageLiveLocationArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"EditMessageLiveLocation\" method.\n/// </summary>\npublic class EditMessageLiveLocationArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditMessageLiveLocationArgs\"/> class.\n    /// </summary>\n    /// <param name=\"latitude\">Latitude of new location</param>\n    /// <param name=\"longitude\">Longitude of new location</param>\n    public EditMessageLiveLocationArgs(float latitude, float longitude)\n    {\n        this.Latitude = latitude;\n        this.Longitude = longitude;\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message to be edited was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int? MessageId { get; set; }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n\n    /// <summary>\n    /// Latitude of new location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Latitude)]\n    public float Latitude { get; set; }\n\n    /// <summary>\n    /// Longitude of new location\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Longitude)]\n    public float Longitude { get; set; }\n\n    /// <summary>\n    /// New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current <em>live_period</em> by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then <em>live_period</em> remains unchanged\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LivePeriod)]\n    public int? LivePeriod { get; set; }\n\n    /// <summary>\n    /// The radius of uncertainty for the location, measured in meters; 0-1500\n    /// </summary>\n    [JsonPropertyName(PropertyNames.HorizontalAccuracy)]\n    public float? HorizontalAccuracy { get; set; }\n\n    /// <summary>\n    /// Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Heading)]\n    public int? Heading { get; set; }\n\n    /// <summary>\n    /// The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProximityAlertRadius)]\n    public int? ProximityAlertRadius { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/EditMessageMediaArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"EditMessageMedia\" method.\n/// </summary>\npublic class EditMessageMediaArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditMessageMediaArgs\"/> class.\n    /// </summary>\n    /// <param name=\"media\">A JSON-serialized object for a new media content of the message</param>\n    public EditMessageMediaArgs(InputMedia media)\n    {\n        this.Media = media ?? throw new ArgumentNullException(nameof(media));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message to be edited was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int? MessageId { get; set; }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for a new media content of the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Media)]\n    public InputMedia Media { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/EditMessageReplyMarkupArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"EditMessageReplyMarkup\" method.\n/// </summary>\npublic class EditMessageReplyMarkupArgs\n{\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message to be edited was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int? MessageId { get; set; }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/EditMessageTextArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"EditMessageText\" method.\n/// </summary>\npublic class EditMessageTextArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditMessageTextArgs\"/> class.\n    /// </summary>\n    /// <param name=\"text\">New text of the message, 1-4096 characters after entities parsing</param>\n    public EditMessageTextArgs(string text)\n    {\n        this.Text = text ?? throw new ArgumentNullException(nameof(text));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message to be edited was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int? MessageId { get; set; }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n\n    /// <summary>\n    /// New text of the message, 1-4096 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string Text { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Entities)]\n    public IEnumerable<MessageEntity>? Entities { get; set; }\n\n    /// <summary>\n    /// Link preview generation options for the message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.LinkPreviewOptions)]\n    public LinkPreviewOptions? LinkPreviewOptions { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/EditStoryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"EditStory\" method.\n/// </summary>\npublic class EditStoryArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"EditStoryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to edit</param>\n    /// <param name=\"content\">Content of the story</param>\n    public EditStoryArgs(string businessConnectionId, int storyId, InputStoryContent content)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.StoryId = storyId;\n        this.Content = content ?? throw new ArgumentNullException(nameof(content));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier of the story to edit\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StoryId)]\n    public int StoryId { get; set; }\n\n    /// <summary>\n    /// Content of the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Content)]\n    public InputStoryContent Content { get; set; }\n\n    /// <summary>\n    /// Caption of the story, 0-2048 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of clickable areas to be shown on the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Areas)]\n    public IEnumerable<StoryArea>? Areas { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/GetBusinessAccountGiftsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"GetBusinessAccountGifts\" method.\n/// </summary>\npublic class GetBusinessAccountGiftsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"GetBusinessAccountGiftsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    public GetBusinessAccountGiftsArgs(string businessConnectionId)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that aren't saved to the account's profile page\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnsaved)]\n    public bool? ExcludeUnsaved { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that are saved to the account's profile page\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeSaved)]\n    public bool? ExcludeSaved { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnlimited)]\n    public bool? ExcludeUnlimited { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude gifts that can be purchased a limited number of times\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeLimited)]\n    public bool? ExcludeLimited { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to exclude unique gifts\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ExcludeUnique)]\n    public bool? ExcludeUnique { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.SortByPrice)]\n    public bool? SortByPrice { get; set; }\n\n    /// <summary>\n    /// Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Offset)]\n    public string? Offset { get; set; }\n\n    /// <summary>\n    /// The maximum number of gifts to be returned; 1-100. Defaults to 100\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Limit)]\n    public int? Limit { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/GiftPremiumSubscriptionArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"GiftPremiumSubscription\" method.\n/// </summary>\npublic class GiftPremiumSubscriptionArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"GiftPremiumSubscriptionArgs\"/> class.\n    /// </summary>\n    /// <param name=\"userId\">Unique identifier of the target user who will receive a Telegram Premium subscription</param>\n    /// <param name=\"monthCount\">Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months</param>\n    public GiftPremiumSubscriptionArgs(long userId, int monthCount, int starCount)\n    {\n        this.UserId = userId;\n        this.MonthCount = monthCount;\n        this.StarCount = starCount;\n    }\n\n    /// <summary>\n    /// Unique identifier of the target user who will receive a Telegram Premium subscription\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long UserId { get; set; }\n\n    /// <summary>\n    /// Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MonthCount)]\n    public int MonthCount { get; set; }\n\n    /// <summary>\n    /// Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months\n    /// </summary>\n    [JsonPropertyName(PropertyNames.StarCount)]\n    public int StarCount { get; set; }\n\n    /// <summary>\n    /// Text that will be shown along with the service message about the subscription; 0-128 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextParseMode)]\n    public string? TextParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/PostStoryArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"PostStory\" method.\n/// </summary>\npublic class PostStoryArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"PostStoryArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    public PostStoryArgs(string businessConnectionId, InputStoryContent content, int activePeriod)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.Content = content ?? throw new ArgumentNullException(nameof(content));\n        this.ActivePeriod = activePeriod;\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Content of the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Content)]\n    public InputStoryContent Content { get; set; }\n\n    /// <summary>\n    /// Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ActivePeriod)]\n    public int ActivePeriod { get; set; }\n\n    /// <summary>\n    /// Caption of the story, 0-2048 characters after entities parsing\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Caption)]\n    public string? Caption { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ParseMode)]\n    public string? ParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.CaptionEntities)]\n    public IEnumerable<MessageEntity>? CaptionEntities { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of clickable areas to be shown on the story\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Areas)]\n    public IEnumerable<StoryArea>? Areas { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to keep the story accessible after it expires\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PostToChatPage)]\n    public bool? PostToChatPage { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ProtectContent)]\n    public bool? ProtectContent { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/SendGiftArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"SendGift\" method.\n/// </summary>\npublic class SendGiftArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SendGiftArgs\"/> class.\n    /// </summary>\n    /// <param name=\"giftId\">Identifier of the gift</param>\n    public SendGiftArgs(string giftId)\n    {\n        this.GiftId = giftId ?? throw new ArgumentNullException(nameof(giftId));\n    }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.UserId)]\n    public long? UserId { get; set; }\n\n    /// <summary>\n    /// Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@channelusername</em>) that will receive the gift.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Identifier of the gift\n    /// </summary>\n    [JsonPropertyName(PropertyNames.GiftId)]\n    public string GiftId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver\n    /// </summary>\n    [JsonPropertyName(PropertyNames.PayForUpgrade)]\n    public bool? PayForUpgrade { get; set; }\n\n    /// <summary>\n    /// Text that will be shown along with the gift; 0-128 characters\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Text)]\n    public string? Text { get; set; }\n\n    /// <summary>\n    /// Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextParseMode)]\n    public string? TextParseMode { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.TextEntities)]\n    public IEnumerable<MessageEntity>? TextEntities { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/SetBusinessAccountGiftSettingsArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"SetBusinessAccountGiftSettings\" method.\n/// </summary>\npublic class SetBusinessAccountGiftSettingsArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetBusinessAccountGiftSettingsArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"showGiftButton\">Pass <em>True</em>, if a button for sending a gift to the user or by the business account must always be shown in the input field</param>\n    /// <param name=\"acceptedGiftTypes\">Types of gifts accepted by the business account</param>\n    public SetBusinessAccountGiftSettingsArgs(\n        string businessConnectionId,\n        bool showGiftButton,\n        AcceptedGiftTypes acceptedGiftTypes\n    )\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.ShowGiftButton = showGiftButton;\n        this.AcceptedGiftTypes =\n            acceptedGiftTypes ?? throw new ArgumentNullException(nameof(acceptedGiftTypes));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em>, if a button for sending a gift to the user or by the business account must always be shown in the input field\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ShowGiftButton)]\n    public bool ShowGiftButton { get; set; }\n\n    /// <summary>\n    /// Types of gifts accepted by the business account\n    /// </summary>\n    [JsonPropertyName(PropertyNames.AcceptedGiftTypes)]\n    public AcceptedGiftTypes AcceptedGiftTypes { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/SetBusinessAccountProfilePhotoArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"SetBusinessAccountProfilePhoto\" method.\n/// </summary>\npublic class SetBusinessAccountProfilePhotoArgs : AttachedFilesArgsBase\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SetBusinessAccountProfilePhotoArgs\"/> class.\n    /// </summary>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    public SetBusinessAccountProfilePhotoArgs(string businessConnectionId, InputProfilePhoto photo)\n    {\n        this.BusinessConnectionId =\n            businessConnectionId ?? throw new ArgumentNullException(nameof(businessConnectionId));\n        this.Photo = photo ?? throw new ArgumentNullException(nameof(photo));\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// The new profile photo to set\n    /// </summary>\n    [JsonPropertyName(PropertyNames.Photo)]\n    public InputProfilePhoto Photo { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to set the public photo, which will be visible even if the main photo is hidden by the business account's privacy settings. An account can have only one public photo.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.IsPublic)]\n    public bool? IsPublic { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/StopMessageLiveLocationArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"StopMessageLiveLocation\" method.\n/// </summary>\npublic class StopMessageLiveLocationArgs\n{\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message to be edited was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object? ChatId { get; set; }\n\n    /// <summary>\n    /// Required if <em>inline_message_id</em> is not specified. Identifier of the message with live location to stop\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int? MessageId { get; set; }\n\n    /// <summary>\n    /// Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message\n    /// </summary>\n    [JsonPropertyName(PropertyNames.InlineMessageId)]\n    public string? InlineMessageId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/Args/StopPollArgs.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Represents the arguments of the \"StopPoll\" method.\n/// </summary>\npublic class StopPollArgs\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"StopPollArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the original message with the poll</param>\n    public StopPollArgs(long chatId, int messageId)\n    {\n        this.ChatId = chatId;\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"StopPollArgs\"/> class.\n    /// </summary>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the original message with the poll</param>\n    public StopPollArgs(string chatId, int messageId)\n    {\n        this.ChatId = chatId ?? throw new ArgumentNullException(nameof(chatId));\n        this.MessageId = messageId;\n    }\n\n    /// <summary>\n    /// Unique identifier of the business connection on behalf of which the message to be edited was sent\n    /// </summary>\n    [JsonPropertyName(PropertyNames.BusinessConnectionId)]\n    public string? BusinessConnectionId { get; set; }\n\n    /// <summary>\n    /// Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ChatId)]\n    public object ChatId { get; set; }\n\n    /// <summary>\n    /// Identifier of the original message with the poll\n    /// </summary>\n    [JsonPropertyName(PropertyNames.MessageId)]\n    public int MessageId { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized object for a new message <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.\n    /// </summary>\n    [JsonPropertyName(PropertyNames.ReplyMarkup)]\n    public InlineKeyboardMarkup? ReplyMarkup { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/approveSuggestedPost.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to approve a suggested post in a direct messages chat. The bot must have the 'can_post_messages' administrator right in the corresponding channel chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target direct messages chat</param>\n    /// <param name=\"messageId\">Identifier of a suggested post message to approve</param>\n    /// <param name=\"sendDate\">Point in time (Unix timestamp) when the post is expected to be published; omit if the date has already been specified when the suggested post was created. If specified, then the date must be not more than 2678400 seconds (30 days) in the future</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ApproveSuggestedPost(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        int? sendDate = null\n    ) => client.ApproveSuggestedPostAsync(chatId, messageId, sendDate).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to approve a suggested post in a direct messages chat. The bot must have the 'can_post_messages' administrator right in the corresponding channel chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target direct messages chat</param>\n    /// <param name=\"messageId\">Identifier of a suggested post message to approve</param>\n    /// <param name=\"sendDate\">Point in time (Unix timestamp) when the post is expected to be published; omit if the date has already been specified when the suggested post was created. If specified, then the date must be not more than 2678400 seconds (30 days) in the future</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ApproveSuggestedPostAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        int? sendDate = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (sendDate is not null)\n        {\n            args.Add(PropertyNames.SendDate, sendDate);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ApproveSuggestedPost,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/convertGiftToStars.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Converts a given regular gift to Telegram Stars. Requires the <em>can_convert_gifts_to_stars</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be converted to Telegram Stars</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ConvertGiftToStars(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId\n    ) => client.ConvertGiftToStarsAsync(businessConnectionId, ownedGiftId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Converts a given regular gift to Telegram Stars. Requires the <em>can_convert_gifts_to_stars</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be converted to Telegram Stars</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ConvertGiftToStarsAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.OwnedGiftId,\n                ownedGiftId ?? throw new ArgumentNullException(nameof(ownedGiftId))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ConvertGiftToStars,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/declineSuggestedPost.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to decline a suggested post in a direct messages chat. The bot must have the 'can_manage_direct_messages' administrator right in the corresponding channel chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target direct messages chat</param>\n    /// <param name=\"messageId\">Identifier of a suggested post message to decline</param>\n    /// <param name=\"comment\">Comment for the creator of the suggested post; 0-128 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeclineSuggestedPost(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? comment = null\n    ) => client.DeclineSuggestedPostAsync(chatId, messageId, comment).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to decline a suggested post in a direct messages chat. The bot must have the 'can_manage_direct_messages' administrator right in the corresponding channel chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target direct messages chat</param>\n    /// <param name=\"messageId\">Identifier of a suggested post message to decline</param>\n    /// <param name=\"comment\">Comment for the creator of the suggested post; 0-128 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeclineSuggestedPostAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? comment = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (comment is not null)\n        {\n            args.Add(PropertyNames.Comment, comment);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeclineSuggestedPost,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/deleteAllMessageReactions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to remove up to 10000 recent reactions in a group or a supergroup chat added by a given user or chat. The bot must have the 'can_delete_messages' administrator right in the chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup (in the format <em>@username</em>)</param>\n    /// <param name=\"userId\">Identifier of the user whose reactions will be removed, if the reactions were added by a user</param>\n    /// <param name=\"actorChatId\">Identifier of the chat whose reactions will be removed, if the reactions were added by a chat</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteAllMessageReactions(\n        this ITelegramBotClient client,\n        long chatId,\n        long? userId = null,\n        long? actorChatId = null\n    ) =>\n        client.DeleteAllMessageReactionsAsync(chatId, userId, actorChatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to remove up to 10000 recent reactions in a group or a supergroup chat added by a given user or chat. The bot must have the 'can_delete_messages' administrator right in the chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup (in the format <em>@username</em>)</param>\n    /// <param name=\"userId\">Identifier of the user whose reactions will be removed, if the reactions were added by a user</param>\n    /// <param name=\"actorChatId\">Identifier of the chat whose reactions will be removed, if the reactions were added by a chat</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteAllMessageReactionsAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        long? userId = null,\n        long? actorChatId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (userId is not null)\n        {\n            args.Add(PropertyNames.UserId, userId);\n        }\n        if (actorChatId is not null)\n        {\n            args.Add(PropertyNames.ActorChatId, actorChatId);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteAllMessageReactions,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to remove up to 10000 recent reactions in a group or a supergroup chat added by a given user or chat. The bot must have the 'can_delete_messages' administrator right in the chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup (in the format <em>@username</em>)</param>\n    /// <param name=\"userId\">Identifier of the user whose reactions will be removed, if the reactions were added by a user</param>\n    /// <param name=\"actorChatId\">Identifier of the chat whose reactions will be removed, if the reactions were added by a chat</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteAllMessageReactions(\n        this ITelegramBotClient client,\n        string chatId,\n        long? userId = null,\n        long? actorChatId = null\n    ) =>\n        client.DeleteAllMessageReactionsAsync(chatId, userId, actorChatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to remove up to 10000 recent reactions in a group or a supergroup chat added by a given user or chat. The bot must have the 'can_delete_messages' administrator right in the chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup (in the format <em>@username</em>)</param>\n    /// <param name=\"userId\">Identifier of the user whose reactions will be removed, if the reactions were added by a user</param>\n    /// <param name=\"actorChatId\">Identifier of the chat whose reactions will be removed, if the reactions were added by a chat</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteAllMessageReactionsAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        long? userId = null,\n        long? actorChatId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (userId is not null)\n        {\n            args.Add(PropertyNames.UserId, userId);\n        }\n        if (actorChatId is not null)\n        {\n            args.Add(PropertyNames.ActorChatId, actorChatId);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteAllMessageReactions,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/deleteBusinessMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Delete messages on behalf of a business account. Requires the <em>can_delete_sent_messages</em> business bot right to delete messages sent by the bot itself, or the <em>can_delete_all_messages</em> business bot right to delete any message. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"DeleteBusinessMessages\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteBusinessMessages(\n        this ITelegramBotClient client,\n        DeleteBusinessMessagesArgs args\n    ) => client.DeleteBusinessMessagesAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Delete messages on behalf of a business account. Requires the <em>can_delete_sent_messages</em> business bot right to delete messages sent by the bot itself, or the <em>can_delete_all_messages</em> business bot right to delete any message. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"DeleteBusinessMessages\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteBusinessMessagesAsync(\n        this ITelegramBotClient client,\n        DeleteBusinessMessagesArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteBusinessMessages,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Delete messages on behalf of a business account. Requires the <em>can_delete_sent_messages</em> business bot right to delete messages sent by the bot itself, or the <em>can_delete_all_messages</em> business bot right to delete any message. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to delete the messages</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must be from the same chat. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteBusinessMessages(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        IEnumerable<int> messageIds\n    ) =>\n        client\n            .DeleteBusinessMessagesAsync(businessConnectionId, messageIds)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Delete messages on behalf of a business account. Requires the <em>can_delete_sent_messages</em> business bot right to delete messages sent by the bot itself, or the <em>can_delete_all_messages</em> business bot right to delete any message. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to delete the messages</param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must be from the same chat. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteBusinessMessagesAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        IEnumerable<int> messageIds,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteBusinessMessages,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/deleteMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to delete a message, including service messages, with the following limitations:<br />- A message can only be deleted if it was sent less than 48 hours ago.<br />- Service messages about a supergroup, channel, or forum topic creation can't be deleted.<br />- A dice message in a private chat can only be deleted if it was sent more than 24 hours ago.<br />- Bots can delete outgoing messages in private chats, groups, and supergroups.<br />- Bots can delete incoming messages in private chats.<br />- Bots granted <em>can_post_messages</em> permissions can delete outgoing messages in channels.<br />- If the bot is an administrator of a group, it can delete any message there.<br />- If the bot has <em>can_delete_messages</em> administrator right in a supergroup or a channel, it can delete any message there.<br />- If the bot has <em>can_manage_direct_messages</em> administrator right in a channel, it can delete any message in the corresponding direct messages chat.<br />Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the message to delete</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMessage(this ITelegramBotClient client, long chatId, int messageId) =>\n        client.DeleteMessageAsync(chatId, messageId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a message, including service messages, with the following limitations:<br />- A message can only be deleted if it was sent less than 48 hours ago.<br />- Service messages about a supergroup, channel, or forum topic creation can't be deleted.<br />- A dice message in a private chat can only be deleted if it was sent more than 24 hours ago.<br />- Bots can delete outgoing messages in private chats, groups, and supergroups.<br />- Bots can delete incoming messages in private chats.<br />- Bots granted <em>can_post_messages</em> permissions can delete outgoing messages in channels.<br />- If the bot is an administrator of a group, it can delete any message there.<br />- If the bot has <em>can_delete_messages</em> administrator right in a supergroup or a channel, it can delete any message there.<br />- If the bot has <em>can_manage_direct_messages</em> administrator right in a channel, it can delete any message in the corresponding direct messages chat.<br />Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the message to delete</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMessageAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteMessage, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to delete a message, including service messages, with the following limitations:<br />- A message can only be deleted if it was sent less than 48 hours ago.<br />- Service messages about a supergroup, channel, or forum topic creation can't be deleted.<br />- A dice message in a private chat can only be deleted if it was sent more than 24 hours ago.<br />- Bots can delete outgoing messages in private chats, groups, and supergroups.<br />- Bots can delete incoming messages in private chats.<br />- Bots granted <em>can_post_messages</em> permissions can delete outgoing messages in channels.<br />- If the bot is an administrator of a group, it can delete any message there.<br />- If the bot has <em>can_delete_messages</em> administrator right in a supergroup or a channel, it can delete any message there.<br />- If the bot has <em>can_manage_direct_messages</em> administrator right in a channel, it can delete any message in the corresponding direct messages chat.<br />Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the message to delete</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMessage(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId\n    ) => client.DeleteMessageAsync(chatId, messageId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete a message, including service messages, with the following limitations:<br />- A message can only be deleted if it was sent less than 48 hours ago.<br />- Service messages about a supergroup, channel, or forum topic creation can't be deleted.<br />- A dice message in a private chat can only be deleted if it was sent more than 24 hours ago.<br />- Bots can delete outgoing messages in private chats, groups, and supergroups.<br />- Bots can delete incoming messages in private chats.<br />- Bots granted <em>can_post_messages</em> permissions can delete outgoing messages in channels.<br />- If the bot is an administrator of a group, it can delete any message there.<br />- If the bot has <em>can_delete_messages</em> administrator right in a supergroup or a channel, it can delete any message there.<br />- If the bot has <em>can_manage_direct_messages</em> administrator right in a channel, it can delete any message in the corresponding direct messages chat.<br />Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the message to delete</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMessageAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteMessage, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/deleteMessageReaction.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to remove a reaction from a message in a group or a supergroup chat. The bot must have the 'can_delete_messages' administrator right in the chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup (in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Identifier of the target message</param>\n    /// <param name=\"userId\">Identifier of the user whose reaction will be removed, if the reaction was added by a user</param>\n    /// <param name=\"actorChatId\">Identifier of the chat whose reaction will be removed, if the reaction was added by a chat</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMessageReaction(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        long? userId = null,\n        long? actorChatId = null\n    ) =>\n        client\n            .DeleteMessageReactionAsync(chatId, messageId, userId, actorChatId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to remove a reaction from a message in a group or a supergroup chat. The bot must have the 'can_delete_messages' administrator right in the chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup (in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Identifier of the target message</param>\n    /// <param name=\"userId\">Identifier of the user whose reaction will be removed, if the reaction was added by a user</param>\n    /// <param name=\"actorChatId\">Identifier of the chat whose reaction will be removed, if the reaction was added by a chat</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMessageReactionAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        long? userId = null,\n        long? actorChatId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (userId is not null)\n        {\n            args.Add(PropertyNames.UserId, userId);\n        }\n        if (actorChatId is not null)\n        {\n            args.Add(PropertyNames.ActorChatId, actorChatId);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteMessageReaction,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to remove a reaction from a message in a group or a supergroup chat. The bot must have the 'can_delete_messages' administrator right in the chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup (in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Identifier of the target message</param>\n    /// <param name=\"userId\">Identifier of the user whose reaction will be removed, if the reaction was added by a user</param>\n    /// <param name=\"actorChatId\">Identifier of the chat whose reaction will be removed, if the reaction was added by a chat</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMessageReaction(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        long? userId = null,\n        long? actorChatId = null\n    ) =>\n        client\n            .DeleteMessageReactionAsync(chatId, messageId, userId, actorChatId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to remove a reaction from a message in a group or a supergroup chat. The bot must have the 'can_delete_messages' administrator right in the chat. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target supergroup (in the format <em>@username</em>)</param>\n    /// <param name=\"messageId\">Identifier of the target message</param>\n    /// <param name=\"userId\">Identifier of the user whose reaction will be removed, if the reaction was added by a user</param>\n    /// <param name=\"actorChatId\">Identifier of the chat whose reaction will be removed, if the reaction was added by a chat</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMessageReactionAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        long? userId = null,\n        long? actorChatId = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (userId is not null)\n        {\n            args.Add(PropertyNames.UserId, userId);\n        }\n        if (actorChatId is not null)\n        {\n            args.Add(PropertyNames.ActorChatId, actorChatId);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.DeleteMessageReaction,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/deleteMessages.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"DeleteMessages\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMessages(this ITelegramBotClient client, DeleteMessagesArgs args) =>\n        client.DeleteMessagesAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"DeleteMessages\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMessagesAsync(\n        this ITelegramBotClient client,\n        DeleteMessagesArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteMessages, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMessages(\n        this ITelegramBotClient client,\n        long chatId,\n        IEnumerable<int> messageIds\n    ) => client.DeleteMessagesAsync(chatId, messageIds).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMessagesAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        IEnumerable<int> messageIds,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteMessages, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteMessages(\n        this ITelegramBotClient client,\n        string chatId,\n        IEnumerable<int> messageIds\n    ) => client.DeleteMessagesAsync(chatId, messageIds).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageIds\">A JSON-serialized list of 1-100 identifiers of messages to delete. See <a href=\"https://core.telegram.org/bots/api#deletemessage\">deleteMessage</a> for limitations on which messages can be deleted</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteMessagesAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        IEnumerable<int> messageIds,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            {\n                PropertyNames.MessageIds,\n                messageIds ?? throw new ArgumentNullException(nameof(messageIds))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteMessages, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/deleteStory.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Deletes a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to delete</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool DeleteStory(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int storyId\n    ) => client.DeleteStoryAsync(businessConnectionId, storyId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Deletes a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to delete</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> DeleteStoryAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int storyId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.StoryId, storyId },\n        };\n\n        return client.CallMethodAsync<bool>(MethodNames.DeleteStory, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/editMessageCaption.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageCaption\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static TResult EditMessageCaption<TResult>(\n        this ITelegramBotClient client,\n        EditMessageCaptionArgs args\n    ) => client.EditMessageCaptionAsync<TResult>(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageCaption\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<TResult> EditMessageCaptionAsync<TResult>(\n        this ITelegramBotClient client,\n        EditMessageCaptionArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<TResult>(\n            MethodNames.EditMessageCaption,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"caption\">New caption of the message, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Supported only for animation, photo and video messages.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageCaption(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageCaptionAsync(\n                chatId,\n                messageId,\n                businessConnectionId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"caption\">New caption of the message, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Supported only for animation, photo and video messages.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageCaptionAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageCaption,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"caption\">New caption of the message, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Supported only for animation, photo and video messages.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageCaption(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageCaptionAsync(\n                chatId,\n                messageId,\n                businessConnectionId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"caption\">New caption of the message, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Supported only for animation, photo and video messages.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageCaptionAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageCaption,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"caption\">New caption of the message, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Supported only for animation, photo and video messages.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditMessageCaption(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        string? businessConnectionId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageCaptionAsync(\n                inlineMessageId,\n                businessConnectionId,\n                caption,\n                parseMode,\n                captionEntities,\n                showCaptionAboveMedia,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"caption\">New caption of the message, 0-1024 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"showCaptionAboveMedia\">Pass <em>True</em>, if the caption must be shown above the message media. Supported only for animation, photo and video messages.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditMessageCaptionAsync(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        string? businessConnectionId = null,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        bool? showCaptionAboveMedia = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.InlineMessageId,\n                inlineMessageId ?? throw new ArgumentNullException(nameof(inlineMessageId))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (showCaptionAboveMedia is not null)\n        {\n            args.Add(PropertyNames.ShowCaptionAboveMedia, showCaptionAboveMedia);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.EditMessageCaption,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/editMessageChecklist.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to edit a checklist on behalf of a connected business account. On success, the edited <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageChecklist\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageChecklist(\n        this ITelegramBotClient client,\n        EditMessageChecklistArgs args\n    ) => client.EditMessageChecklistAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit a checklist on behalf of a connected business account. On success, the edited <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageChecklist\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageChecklistAsync(\n        this ITelegramBotClient client,\n        EditMessageChecklistArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageChecklist,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit a checklist on behalf of a connected business account. On success, the edited <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Unique identifier for the target message</param>\n    /// <param name=\"checklist\">A JSON-serialized object for the new checklist</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for the new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a> for the message</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageChecklist(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long chatId,\n        int messageId,\n        InputChecklist checklist,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageChecklistAsync(\n                businessConnectionId,\n                chatId,\n                messageId,\n                checklist,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit a checklist on behalf of a connected business account. On success, the edited <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Unique identifier for the target message</param>\n    /// <param name=\"checklist\">A JSON-serialized object for the new checklist</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for the new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a> for the message</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageChecklistAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long chatId,\n        int messageId,\n        InputChecklist checklist,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n            {\n                PropertyNames.Checklist,\n                checklist ?? throw new ArgumentNullException(nameof(checklist))\n            },\n        };\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageChecklist,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit a checklist on behalf of a connected business account. On success, the edited <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Unique identifier for the target message</param>\n    /// <param name=\"checklist\">A JSON-serialized object for the new checklist</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for the new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a> for the message</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageChecklist(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string chatId,\n        int messageId,\n        InputChecklist checklist,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageChecklistAsync(\n                businessConnectionId,\n                chatId,\n                messageId,\n                checklist,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit a checklist on behalf of a connected business account. On success, the edited <see cref=\"Message\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message will be sent</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Unique identifier for the target message</param>\n    /// <param name=\"checklist\">A JSON-serialized object for the new checklist</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for the new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a> for the message</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageChecklistAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string chatId,\n        int messageId,\n        InputChecklist checklist,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n            {\n                PropertyNames.Checklist,\n                checklist ?? throw new ArgumentNullException(nameof(checklist))\n            },\n        };\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageChecklist,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/editMessageLiveLocation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to edit live location messages. A location can be edited until its <em>live_period</em> expires or editing is explicitly disabled by a call to <a href=\"https://core.telegram.org/bots/api#stopmessagelivelocation\">stopMessageLiveLocation</a>. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageLiveLocation\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static TResult EditMessageLiveLocation<TResult>(\n        this ITelegramBotClient client,\n        EditMessageLiveLocationArgs args\n    ) => client.EditMessageLiveLocationAsync<TResult>(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit live location messages. A location can be edited until its <em>live_period</em> expires or editing is explicitly disabled by a call to <a href=\"https://core.telegram.org/bots/api#stopmessagelivelocation\">stopMessageLiveLocation</a>. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageLiveLocation\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<TResult> EditMessageLiveLocationAsync<TResult>(\n        this ITelegramBotClient client,\n        EditMessageLiveLocationArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<TResult>(\n            MethodNames.EditMessageLiveLocation,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit live location messages. A location can be edited until its <em>live_period</em> expires or editing is explicitly disabled by a call to <a href=\"https://core.telegram.org/bots/api#stopmessagelivelocation\">stopMessageLiveLocation</a>. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"latitude\">Latitude of new location</param>\n    /// <param name=\"longitude\">Longitude of new location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"livePeriod\">New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current <em>live_period</em> by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then <em>live_period</em> remains unchanged</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"heading\">Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageLiveLocation(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? livePeriod = null,\n        float? horizontalAccuracy = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageLiveLocationAsync(\n                chatId,\n                messageId,\n                latitude,\n                longitude,\n                businessConnectionId,\n                livePeriod,\n                horizontalAccuracy,\n                heading,\n                proximityAlertRadius,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit live location messages. A location can be edited until its <em>live_period</em> expires or editing is explicitly disabled by a call to <a href=\"https://core.telegram.org/bots/api#stopmessagelivelocation\">stopMessageLiveLocation</a>. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"latitude\">Latitude of new location</param>\n    /// <param name=\"longitude\">Longitude of new location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"livePeriod\">New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current <em>live_period</em> by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then <em>live_period</em> remains unchanged</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"heading\">Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageLiveLocationAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? livePeriod = null,\n        float? horizontalAccuracy = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n            { PropertyNames.Latitude, latitude },\n            { PropertyNames.Longitude, longitude },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (livePeriod is not null)\n        {\n            args.Add(PropertyNames.LivePeriod, livePeriod);\n        }\n        if (horizontalAccuracy is not null)\n        {\n            args.Add(PropertyNames.HorizontalAccuracy, horizontalAccuracy);\n        }\n        if (heading is not null)\n        {\n            args.Add(PropertyNames.Heading, heading);\n        }\n        if (proximityAlertRadius is not null)\n        {\n            args.Add(PropertyNames.ProximityAlertRadius, proximityAlertRadius);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageLiveLocation,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit live location messages. A location can be edited until its <em>live_period</em> expires or editing is explicitly disabled by a call to <a href=\"https://core.telegram.org/bots/api#stopmessagelivelocation\">stopMessageLiveLocation</a>. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"latitude\">Latitude of new location</param>\n    /// <param name=\"longitude\">Longitude of new location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"livePeriod\">New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current <em>live_period</em> by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then <em>live_period</em> remains unchanged</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"heading\">Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageLiveLocation(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? livePeriod = null,\n        float? horizontalAccuracy = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageLiveLocationAsync(\n                chatId,\n                messageId,\n                latitude,\n                longitude,\n                businessConnectionId,\n                livePeriod,\n                horizontalAccuracy,\n                heading,\n                proximityAlertRadius,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit live location messages. A location can be edited until its <em>live_period</em> expires or editing is explicitly disabled by a call to <a href=\"https://core.telegram.org/bots/api#stopmessagelivelocation\">stopMessageLiveLocation</a>. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"latitude\">Latitude of new location</param>\n    /// <param name=\"longitude\">Longitude of new location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"livePeriod\">New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current <em>live_period</em> by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then <em>live_period</em> remains unchanged</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"heading\">Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageLiveLocationAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? livePeriod = null,\n        float? horizontalAccuracy = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n            { PropertyNames.Latitude, latitude },\n            { PropertyNames.Longitude, longitude },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (livePeriod is not null)\n        {\n            args.Add(PropertyNames.LivePeriod, livePeriod);\n        }\n        if (horizontalAccuracy is not null)\n        {\n            args.Add(PropertyNames.HorizontalAccuracy, horizontalAccuracy);\n        }\n        if (heading is not null)\n        {\n            args.Add(PropertyNames.Heading, heading);\n        }\n        if (proximityAlertRadius is not null)\n        {\n            args.Add(PropertyNames.ProximityAlertRadius, proximityAlertRadius);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageLiveLocation,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit live location messages. A location can be edited until its <em>live_period</em> expires or editing is explicitly disabled by a call to <a href=\"https://core.telegram.org/bots/api#stopmessagelivelocation\">stopMessageLiveLocation</a>. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"latitude\">Latitude of new location</param>\n    /// <param name=\"longitude\">Longitude of new location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"livePeriod\">New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current <em>live_period</em> by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then <em>live_period</em> remains unchanged</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"heading\">Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditMessageLiveLocation(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? livePeriod = null,\n        float? horizontalAccuracy = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageLiveLocationAsync(\n                inlineMessageId,\n                latitude,\n                longitude,\n                businessConnectionId,\n                livePeriod,\n                horizontalAccuracy,\n                heading,\n                proximityAlertRadius,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit live location messages. A location can be edited until its <em>live_period</em> expires or editing is explicitly disabled by a call to <a href=\"https://core.telegram.org/bots/api#stopmessagelivelocation\">stopMessageLiveLocation</a>. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"latitude\">Latitude of new location</param>\n    /// <param name=\"longitude\">Longitude of new location</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"livePeriod\">New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current <em>live_period</em> by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then <em>live_period</em> remains unchanged</param>\n    /// <param name=\"horizontalAccuracy\">The radius of uncertainty for the location, measured in meters; 0-1500</param>\n    /// <param name=\"heading\">Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.</param>\n    /// <param name=\"proximityAlertRadius\">The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditMessageLiveLocationAsync(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        float latitude,\n        float longitude,\n        string? businessConnectionId = null,\n        int? livePeriod = null,\n        float? horizontalAccuracy = null,\n        int? heading = null,\n        int? proximityAlertRadius = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.InlineMessageId,\n                inlineMessageId ?? throw new ArgumentNullException(nameof(inlineMessageId))\n            },\n            { PropertyNames.Latitude, latitude },\n            { PropertyNames.Longitude, longitude },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (livePeriod is not null)\n        {\n            args.Add(PropertyNames.LivePeriod, livePeriod);\n        }\n        if (horizontalAccuracy is not null)\n        {\n            args.Add(PropertyNames.HorizontalAccuracy, horizontalAccuracy);\n        }\n        if (heading is not null)\n        {\n            args.Add(PropertyNames.Heading, heading);\n        }\n        if (proximityAlertRadius is not null)\n        {\n            args.Add(PropertyNames.ProximityAlertRadius, proximityAlertRadius);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.EditMessageLiveLocation,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/editMessageMedia.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageMedia\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static TResult EditMessageMedia<TResult>(\n        this ITelegramBotClient client,\n        EditMessageMediaArgs args\n    ) => client.EditMessageMediaAsync<TResult>(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageMedia\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<TResult> EditMessageMediaAsync<TResult>(\n        this ITelegramBotClient client,\n        EditMessageMediaArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<TResult>(\n            MethodNames.EditMessageMedia,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"media\">A JSON-serialized object for a new media content of the message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageMedia(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        InputMedia media,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageMediaAsync(chatId, messageId, media, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"media\">A JSON-serialized object for a new media content of the message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageMediaAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        InputMedia media,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n            { PropertyNames.Media, media ?? throw new ArgumentNullException(nameof(media)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageMedia,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"media\">A JSON-serialized object for a new media content of the message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageMedia(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        InputMedia media,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageMediaAsync(chatId, messageId, media, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"media\">A JSON-serialized object for a new media content of the message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageMediaAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        InputMedia media,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n            { PropertyNames.Media, media ?? throw new ArgumentNullException(nameof(media)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageMedia,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"media\">A JSON-serialized object for a new media content of the message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditMessageMedia(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        InputMedia media,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageMediaAsync(inlineMessageId, media, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"media\">A JSON-serialized object for a new media content of the message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditMessageMediaAsync(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        InputMedia media,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.InlineMessageId,\n                inlineMessageId ?? throw new ArgumentNullException(nameof(inlineMessageId))\n            },\n            { PropertyNames.Media, media ?? throw new ArgumentNullException(nameof(media)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.EditMessageMedia, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/editMessageReplyMarkup.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageReplyMarkup\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static TResult EditMessageReplyMarkup<TResult>(\n        this ITelegramBotClient client,\n        EditMessageReplyMarkupArgs args\n    ) => client.EditMessageReplyMarkupAsync<TResult>(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageReplyMarkup\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<TResult> EditMessageReplyMarkupAsync<TResult>(\n        this ITelegramBotClient client,\n        EditMessageReplyMarkupArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<TResult>(\n            MethodNames.EditMessageReplyMarkup,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageReplyMarkup(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageReplyMarkupAsync(chatId, messageId, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageReplyMarkupAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageReplyMarkup,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageReplyMarkup(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageReplyMarkupAsync(chatId, messageId, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageReplyMarkupAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageReplyMarkup,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditMessageReplyMarkup(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageReplyMarkupAsync(inlineMessageId, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditMessageReplyMarkupAsync(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.InlineMessageId,\n                inlineMessageId ?? throw new ArgumentNullException(nameof(inlineMessageId))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.EditMessageReplyMarkup,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/editMessageText.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to edit text and <a href=\"https://core.telegram.org/bots/api#games\">game</a> messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageText\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static TResult EditMessageText<TResult>(\n        this ITelegramBotClient client,\n        EditMessageTextArgs args\n    ) => client.EditMessageTextAsync<TResult>(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to edit text and <a href=\"https://core.telegram.org/bots/api#games\">game</a> messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditMessageText\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<TResult> EditMessageTextAsync<TResult>(\n        this ITelegramBotClient client,\n        EditMessageTextArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<TResult>(\n            MethodNames.EditMessageText,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit text and <a href=\"https://core.telegram.org/bots/api#games\">game</a> messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"text\">New text of the message, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageText(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string text,\n        string? businessConnectionId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageTextAsync(\n                chatId,\n                messageId,\n                text,\n                businessConnectionId,\n                parseMode,\n                entities,\n                linkPreviewOptions,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit text and <a href=\"https://core.telegram.org/bots/api#games\">game</a> messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"text\">New text of the message, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageTextAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string text,\n        string? businessConnectionId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n            { PropertyNames.Text, text ?? throw new ArgumentNullException(nameof(text)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (entities is not null)\n        {\n            args.Add(PropertyNames.Entities, entities);\n        }\n        if (linkPreviewOptions is not null)\n        {\n            args.Add(PropertyNames.LinkPreviewOptions, linkPreviewOptions);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageText,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit text and <a href=\"https://core.telegram.org/bots/api#games\">game</a> messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"text\">New text of the message, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message EditMessageText(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string text,\n        string? businessConnectionId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageTextAsync(\n                chatId,\n                messageId,\n                text,\n                businessConnectionId,\n                parseMode,\n                entities,\n                linkPreviewOptions,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit text and <a href=\"https://core.telegram.org/bots/api#games\">game</a> messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message to edit</param>\n    /// <param name=\"text\">New text of the message, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> EditMessageTextAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string text,\n        string? businessConnectionId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n            { PropertyNames.Text, text ?? throw new ArgumentNullException(nameof(text)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (entities is not null)\n        {\n            args.Add(PropertyNames.Entities, entities);\n        }\n        if (linkPreviewOptions is not null)\n        {\n            args.Add(PropertyNames.LinkPreviewOptions, linkPreviewOptions);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.EditMessageText,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to edit text and <a href=\"https://core.telegram.org/bots/api#games\">game</a> messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"text\">New text of the message, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool EditMessageText(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        string text,\n        string? businessConnectionId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .EditMessageTextAsync(\n                inlineMessageId,\n                text,\n                businessConnectionId,\n                parseMode,\n                entities,\n                linkPreviewOptions,\n                replyMarkup\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to edit text and <a href=\"https://core.telegram.org/bots/api#games\">game</a> messages. On success, if the edited message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within <strong>48 hours</strong> from the time they were sent.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"text\">New text of the message, 1-4096 characters after entities parsing</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the message text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"entities\">A JSON-serialized list of special entities that appear in message text, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"linkPreviewOptions\">Link preview generation options for the message</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for an <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> EditMessageTextAsync(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        string text,\n        string? businessConnectionId = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? entities = null,\n        LinkPreviewOptions? linkPreviewOptions = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.InlineMessageId,\n                inlineMessageId ?? throw new ArgumentNullException(nameof(inlineMessageId))\n            },\n            { PropertyNames.Text, text ?? throw new ArgumentNullException(nameof(text)) },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (entities is not null)\n        {\n            args.Add(PropertyNames.Entities, entities);\n        }\n        if (linkPreviewOptions is not null)\n        {\n            args.Add(PropertyNames.LinkPreviewOptions, linkPreviewOptions);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.EditMessageText, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/editStory.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Edits a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditStory\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story EditStory(this ITelegramBotClient client, EditStoryArgs args) =>\n        client.EditStoryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Edits a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"EditStory\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> EditStoryAsync(\n        this ITelegramBotClient client,\n        EditStoryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.EditStory, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Edits a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to edit</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"caption\">Caption of the story, 0-2048 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"areas\">A JSON-serialized list of clickable areas to be shown on the story</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story EditStory(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int storyId,\n        InputStoryContent content,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        IEnumerable<StoryArea>? areas = null\n    ) =>\n        client\n            .EditStoryAsync(\n                businessConnectionId,\n                storyId,\n                content,\n                caption,\n                parseMode,\n                captionEntities,\n                areas\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Edits a story previously posted by the bot on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"storyId\">Unique identifier of the story to edit</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"caption\">Caption of the story, 0-2048 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"areas\">A JSON-serialized list of clickable areas to be shown on the story</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> EditStoryAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int storyId,\n        InputStoryContent content,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        IEnumerable<StoryArea>? areas = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.StoryId, storyId },\n            { PropertyNames.Content, content ?? throw new ArgumentNullException(nameof(content)) },\n        };\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (areas is not null)\n        {\n            args.Add(PropertyNames.Areas, areas);\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.EditStory, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/getAvailableGifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Returns the list of gifts that can be sent by the bot to users and channel chats. Requires no parameters. Returns a <see cref=\"Gifts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Gifts GetAvailableGifts(this ITelegramBotClient client) =>\n        client.GetAvailableGiftsAsync().GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the list of gifts that can be sent by the bot to users and channel chats. Requires no parameters. Returns a <see cref=\"Gifts\"/> object.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Gifts> GetAvailableGiftsAsync(\n        this ITelegramBotClient client,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Gifts>(\n            MethodNames.GetAvailableGifts,\n            cancellationToken: cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/getBusinessAccountGifts.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Returns the gifts received and owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetBusinessAccountGifts\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetBusinessAccountGifts(\n        this ITelegramBotClient client,\n        GetBusinessAccountGiftsArgs args\n    ) => client.GetBusinessAccountGiftsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the gifts received and owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GetBusinessAccountGifts\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetBusinessAccountGiftsAsync(\n        this ITelegramBotClient client,\n        GetBusinessAccountGiftsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetBusinessAccountGifts,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Returns the gifts received and owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"excludeUnsaved\">Pass <em>True</em> to exclude gifts that aren't saved to the account's profile page</param>\n    /// <param name=\"excludeSaved\">Pass <em>True</em> to exclude gifts that are saved to the account's profile page</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimited\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static OwnedGifts GetBusinessAccountGifts(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool? excludeUnsaved = null,\n        bool? excludeSaved = null,\n        bool? excludeUnlimited = null,\n        bool? excludeLimited = null,\n        bool? excludeUnique = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null\n    ) =>\n        client\n            .GetBusinessAccountGiftsAsync(\n                businessConnectionId,\n                excludeUnsaved,\n                excludeSaved,\n                excludeUnlimited,\n                excludeLimited,\n                excludeUnique,\n                sortByPrice,\n                offset,\n                limit\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Returns the gifts received and owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"OwnedGifts\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"excludeUnsaved\">Pass <em>True</em> to exclude gifts that aren't saved to the account's profile page</param>\n    /// <param name=\"excludeSaved\">Pass <em>True</em> to exclude gifts that are saved to the account's profile page</param>\n    /// <param name=\"excludeUnlimited\">Pass <em>True</em> to exclude gifts that can be purchased an unlimited number of times</param>\n    /// <param name=\"excludeLimited\">Pass <em>True</em> to exclude gifts that can be purchased a limited number of times</param>\n    /// <param name=\"excludeUnique\">Pass <em>True</em> to exclude unique gifts</param>\n    /// <param name=\"sortByPrice\">Pass <em>True</em> to sort results by gift price instead of send date. Sorting is applied before pagination.</param>\n    /// <param name=\"offset\">Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results</param>\n    /// <param name=\"limit\">The maximum number of gifts to be returned; 1-100. Defaults to 100</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<OwnedGifts> GetBusinessAccountGiftsAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool? excludeUnsaved = null,\n        bool? excludeSaved = null,\n        bool? excludeUnlimited = null,\n        bool? excludeLimited = null,\n        bool? excludeUnique = null,\n        bool? sortByPrice = null,\n        string? offset = null,\n        int? limit = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n        if (excludeUnsaved is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnsaved, excludeUnsaved);\n        }\n        if (excludeSaved is not null)\n        {\n            args.Add(PropertyNames.ExcludeSaved, excludeSaved);\n        }\n        if (excludeUnlimited is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnlimited, excludeUnlimited);\n        }\n        if (excludeLimited is not null)\n        {\n            args.Add(PropertyNames.ExcludeLimited, excludeLimited);\n        }\n        if (excludeUnique is not null)\n        {\n            args.Add(PropertyNames.ExcludeUnique, excludeUnique);\n        }\n        if (sortByPrice is not null)\n        {\n            args.Add(PropertyNames.SortByPrice, sortByPrice);\n        }\n        if (offset is not null)\n        {\n            args.Add(PropertyNames.Offset, offset);\n        }\n        if (limit is not null)\n        {\n            args.Add(PropertyNames.Limit, limit);\n        }\n\n        return client.CallMethodAsync<OwnedGifts>(\n            MethodNames.GetBusinessAccountGifts,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/getBusinessAccountStarBalance.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Returns the amount of Telegram Stars owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"StarAmount\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static StarAmount GetBusinessAccountStarBalance(\n        this ITelegramBotClient client,\n        string businessConnectionId\n    ) => client.GetBusinessAccountStarBalanceAsync(businessConnectionId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Returns the amount of Telegram Stars owned by a managed business account. Requires the <em>can_view_gifts_and_stars</em> business bot right. Returns <see cref=\"StarAmount\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<StarAmount> GetBusinessAccountStarBalanceAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n\n        return client.CallMethodAsync<StarAmount>(\n            MethodNames.GetBusinessAccountStarBalance,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/giftPremiumSubscription.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Gifts a Telegram Premium subscription to the given user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GiftPremiumSubscription\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool GiftPremiumSubscription(\n        this ITelegramBotClient client,\n        GiftPremiumSubscriptionArgs args\n    ) => client.GiftPremiumSubscriptionAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Gifts a Telegram Premium subscription to the given user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"GiftPremiumSubscription\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> GiftPremiumSubscriptionAsync(\n        this ITelegramBotClient client,\n        GiftPremiumSubscriptionArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.GiftPremiumSubscription,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Gifts a Telegram Premium subscription to the given user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user who will receive a Telegram Premium subscription</param>\n    /// <param name=\"monthCount\">Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months</param>\n    /// <param name=\"text\">Text that will be shown along with the service message about the subscription; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool GiftPremiumSubscription(\n        this ITelegramBotClient client,\n        long userId,\n        int monthCount,\n        int starCount,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null\n    ) =>\n        client\n            .GiftPremiumSubscriptionAsync(\n                userId,\n                monthCount,\n                starCount,\n                text,\n                textParseMode,\n                textEntities\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Gifts a Telegram Premium subscription to the given user. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user who will receive a Telegram Premium subscription</param>\n    /// <param name=\"monthCount\">Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months</param>\n    /// <param name=\"text\">Text that will be shown along with the service message about the subscription; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> GiftPremiumSubscriptionAsync(\n        this ITelegramBotClient client,\n        long userId,\n        int monthCount,\n        int starCount,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.UserId, userId },\n            { PropertyNames.MonthCount, monthCount },\n            { PropertyNames.StarCount, starCount },\n        };\n        if (text is not null)\n        {\n            args.Add(PropertyNames.Text, text);\n        }\n        if (textParseMode is not null)\n        {\n            args.Add(PropertyNames.TextParseMode, textParseMode);\n        }\n        if (textEntities is not null)\n        {\n            args.Add(PropertyNames.TextEntities, textEntities);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.GiftPremiumSubscription,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/postStory.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Posts a story on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"PostStory\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story PostStory(this ITelegramBotClient client, PostStoryArgs args) =>\n        client.PostStoryAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Posts a story on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"PostStory\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> PostStoryAsync(\n        this ITelegramBotClient client,\n        PostStoryArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.PostStory, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Posts a story on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    /// <param name=\"caption\">Caption of the story, 0-2048 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"areas\">A JSON-serialized list of clickable areas to be shown on the story</param>\n    /// <param name=\"postToChatPage\">Pass <em>True</em> to keep the story accessible after it expires</param>\n    /// <param name=\"protectContent\">Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Story PostStory(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        InputStoryContent content,\n        int activePeriod,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        IEnumerable<StoryArea>? areas = null,\n        bool? postToChatPage = null,\n        bool? protectContent = null\n    ) =>\n        client\n            .PostStoryAsync(\n                businessConnectionId,\n                content,\n                activePeriod,\n                caption,\n                parseMode,\n                captionEntities,\n                areas,\n                postToChatPage,\n                protectContent\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Posts a story on behalf of a managed business account. Requires the <em>can_manage_stories</em> business bot right. Returns <see cref=\"Story\"/> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"content\">Content of the story</param>\n    /// <param name=\"activePeriod\">Period after which the story is moved to the archive, in seconds; must be one of <em>6 * 3600</em>, <em>12 * 3600</em>, <em>86400</em>, or <em>2 * 86400</em></param>\n    /// <param name=\"caption\">Caption of the story, 0-2048 characters after entities parsing</param>\n    /// <param name=\"parseMode\">Mode for parsing entities in the story caption. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details.</param>\n    /// <param name=\"captionEntities\">A JSON-serialized list of special entities that appear in the caption, which can be specified instead of <em>parse_mode</em></param>\n    /// <param name=\"areas\">A JSON-serialized list of clickable areas to be shown on the story</param>\n    /// <param name=\"postToChatPage\">Pass <em>True</em> to keep the story accessible after it expires</param>\n    /// <param name=\"protectContent\">Pass <em>True</em> if the content of the story must be protected from forwarding and screenshotting</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Story> PostStoryAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        InputStoryContent content,\n        int activePeriod,\n        string? caption = null,\n        string? parseMode = null,\n        IEnumerable<MessageEntity>? captionEntities = null,\n        IEnumerable<StoryArea>? areas = null,\n        bool? postToChatPage = null,\n        bool? protectContent = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.Content, content ?? throw new ArgumentNullException(nameof(content)) },\n            { PropertyNames.ActivePeriod, activePeriod },\n        };\n        if (caption is not null)\n        {\n            args.Add(PropertyNames.Caption, caption);\n        }\n        if (parseMode is not null)\n        {\n            args.Add(PropertyNames.ParseMode, parseMode);\n        }\n        if (captionEntities is not null)\n        {\n            args.Add(PropertyNames.CaptionEntities, captionEntities);\n        }\n        if (areas is not null)\n        {\n            args.Add(PropertyNames.Areas, areas);\n        }\n        if (postToChatPage is not null)\n        {\n            args.Add(PropertyNames.PostToChatPage, postToChatPage);\n        }\n        if (protectContent is not null)\n        {\n            args.Add(PropertyNames.ProtectContent, protectContent);\n        }\n\n        return client.CallMethodAsync<Story>(MethodNames.PostStory, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/readBusinessMessage.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Marks incoming message as read on behalf of a business account. Requires the <em>can_read_messages</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to read the message</param>\n    /// <param name=\"chatId\">Unique identifier of the chat in which the message was received. The chat must have been active in the last 24 hours.</param>\n    /// <param name=\"messageId\">Unique identifier of the message to mark as read</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool ReadBusinessMessage(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long chatId,\n        int messageId\n    ) =>\n        client\n            .ReadBusinessMessageAsync(businessConnectionId, chatId, messageId)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Marks incoming message as read on behalf of a business account. Requires the <em>can_read_messages</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which to read the message</param>\n    /// <param name=\"chatId\">Unique identifier of the chat in which the message was received. The chat must have been active in the last 24 hours.</param>\n    /// <param name=\"messageId\">Unique identifier of the message to mark as read</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> ReadBusinessMessageAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        long chatId,\n        int messageId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.ReadBusinessMessage,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/removeBusinessAccountProfilePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Removes the current profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"isPublic\">Pass <em>True</em> to remove the public photo, which is visible even if the main photo is hidden by the business account's privacy settings. After the main photo is removed, the previous profile photo (if present) becomes the main photo.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveBusinessAccountProfilePhoto(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool? isPublic = null\n    ) =>\n        client\n            .RemoveBusinessAccountProfilePhotoAsync(businessConnectionId, isPublic)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Removes the current profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"isPublic\">Pass <em>True</em> to remove the public photo, which is visible even if the main photo is hidden by the business account's privacy settings. After the main photo is removed, the previous profile photo (if present) becomes the main photo.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveBusinessAccountProfilePhotoAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool? isPublic = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n        if (isPublic is not null)\n        {\n            args.Add(PropertyNames.IsPublic, isPublic);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveBusinessAccountProfilePhoto,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/removeChatVerification.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveChatVerification(this ITelegramBotClient client, long chatId) =>\n        client.RemoveChatVerificationAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveChatVerificationAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveChatVerification,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveChatVerification(this ITelegramBotClient client, string chatId) =>\n        client.RemoveChatVerificationAsync(chatId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a chat that is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveChatVerificationAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveChatVerification,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/removeUserVerification.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Removes verification from a user who is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool RemoveUserVerification(this ITelegramBotClient client, long userId) =>\n        client.RemoveUserVerificationAsync(userId).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Removes verification from a user who is currently verified <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> RemoveUserVerificationAsync(\n        this ITelegramBotClient client,\n        long userId,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.RemoveUserVerification,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/sendGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendGift\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendGift(this ITelegramBotClient client, SendGiftArgs args) =>\n        client.SendGiftAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SendGift\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendGiftAsync(\n        this ITelegramBotClient client,\n        SendGiftArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendGift, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"giftId\">Identifier of the gift</param>\n    /// <param name=\"userId\">Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.</param>\n    /// <param name=\"chatId\">Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@channelusername</em>) that will receive the gift.</param>\n    /// <param name=\"payForUpgrade\">Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver</param>\n    /// <param name=\"text\">Text that will be shown along with the gift; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SendGift(\n        this ITelegramBotClient client,\n        string giftId,\n        long? userId = null,\n        long? chatId = null,\n        bool? payForUpgrade = null,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null\n    ) =>\n        client\n            .SendGiftAsync(giftId, userId, chatId, payForUpgrade, text, textParseMode, textEntities)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Sends a gift to the given user or channel chat. The gift can't be converted to Telegram Stars by the receiver. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"giftId\">Identifier of the gift</param>\n    /// <param name=\"userId\">Required if <em>chat_id</em> is not specified. Unique identifier of the target user who will receive the gift.</param>\n    /// <param name=\"chatId\">Required if <em>user_id</em> is not specified. Unique identifier for the chat or username of the channel (in the format <em>@channelusername</em>) that will receive the gift.</param>\n    /// <param name=\"payForUpgrade\">Pass <em>True</em> to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver</param>\n    /// <param name=\"text\">Text that will be shown along with the gift; 0-128 characters</param>\n    /// <param name=\"textParseMode\">Mode for parsing entities in the text. See <a href=\"https://core.telegram.org/bots/api#formatting-options\">formatting options</a> for more details. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"textEntities\">A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”, and “custom_emoji” are ignored.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SendGiftAsync(\n        this ITelegramBotClient client,\n        string giftId,\n        long? userId = null,\n        long? chatId = null,\n        bool? payForUpgrade = null,\n        string? text = null,\n        string? textParseMode = null,\n        IEnumerable<MessageEntity>? textEntities = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.GiftId, giftId ?? throw new ArgumentNullException(nameof(giftId)) },\n        };\n        if (userId is not null)\n        {\n            args.Add(PropertyNames.UserId, userId);\n        }\n        if (chatId is not null)\n        {\n            args.Add(PropertyNames.ChatId, chatId);\n        }\n        if (payForUpgrade is not null)\n        {\n            args.Add(PropertyNames.PayForUpgrade, payForUpgrade);\n        }\n        if (text is not null)\n        {\n            args.Add(PropertyNames.Text, text);\n        }\n        if (textParseMode is not null)\n        {\n            args.Add(PropertyNames.TextParseMode, textParseMode);\n        }\n        if (textEntities is not null)\n        {\n            args.Add(PropertyNames.TextEntities, textEntities);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.SendGift, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/setBusinessAccountBio.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Changes the bio of a managed business account. Requires the <em>can_change_bio</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"bio\">The new value of the bio for the business account; 0-140 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountBio(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string? bio = null\n    ) => client.SetBusinessAccountBioAsync(businessConnectionId, bio).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Changes the bio of a managed business account. Requires the <em>can_change_bio</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"bio\">The new value of the bio for the business account; 0-140 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountBioAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string? bio = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n        if (bio is not null)\n        {\n            args.Add(PropertyNames.Bio, bio);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountBio,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/setBusinessAccountGiftSettings.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Changes the privacy settings pertaining to incoming gifts in a managed business account. Requires the <em>can_change_gift_settings</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetBusinessAccountGiftSettings\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountGiftSettings(\n        this ITelegramBotClient client,\n        SetBusinessAccountGiftSettingsArgs args\n    ) => client.SetBusinessAccountGiftSettingsAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Changes the privacy settings pertaining to incoming gifts in a managed business account. Requires the <em>can_change_gift_settings</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetBusinessAccountGiftSettings\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountGiftSettingsAsync(\n        this ITelegramBotClient client,\n        SetBusinessAccountGiftSettingsArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountGiftSettings,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Changes the privacy settings pertaining to incoming gifts in a managed business account. Requires the <em>can_change_gift_settings</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"showGiftButton\">Pass <em>True</em>, if a button for sending a gift to the user or by the business account must always be shown in the input field</param>\n    /// <param name=\"acceptedGiftTypes\">Types of gifts accepted by the business account</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountGiftSettings(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool showGiftButton,\n        AcceptedGiftTypes acceptedGiftTypes\n    ) =>\n        client\n            .SetBusinessAccountGiftSettingsAsync(\n                businessConnectionId,\n                showGiftButton,\n                acceptedGiftTypes\n            )\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the privacy settings pertaining to incoming gifts in a managed business account. Requires the <em>can_change_gift_settings</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"showGiftButton\">Pass <em>True</em>, if a button for sending a gift to the user or by the business account must always be shown in the input field</param>\n    /// <param name=\"acceptedGiftTypes\">Types of gifts accepted by the business account</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountGiftSettingsAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        bool showGiftButton,\n        AcceptedGiftTypes acceptedGiftTypes,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.ShowGiftButton, showGiftButton },\n            {\n                PropertyNames.AcceptedGiftTypes,\n                acceptedGiftTypes ?? throw new ArgumentNullException(nameof(acceptedGiftTypes))\n            },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountGiftSettings,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/setBusinessAccountName.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Changes the first and last name of a managed business account. Requires the <em>can_change_name</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"firstName\">The new value of the first name for the business account; 1-64 characters</param>\n    /// <param name=\"lastName\">The new value of the last name for the business account; 0-64 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountName(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string firstName,\n        string? lastName = null\n    ) =>\n        client\n            .SetBusinessAccountNameAsync(businessConnectionId, firstName, lastName)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the first and last name of a managed business account. Requires the <em>can_change_name</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"firstName\">The new value of the first name for the business account; 1-64 characters</param>\n    /// <param name=\"lastName\">The new value of the last name for the business account; 0-64 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountNameAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string firstName,\n        string? lastName = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.FirstName,\n                firstName ?? throw new ArgumentNullException(nameof(firstName))\n            },\n        };\n        if (lastName is not null)\n        {\n            args.Add(PropertyNames.LastName, lastName);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountName,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/setBusinessAccountProfilePhoto.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Changes the profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetBusinessAccountProfilePhoto\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountProfilePhoto(\n        this ITelegramBotClient client,\n        SetBusinessAccountProfilePhotoArgs args\n    ) => client.SetBusinessAccountProfilePhotoAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Changes the profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"SetBusinessAccountProfilePhoto\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountProfilePhotoAsync(\n        this ITelegramBotClient client,\n        SetBusinessAccountProfilePhotoArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountProfilePhoto,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Changes the profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    /// <param name=\"isPublic\">Pass <em>True</em> to set the public photo, which will be visible even if the main photo is hidden by the business account's privacy settings. An account can have only one public photo.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountProfilePhoto(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        InputProfilePhoto photo,\n        bool? isPublic = null\n    ) =>\n        client\n            .SetBusinessAccountProfilePhotoAsync(businessConnectionId, photo, isPublic)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the profile photo of a managed business account. Requires the <em>can_edit_profile_photo</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"photo\">The new profile photo to set</param>\n    /// <param name=\"isPublic\">Pass <em>True</em> to set the public photo, which will be visible even if the main photo is hidden by the business account's privacy settings. An account can have only one public photo.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountProfilePhotoAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        InputProfilePhoto photo,\n        bool? isPublic = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.Photo, photo ?? throw new ArgumentNullException(nameof(photo)) },\n        };\n        if (isPublic is not null)\n        {\n            args.Add(PropertyNames.IsPublic, isPublic);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountProfilePhoto,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/setBusinessAccountUsername.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Changes the username of a managed business account. Requires the <em>can_change_username</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"username\">The new value of the username for the business account; 0-32 characters</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool SetBusinessAccountUsername(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string? username = null\n    ) =>\n        client\n            .SetBusinessAccountUsernameAsync(businessConnectionId, username)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Changes the username of a managed business account. Requires the <em>can_change_username</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"username\">The new value of the username for the business account; 0-32 characters</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> SetBusinessAccountUsernameAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string? username = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n        };\n        if (username is not null)\n        {\n            args.Add(PropertyNames.Username, username);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.SetBusinessAccountUsername,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/stopMessageLiveLocation.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to stop updating a live location message before <em>live_period</em> expires. On success, if the message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"StopMessageLiveLocation\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static TResult StopMessageLiveLocation<TResult>(\n        this ITelegramBotClient client,\n        StopMessageLiveLocationArgs args\n    ) => client.StopMessageLiveLocationAsync<TResult>(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to stop updating a live location message before <em>live_period</em> expires. On success, if the message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"StopMessageLiveLocation\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<TResult> StopMessageLiveLocationAsync<TResult>(\n        this ITelegramBotClient client,\n        StopMessageLiveLocationArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<TResult>(\n            MethodNames.StopMessageLiveLocation,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to stop updating a live location message before <em>live_period</em> expires. On success, if the message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message with live location to stop</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message StopMessageLiveLocation(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .StopMessageLiveLocationAsync(chatId, messageId, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to stop updating a live location message before <em>live_period</em> expires. On success, if the message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message with live location to stop</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> StopMessageLiveLocationAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.StopMessageLiveLocation,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to stop updating a live location message before <em>live_period</em> expires. On success, if the message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message with live location to stop</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Message StopMessageLiveLocation(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .StopMessageLiveLocationAsync(chatId, messageId, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to stop updating a live location message before <em>live_period</em> expires. On success, if the message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Required if <em>inline_message_id</em> is not specified. Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em>.</param>\n    /// <param name=\"messageId\">Required if <em>inline_message_id</em> is not specified. Identifier of the message with live location to stop</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Message> StopMessageLiveLocationAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Message>(\n            MethodNames.StopMessageLiveLocation,\n            args,\n            cancellationToken\n        );\n    }\n\n    /// <summary>\n    /// Use this method to stop updating a live location message before <em>live_period</em> expires. On success, if the message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool StopMessageLiveLocation(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .StopMessageLiveLocationAsync(inlineMessageId, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to stop updating a live location message before <em>live_period</em> expires. On success, if the message is not an inline message, the edited <see cref=\"Message\"/> is returned, otherwise <em>True</em> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"inlineMessageId\">Required if <em>chat_id</em> and <em>message_id</em> are not specified. Identifier of the inline message</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> StopMessageLiveLocationAsync(\n        this ITelegramBotClient client,\n        string inlineMessageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.InlineMessageId,\n                inlineMessageId ?? throw new ArgumentNullException(nameof(inlineMessageId))\n            },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.StopMessageLiveLocation,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/stopPoll.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Use this method to stop a poll which was sent by the bot. On success, the stopped <see cref=\"Poll\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"StopPoll\" method.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Poll StopPoll(this ITelegramBotClient client, StopPollArgs args) =>\n        client.StopPollAsync(args).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Use this method to stop a poll which was sent by the bot. On success, the stopped <see cref=\"Poll\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"args\">The arguments for the \"StopPoll\" method.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Poll> StopPollAsync(\n        this ITelegramBotClient client,\n        StopPollArgs args,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        return client.CallMethodAsync<Poll>(MethodNames.StopPoll, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to stop a poll which was sent by the bot. On success, the stopped <see cref=\"Poll\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the original message with the poll</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new message <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Poll StopPoll(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .StopPollAsync(chatId, messageId, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to stop a poll which was sent by the bot. On success, the stopped <see cref=\"Poll\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the original message with the poll</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new message <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Poll> StopPollAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Poll>(MethodNames.StopPoll, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Use this method to stop a poll which was sent by the bot. On success, the stopped <see cref=\"Poll\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the original message with the poll</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new message <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Poll StopPoll(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null\n    ) =>\n        client\n            .StopPollAsync(chatId, messageId, businessConnectionId, replyMarkup)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Use this method to stop a poll which was sent by the bot. On success, the stopped <see cref=\"Poll\"/> is returned.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target bot, supergroup or channel in the format <em>@username</em></param>\n    /// <param name=\"messageId\">Identifier of the original message with the poll</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection on behalf of which the message to be edited was sent</param>\n    /// <param name=\"replyMarkup\">A JSON-serialized object for a new message <a href=\"https://core.telegram.org/bots/features#inline-keyboards\">inline keyboard</a>.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<Poll> StopPollAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        int messageId,\n        string? businessConnectionId = null,\n        ReplyMarkup? replyMarkup = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n            { PropertyNames.MessageId, messageId },\n        };\n        if (businessConnectionId is not null)\n        {\n            args.Add(PropertyNames.BusinessConnectionId, businessConnectionId);\n        }\n        if (replyMarkup is not null)\n        {\n            args.Add(PropertyNames.ReplyMarkup, replyMarkup);\n        }\n\n        return client.CallMethodAsync<Poll>(MethodNames.StopPoll, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/transferBusinessAccountStars.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Transfers Telegram Stars from the business account balance to the bot's balance. Requires the <em>can_transfer_stars</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to transfer; 1-10000</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool TransferBusinessAccountStars(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int starCount\n    ) =>\n        client\n            .TransferBusinessAccountStarsAsync(businessConnectionId, starCount)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Transfers Telegram Stars from the business account balance to the bot's balance. Requires the <em>can_transfer_stars</em> business bot right. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"starCount\">Number of Telegram Stars to transfer; 1-10000</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> TransferBusinessAccountStarsAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        int starCount,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            { PropertyNames.StarCount, starCount },\n        };\n\n        return client.CallMethodAsync<bool>(\n            MethodNames.TransferBusinessAccountStars,\n            args,\n            cancellationToken\n        );\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/transferGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Transfers an owned unique gift to another user. Requires the <em>can_transfer_and_upgrade_gifts</em> business bot right. Requires <em>can_transfer_stars</em> business bot right if the transfer is paid. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be transferred</param>\n    /// <param name=\"newOwnerChatId\">Unique identifier of the chat which will own the gift. The chat must be active in the last 24 hours.</param>\n    /// <param name=\"starCount\">The amount of Telegram Stars that will be paid for the transfer from the business account balance. If positive, then the <em>can_transfer_stars</em> business bot right is required.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool TransferGift(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        long newOwnerChatId,\n        int? starCount = null\n    ) =>\n        client\n            .TransferGiftAsync(businessConnectionId, ownedGiftId, newOwnerChatId, starCount)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Transfers an owned unique gift to another user. Requires the <em>can_transfer_and_upgrade_gifts</em> business bot right. Requires <em>can_transfer_stars</em> business bot right if the transfer is paid. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be transferred</param>\n    /// <param name=\"newOwnerChatId\">Unique identifier of the chat which will own the gift. The chat must be active in the last 24 hours.</param>\n    /// <param name=\"starCount\">The amount of Telegram Stars that will be paid for the transfer from the business account balance. If positive, then the <em>can_transfer_stars</em> business bot right is required.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> TransferGiftAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        long newOwnerChatId,\n        int? starCount = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.OwnedGiftId,\n                ownedGiftId ?? throw new ArgumentNullException(nameof(ownedGiftId))\n            },\n            { PropertyNames.NewOwnerChatId, newOwnerChatId },\n        };\n        if (starCount is not null)\n        {\n            args.Add(PropertyNames.StarCount, starCount);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.TransferGift, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/upgradeGift.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Upgrades a given regular gift to a unique gift. Requires the <em>can_transfer_and_upgrade_gifts</em> business bot right. Additionally requires the <em>can_transfer_stars</em> business bot right if the upgrade is paid. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be upgraded to a unique one</param>\n    /// <param name=\"keepOriginalDetails\">Pass <em>True</em> to keep the original gift text, sender and receiver in the upgraded gift</param>\n    /// <param name=\"starCount\">The amount of Telegram Stars that will be paid for the upgrade from the business account balance. If <em>gift.prepaid_upgrade_star_count &gt; 0</em>, then pass 0, otherwise, the <em>can_transfer_stars</em> business bot right is required and <em>gift.upgrade_star_count</em> must be passed.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool UpgradeGift(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        bool? keepOriginalDetails = null,\n        int? starCount = null\n    ) =>\n        client\n            .UpgradeGiftAsync(businessConnectionId, ownedGiftId, keepOriginalDetails, starCount)\n            .GetAwaiter()\n            .GetResult();\n\n    /// <summary>\n    /// Upgrades a given regular gift to a unique gift. Requires the <em>can_transfer_and_upgrade_gifts</em> business bot right. Additionally requires the <em>can_transfer_stars</em> business bot right if the upgrade is paid. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"businessConnectionId\">Unique identifier of the business connection</param>\n    /// <param name=\"ownedGiftId\">Unique identifier of the regular gift that should be upgraded to a unique one</param>\n    /// <param name=\"keepOriginalDetails\">Pass <em>True</em> to keep the original gift text, sender and receiver in the upgraded gift</param>\n    /// <param name=\"starCount\">The amount of Telegram Stars that will be paid for the upgrade from the business account balance. If <em>gift.prepaid_upgrade_star_count &gt; 0</em>, then pass 0, otherwise, the <em>can_transfer_stars</em> business bot right is required and <em>gift.upgrade_star_count</em> must be passed.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> UpgradeGiftAsync(\n        this ITelegramBotClient client,\n        string businessConnectionId,\n        string ownedGiftId,\n        bool? keepOriginalDetails = null,\n        int? starCount = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            {\n                PropertyNames.BusinessConnectionId,\n                businessConnectionId\n                    ?? throw new ArgumentNullException(nameof(businessConnectionId))\n            },\n            {\n                PropertyNames.OwnedGiftId,\n                ownedGiftId ?? throw new ArgumentNullException(nameof(ownedGiftId))\n            },\n        };\n        if (keepOriginalDetails is not null)\n        {\n            args.Add(PropertyNames.KeepOriginalDetails, keepOriginalDetails);\n        }\n        if (starCount is not null)\n        {\n            args.Add(PropertyNames.StarCount, starCount);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.UpgradeGift, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/verifyChat.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyChat(\n        this ITelegramBotClient client,\n        long chatId,\n        string? customDescription = null\n    ) => client.VerifyChatAsync(chatId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyChatAsync(\n        this ITelegramBotClient client,\n        long chatId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.ChatId, chatId } };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyChat, args, cancellationToken);\n    }\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyChat(\n        this ITelegramBotClient client,\n        string chatId,\n        string? customDescription = null\n    ) => client.VerifyChatAsync(chatId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a chat <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"chatId\">Unique identifier for the target chat or username of the target channel (in the format <em>@channelusername</em>)</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyChatAsync(\n        this ITelegramBotClient client,\n        string chatId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>()\n        {\n            { PropertyNames.ChatId, chatId ?? throw new ArgumentNullException(nameof(chatId)) },\n        };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyChat, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/UpdatingMessages/verifyUser.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n//* This file is auto-generated. Don't edit it manually!\n\nnamespace Telegram.BotAPI.UpdatingMessages;\n\n/// <summary>\n/// Extension methods for the Telegram Bot API.\n/// </summary>\npublic static partial class UpdatingMessagesExtensions\n{\n    /// <summary>\n    /// Verifies a user <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static bool VerifyUser(\n        this ITelegramBotClient client,\n        long userId,\n        string? customDescription = null\n    ) => client.VerifyUserAsync(userId, customDescription).GetAwaiter().GetResult();\n\n    /// <summary>\n    /// Verifies a user <a href=\"https://telegram.org/verify#third-party-verification\">on behalf of the organization</a> which is represented by the bot. Returns <em>True</em> on success.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"userId\">Unique identifier of the target user</param>\n    /// <param name=\"customDescription\">Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.</param>\n    /// <param name=\"cancellationToken\">The cancellation token to cancel operation.</param>\n    /// <exception cref=\"ArgumentNullException\">Thrown if <paramref name=\"client\"/> is <c>null</c>.</exception>\n    /// <exception cref=\"BotRequestException\">Thrown if the request to the Telegram Bot API fails.</exception>\n    /// <returns></returns>\n    public static Task<bool> VerifyUserAsync(\n        this ITelegramBotClient client,\n        long userId,\n        string? customDescription = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (client is null)\n        {\n            throw new ArgumentNullException(nameof(client));\n        }\n\n        var args = new Dictionary<string, object>() { { PropertyNames.UserId, userId } };\n        if (customDescription is not null)\n        {\n            args.Add(PropertyNames.CustomDescription, customDescription);\n        }\n\n        return client.CallMethodAsync<bool>(MethodNames.VerifyUser, args, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI/Usings.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nglobal using System;\nglobal using System.Collections.Generic;\nglobal using System.Text.Json.Serialization;\nglobal using System.Threading;\nglobal using System.Threading.Tasks;\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Builders/AppendButtonOptions.cs",
    "content": "namespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Represents the options for appending a button to a keyboard.\n/// </summary>\n/// <param name=\"IconCustomEmojiId\">Optional. Unique identifier of the custom emoji shown before the text of the button. Can only be used by bots that purchased additional usernames on <a href=\"https://fragment.com/\">Fragment</a> or in the messages directly sent by the bot to private, group and supergroup chats if the owner of the bot has a Telegram Premium subscription.</param>\n/// <param name=\"Style\">Optional. Style of the button. Must be one of “danger” (red), “success” (green) or “primary” (blue). If omitted, then an app-specific style is used.</param>\npublic record AppendButtonOptions(string? IconCustomEmojiId = null, string? Style = null)\n{\n    /// <summary>\n    /// Optional. Unique identifier of the custom emoji shown before the text of the button. Can only be used by bots that purchased additional usernames on <a href=\"https://fragment.com/\">Fragment</a> or in the messages directly sent by the bot to private, group and supergroup chats if the owner of the bot has a Telegram Premium subscription.\n    /// </summary>\n    public string? IconCustomEmojiId { get; } = IconCustomEmojiId;\n\n    /// <summary>\n    /// Optional. Style of the button. Must be one of “danger” (red), “success” (green) or “primary” (blue). If omitted, then an app-specific style is used.\n    /// </summary>\n    public string? Style { get; } = Style;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Builders/InlineKeyboardBuilder.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.Games;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Represents a mutable collection of inline keyboard buttons.\n/// </summary>\npublic sealed class InlineKeyboardBuilder(\n    IEnumerable<IEnumerable<InlineKeyboardButton>>? keyboard = null\n) : KeyboardBuilderBase<InlineKeyboardBuilder, InlineKeyboardButton>(keyboard)\n{\n    /// <summary>\n    /// Appends a new URL button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"url\">The URL to open when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendUrl(\n        string text,\n        string url,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { Url = url }, options);\n\n    /// <summary>\n    /// Appends a new callback data button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"callbackData\">The callback data to send when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendCallbackData(\n        string text,\n        string callbackData,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { CallbackData = callbackData }, options);\n\n    /// <summary>\n    /// Appends a new Web App button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"webApp\">Description of the Web App that will be launched when the user presses the button. The Web App will be able to send an arbitrary message on behalf of the user using the method answerWebAppQuery. Available only in private chats between a user and the bot.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendWebApp(\n        string text,\n        WebAppInfo webApp,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { WebApp = webApp }, options);\n\n    /// <summary>\n    /// Appends a new Web App button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"url\">The URL to open when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendWebApp(\n        string text,\n        string url,\n        AppendButtonOptions? options = null\n    ) => this.AppendWebApp(text, new WebAppInfo(url), options);\n\n    /// <summary>\n    /// Appends a new login URL button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"loginUrl\">The login URL to open when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendLoginUrl(\n        string text,\n        LoginUrl loginUrl,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { LoginUrl = loginUrl }, options);\n\n    /// <summary>\n    /// Appends a new login URL button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"url\">The URL to open when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendLoginUrl(\n        string text,\n        string url,\n        AppendButtonOptions? options = null\n    ) => this.AppendLoginUrl(text, new LoginUrl(url), options);\n\n    /// <summary>\n    /// Appends a new switch inline query button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"switchInlineQuery\">The query to send when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendSwitchInlineQuery(\n        string text,\n        string switchInlineQuery,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { SwitchInlineQuery = switchInlineQuery });\n\n    /// <summary>\n    /// Appends a new switch inline query current chat button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"switchInlineQueryCurrentChat\">The query to send when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendSwitchInlineQueryCurrentChat(\n        string text,\n        string switchInlineQueryCurrentChat,\n        AppendButtonOptions? options = null\n    ) =>\n        this.Append(\n            new(text) { SwitchInlineQueryCurrentChat = switchInlineQueryCurrentChat },\n            options\n        );\n\n    /// <summary>\n    /// Appends a new <see cref=\"SwitchInlineQueryChosenChat\" /> button to the keyboard.\n    /// </summary>\n    /// <remarks>\n    /// Pressing the button will prompt the user to select one of their chats of the specified type, open that chat and insert the bot's username and the specified inline query in the input field.\n    /// </remarks>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"switchInlineQueryChosenChat\">The query to send when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendSwitchInlineQueryChosenChat(\n        string text,\n        SwitchInlineQueryChosenChat switchInlineQueryChosenChat,\n        AppendButtonOptions? options = null\n    ) =>\n        this.Append(\n            new(text) { SwitchInlineQueryChosenChat = switchInlineQueryChosenChat },\n            options\n        );\n\n    /// <summary>\n    /// Appends a new <see cref=\"CopyTextButton\" /> button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"button\">The <see cref=\"CopyTextButton\" /> instance with the text to be copied when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendCopyText(\n        string text,\n        CopyTextButton button,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { CopyText = button }, options);\n\n    /// <summary>\n    /// Appends a new <see cref=\"CallbackGame\" /> button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendCallbackGame(\n        string text,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { CallbackGame = new CallbackGame() }, options);\n\n    /// <summary>\n    /// Appends a new pay button to the keyboard.\n    /// </summary>\n    /// <remarks>\n    /// <b>NOTE:</b> This type of button <b>must</b> always be the first button in the first row and can only be used in invoice messages.\n    /// </remarks>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"InlineKeyboardBuilder\"/>.</returns>\n    public InlineKeyboardBuilder AppendPay(string text, AppendButtonOptions? options = null) =>\n        this.Append(new(text) { Pay = true }, options);\n\n    private InlineKeyboardBuilder Append(InlineKeyboardButton button, AppendButtonOptions? options)\n    {\n        button.IconCustomEmojiId = options?.IconCustomEmojiId;\n        button.Style = options?.Style;\n        return this.Append(button);\n    }\n\n    public static implicit operator InlineKeyboardButton[][](InlineKeyboardBuilder builder) =>\n        [.. builder.Select(row => row.ToArray())];\n\n    public static implicit operator InlineKeyboardBuilder(InlineKeyboardButton[][] keyboard) =>\n        new(keyboard);\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Builders/KeyboardBuilderBase.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Collections;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Provides a base class for building keyboards with a fluent interface.\n/// </summary>\n/// <typeparam name=\"TBuilder\">The type of the specific builder class that is derived from this base class.</typeparam>\n/// <typeparam name=\"TButton\">The type of the button that this builder creates.</typeparam>\npublic abstract class KeyboardBuilderBase<TBuilder, TButton> : IEnumerable<IEnumerable<TButton>>\n    where TBuilder : KeyboardBuilderBase<TBuilder, TButton>\n{\n    private readonly List<IEnumerable<TButton>> rows;\n    private List<TButton>? currentRow;\n\n    protected KeyboardBuilderBase(IEnumerable<IEnumerable<TButton>>? keyboard = null)\n    {\n        this.rows = [.. keyboard?.Where(k => k.Any()) ?? []];\n        this.currentRow = this.rows.LastOrDefault()?.ToList();\n    }\n\n    /// <summary>\n    /// Appends the specified button to the current row.\n    /// </summary>\n    /// <param name=\"button\">The button to append.</param>\n    /// <returns>The current builder instance.</returns>\n    public TBuilder Append(TButton button)\n    {\n        if (this.currentRow is null)\n        {\n            this.currentRow = [];\n            this.rows.Add(this.currentRow);\n        }\n\n        this.currentRow.Add(button);\n        return (TBuilder)this;\n    }\n\n    /// <summary>\n    /// Appends a new row to the keyboard.\n    /// </summary>\n    /// <returns>The current builder instance.</returns>\n    public TBuilder AppendRow()\n    {\n        if (this.currentRow is not null && this.currentRow.Count > 0)\n        {\n            this.currentRow = null;\n        }\n\n        return (TBuilder)this;\n    }\n\n    IEnumerator<IEnumerable<TButton>> IEnumerable<IEnumerable<TButton>>.GetEnumerator() =>\n        this.rows.GetEnumerator();\n\n    IEnumerator IEnumerable.GetEnumerator() => this.rows.GetEnumerator();\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Builders/ReplyKeyboardBuilder.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Represents a mutable collection of reply keyboard buttons.\n/// </summary>\npublic sealed class ReplyKeyboardBuilder(IEnumerable<IEnumerable<KeyboardButton>>? keyboard = null)\n    : KeyboardBuilderBase<ReplyKeyboardBuilder, KeyboardButton>(keyboard)\n{\n    /// <summary>\n    /// Appends a new text button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendText(string text, AppendButtonOptions? options = null) =>\n        this.Append(new(text), options);\n\n    /// <summary>\n    /// Appends a new request users button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"requestUsers\">The criteria used to request a suitable user.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendRequestUsers(\n        string text,\n        KeyboardButtonRequestUsers requestUsers,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { RequestUsers = requestUsers }, options);\n\n    /// <summary>\n    /// Appends a new request users button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"requestId\">Signed 32-bit identifier of the request that will be received back in the <see cref=\"UsersShared\"/> object. Must be unique within the message</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendRequestUsers(\n        string text,\n        int requestId,\n        AppendButtonOptions? options = null\n    ) => this.AppendRequestUsers(text, new KeyboardButtonRequestUsers(requestId), options);\n\n    /// <summary>\n    /// Appends a new request chat button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"requestChat\">The criteria used to request a suitable chat.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendRequestChat(\n        string text,\n        KeyboardButtonRequestChat requestChat,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { RequestChat = requestChat }, options);\n\n    /// <summary>\n    /// Appends a new request chat button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"requestId\">Signed 32-bit identifier of the request that will be received back in the <see cref=\"ChatShared\"/> object. Must be unique within the message</param>\n    /// <param name=\"chatIsChannel\">True if the chat is a channel, false otherwise.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendRequestChat(\n        string text,\n        int requestId,\n        bool chatIsChannel,\n        AppendButtonOptions? options = null\n    ) =>\n        this.AppendRequestChat(\n            text,\n            new KeyboardButtonRequestChat(requestId, chatIsChannel),\n            options\n        );\n\n    /// <summary>\n    /// Appends a new request contact button to the keyboard.\n    /// The button will request the user's contact information when pressed.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendRequestContact(\n        string text,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { RequestContact = true }, options);\n\n    /// <summary>\n    /// Appends a new request location button to the keyboard.\n    /// The button will request the user's location when pressed.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendRequestLocation(\n        string text,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { RequestLocation = true }, options);\n\n    /// <summary>\n    /// Appends a new request poll button to the keyboard.\n    /// The button will request the user to create a poll when pressed.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"pollType\">The type of poll to be created.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    /// <remarks>\n    public ReplyKeyboardBuilder AppendRequestPoll(\n        string text,\n        KeyboardButtonPollType? pollType = null,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { RequestPoll = pollType ?? new() }, options);\n\n    /// <summary>\n    /// Appends a new request poll button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"pollType\">The type of poll to be created.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendRequestPoll(\n        string text,\n        string pollType,\n        AppendButtonOptions? options = null\n    ) => this.AppendRequestPoll(text, new KeyboardButtonPollType { Type = pollType }, options);\n\n    /// <summary>\n    /// Appends a new web app button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"webApp\">The web app to be launched when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendWebApp(\n        string text,\n        WebAppInfo webApp,\n        AppendButtonOptions? options = null\n    ) => this.Append(new(text) { WebApp = webApp }, options);\n\n    /// <summary>\n    /// Appends a new web app button to the keyboard.\n    /// </summary>\n    /// <param name=\"text\">The text of the button.</param>\n    /// <param name=\"url\">The URL of the web app to be launched when the button is pressed.</param>\n    /// <param name=\"options\">Additional options for the button.</param>\n    /// <returns>The current instance of <see cref=\"ReplyKeyboardBuilder\"/>.</returns>\n    public ReplyKeyboardBuilder AppendWebApp(\n        string text,\n        string url,\n        AppendButtonOptions? options = null\n    ) => this.AppendWebApp(text, new WebAppInfo(url), options);\n\n    private ReplyKeyboardBuilder Append(KeyboardButton button, AppendButtonOptions? options)\n    {\n        button.IconCustomEmojiId = options?.IconCustomEmojiId;\n        button.Style = options?.Style;\n        return this.Append(button);\n    }\n\n    public static implicit operator KeyboardButton[][](ReplyKeyboardBuilder? builder) =>\n        [.. builder.Select(i => i.ToArray())];\n\n    public static implicit operator ReplyKeyboardBuilder(KeyboardButton[][]? keyboard) =>\n        new(keyboard);\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Commands/BotCommandAttribute.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI.Extensions.Commands;\n\n/// <summary>\n/// Attribute to define a class or method as a Telegram bot command.\n/// </summary>\n[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]\npublic sealed class BotCommandAttribute : Attribute\n{\n    /// <summary>\n    /// Command name.\n    /// </summary>\n    public string Command { get; }\n\n    /// <summary>\n    /// Command description.\n    /// </summary>\n    public string Description { get; }\n\n    /// <summary>\n    /// A list of aliases for the command.\n    /// </summary>\n    public string[] Aliases { get; }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BotCommandAttribute\"/> class.\n    /// </summary>\n    /// <param name=\"command\">Command name.</param>\n    /// <param name=\"description\">Command description.</param>\n    /// <param name=\"aliases\">Optional. A list of aliases for the command.</param>\n    public BotCommandAttribute(string command, string description, params string[] aliases)\n    {\n        if (command.Length < 1 || command.Length > 32)\n        {\n            throw new ArgumentException(\n                \"Command name must be between 1 and 32 characters.\",\n                nameof(command)\n            );\n        }\n\n        this.Command = command;\n        this.Description = description;\n        this.Aliases = aliases;\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Commands/BotCommandParser.cs",
    "content": "using System.Text.RegularExpressions;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Extensions.Commands;\n\n/// <summary>\n/// Provides methods to parse Telegram bot commands from messages.\n/// </summary>\npublic static class BotCommandParser\n{\n    private static readonly Regex pattern = new(\n        @\"^\\/(?<cmd>\\w+)(?:@(?<username>[^\\s]+))?(?:\\s+(?<params>.+))?$\",\n        RegexOptions.Compiled | RegexOptions.IgnoreCase\n    );\n\n    /// <summary>\n    /// Parse the provided message and return the command name, arguments, and the username of the bot the command is targeted to (if available).\n    /// </summary>\n    /// <param name=\"message\">The message to parse.</param>\n    /// <exception cref=\"ArgumentException\">Thrown when the message does not contain a command.</exception>\n    public static (string commandName, string? args, string? username) Parse(Message message)\n    {\n        var text = message.Text ?? message.Caption;\n        if (string.IsNullOrEmpty(text))\n        {\n            throw new ArgumentException(\"The message is not a command.\", nameof(message));\n        }\n        return Parse(text ?? string.Empty);\n    }\n\n    /// <summary>\n    /// Parse the provided message and return the command name, arguments, and the username of the bot the command is targeted to (if available).\n    /// </summary>\n    /// <param name=\"message\">The message to parse.</param>\n    /// <exception cref=\"ArgumentException\">Thrown when the message does not contain a command.</exception>\n    public static (string commandName, string? args, string? username) Parse(string message)\n    {\n        if (TryParse(message, out var result))\n        {\n            return result;\n        }\n        throw new ArgumentException(\"The message is not a command.\", nameof(message));\n    }\n\n    /// <summary>\n    /// Try to parse the provided message and return the command name, arguments, and the username of the bot the command is targeted to (if available).\n    /// </summary>\n    /// <param name=\"message\">The message to parse.</param>\n    /// <param name=\"result\">The parsed command name, arguments, and the username of the bot the command is targeted to (if available).</param>\n    /// <returns></returns>\n    public static bool TryParse(\n        Message message,\n        out (string commandName, string? args, string? username) result\n    )\n    {\n        var text = message.Text ?? message.Caption;\n        if (string.IsNullOrEmpty(text))\n        {\n            result = default;\n            return false;\n        }\n\n        return TryParse(text!, out result);\n    }\n\n    /// <summary>\n    /// Try to parse the provided message and return the command name, arguments, and the username of the bot the command is targeted to (if available).\n    /// </summary>\n    /// <param name=\"message\">The message to parse.</param>\n    /// <param name=\"result\">The parsed command name, arguments, and the username of the bot the command is targeted to (if available).</param>\n    /// <returns></returns>\n    public static bool TryParse(\n        string message,\n        out (string commandName, string? args, string? username) result\n    )\n    {\n        var match = pattern.Match(message);\n        result = match.Success\n            ? (\n                match.Groups[\"cmd\"].Value,\n                match.Groups[\"params\"].Value,\n                match.Groups[\"username\"].Value\n            )\n            : default;\n        return match.Success;\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Commands/BotCommandVisibility.cs",
    "content": "namespace Telegram.BotAPI.Extensions.Commands;\n\n/// <summary>\n/// Defines the visibility of a Telegram bot command.\n/// </summary>\n[Flags]\npublic enum BotCommandVisibility\n{\n    /// <summary>\n    /// All users can see the command.\n    /// </summary>\n    Default = 1,\n\n    /// <summary>\n    /// Hide the command from the menu.\n    /// </summary>\n    Hidden = 2,\n\n    /// <summary>\n    /// All users can see the command but only in private chats.\n    /// </summary>\n    PrivateChats = 4,\n\n    /// <summary>\n    /// The command is visible for group members only.\n    /// </summary>\n    Members = 8,\n\n    /// <summary>\n    /// The command is available for administrators only in groups and supergroups.\n    /// </summary>\n    Administrators = 16,\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Commands/BotCommandVisibilityAttribute.cs",
    "content": "namespace Telegram.BotAPI.Extensions.Commands;\n\n/// <summary>\n/// This attribute helps to specify who can see or use the command.\n/// </summary>\n/// <param name=\"visibility\">The visibility.</param>\n[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]\npublic class BotCommandVisibilityAttribute(BotCommandVisibility visibility) : Attribute\n{\n    /// <summary>\n    /// Specifies who can see or use the command.\n    /// </summary>\n    public BotCommandVisibility Visibility => visibility;\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Commands/LocalizedBotCommandAttribute.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI.Extensions.Commands;\n\n/// <summary>\n/// Defines a translation for a Telegram bot command.\n/// </summary>\n/// <param name=\"languageCode\">Language code.</param>\n/// <param name=\"description\">Command description.</param>\n[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]\npublic sealed class LocalizedBotCommandAttribute(string languageCode, string description)\n    : Attribute\n{\n    /// <summary>\n    /// Language code.\n    /// </summary>\n    public string LanguageCode { get; } = languageCode;\n\n    /// <summary>\n    /// Command name.\n    /// </summary>\n    public string? Command { get; }\n\n    /// <summary>\n    /// Command description.\n    /// </summary>\n    public string Description { get; } = description;\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"LocalizedBotCommandAttribute\"/> class.\n    /// </summary>\n    /// <param name=\"languageCode\">Language code.</param>\n    /// <param name=\"command\">Command name.</param>\n    /// <param name=\"description\">Command description.</param>\n    /// <exception cref=\"ArgumentException\"></exception>\n    public LocalizedBotCommandAttribute(string languageCode, string command, string description)\n        : this(languageCode, description)\n    {\n        if (command.Length < 1 || command.Length > 32)\n        {\n            throw new ArgumentException(\n                \"Command name must be between 1 and 32 characters.\",\n                nameof(command)\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/HtmlTextFormatter.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Text;\nusing Telegram.BotAPI.AvailableTypes;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Defines methods to format text in HTML.\n/// </summary>\npublic static class HtmlTextFormatter\n{\n    /// <summary>\n    /// Create a new stylized text from message entities.\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <param name=\"entities\">Message entities.</param>\n    public static string FromEntities(string input, IEnumerable<MessageEntity> entities)\n    {\n        if (input is null)\n        {\n            throw new ArgumentNullException(nameof(input));\n        }\n\n        if (entities == null)\n        {\n            throw new ArgumentNullException(nameof(input));\n        }\n\n        if (entities.Any())\n        {\n            StringBuilder? buffer = new();\n            int offset = 0;\n            string nFsubText;\n            string subText;\n            foreach (MessageEntity? e in entities)\n            {\n                if (offset < e.Offset)\n                {\n                    nFsubText = input.Substring(offset, e.Offset - offset);\n                    subText = EncodeHtmlCharacters(nFsubText);\n                    buffer.Append(subText);\n                    offset = e.Offset;\n                }\n\n                subText = input.Substring(offset, e.Length);\n                switch (e.Type)\n                {\n                    case \"bold\":\n                        buffer.Append(Bold(subText));\n                        break;\n                    case \"italic\":\n                        buffer.Append(Italic(subText));\n                        break;\n                    case \"underline\":\n                        buffer.Append(Underline(subText));\n                        break;\n                    case \"strikethrough\":\n                        buffer.Append(Strikethrough(subText));\n                        break;\n                    case \"spoiler\":\n                        buffer.Append(Spoiler(subText));\n                        break;\n                    case \"code\":\n                        buffer.Append(Code(subText));\n                        break;\n                    case \"pre\":\n                        buffer.Append(Pre(subText, e.Language));\n                        break;\n                    case \"text_link\":\n                        buffer.Append(TextLink(subText, e.Url!));\n                        break;\n                    case \"text_mention\":\n                        buffer.Append(TextMention(subText, e.User!.Id));\n                        break;\n                    case \"custom_emoji\":\n                        buffer.Append(CustomEmoji(subText, e.CustomEmojiId!));\n                        break;\n                    default:\n                        subText = EncodeHtmlCharacters(subText);\n                        buffer.Append(subText);\n                        break;\n                }\n\n                offset += e.Length;\n            }\n\n            if (offset < input.Length)\n            {\n                nFsubText = input.Substring(offset);\n                subText = EncodeHtmlCharacters(nFsubText);\n                buffer.Append(subText);\n            }\n\n            return buffer.ToString();\n        }\n\n        return EncodeHtmlCharacters(input);\n    }\n\n    /// <summary>\n    /// Convert the given text to bold.\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <returns>Stylized <see cref=\"string\"/></returns>\n    public static string Bold(string input)\n    {\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n        return $\"<b>{text}</b>\";\n    }\n\n    /// <summary>\n    /// Convert the given text to italic.\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <returns>The text in italic.</returns>\n    public static string Italic(string input)\n    {\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n        return $\"<i>{text}</i>\";\n    }\n\n    /// <summary>\n    /// Convert the given text to underline.\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <returns>The text underlined.</returns>\n    public static string Underline(string input)\n    {\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n        return $\"<u>{text}</u>\";\n    }\n\n    /// <summary>\n    /// Convert the given text to strikethrough.\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <returns>A strikethrough text</returns>\n    public static string Strikethrough(string input)\n    {\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n        return $\"<s>{text}</s>\";\n    }\n\n    /// <summary>Conver the fiven text into a spoiler.</summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <returns>The spoiler</returns>\n    public static string Spoiler(string input)\n    {\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n        return $\"<span class=\\\"tg-spoiler\\\">{text}</span>\";\n    }\n\n    /// <summary>Convert the text into a code block</summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <returns>A code block</returns>\n    public static string Code(string input)\n    {\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n        return $\"<code>{text}</code>\";\n    }\n\n    /// <summary>\n    /// Convert the given text into a block of pre-formatted text.\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <returns>A pre-formatted text</returns>\n    public static string Pre(string input, string? language = null)\n    {\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n\n        return string.IsNullOrEmpty(language)\n            ? $\"<pre>{text}</pre>\"\n            : $\"<pre><code class=\\\"language-{language}\\\">{text}</code></pre>\";\n    }\n\n    /// <summary>\n    /// Create a new text with a hyperlink.\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <param name=\"url\">Url.</param>\n    /// <returns>A text link</returns>\n    public static string TextLink(string input, string url)\n    {\n        if (string.IsNullOrEmpty(url))\n        {\n            throw new ArgumentNullException(nameof(url));\n        }\n\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n        return $\"<a href=\\\"{url}\\\">{text}</a>\";\n    }\n\n    /// <summary>\n    /// Create a new text with a mention.\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <param name=\"userId\">Unique identifier for this user or bot.</param>\n    /// <returns>The text mention</returns>\n    public static string TextMention(string input, long userId)\n    {\n        input ??= string.Empty;\n        string text = EncodeHtmlCharacters(input);\n        return $\"<a href=\\\"tg://user?id={userId}\\\">{text}</a>\";\n    }\n\n    /// <summary>\n    ///     Format text. Custom Emoji. <br />\n    /// </summary>\n    /// <remarks>\n    ///     Custom emoji is not supported with Markdown. Use MarkdownV2 instead.\n    /// </remarks>\n    /// <param name=\"customEmojiId\">Unique identifier of the custom emoji.</param>\n    /// <param name=\"emoji\">The emoji.</param>\n    /// <returns>Stylized <see cref=\"string\" /></returns>\n    public static string CustomEmoji(string customEmojiId, string emoji)\n    {\n        if (string.IsNullOrEmpty(customEmojiId))\n        {\n            throw new ArgumentNullException(nameof(customEmojiId));\n        }\n\n        if (string.IsNullOrEmpty(emoji))\n        {\n            throw new ArgumentNullException(nameof(emoji));\n        }\n\n        return $\"<tg-emoji emoji-id=\\\"{customEmojiId}\\\">{emoji}</tg-emoji>\";\n    }\n\n    /// <summary>\n    ///     Replaces symbols that are not part of an HTML tag or entity with HTML entities (&lt; with &amp;lt;, &gt; with &amp;\n    ///     gt; and &amp; with &amp;amp;).\n    /// </summary>\n    /// <param name=\"input\">Input text.</param>\n    /// <returns>String with HTML entities.</returns>\n    /// <returns>\n    ///     <see cref=\"string\" />\n    /// </returns>\n    public static string EncodeHtmlCharacters(string input)\n    {\n        if (string.IsNullOrEmpty(input))\n        {\n            return input;\n        }\n\n        return input.Replace(\"&\", \"&amp;\").Replace(\"<\", \"&lt;\").Replace(\">\", \"&gt;\");\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/IAsyncUpdateHandler.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Represents an interface for handling incoming updates asynchronously.\n/// </summary>\npublic interface IAsyncUpdateHandler\n{\n    /// <summary>\n    /// Receives and processes an incoming update.\n    /// </summary>\n    /// <param name=\"update\">The incoming update.</param>\n    /// <param name=\"cancellationToken\">A cancellation token</param>\n    /// <returns>A task that represents the asynchronous operation.</returns>\n    Task OnUpdateAsync(Update update, CancellationToken cancellationToken = default);\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/IUpdateHandler.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Represents an interface for handling incoming updates.\n/// </summary>\npublic interface IUpdateHandler\n{\n    /// <summary>\n    /// Receives and processes an incoming update.\n    /// </summary>\n    /// <param name=\"update\">The incoming update.</param>\n    void OnUpdate(Update update);\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/LongPolling/LongPollingExtensions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Telegram.BotAPI.Extensions.LongPolling;\n\npublic static class LongPollingExtensions\n{\n    /// <summary>\n    /// Starts a long polling session using the current bot client.\n    /// </summary>\n    /// <param name=\"client\">The <see cref=\"ITelegramBotClient\"/> instance.</param>\n    /// <param name=\"updateHandler\">A function to handle incoming updates.</param>\n    /// <param name=\"errorHandler\">A function to handle errors.</param>\n    /// <param name=\"options\">Optional. Options for the long polling session.</param>\n    /// <param name=\"cancellationToken\">Optional. The cancellation token to cancel operation.</param>\n    /// <returns></returns>\n    public static async Task StartLongPolling(\n        this ITelegramBotClient client,\n        Func<ITelegramBotClient, Update, CancellationToken, Task> updateHandler,\n        Func<ITelegramBotClient, Exception, CancellationToken, Task> errorHandler,\n        LongPollingOptions? options = null,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (options?.DropPendingUpdates is true)\n        {\n            await client.DeleteWebhookAsync(true, cancellationToken).ConfigureAwait(false);\n        }\n\n        var args = new GetUpdatesArgs()\n        {\n            Limit = options?.Limit,\n            Timeout = options?.Timeout,\n            AllowedUpdates = options?.AllowedUpdates,\n        };\n\n        var tasks = new List<Task>();\n        var semaphore = new SemaphoreSlim(options?.ParallelLimit ?? 1);\n\n        while (!cancellationToken.IsCancellationRequested)\n        {\n            try\n            {\n                var updates = await client\n                    .GetUpdatesAsync(args, cancellationToken)\n                    .ConfigureAwait(false);\n                if (updates.Any())\n                {\n                    args.Offset = updates.Last().UpdateId + 1;\n                    foreach (var update in updates)\n                    {\n                        await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);\n                        tasks.Add(\n                            updateHandler(client, update, cancellationToken)\n                                .ContinueWith(\n                                    task =>\n                                    {\n                                        if (task.IsFaulted)\n                                        {\n                                            return errorHandler(\n                                                    client,\n                                                    task.Exception.InnerException,\n                                                    cancellationToken\n                                                )\n                                                .ContinueWith(_ => semaphore.Release());\n                                        }\n                                        return Task.FromResult(semaphore.Release());\n                                    },\n                                    cancellationToken\n                                )\n                        );\n                    }\n                }\n                else\n                {\n                    await Task.Delay(200, cancellationToken).ConfigureAwait(false);\n                }\n            }\n            catch (Exception error)\n            {\n                await errorHandler(client, error, cancellationToken).ConfigureAwait(false);\n            }\n\n            await Task.WhenAll(tasks).ConfigureAwait(false);\n            tasks.Clear();\n        }\n\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/LongPolling/LongPollingOptions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI.Extensions.LongPolling;\n\n/// <summary>\n/// Represents basic options for long polling.\n/// </summary>\npublic record LongPollingOptions\n{\n    /// <summary>\n    /// Limits the number of updates to be retrieved per call. Values between 1-100 are accepted. Defaults to 100.\n    /// </summary>\n    public int? Limit { get; set; }\n\n    /// <summary>\n    /// A JSON-serialized list of the update types you want your bot to receive. For example, specify <em>[\"message\", \"edited_channel_post\", \"callback_query\"]</em> to only receive updates of these types. See <see cref=\"Update\"/> for a complete list of available update types. Specify an empty list to receive all update types except <em>chat_member</em>, <em>message_reaction</em>, and <em>message_reaction_count</em> (default). If not specified, the previous setting will be used.<br /><br />Please note that this parameter doesn't affect updates created before the call to getUpdates, so unwanted updates may be received for a short period of time.\n    /// </summary>\n    public IEnumerable<string>? AllowedUpdates { get; set; }\n\n    /// <summary>\n    /// Pass <em>True</em> to drop all pending updates\n    /// </summary>\n    public bool? DropPendingUpdates { get; set; }\n\n    /// <summary>\n    /// Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be positive, short polling should be used for testing purposes only.\n    /// </summary>\n    public int? Timeout { get; set; }\n\n    /// <summary>\n    /// Optional. Enables the parallel update processing by specifying the maximum number of updates to be processed simultaneously.\n    /// </summary>\n    public int? ParallelLimit { get; set; }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/README.md",
    "content": "# Telegram.BotAPI.Extensions\n\nThis library provides a set of extensions and utilities for the [Telegram.BotAPI](https://github.com/Eptagone/Telegram.BotAPI) library.\n\n## Features\n\n- Base classes to create telegram bots\n  - SimpleUpdateHandlerBase: An abstract class prepared to handle updates and dispatch it to the right method. It defines virtual methods for each type of update, including commands and errors.\n  - TelegramBotCommandAttribute: An attribute to mark methods as bot commands.\n  - BotCommandExtractor: A class to extract commands from a message text using regular expressions.\n  - HtmlTextFormatter: A class to format text using HTML tags.\n  - InlineKeyboardBuilder: A class to build inline keyboards.\n  - ReplyKeyboardBuilder: A class to build reply keyboards.\n- Extensions\n  - UpdateExtensions: A set of extension methods for Update objects.\n    - BuildFileDownloadLink: An extension method to build a download link for a file.\n\n## Installation\n\n### Install from the command line\n\n```PowerShell\ndotnet add PROJECT package Telegram.BotAPI.Extensions\n```\n\n[Get package from Nuget Web Site](https://www.nuget.org/packages/Telegram.BotAPI.Extensions/)\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/SimpleUpdateHandlerBase.cs",
    "content": "﻿// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.AvailableTypes;\nusing Telegram.BotAPI.Extensions.Commands;\nusing Telegram.BotAPI.GettingUpdates;\nusing Telegram.BotAPI.InlineMode;\nusing Telegram.BotAPI.Payments;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Represents a simple base class to handle incoming updates.\n/// </summary>\npublic abstract class SimpleUpdateHandlerBase : IUpdateHandler, IAsyncUpdateHandler\n{\n    private string? cmdBotUserName;\n\n    protected void SetBotUserName(string botUserName) => this.cmdBotUserName = botUserName;\n\n    #region Handlers\n    /// <inheritdoc/>\n    public virtual void OnUpdate(Update update)\n    {\n        try\n        {\n            if (update.Message != null)\n            {\n                this.OnMessage(update.Message);\n            }\n            else if (update.EditedMessage != null)\n            {\n                this.OnEditedMessage(update.EditedMessage);\n            }\n            else if (update.ChannelPost != null)\n            {\n                this.OnChannelPost(update.ChannelPost);\n            }\n            else if (update.EditedChannelPost != null)\n            {\n                this.OnEditedChannelPost(update.EditedChannelPost);\n            }\n            else if (update.BusinessConnection != null)\n            {\n                this.OnBusinessConnection(update.BusinessConnection);\n            }\n            else if (update.BusinessMessage != null)\n            {\n                this.OnBusinessMessage(update.BusinessMessage);\n            }\n            else if (update.EditedBusinessMessage != null)\n            {\n                this.OnEditedBusinessMessage(update.EditedBusinessMessage);\n            }\n            else if (update.DeletedBusinessMessages != null)\n            {\n                this.OnDeletedBusinessMessages(update.DeletedBusinessMessages);\n            }\n            else if (update.MessageReaction != null)\n            {\n                this.OnMessageReaction(update.MessageReaction);\n            }\n            else if (update.MessageReactionCount != null)\n            {\n                this.OnMessageReactionCount(update.MessageReactionCount);\n            }\n            else if (update.InlineQuery != null)\n            {\n                this.OnInlineQuery(update.InlineQuery);\n            }\n            else if (update.ChosenInlineResult != null)\n            {\n                this.OnChosenInlineResult(update.ChosenInlineResult);\n            }\n            else if (update.CallbackQuery != null)\n            {\n                this.OnCallbackQuery(update.CallbackQuery);\n            }\n            else if (update.ShippingQuery != null)\n            {\n                this.OnShippingQuery(update.ShippingQuery);\n            }\n            else if (update.PreCheckoutQuery != null)\n            {\n                this.OnPreCheckoutQuery(update.PreCheckoutQuery);\n            }\n            else if (update.Poll != null)\n            {\n                this.OnPoll(update.Poll);\n            }\n            else if (update.PollAnswer != null)\n            {\n                this.OnPollAnswer(update.PollAnswer);\n            }\n            else if (update.MyChatMember != null)\n            {\n                this.OnMyChatMember(update.MyChatMember);\n            }\n            else if (update.ChatMember != null)\n            {\n                this.OnChatMember(update.ChatMember);\n            }\n            else if (update.ChatJoinRequest != null)\n            {\n                this.OnChatJoinRequest(update.ChatJoinRequest);\n            }\n            else if (update.ChatBoost != null)\n            {\n                this.OnChatBoost(update.ChatBoost);\n            }\n            else if (update.RemovedChatBoost != null)\n            {\n                this.OnRemovedChatBoost(update.RemovedChatBoost);\n            }\n        }\n        catch (Exception exp)\n        {\n            this.OnException(exp);\n        }\n    }\n\n    /// <inheritdoc/>\n    public virtual async Task OnUpdateAsync(\n        Update update,\n        CancellationToken cancellationToken = default\n    )\n    {\n        try\n        {\n            if (update.Message != null)\n            {\n                await this.OnMessageAsync(update.Message, cancellationToken).ConfigureAwait(false);\n            }\n            else if (update.EditedMessage != null)\n            {\n                await this.OnEditedMessageAsync(update.EditedMessage, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.ChannelPost != null)\n            {\n                await this.OnChannelPostAsync(update.ChannelPost, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.EditedChannelPost != null)\n            {\n                await this.OnEditedChannelPostAsync(update.EditedChannelPost, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.BusinessConnection != null)\n            {\n                await this.OnBusinessConnectionAsync(update.BusinessConnection, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.BusinessMessage != null)\n            {\n                await this.OnBusinessMessageAsync(update.BusinessMessage, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.EditedBusinessMessage != null)\n            {\n                await this.OnEditedBusinessMessageAsync(\n                        update.EditedBusinessMessage,\n                        cancellationToken\n                    )\n                    .ConfigureAwait(false);\n            }\n            else if (update.DeletedBusinessMessages != null)\n            {\n                await this.OnDeletedBusinessMessagesAsync(\n                        update.DeletedBusinessMessages,\n                        cancellationToken\n                    )\n                    .ConfigureAwait(false);\n            }\n            else if (update.MessageReaction != null)\n            {\n                await this.OnMessageReactionAsync(update.MessageReaction, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.MessageReactionCount != null)\n            {\n                await this.OnMessageReactionCountAsync(\n                        update.MessageReactionCount,\n                        cancellationToken\n                    )\n                    .ConfigureAwait(false);\n            }\n            else if (update.InlineQuery != null)\n            {\n                await this.OnInlineQueryAsync(update.InlineQuery, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.ChosenInlineResult != null)\n            {\n                await this.OnChosenInlineResultAsync(update.ChosenInlineResult, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.CallbackQuery != null)\n            {\n                await this.OnCallbackQueryAsync(update.CallbackQuery, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.ShippingQuery != null)\n            {\n                await this.OnShippingQueryAsync(update.ShippingQuery, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.PreCheckoutQuery != null)\n            {\n                await this.OnPreCheckoutQueryAsync(update.PreCheckoutQuery, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.PurchasedPaidMedia != null)\n            {\n                await this.OnPurchasedPaidMediaAsync(update.PurchasedPaidMedia, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.Poll != null)\n            {\n                await this.OnPollAsync(update.Poll, cancellationToken).ConfigureAwait(false);\n            }\n            else if (update.PollAnswer != null)\n            {\n                await this.OnPollAnswerAsync(update.PollAnswer, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.MyChatMember != null)\n            {\n                await this.OnMyChatMemberAsync(update.MyChatMember, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.ChatMember != null)\n            {\n                await this.OnChatMemberAsync(update.ChatMember, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.ChatJoinRequest != null)\n            {\n                await this.OnChatJoinRequestAsync(update.ChatJoinRequest, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.ChatBoost != null)\n            {\n                await this.OnChatBoostAsync(update.ChatBoost, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n            else if (update.RemovedChatBoost != null)\n            {\n                await this.OnRemovedChatBoostAsync(update.RemovedChatBoost, cancellationToken)\n                    .ConfigureAwait(false);\n            }\n        }\n        catch (Exception exp)\n        {\n            await this.OnExceptionAsync(exp, cancellationToken).ConfigureAwait(false);\n        }\n    }\n\n    /// <summary>\n    /// Handles a message update.\n    /// </summary>\n    /// <param name=\"message\">Message.</param>\n    protected virtual void OnMessage(Message message)\n    {\n        if (\n            message.Entities?.Any(e => e.Type == \"bot_command\")\n            ?? message.CaptionEntities?.Any(e => e.Type == \"bot_command\")\n            ?? false\n        )\n        {\n            var (commandName, args, username) = BotCommandParser.Parse(\n                message.Text ?? message.Caption ?? string.Empty\n            );\n            if (\n                !string.IsNullOrEmpty(this.cmdBotUserName)\n                && !string.IsNullOrEmpty(username)\n                && username != this.cmdBotUserName\n            )\n            {\n                return;\n            }\n\n            this.OnCommand(message, commandName, args ?? string.Empty);\n        }\n    }\n\n    /// <summary>\n    /// Handles a message update.\n    /// </summary>\n    /// <param name=\"message\">Message.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    protected virtual Task OnMessageAsync(\n        Message message,\n        CancellationToken cancellationToken = default\n    )\n    {\n        if (\n            message.Entities?.Any(e => e.Type == \"bot_command\")\n            ?? message.CaptionEntities?.Any(e => e.Type == \"bot_command\")\n            ?? false\n        )\n        {\n            var (commandName, args, username) = BotCommandParser.Parse(\n                message.Text ?? message.Caption ?? string.Empty\n            );\n            if (\n                !string.IsNullOrEmpty(this.cmdBotUserName)\n                && !string.IsNullOrEmpty(username)\n                && username != this.cmdBotUserName\n            )\n            {\n                return Task.CompletedTask;\n            }\n\n            return this.OnCommandAsync(\n                message,\n                commandName,\n                args ?? string.Empty,\n                cancellationToken\n            );\n        }\n\n        return Task.CompletedTask;\n    }\n\n    /// <summary>\n    /// Handles an edited message update.\n    /// </summary>\n    /// <param name=\"message\">The edited message.</param>\n    protected virtual void OnEditedMessage(Message message) =>\n        this.OnEditedMessageAsync(message).Wait();\n\n    /// <summary>\n    /// Handles an edited message update.\n    /// </summary>\n    /// <param name=\"message\">The edited message.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnEditedMessageAsync(\n        Message message,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a channel post update.\n    /// </summary>\n    /// <param name=\"message\">The channel post.</param>\n    protected virtual void OnChannelPost(Message message) =>\n        this.OnChannelPostAsync(message).Wait();\n\n    /// <summary>\n    /// Handles a channel post update.\n    /// </summary>\n    /// <param name=\"message\">The channel post.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnChannelPostAsync(\n        Message message,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles an edited channel post update.\n    /// </summary>\n    /// <param name=\"message\">The edited channel post.</param>\n    protected virtual void OnEditedChannelPost(Message message) =>\n        this.OnEditedChannelPostAsync(message).Wait();\n\n    /// <summary>\n    /// Handles an edited channel post update.\n    /// </summary>\n    /// <param name=\"message\">The edited channel post.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnEditedChannelPostAsync(\n        Message message,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a business connection update.\n    /// </summary>\n    /// <param name=\"businessConnection\">The business connection.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnBusinessConnectionAsync(\n        BusinessConnection businessConnection,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a business connection update.\n    /// </summary>\n    /// <param name=\"businessConnection\">The business connection.</param>\n    protected virtual void OnBusinessConnection(BusinessConnection businessConnection) =>\n        this.OnBusinessConnectionAsync(businessConnection).Wait();\n\n    /// <summary>\n    /// Handles a business message update.\n    /// </summary>\n    /// <param name=\"businessMessage\">The business message.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnBusinessMessageAsync(\n        Message businessMessage,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a business message update.\n    /// </summary>\n    /// <param name=\"businessMessage\">The business message.</param>\n    protected virtual void OnBusinessMessage(Message businessMessage) =>\n        this.OnBusinessMessageAsync(businessMessage).Wait();\n\n    /// <summary>\n    /// Handles an edited business message update.\n    /// </summary>\n    /// <param name=\"editedBusinessMessage\">The edited business message.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnEditedBusinessMessageAsync(\n        Message editedBusinessMessage,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles an edited business message update.\n    /// </summary>\n    /// <param name=\"editedBusinessMessage\">The edited business message.</param>\n    protected virtual void OnEditedBusinessMessage(Message editedBusinessMessage) =>\n        this.OnEditedBusinessMessageAsync(editedBusinessMessage).Wait();\n\n    /// <summary>\n    /// Handles a deleted business messages update.\n    /// </summary>\n    /// <param name=\"deletedBusinessMessages\">The deleted business messages.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnDeletedBusinessMessagesAsync(\n        BusinessMessagesDeleted deletedBusinessMessages,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a deleted business messages update.\n    /// </summary>\n    /// <param name=\"deletedBusinessMessages\">The deleted business messages.</param>\n    protected virtual void OnDeletedBusinessMessages(\n        BusinessMessagesDeleted deletedBusinessMessages\n    ) => this.OnDeletedBusinessMessagesAsync(deletedBusinessMessages).Wait();\n\n    /// <summary>\n    /// Handles a message reaction update.\n    /// </summary>\n    /// <param name=\"messageReaction\">The message reaction.</param>\n    protected virtual void OnMessageReaction(MessageReactionUpdated messageReaction) =>\n        this.OnMessageReactionAsync(messageReaction).Wait();\n\n    /// <summary>\n    /// Handles a message reaction update.\n    /// </summary>\n    /// <param name=\"messageReaction\">The message reaction.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnMessageReactionAsync(\n        MessageReactionUpdated messageReaction,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a message reaction count update.\n    /// </summary>\n    /// <param name=\"messageReactionCount\">The message reaction count.</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual void OnMessageReactionCount(\n        MessageReactionCountUpdated messageReactionCount\n    ) => this.OnMessageReactionCountAsync(messageReactionCount).Wait();\n\n    /// <summary>\n    /// Handles a message reaction count update.\n    /// </summary>\n    /// <param name=\"messageReactionCount\">The message reaction count.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnMessageReactionCountAsync(\n        MessageReactionCountUpdated messageReactionCount,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles an inline query update.\n    /// </summary>\n    /// <param name=\"inlineQuery\">The inline query.</param>\n    protected virtual void OnInlineQuery(InlineQuery inlineQuery) =>\n        this.OnInlineQueryAsync(inlineQuery).Wait();\n\n    /// <summary>\n    /// Handles an inline query update.\n    /// </summary>\n    /// <param name=\"inlineQuery\">The inline query.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnInlineQueryAsync(\n        InlineQuery inlineQuery,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a chosen inline result update.\n    /// </summary>\n    /// <param name=\"chosenInlineResult\">The chosen inline result.</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual void OnChosenInlineResult(ChosenInlineResult chosenInlineResult) =>\n        this.OnChosenInlineResultAsync(chosenInlineResult).Wait();\n\n    /// <summary>\n    /// Handles a chosen inline result update.\n    /// </summary>\n    /// <param name=\"chosenInlineResult\">The chosen inline result.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnChosenInlineResultAsync(\n        ChosenInlineResult chosenInlineResult,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a callback query update.\n    /// </summary>\n    /// <param name=\"callbackQuery\">The callback query.</param>\n    protected virtual void OnCallbackQuery(CallbackQuery callbackQuery) =>\n        this.OnCallbackQueryAsync(callbackQuery).Wait();\n\n    /// <summary>\n    /// Handles a callback query update.\n    /// </summary>\n    /// <param name=\"callbackQuery\">The callback query.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnCallbackQueryAsync(\n        CallbackQuery callbackQuery,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a shipping query update.\n    /// </summary>\n    /// <param name=\"shippingQuery\">The shipping query.</param>\n    protected virtual void OnShippingQuery(ShippingQuery shippingQuery) =>\n        this.OnShippingQueryAsync(shippingQuery).Wait();\n\n    /// <summary>\n    /// Handles a shipping query update.\n    /// </summary>\n    /// <param name=\"shippingQuery\">The shipping query.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnShippingQueryAsync(\n        ShippingQuery shippingQuery,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a pre-checkout query update.\n    /// </summary>\n    /// <param name=\"preCheckoutQuery\">The pre-checkout query.</param>\n    protected virtual void OnPreCheckoutQuery(PreCheckoutQuery preCheckoutQuery) =>\n        this.OnPreCheckoutQueryAsync(preCheckoutQuery).Wait();\n\n    /// <summary>\n    /// Handles a pre-checkout query update.\n    /// </summary>\n    /// <param name=\"preCheckoutQuery\">The pre-checkout query.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnPreCheckoutQueryAsync(\n        PreCheckoutQuery preCheckoutQuery,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a purchased paid media update.\n    /// </summary>\n    /// <param name=\"purchasedPaidMedia\">The purchased paid media.</param>\n    protected virtual void OnPurchasedPaidMedia(PaidMediaPurchased purchasedPaidMedia) =>\n        this.OnPurchasedPaidMediaAsync(purchasedPaidMedia).Wait();\n\n    /// <summary>\n    /// Handles a purchased paid media update.\n    /// </summary>\n    /// <param name=\"purchasedPaidMedia\">The purchased paid media.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns></returns>\n    protected virtual Task OnPurchasedPaidMediaAsync(\n        PaidMediaPurchased purchasedPaidMedia,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a poll update.\n    /// </summary>\n    /// <param name=\"poll\">The poll.</param>\n    protected virtual void OnPoll(Poll poll) => this.OnPollAsync(poll).Wait();\n\n    /// <summary>\n    /// Handles a poll update.\n    /// </summary>\n    /// <param name=\"poll\">The poll.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnPollAsync(Poll poll, CancellationToken cancellationToken = default) =>\n        Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a poll answer update.\n    /// </summary>\n    /// <param name=\"pollAnswer\">The poll answer.</param>\n    protected virtual void OnPollAnswer(PollAnswer pollAnswer) =>\n        this.OnPollAnswerAsync(pollAnswer).Wait();\n\n    /// <summary>\n    /// Handles a poll answer update.\n    /// </summary>\n    /// <param name=\"pollAnswer\">The poll answer.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnPollAnswerAsync(\n        PollAnswer pollAnswer,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a my chat member update.\n    /// </summary>\n    /// <param name=\"myChatMember\">The my chat member.</param>\n    protected virtual void OnMyChatMember(ChatMemberUpdated myChatMember) =>\n        this.OnMyChatMemberAsync(myChatMember).Wait();\n\n    /// <summary>\n    /// Handles a my chat member update.\n    /// </summary>\n    /// <param name=\"myChatMember\">The my chat member.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnMyChatMemberAsync(\n        ChatMemberUpdated myChatMember,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a chat member update.\n    /// </summary>\n    /// <param name=\"chatMember\">The chat member.</param>\n    protected virtual void OnChatMember(ChatMemberUpdated chatMember) =>\n        this.OnChatMemberAsync(chatMember).Wait();\n\n    /// <summary>\n    /// Handles a chat member update.\n    /// </summary>\n    /// <param name=\"chatMember\">The chat member.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnChatMemberAsync(\n        ChatMemberUpdated chatMember,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a chat join request update.\n    /// </summary>\n    /// <param name=\"chatJoinRequest\">The chat join request.</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual void OnChatJoinRequest(ChatJoinRequest chatJoinRequest) =>\n        this.OnChatJoinRequestAsync(chatJoinRequest).Wait();\n\n    /// <summary>\n    /// Handles a chat join request update.\n    /// </summary>\n    /// <param name=\"chatJoinRequest\">The chat join request.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnChatJoinRequestAsync(\n        ChatJoinRequest chatJoinRequest,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a chat boost update.\n    /// </summary>\n    /// <param name=\"chatBoost\">The chat boost.</param>\n    protected virtual void OnChatBoost(ChatBoostUpdated chatBoost) =>\n        this.OnChatBoostAsync(chatBoost).Wait();\n\n    /// <summary>\n    /// Handles a chat boost update.\n    /// </summary>\n    /// <param name=\"chatBoost\">The chat boost.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnChatBoostAsync(\n        ChatBoostUpdated chatBoost,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles a removed chat boost update.\n    /// </summary>\n    /// <param name=\"removedChatBoost\">The removed chat boost.</param>\n    protected virtual void OnRemovedChatBoost(ChatBoostRemoved removedChatBoost) =>\n        this.OnRemovedChatBoostAsync(removedChatBoost).Wait();\n\n    /// <summary>\n    /// Handles a removed chat boost update.\n    /// </summary>\n    /// <param name=\"removedChatBoost\">The removed chat boost.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    /// <returns>A <see cref=\"Task\"/> representing the asynchronous operation.</returns>\n    protected virtual Task OnRemovedChatBoostAsync(\n        ChatBoostRemoved removedChatBoost,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n    #endregion\n\n    #region Extra Handlers\n    /// <summary>\n    /// Handles an incoming command extracted from the current message update.\n    /// </summary>\n    /// <param name=\"message\">Message.</param>\n    /// <param name=\"commandName\">Command name.</param>\n    /// <param name=\"args\">A string containing all the arguments of the command. It could be empty if the command has no arguments.</param>\n    protected virtual void OnCommand(Message message, string commandName, string args) =>\n        this.OnCommandAsync(message, commandName, args).Wait();\n\n    /// <summary>\n    /// Handles an incoming command extracted from the current message update.\n    /// </summary>\n    /// <param name=\"message\">Message.</param>\n    /// <param name=\"commandName\">Command name.</param>\n    /// <param name=\"args\">A string containing all the arguments of the command. It could be empty if the command has no arguments.</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    protected virtual Task OnCommandAsync(\n        Message message,\n        string commandName,\n        string args,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n\n    /// <summary>\n    /// Handles an exception thrown by the application.\n    /// </summary>\n    /// <param name=\"exp\">Exception</param>\n    protected virtual void OnException(Exception exp) => this.OnExceptionAsync(exp).Wait();\n\n    /// <summary>\n    /// Handles an exception thrown by the application.\n    /// </summary>\n    /// <param name=\"exp\">Exception</param>\n    /// <param name=\"cancellationToken\">Cancellation token</param>\n    protected virtual Task OnExceptionAsync(\n        Exception exp,\n        CancellationToken cancellationToken = default\n    ) => Task.CompletedTask;\n    #endregion\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/Telegram.BotAPI.Extensions.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <LangVersion>latest</LangVersion>\n    <EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>\n    <AnalysisLevel>latest-recommended</AnalysisLevel>\n    <PackageLicenseFile>LICENSE</PackageLicenseFile>\n    <NeutralLanguage>en</NeutralLanguage>\n    <Authors>Quetzal Rivera</Authors>\n    <Copyright>Quetzal Rivera 2025 ©</Copyright>\n    <PackageProjectUrl>https://github.com/Eptagone/Telegram.BotAPI</PackageProjectUrl>\n    <RepositoryUrl>https://github.com/Eptagone/Telegram.BotAPI</RepositoryUrl>\n    <PackageTags>Telegram;Bot;API;Extensions</PackageTags>\n    <Version>0.8.2</Version>\n    <Title>Extensions for Telegram.BotAPI package</Title>\n    <PackageIcon>packicon.png</PackageIcon>\n    <PackageReadmeFile>README.md</PackageReadmeFile>\n    <PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"..\\..\\..\\LICENSE\">\n      <Pack>True</Pack>\n      <PackagePath>\\</PackagePath>\n    </None>\n    <None Include=\"packicon.png\">\n      <Pack>True</Pack>\n      <PackagePath></PackagePath>\n    </None>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Telegram.BotAPI\" Version=\"9.4.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"README.md\">\n      <Pack>True</Pack>\n      <PackagePath>\\</PackagePath>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/TelegramBotClientExtensions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Globalization;\nusing File = Telegram.BotAPI.AvailableTypes.File;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Defines aditional methods for <see cref=\"ITelegramBotClient\"/>.\n/// </summary>\npublic static class TelegramBotClientExtensions\n{\n    /// <summary>\n    /// Constructs the URL to download a Telegram File.\n    /// </summary>\n    /// <remarks>Don't use this method if you're using the TBA server with --local mode enabled.</remarks>\n    /// <param name=\"client\">The Telegram Bot Client.</param>\n    /// <param name=\"file\">The File.</param>\n    /// <exception cref=\"ArgumentNullException\"></exception>\n    public static string? BuildFileDownloadLink(this ITelegramBotClient client, File file) =>\n        string.IsNullOrEmpty(file.FilePath) ? null : client.BuildFileDownloadLink(file.FilePath!);\n\n    /// <summary>\n    /// Constructs the URL to download a Telegram File.\n    /// </summary>\n    /// <remarks>Don't use this method if you're using the TBA server with --local mode enabled.</remarks>\n    /// <param name=\"client\">The Telegram Bot Client.</param>\n    /// <param name=\"filePath\">The file path.</param>\n    /// <exception cref=\"ArgumentNullException\"></exception>\n    public static string BuildFileDownloadLink(this ITelegramBotClient client, string filePath)\n    {\n        var safePath = filePath;\n\n        // Remove the bot token from the path\n        var tokenIndex = safePath.IndexOf(\n            client.Options.BotToken,\n            StringComparison.InvariantCulture\n        );\n        if (tokenIndex != -1)\n        {\n            safePath = safePath.Substring(tokenIndex + client.Options.BotToken.Length);\n        }\n        safePath = safePath.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);\n\n        return $\"{client.Options.ServerAddress.TrimEnd(Path.AltDirectorySeparatorChar)}/file/bot{client.Options.BotToken}/{safePath.TrimStart(Path.AltDirectorySeparatorChar)}\";\n    }\n\n    /// <summary>\n    /// Constructs the URL to download a Telegram File using the format <c>https://api.telegram.org/file/bot&lt;token&gt;/&lt;file_path&gt;</c>\n    /// </summary>\n    /// <remarks>\n    /// <b>Note</b>: If you're using a local <b>TBAS (Telegram Bot API Server)</b> instance, this method will trim the bot folder (e.g. <c>/var/tbas/{BOT_TOKEN}</c>) from the file path and generate the URL accordingly. However, local TBAS doesn't support this kind of download urls. So, you'll need to configure your server to serve static files in that way in order to download files using this kind of URL.\n    /// </remarks>\n    /// <param name=\"client\">The Telegram Bot Client instance.</param>\n    /// <param name=\"file\">The File.</param>\n    /// <returns></returns>\n    public static Uri? BuildFileDownloadUri(this ITelegramBotClient client, File file) =>\n        string.IsNullOrEmpty(file.FilePath) ? null : client.BuildFileDownloadUri(file.FilePath!);\n\n    /// <summary>\n    /// Constructs the URL to download a Telegram File using the format <c>https://api.telegram.org/file/bot&lt;token&gt;/&lt;file_path&gt;</c>\n    /// </summary>\n    /// <remarks>\n    /// <b>Note</b>: If you're using a local <b>TBAS (Telegram Bot API Server)</b> instance, this method will trim the bot folder (e.g. <c>/var/tbas/{BOT_TOKEN}</c>) from the file path and generate the URL accordingly. However, local TBAS doesn't support this kind of download urls. So, you'll need to configure your server to serve static files in that way in order to download files using this kind of URL.\n    /// </remarks>\n    /// <param name=\"client\">The Telegram Bot Client instance.</param>\n    /// <param name=\"filePath\">The file path.</param>\n    /// <returns></returns>\n    public static Uri BuildFileDownloadUri(this ITelegramBotClient client, string filePath)\n    {\n        return new Uri(client.BuildFileDownloadLink(filePath));\n    }\n}\n"
  },
  {
    "path": "src/library/Telegram.BotAPI.Extensions/UpdateExtensions.cs",
    "content": "// Copyright (c) 2026 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Reflection;\nusing System.Text.Json.Serialization;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Telegram.BotAPI.Extensions;\n\n/// <summary>\n/// Extensions for <see cref=\"Update\"/> class.\n/// </summary>\npublic static class UpdateExtensions\n{\n    /// <summary>\n    /// Retrieves the type of the update by examining the properties of the <see cref=\"Update\"/> object.\n    /// </summary>\n    /// <param name=\"update\">The instance of <see cref=\"Update\"/> whose type is to be determined.</param>\n    /// <returns>The JSON property name of the first non-null property in the <see cref=\"Update\"/> instance, excluding the UpdateId property. This is used to determine the type of the update.</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when the provided <see cref=\"Update\"/> instance is null.</exception>\n    /// <exception cref=\"InvalidOperationException\">Thrown when the <see cref=\"Update\"/> instance does not have any valid properties.</exception>\n    public static string GetUpdateType(this Update update)\n    {\n        if (update is null)\n        {\n            throw new ArgumentNullException(nameof(update));\n        }\n\n        // Get all properties of the Update class where the value is not null.\n        var properties = typeof(Update)\n            .GetProperties(BindingFlags.Public | BindingFlags.Instance)\n            .Where(p => p.GetValue(update) != null);\n        // Get the json name of the first property ignoring UpdateId.\n        var property =\n            properties.FirstOrDefault(p => p.Name != nameof(Update.UpdateId))\n            ?? throw new InvalidOperationException(\"The update is not valid.\");\n\n        return property.GetCustomAttribute<JsonPropertyNameAttribute>()!.Name;\n    }\n}\n"
  },
  {
    "path": "src/tests/Telegram.BotAPI.Tests/Args.cs",
    "content": "﻿// Copyright (c) 2024 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI.Tests;\n\npublic sealed class Args\n{\n    [Theory]\n    [InlineData(777000, \"Pizza\", \"pepperoni, ham, cheese\", \"pizza\", \"PROVIDER TOKEN\", \"USD\")]\n    [InlineData(123456789, \"Burger\", \"ham, avocado, cheese\", \"burger\", \"PROVIDER TOKEN\", \"USD\")]\n    public void SendInvoice(\n        long chatId,\n        string title,\n        string description,\n        string payload,\n        string providerToken,\n        string currency\n    )\n    {\n        var prices = new LabeledPrice[] { new(\"Large\", 499), new(\"Small\", 199) };\n        var invoiceArgs = new SendInvoiceArgs(chatId, title, description, payload, currency, prices)\n        {\n            ProviderToken = providerToken,\n        };\n        Assert.IsType<long>(invoiceArgs.ChatId);\n    }\n}\n"
  },
  {
    "path": "src/tests/Telegram.BotAPI.Tests/CommandParserTests.cs",
    "content": "﻿// Copyright (c) 2024 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing Telegram.BotAPI.Extensions.Commands;\n\nnamespace Telegram.BotAPI.Tests;\n\npublic sealed class CommandParserTests\n{\n    [Theory]\n    [InlineData(@\"/start\", \"start\")]\n    [InlineData(@\"/help\", \"help\")]\n    [InlineData(@\"/example@potato\", \"example\")]\n    [InlineData(@\"/potato@robert\", \"potato\")]\n    [InlineData(@\"/potato@robert cat\", \"potato\")]\n    public void ParseCommandName(string text, string expectedCommandName)\n    {\n        var (commandName, _, _) = BotCommandParser.Parse(text);\n        Assert.Equal(expectedCommandName, commandName);\n    }\n\n    [Theory]\n    [InlineData(@\"/start\", \"\")]\n    [InlineData(@\"/help\", \"\")]\n    [InlineData(@\"/example@potato\", \"\")]\n    [InlineData(@\"/potato@robert\", \"\")]\n    [InlineData(@\"/potato@robert cat\", \"cat\")]\n    public void ParseParameters(string text, string expectedParameters)\n    {\n        var (_, parameters, _) = BotCommandParser.Parse(text);\n        Assert.Equal(expectedParameters, parameters);\n    }\n\n    [Theory]\n    [InlineData(@\"/start\", \"\")]\n    [InlineData(@\"/help\", \"\")]\n    [InlineData(@\"/example@potato\", \"potato\")]\n    [InlineData(@\"/potato@robert\", \"robert\")]\n    [InlineData(@\"/potato@robert cat\", \"robert\")]\n    public void ParseUsername(string text, string expectedUsername)\n    {\n        var (_, _, username) = BotCommandParser.Parse(text);\n        Assert.Equal(expectedUsername, username);\n    }\n\n    [Theory]\n    [InlineData(@\"Hello world\")]\n    [InlineData(@\"A cat driver\")]\n    [InlineData(@\"!badcommand\")]\n    [InlineData(@\"the command is /commandName\")]\n    public void FailParse(string text)\n    {\n        Assert.Throws<ArgumentException>(() => BotCommandParser.Parse(text));\n    }\n\n    [Theory]\n    [InlineData(@\"Hello world\", false)]\n    [InlineData(@\"\", false)]\n    [InlineData(@\"!badcommand\", false)]\n    [InlineData(@\"the command is /commandName\", false)]\n    [InlineData(@\"/start\", true)]\n    [InlineData(@\"/help\", true)]\n    [InlineData(@\"/example@potato\", true)]\n    [InlineData(@\"/potato@robert\", true)]\n    [InlineData(@\"/potato@robert cat\", true)]\n    public void TryParse(string text, bool expectedResult)\n    {\n        Assert.Equal(expectedResult, BotCommandParser.TryParse(text, out _));\n    }\n}\n"
  },
  {
    "path": "src/tests/Telegram.BotAPI.Tests/ConverterTests.cs",
    "content": "﻿// Copyright (c) 2024 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Linq;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing Telegram.BotAPI.Extensions;\n\nnamespace Telegram.BotAPI.Tests;\n\npublic sealed class ConverterTests(ITestOutputHelper outputHelper)\n{\n    private readonly ITestOutputHelper outputHelper = outputHelper;\n\n    [Theory]\n    [InlineData(\n        @\"{\n      \"\"user\"\": {\n        \"\"id\"\": 777000,\n        \"\"is_bot\"\": false,\n        \"\"first_name\"\": \"\"Telegram\"\",\n        \"\"username\"\": \"\"Telegram\"\",\n        \"\"language_code\"\": \"\"en\"\"\n      },\n      \"\"status\"\": \"\"creator\"\",\n      \"\"custom_title\"\": \"\"T\"\",\n      \"\"is_anonymous\"\": false\n    }\"\n    )]\n    [InlineData(\n        @\"{\n      \"\"user\"\": {\n        \"\"id\"\": 777000,\n        \"\"is_bot\"\": false,\n        \"\"first_name\"\": \"\"Telegram\"\"\n      },\n      \"\"status\"\": \"\"member\"\"\n    }\"\n    )]\n    [InlineData(\n        @\"{\n      \"\"user\"\": {\n        \"\"id\"\": 2383311034,\n        \"\"is_bot\"\": false,\n        \"\"first_name\"\": \"\"♡︎mori\"\",\n        \"\"username\"\": \"\"user\"\"\n      },\n      \"\"status\"\": \"\"administrator\"\",\n      \"\"can_be_edited\"\": false,\n      \"\"can_manage_chat\"\": true,\n      \"\"can_change_info\"\": true,\n      \"\"can_delete_messages\"\": true,\n      \"\"can_invite_users\"\": true,\n      \"\"can_restrict_members\"\": true,\n      \"\"can_pin_messages\"\": true,\n      \"\"can_promote_members\"\": false,\n      \"\"can_manage_voice_chats\"\": true,\n      \"\"is_anonymous\"\": false\n    }\"\n    )]\n    public void DeserializeChatMember(string jsonChatMember)\n    {\n        var chatMember = JsonSerializer.Deserialize<ChatMember>(jsonChatMember);\n        switch (chatMember?.Status)\n        {\n            case \"member\":\n                Assert.IsType<ChatMemberMember>(chatMember);\n                break;\n            case \"kicked\":\n                Assert.IsType<ChatMemberBanned>(chatMember);\n                break;\n            case \"administrator\":\n                Assert.IsType<ChatMemberAdministrator>(chatMember);\n                break;\n            case \"creator\":\n                Assert.IsType<ChatMemberOwner>(chatMember);\n                break;\n            case \"restricted\":\n                Assert.IsType<ChatMemberRestricted>(chatMember);\n                break;\n            case \"left\":\n                Assert.IsType<ChatMemberLeft>(chatMember);\n                break;\n            default:\n                break;\n        }\n    }\n\n    [Theory]\n    [InlineData(\n        @\"{\n      \"\"type\"\": \"\"solid\"\",\n      \"\"color\"\": 128\n    }\"\n    )]\n    [InlineData(\n        @\"{\n      \"\"type\"\": \"\"gradient\"\",\n      \"\"top_color\"\": 1,\n      \"\"bottom_color\"\": 2,\n      \"\"rotation_angle\"\": 3\n    }\"\n    )]\n    [InlineData(\n        @\"{\n      \"\"type\"\": \"\"freeform_gradient\"\",\n      \"\"colors\"\": [1,2,3]\n    }\"\n    )]\n    public void DeserializeBackgroundFill(string jsonBackgroundFill)\n    {\n        var chatMember = JsonSerializer.Deserialize<BackgroundFill>(jsonBackgroundFill);\n        switch (chatMember.Type)\n        {\n            case \"solid\":\n                Assert.IsType<BackgroundFillSolid>(chatMember);\n                break;\n            case \"gradient\":\n                Assert.IsType<BackgroundFillGradient>(chatMember);\n                break;\n            case \"freeform_gradient\":\n                Assert.IsType<BackgroundFillFreeformGradient>(chatMember);\n                Assert.Equal(3, ((BackgroundFillFreeformGradient)chatMember).Colors.Count());\n                break;\n            default:\n                break;\n        }\n    }\n\n    [Fact]\n    public void SerializeChatMemberReturnsJsonString()\n    {\n        var members = new ChatMember[]\n        {\n            new ChatMemberMember\n            {\n                User = new User\n                {\n                    Id = 777000,\n                    FirstName = \"Telegram\",\n                    IsBot = false,\n                },\n            },\n            new ChatMemberBanned\n            {\n                User = new User\n                {\n                    Id = 777000,\n                    FirstName = \"Sadman\",\n                    IsBot = false,\n                },\n                UntilDate = (int)TimeSpan.FromSeconds(3819829182).TotalSeconds,\n            },\n            new ChatMemberOwner\n            {\n                CustomTitle = \"God\",\n                User = new User\n                {\n                    Id = 777000,\n                    FirstName = \"Telegram\",\n                    IsBot = false,\n                },\n            },\n            new ChatMemberAdministrator\n            {\n                CustomTitle = \"Duckman\",\n                User = new User\n                {\n                    Id = 777000,\n                    FirstName = \"Cat-Dog ♡︎\",\n                    IsBot = false,\n                },\n                CanBeEdited = true,\n                CanRestrictMembers = true,\n                CanManageVideoChats = true,\n            },\n        };\n        var options = new JsonSerializerOptions\n        {\n            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,\n        };\n        foreach (var chatMember in members)\n        {\n            var jsonObject = JsonSerializer.Serialize(chatMember, options);\n            this.outputHelper.WriteLine(jsonObject);\n            Assert.NotNull(jsonObject);\n        }\n    }\n\n    [Fact]\n    public void SerializeAndDeserializeInlineKeyboardMarkup()\n    {\n        var keyboard = new InlineKeyboardBuilder()\n            .AppendCallbackData(\"Your text\", \"example\")\n            .AppendCallbackData(\"Your chatId\", \"example\")\n            .AppendRow()\n            .AppendCallbackData(\"Your text\", \"example\");\n        var markup = new InlineKeyboardMarkup(keyboard);\n\n        var options = new JsonSerializerOptions\n        {\n            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,\n        };\n\n        var rawText = JsonSerializer.Serialize(markup, options);\n        this.outputHelper.WriteLine(rawText);\n        var keyboardAgain = JsonSerializer.Deserialize<InlineKeyboardMarkup>(rawText, options);\n        Assert.Equal(rawText, JsonSerializer.Serialize(keyboardAgain, options));\n    }\n\n    [Fact]\n    public void SerializeAndDeserializeTransactionPartner()\n    {\n        var partner = new TransactionPartnerFragment();\n        var options = new JsonSerializerOptions\n        {\n            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,\n        };\n        var rawText = JsonSerializer.Serialize(partner, options);\n        this.outputHelper.WriteLine(rawText);\n        var partnerAgain = JsonSerializer.Deserialize<TransactionPartnerFragment>(rawText, options);\n        Assert.Equal(rawText, JsonSerializer.Serialize(partnerAgain, options));\n    }\n\n    [Fact]\n    public void SerializeAndDeserializeRevenueWithdrawalState()\n    {\n        var state = new RevenueWithdrawalStateSucceeded();\n\n        var options = new JsonSerializerOptions\n        {\n            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,\n        };\n        var rawText = JsonSerializer.Serialize(state, options);\n        this.outputHelper.WriteLine(rawText);\n        var stateAgain = JsonSerializer.Deserialize<RevenueWithdrawalStateSucceeded>(\n            rawText,\n            options\n        );\n        Assert.Equal(rawText, JsonSerializer.Serialize(stateAgain, options));\n    }\n}\n"
  },
  {
    "path": "src/tests/Telegram.BotAPI.Tests/ExtensionsTests.cs",
    "content": "// Copyright (c) 2024 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing Telegram.BotAPI.Extensions;\nusing Telegram.BotAPI.GettingUpdates;\n\nnamespace Telegram.BotAPI.Tests;\n\npublic sealed class ExtensionsTests\n{\n    [Theory]\n    [InlineData(\n        @\"{\"\"update_id\"\":1,\"\"message\"\":{\"\"message_id\"\":1,\"\"date\"\":1,\"\"chat\"\":{\"\"id\"\":1,\"\"type\"\":\"\"private\"\"},\"\"text\"\":\"\"test\"\"}}\",\n        \"message\"\n    )]\n    [InlineData(\n        @\"{\"\"update_id\"\":1,\"\"edited_message\"\":{\"\"message_id\"\":1,\"\"date\"\":1,\"\"chat\"\":{\"\"id\"\":1,\"\"type\"\":\"\"private\"\"},\"\"text\"\":\"\"test\"\"}}\",\n        \"edited_message\"\n    )]\n    public void GetUpdateType(string jsonUpdate, string updateType)\n    {\n        var update = JsonSerializer.Deserialize<Update>(jsonUpdate);\n        var uType = update?.GetUpdateType();\n        Assert.Equal(uType, updateType);\n    }\n\n    [Fact]\n    public void BuildInlineKeyboard()\n    {\n        InlineKeyboardButton[][] keyboard = new InlineKeyboardBuilder()\n            .AppendUrl(\"Google\", \"https://www.google.com\")\n            .AppendCallbackData(\"Callback\", \"callback\")\n            .AppendWebApp(\"WebApp\", new WebAppInfo(\"https://www.google.com\"))\n            .AppendLoginUrl(\"Login\", new LoginUrl(\"https://www.google.com\"))\n            .AppendRow()\n            .AppendUrl(\"Google\", \"https://www.google.com\");\n\n        Assert.Equal(2, keyboard.Length);\n        Assert.Equal(4, keyboard[0].Length);\n        Assert.Single(keyboard[1]);\n\n        var json = JsonSerializer.Serialize(\n            keyboard,\n            new JsonSerializerOptions\n            {\n                DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,\n            }\n        );\n        Assert.Equal(\n            @\"[[{\"\"text\"\":\"\"Google\"\",\"\"url\"\":\"\"https://www.google.com\"\"},{\"\"text\"\":\"\"Callback\"\",\"\"callback_data\"\":\"\"callback\"\"},{\"\"text\"\":\"\"WebApp\"\",\"\"web_app\"\":{\"\"url\"\":\"\"https://www.google.com\"\"}},{\"\"text\"\":\"\"Login\"\",\"\"login_url\"\":{\"\"url\"\":\"\"https://www.google.com\"\"}}],[{\"\"text\"\":\"\"Google\"\",\"\"url\"\":\"\"https://www.google.com\"\"}]]\",\n            json\n        );\n    }\n}\n"
  },
  {
    "path": "src/tests/Telegram.BotAPI.Tests/MethodTests.cs",
    "content": "﻿// Copyright (c) 2024 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nnamespace Telegram.BotAPI.Tests;\n\npublic sealed class MethodTests\n{\n    [Fact]\n    public void SendMessageWithNullClient()\n    {\n        Assert.Throws<ArgumentNullException>(() =>\n        {\n            AvailableMethodsExtensions.SendMessage(null, 0, \"Hello World\");\n        });\n    }\n}\n"
  },
  {
    "path": "src/tests/Telegram.BotAPI.Tests/Serialization.cs",
    "content": "﻿// Copyright (c) 2024 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nusing System.Linq;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing Telegram.BotAPI.InlineMode;\nusing Telegram.BotAPI.UpdatingMessages;\n\nnamespace Telegram.BotAPI.Tests;\n\npublic sealed class Serialization(ITestOutputHelper outputHelper)\n{\n    private static readonly JsonSerializerOptions options = new()\n    {\n        DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,\n    };\n\n    private readonly ITestOutputHelper _outputHelper = outputHelper;\n\n    [Fact]\n    public void SerializeEditMessageLiveLocationArgs()\n    {\n        var obj = new EditMessageLiveLocationArgs(1, 0);\n\n        var rawText = JsonSerializer.Serialize(obj, options);\n        this._outputHelper.WriteLine(rawText);\n    }\n\n    [Fact]\n    public void SerializeReplyMarkup()\n    {\n        ReplyMarkup obj = new InlineKeyboardMarkup(\n            [\n                [new InlineKeyboardButton(\"Button\") { CallbackData = \"data\" }],\n            ]\n        );\n\n        var rawText = JsonSerializer.Serialize(obj, options);\n        this._outputHelper.WriteLine(rawText);\n        var deserializeMarkup = JsonSerializer.Deserialize<ReplyMarkup>(rawText, options);\n        Assert.IsType<InlineKeyboardMarkup>(deserializeMarkup);\n        var inlineKeyboard = ((InlineKeyboardMarkup)deserializeMarkup).InlineKeyboard;\n        Assert.Equal(\"Button\", inlineKeyboard.First().First().Text);\n        Assert.Equal(\"data\", inlineKeyboard.First().First().CallbackData);\n    }\n\n    [Fact]\n    public void SerializeSendGameArgs()\n    {\n        var args = new SendGameArgs(777777, \"Welcome to my game\");\n\n        var rawText = JsonSerializer.Serialize(args, options);\n        this._outputHelper.WriteLine(rawText);\n        var deserializeArgs = JsonSerializer.Deserialize<JsonDocument>(rawText, options);\n        Assert.Equal(777777, deserializeArgs?.RootElement.GetProperty(\"chat_id\").GetInt64());\n        Assert.Equal(\n            \"Welcome to my game\",\n            deserializeArgs?.RootElement.GetProperty(\"game_short_name\").GetString()\n        );\n    }\n\n    [Fact]\n    public void SerializeQueryResultWithTextMessageContent()\n    {\n        var result = new InlineQueryResultArticle\n        {\n            Id = \"1\",\n            Title = \"Title\",\n            InputMessageContent = new InputTextMessageContent(\"Hello, World!\")\n            {\n                ParseMode = \"MarkdownV2\",\n            },\n            ReplyMarkup = new InlineKeyboardMarkup(\n                [\n                    [new InlineKeyboardButton(\"Button\") { CallbackData = \"data\" }],\n                ]\n            ),\n        };\n\n        var rawText = JsonSerializer.Serialize(result, options);\n        this._outputHelper.WriteLine(rawText);\n        var deserializeResult = JsonSerializer.Deserialize<InlineQueryResult>(rawText, options);\n        Assert.IsType<InlineQueryResultArticle>(deserializeResult);\n        Assert.Equal(\n            \"data\",\n            deserializeResult.ReplyMarkup?.InlineKeyboard.First().First().CallbackData\n        );\n        Assert.IsType<InputTextMessageContent>(\n            ((InlineQueryResultArticle)deserializeResult).InputMessageContent\n        );\n        Assert.Equal(\n            \"Hello, World!\",\n            (\n                (InputTextMessageContent)\n                    ((InlineQueryResultArticle)deserializeResult).InputMessageContent\n            ).MessageText\n        );\n    }\n}\n"
  },
  {
    "path": "src/tests/Telegram.BotAPI.Tests/Telegram.BotAPI.Tests.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <IsPackable>false</IsPackable>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.11.1\" />\n    <PackageReference Include=\"System.Text.Json\" Version=\"10.0.7\" />\n    <PackageReference Include=\"xunit\" Version=\"2.9.2\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.8.2\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"coverlet.collector\" Version=\"6.0.2\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference\n      Include=\"..\\..\\library\\Telegram.BotAPI.Extensions\\Telegram.BotAPI.Extensions.csproj\" />\n    <ProjectReference Include=\"..\\..\\library\\Telegram.BotAPI\\Telegram.BotAPI.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/tests/Telegram.BotAPI.Tests/Usings.cs",
    "content": "﻿// Copyright (c) 2024 Quetzal Rivera.\n// Licensed under the MIT License, See LICENCE in the project root for license information.\n\nglobal using System;\nglobal using Telegram.BotAPI.AvailableMethods;\nglobal using Telegram.BotAPI.AvailableTypes;\nglobal using Telegram.BotAPI.Games;\nglobal using Telegram.BotAPI.Payments;\nglobal using Xunit;\nglobal using Xunit.Abstractions;\n"
  },
  {
    "path": "tools/.editorconfig",
    "content": "[*.{cs,csx}]\nindent_style = space\ncharset = utf-8\ndotnet_style_qualification_for_field = true:suggestion\ndotnet_style_qualification_for_property = true:suggestion\ndotnet_style_qualification_for_method = true:suggestion\ndotnet_style_qualification_for_event = true:suggestion"
  },
  {
    "path": "tools/.vscode/launch.json",
    "content": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \".NET Script Debug\",\n      \"type\": \"coreclr\",\n      \"request\": \"launch\",\n      \"program\": \"${env:HOME}/.dotnet/tools/dotnet-script\",\n      \"args\": [\n        \"${file}\"\n      ],\n      \"windows\": {\n        \"program\": \"dotnet\",\n        \"args\": [\n          \"exec\",\n          \"${env:USERPROFILE}/.dotnet/tools/.store/dotnet-script/1.5.0/dotnet-script/1.5.0/tools/net8.0/any/dotnet-script.dll\",\n          \"./main.csx\"\n        ],\n      },\n      \"cwd\": \"${workspaceFolder}\",\n      \"stopAtEntry\": false,\n    }\n  ]\n}"
  },
  {
    "path": "tools/.vscode/settings.json",
    "content": "{\n    \"dotnet.server.useOmnisharp\": true,\n}"
  },
  {
    "path": "tools/README.md",
    "content": "# Tools\n\nThis folder contains an advanced script for code generation. It scrapes the [telegram bot api documentation](https://core.telegram.org/bots/api) to get all required information and generates the code for all models and extension methods for this library.\n\nFeel free to use and/or modify the script for your own needs.\n\n## Requirements\n\n- .NET 8 or higher\n- [dotnet-script](https://github.com/dotnet-script/dotnet-script)\n\n## Usage\n\n```bash\n# Linux/Mac\nmain.csx\n# or with output directory\nmain.csx <output-directory>\n\n# Windows\ndotnet script main.csx\n# or with output directory\ndotnet script main.csx <output-directory>\n```\n\n> **Note:** If you don't specify an output directory, the script will generate the code in a `publish` folder.\n"
  },
  {
    "path": "tools/constants.csx",
    "content": "#nullable enable\n\npublic static class ScriptConstants\n{\n    public const string PROJECT_NAME = \"Telegram.BotAPI\";\n    public const string TELEGRAM_CORE_WEBSITE_URL = \"https://core.telegram.org\";\n    public const string TELEGRAM_BOT_API_DOCS_URL = \"https://core.telegram.org/bots/api\";\n    public const string INPUT_FILE_TYPE_NAME = \"InputFile\";\n    public const string TEMPLATE_RESULT_TYPE_NAME = \"TResult\";\n    public static string DEFAULT_OUTPUT_PATH = Path.Combine(\n        Directory.GetCurrentDirectory(),\n        \"publish\"\n    );\n}\n"
  },
  {
    "path": "tools/generator.csx",
    "content": "#nullable enable\n#r \"nuget: Humanizer.Core, 2.14.1\"\n#load \"models.csx\"\n#load \"constants.csx\"\n\nusing Humanizer;\n\nstatic void GenerateClasses(IEnumerable<ClassDefinition> classes, string outputPath)\n{\n    foreach (var @class in classes)\n    {\n        var builder = new StringBuilder();\n        builder.AppendLine(\"// Copyright (c) 2026 Quetzal Rivera.\");\n        builder.AppendLine(\n            \"// Licensed under the MIT License, See LICENCE in the project root for license information.\"\n        );\n        builder.AppendLine(\"//* This file is auto-generated. Don't edit it manually!\");\n        builder.AppendLine();\n        var usings = @class.Usings.Where(u => u != @class.Namespace);\n        // if (@class.ClassType == ClassModelType.BaseModel && @class.Properties.Any())\n        if (@class.ClassType == ClassModelType.BaseModel)\n        {\n            builder.AppendLine($\"using {ScriptConstants.PROJECT_NAME}.Converters;\");\n            if (!usings.Any())\n            {\n                builder.AppendLine();\n            }\n        }\n        if (usings.Any())\n        {\n            foreach (var @using in usings)\n            {\n                builder.AppendLine($\"using {@using};\");\n            }\n            builder.AppendLine();\n        }\n        builder.AppendLine($\"namespace {@class.Namespace};\");\n        builder.AppendLine();\n        builder.AppendLine(\"/// <summary>\");\n        foreach (var docLine in @class.Description)\n        {\n            builder.AppendLine($\"/// {docLine}\");\n        }\n        builder.AppendLine(\"/// </summary>\");\n        // Open the class according to its type\n        switch (@class.ClassType)\n        {\n            case ClassModelType.ExtensionMethods:\n            case ClassModelType.Constants:\n                builder.AppendLine($\"public static partial class {@class.Name}\");\n                break;\n            case ClassModelType.BaseModel:\n                //// If the class has properties, set a JSON converter\n                // if (@class.Properties.Any())\n                // {\n                //    builder.AppendLine($\"[JsonConverter(typeof({@class.Name}Converter))]\");\n                // }\n                builder.AppendLine($\"[JsonConverter(typeof({@class.Name}Converter))]\");\n                builder.AppendLine($\"public abstract class {@class.Name}\");\n                break;\n            default:\n                builder.Append($\"public class {@class.Name}\");\n                var baseClassName =\n                    @class.ClassType == ClassModelType.MethodArgumentsWithAttachments\n                        ? \"AttachedFilesArgsBase\"\n                        : @class.BaseClass?.Name;\n                if (!string.IsNullOrEmpty(baseClassName))\n                {\n                    builder.AppendLine($\" : {baseClassName}\");\n                }\n                else\n                {\n                    builder.AppendLine();\n                }\n                break;\n        }\n        builder.AppendLine(\"{\");\n\n        // Render extension methods\n        foreach (var method in @class.Methods)\n        {\n            foreach (var isAsync in new[] { false, true })\n            {\n                var returnType = isAsync ? $\"Task<{method.ReturnType}>\" : method.ReturnType;\n                var classMethodName = isAsync ? $\"{method.Name}Async\" : method.Name;\n                builder.AppendLine(\"\\t/// <summary>\");\n                foreach (var docLine in method.Description)\n                {\n                    builder.AppendLine($\"\\t/// {docLine}\");\n                }\n                builder.AppendLine(\"\\t/// </summary>\");\n                builder.AppendLine(\n                    \"\\t/// <param name=\\\"client\\\">The <see cref=\\\"ITelegramBotClient\\\"/> instance.</param>\"\n                );\n                foreach (var param in method.Parameters)\n                {\n                    builder.AppendLine(\n                        $\"\\t/// <param name=\\\"{param.Name}\\\">{string.Join(' ', param.Description)}</param>\"\n                    );\n                }\n                if (isAsync)\n                {\n                    builder.AppendLine(\n                        \"\\t/// <param name=\\\"cancellationToken\\\">The cancellation token to cancel operation.</param>\"\n                    );\n                }\n                builder.AppendLine(\n                    \"\\t/// <exception cref=\\\"ArgumentNullException\\\">Thrown if <paramref name=\\\"client\\\"/> is <c>null</c>.</exception>\"\n                );\n                builder.AppendLine(\n                    \"\\t/// <exception cref=\\\"BotRequestException\\\">Thrown if the request to the Telegram Bot API fails.</exception>\"\n                );\n                // TODO: Generate a proper returns tag\n                builder.AppendLine($\"\\t/// <returns></returns>\");\n                var returnTemplate = method.ReturnType == \"TResult\" ? \"<TResult>\" : string.Empty;\n                builder.Append(\n                    $\"\\tpublic static {returnType} {classMethodName}{returnTemplate}(this ITelegramBotClient client{string.Join(string.Empty, method.Parameters.Select(p => $\", {p.WriteParam()}\"))}{(isAsync ? \", CancellationToken cancellationToken = default\" : string.Empty)})\"\n                );\n\n                if (isAsync)\n                {\n                    builder.AppendLine();\n                    builder.AppendLine(\"\\t{\");\n                    builder.AppendLine($\"\\t\\tif (client is null)\");\n                    builder.AppendLine($\"\\t\\t{{\");\n                    builder.AppendLine($\"\\t\\t\\tthrow new ArgumentNullException(nameof(client));\");\n                    builder.AppendLine($\"\\t\\t}}\");\n                    builder.AppendLine();\n\n                    if (method.Parameters.Any())\n                    {\n                        if (method.Parameters.First().Name != \"args\")\n                        {\n                            var argsClass = classes.FirstOrDefault(c =>\n                                c.Name == $\"{classMethodName}Args\"\n                            );\n                            if (argsClass == null)\n                            {\n                                builder.AppendLine(\n                                    $\"\\t\\tvar args = new Dictionary<string, object>()\"\n                                );\n                                builder.AppendLine(\"\\t\\t{\");\n                                var rParamList = new List<string>();\n                                foreach (var param in method.Parameters.Where(p => p.IsRequired))\n                                {\n                                    var paramName = param.Name.Pascalize();\n                                    if (param.IsRequired)\n                                    {\n                                        var propDef = $\"{{ PropertyNames.{paramName}, {param.Name}\";\n                                        if (CanBeNull(param.Type))\n                                        {\n                                            propDef +=\n                                                $\" ?? throw new ArgumentNullException(nameof({param.Name}))\";\n                                        }\n                                        propDef += \" }\";\n                                        rParamList.Add(propDef);\n                                    }\n                                }\n                                if (rParamList.Any())\n                                {\n                                    builder.AppendLine(\n                                        $\"\\t\\t\\t{string.Join(\",\\n\\t\\t\\t\", rParamList)}\"\n                                    );\n                                }\n                                builder.AppendLine(\"\\t\\t};\");\n                                foreach (var param in method.Parameters.Where(p => !p.IsRequired))\n                                {\n                                    var paramName = param.Name.Pascalize();\n                                    builder.AppendLine($\"\\t\\tif ({param.Name} is not null)\");\n                                    builder.AppendLine($\"\\t\\t{{\");\n                                    if (param.Name == \"files\")\n                                    {\n                                        builder.AppendLine(\"\\t\\t\\tforeach (var file in files)\");\n                                        builder.AppendLine(\"\\t\\t\\t{\");\n                                        builder.AppendLine(\n                                            \"\\t\\t\\t\\targs.Add(file.Key, file.Value);\"\n                                        );\n                                        builder.AppendLine(\"\\t\\t\\t}\");\n                                    }\n                                    else\n                                    {\n                                        builder.AppendLine(\n                                            $\"\\t\\t\\targs.Add(PropertyNames.{paramName}, {param.Name});\"\n                                        );\n                                    }\n                                    builder.AppendLine($\"\\t\\t}}\");\n                                }\n                            }\n\n                            builder.AppendLine();\n                        }\n\n                        builder.AppendLine(\n                            $\"\\t\\treturn client.CallMethodAsync<{method.ReturnType}>(MethodNames.{method.Name}, args, cancellationToken);\"\n                        );\n                    }\n                    else\n                    {\n                        builder.AppendLine(\n                            $\"\\t\\treturn client.CallMethodAsync<{method.ReturnType}>(MethodNames.{method.Name}, cancellationToken: cancellationToken);\"\n                        );\n                    }\n                    builder.AppendLine(\"\\t}\");\n                }\n                else\n                {\n                    builder.AppendLine(\" =>\");\n                    builder.AppendLine(\n                        $\"\\t\\tclient.{classMethodName}Async{returnTemplate}({string.Join(\", \", method.Parameters.Select(p => p.Name))}).GetAwaiter().GetResult();\"\n                    );\n                }\n\n                builder.AppendLine();\n            }\n        }\n\n        // Render a constructor if the class requires it\n        switch (@class.ClassType)\n        {\n            case ClassModelType.MethodArguments:\n            case ClassModelType.MethodArgumentsWithAttachments:\n            case ClassModelType.ModelWithConstructor:\n                // Get required properties\n                var requiredProperties = @class.Properties.Where(p =>\n                    p.IsRequired && string.IsNullOrEmpty(p.Value)\n                );\n                if (requiredProperties.Any())\n                {\n                    // Create parameters for the constructor\n                    var parametersCombinations = requiredProperties\n                        .Select(p =>\n                            p.Types.Select(t => new ClassMethodParameterDefinition(\n                                p.Name.Camelize(),\n                                p.Description,\n                                t,\n                                true\n                            ))\n                        )\n                        .Aggregate(\n                            (IEnumerable<IEnumerable<ClassMethodParameterDefinition>>)\n                                new[] { Enumerable.Empty<ClassMethodParameterDefinition>() },\n                            (acc, cur) => from a in acc from b in cur select a.Concat(new[] { b })\n                        );\n\n                    // Render the constructor\n                    foreach (var parameters in parametersCombinations)\n                    {\n                        builder.AppendLine(\"\\t/// <summary>\");\n                        builder.AppendLine(\n                            $\"\\t/// Initializes a new instance of the <see cref=\\\"{@class.Name}\\\"/> class.\"\n                        );\n                        builder.AppendLine(\"\\t/// </summary>\");\n                        foreach (var param in parameters)\n                        {\n                            builder.AppendLine(\n                                $\"\\t/// <param name=\\\"{param.Name}\\\">{string.Join(' ', param.Description)}</param>\"\n                            );\n                        }\n                        builder.AppendLine(\n                            $\"\\tpublic {@class.Name}({string.Join(\", \", parameters.Select(p => p.WriteParam()))})\"\n                        );\n                        builder.AppendLine(\"\\t{\");\n                        foreach (var param in parameters)\n                        {\n                            builder.Append($\"\\t\\tthis.{param.Name.Pascalize()} = {param.Name}\");\n                            if (CanBeNull(param.Type))\n                            {\n                                builder.Append(\n                                    $\" ?? throw new ArgumentNullException(nameof({param.Name}))\"\n                                );\n                            }\n                            builder.AppendLine(\";\");\n                        }\n                        builder.AppendLine(\"\\t}\");\n                        builder.AppendLine();\n                    }\n                }\n                break;\n        }\n\n        // Render constants\n        if (@class.ClassType == ClassModelType.Constants)\n        {\n            builder.AppendLine(\n                \"#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\"\n            );\n            // Render constants\n            foreach (var item in @class.Properties)\n            {\n                builder.AppendLine($\"\\tpublic const string {item.Name} = \\\"{item.Value}\\\";\");\n            }\n            builder.AppendLine(\n                \"#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\"\n            );\n        }\n        // or properties\n        else\n        {\n            foreach (var prop in @class.Properties)\n            {\n                var baseProp = @class.BaseClass?.Properties.FirstOrDefault(p =>\n                    p.Name == prop.Name\n                );\n                if (baseProp?.IsAbstract == false)\n                {\n                    continue;\n                }\n                var typeName = prop.Types.Count() == 1 ? prop.Types.First() : \"object\";\n                if (!prop.IsRequired)\n                {\n                    typeName += \"?\";\n                }\n                builder.AppendLine($\"\\t/// <summary>\");\n                foreach (var docLine in prop.Description)\n                {\n                    builder.AppendLine($\"\\t/// {docLine}\");\n                }\n                builder.AppendLine($\"\\t/// </summary>\");\n                builder.AppendLine($\"\\t[JsonPropertyName(PropertyNames.{prop.Name})]\");\n                if (prop.IsAbstract)\n                {\n                    builder.Append($\"\\tpublic abstract {typeName} {prop.Name} {{ get; \");\n                    if (prop.IsReadOnly)\n                    {\n                        builder.AppendLine($\"}}\");\n                    }\n                    else\n                    {\n                        builder.AppendLine($\"set; }}\");\n                    }\n                }\n                else\n                {\n                    if (baseProp != null)\n                    {\n                        builder.Append($\"\\tpublic override {typeName} {prop.Name}\");\n                    }\n                    else\n                    {\n                        builder.Append($\"\\tpublic {typeName} {WritePropName(prop.Name, @class)}\");\n                    }\n                    if (string.IsNullOrEmpty(prop.Value))\n                    {\n                        builder.Append(@\" { get; set; }\");\n                        if (\n                            (\n                                @class.ClassType == ClassModelType.Model\n                                || @class.ClassType == ClassModelType.BaseModel\n                            )\n                            && prop.IsRequired\n                            && CanBeNull(typeName)\n                        )\n                        {\n                            builder.Append(\" = null!;\");\n                        }\n                        builder.AppendLine();\n                    }\n                    else\n                    {\n                        builder.AppendLine($\" => {WriteValue(prop.Value)};\");\n                    }\n                }\n\n                builder.AppendLine();\n            }\n        }\n\n        // Close the class\n        builder.AppendLine(\"}\");\n        // Build the final string\n        var finalString = builder\n            .ToString()\n            // Remove empty lines at the end of the class\n            .Replace($\"{Environment.NewLine}{Environment.NewLine}}}\", $\"{Environment.NewLine}}}\")\n            // Replace tabs with 4 spaces\n            .Replace(\"\\t\", \"    \")\n            // Replace CRLF with LF\n            .Replace(\"\\r\\n\", \"\\n\");\n\n        // Write the file\n        var filePath = Path.Combine(outputPath, @class.FileName);\n        var directoryPath = Path.GetDirectoryName(filePath);\n        if (!string.IsNullOrEmpty(directoryPath))\n        {\n            if (!Directory.Exists(directoryPath))\n            {\n                Directory.CreateDirectory(directoryPath);\n            }\n        }\n\n        Write(\"Writing file {0}...\", filePath);\n        File.WriteAllText(filePath, finalString);\n        WriteLine(\"Done!\");\n    }\n}\n\n/// <summary>\n/// Formats a property name.\n/// </summary>\n/// <param name=\"propName\">The property name to format.</param>\n/// <param name=\"class\">The class that contains the property.</param>\nstatic string WritePropName(string propName, ClassDefinition @class)\n{\n    if (@class.Name == propName)\n    {\n        return @class.Name switch\n        {\n            \"ForceReply\" => \"ForceReplyFlag\",\n            \"MessageId\" => \"Id\",\n            \"Gifts\" => \"GiftList\",\n            _ => throw new Exception($\"Invalid property name: {propName}\"),\n        };\n    }\n    return propName;\n}\n\n/// <summary>\n/// Formats a parameter for a method.\n/// </summary>\n/// <param name=\"param\">The parameter to format.</param>\nstatic string WriteParam(this ClassMethodParameterDefinition param)\n{\n    var builder = new StringBuilder();\n    var isFiles = param.Name == \"files\";\n    builder.Append(param.Type);\n    if (!isFiles && !param.IsRequired && param.Name != \"cancellationToken\")\n    {\n        builder.Append(\"?\");\n    }\n    builder.Append(' ');\n    builder.Append(param.Name);\n    if (!param.IsRequired)\n    {\n        builder.Append(\" = null\");\n    }\n\n    return builder.ToString();\n}\n\n/// <summary>\n/// Formats a value for a property.\n/// </summary>\n/// <param name=\"value\">The value to format.</param>\nstatic string WriteValue(string value)\n{\n    if (value == \"true\")\n    {\n        return value;\n    }\n    else\n    {\n        return $\"\\\"{value}\\\"\";\n    }\n}\n\n/// <summary>\n/// Checks if a type can be null.\n/// </summary>\nstatic bool CanBeNull(string typeName)\n{\n    return typeName == \"string\" || typeName == \"object\" || char.IsUpper(typeName[0]);\n}\n"
  },
  {
    "path": "tools/main.csx",
    "content": "#!/usr/bin/env dotnet-script\n#nullable enable\n#load \"constants.csx\"\n#load \"scrapper.csx\"\n#load \"mapper.csx\"\n#load \"generator.csx\"\n\nusing System.Net.Http;\n\nvar ourpurPath = Args.FirstOrDefault() ?? ScriptConstants.DEFAULT_OUTPUT_PATH;\n\nWriteLine(\"Scraping Telegram Bot API Definitions...\");\nvar definitions = await ScrapBotApiDefinitions();\nWriteLine();\n\nWriteLine(\"Mapping models...\");\nvar modelClasses = definitions.MapTypesIntoClasses();\nWriteLine(\"Mapping extension methods...\");\nvar methodClasses = definitions.MapMethodsIntoClasses();\nWriteLine(\"Mapping constants...\");\nvar constants = definitions.MapConstantsIntoClasses();\nWriteLine();\nvar classFiles = modelClasses.Concat(methodClasses).Concat(constants);\nWriteLine(\"Generating classes...\");\nGenerateClasses(classFiles, ourpurPath);\nWriteLine(\"Done!\");\n"
  },
  {
    "path": "tools/mapper.csx",
    "content": "#nullable enable\n#r \"nuget: Humanizer.Core, 2.14.1\"\n#load \"constants.csx\"\n#load \"models.csx\"\n\nusing System.Collections;\nusing System.ComponentModel;\nusing System.ComponentModel.DataAnnotations;\nusing System.Text.Json.Serialization;\nusing System.Text.RegularExpressions;\nusing AngleSharp.Common;\nusing Humanizer;\nusing Microsoft.VisualBasic;\n\n/// <summary>\n/// Generates class definitions for all the models in the Telegram Bot API.\n/// </summary>\n/// <param name=\"definitions\">The definitions of the Telegram Bot API.</param>\n/// <returns>The class definitions for all the models in the Telegram Bot API.</returns>\nstatic IEnumerable<ClassDefinition> MapTypesIntoClasses(this BotApiDefinitions definitions)\n{\n    ICollection<ClassDefinition> baseClasses = [];\n    ICollection<ClassDefinition> classes = [];\n\n    // Generate the base classes for each type group\n    foreach (var telegramTypeGroup in definitions.TypeGroups)\n    {\n        var @namespace = string.Format(\n            \"{0}.{1}\",\n            ScriptConstants.PROJECT_NAME,\n            telegramTypeGroup.SectionName.Pascalize()\n        );\n        var className = telegramTypeGroup.Name;\n        var classDescription = new List<string>(telegramTypeGroup.Description);\n        ICollection<ClassPropertyDefinition> properties = [];\n        List<string> usings = [];\n\n        classDescription.Add(\"<list type=\\\"bullet\\\">\");\n        classDescription.AddRange(\n            telegramTypeGroup.Types.Select(model =>\n                $\"<item><description><see cref=\\\"{model}\\\"/></description></item>\"\n            )\n        );\n        classDescription.Add(\"</list>\");\n\n        // Get the types that belong to this group\n        var types = definitions.Types.Where(t => telegramTypeGroup.Types.Contains(t.Name));\n\n        // Find all the properties that are common to all the types in this group\n        var commonPropertyGroups = types\n            .SelectMany(t => t.Properties)\n            .GroupBy(p => p.Name)\n            .Where(g =>\n                g.Count() == types.Count() && g.Select(p => p.IsRequired).Distinct().Count() == 1\n            )\n            // Don't include incompatible properties\n            .Where(g =>\n                g.Select(p => p.Types)\n                    .Aggregate(\n                        new List<IEnumerable<string>>(),\n                        (acc, next) =>\n                        {\n                            acc.Add(next);\n                            return acc;\n                        },\n                        (acc) => acc.Skip(1).All(t => t.SequenceEqual(acc.First()))\n                    )\n            );\n\n        // Generate the properties for the base class\n        foreach (var propGroup in commonPropertyGroups)\n        {\n            var name = propGroup.Key.Pascalize();\n            var firstDescription = propGroup.First().Description;\n            var description = propGroup.All(p => p.Description.SequenceEqual(firstDescription))\n                ? firstDescription\n                : new List<string>();\n            var isAbstract = !description.Any();\n\n            // If the description is empty, try to remove the sentence of each description that is different.\n            if (!description.Any())\n            {\n                var sentences = propGroup.First().Description;\n                description = sentences.Where(s =>\n                    propGroup.All(p => p.Description.Any(d => d == s))\n                );\n            }\n            // If the description is still empty, split the description by a comma and remove the sentence of each description that is different.\n            if (!description.Any())\n            {\n                var splittedSentences = propGroup.First().Description.Select(d => d.Split(','));\n                description = splittedSentences.Select(sp =>\n                    string.Join(\n                        ',',\n                        sp.Where(s => propGroup.All(p => p.Description.Any(d => d.Contains(s))))\n                    )\n                );\n            }\n            // If the description is still empty, throw an exception. A description is required.\n            if (!description.Any())\n            {\n                throw new Exception(\n                    $\"Could not find a common description for property {propGroup.Key} in group {telegramTypeGroup.Name}\"\n                );\n            }\n\n            var typeNames = propGroup\n                .SelectMany(p => p.Types)\n                .Distinct()\n                .Select(tn => AdjustTypeName(tn, propGroup.Key, telegramTypeGroup.Name));\n\n            // Add usings for each type.\n            var references = definitions\n                .Types.Where(t => typeNames.Contains(t.Name))\n                .Select(t => t.SectionName)\n                .Select(s => string.Format(\"{0}.{1}\", ScriptConstants.PROJECT_NAME, s.Pascalize()));\n            usings.AddRange(references);\n\n            typeNames = typeNames\n                .Select(t =>\n                    BuildType(t, propGroup.First().ArrayLevels, propGroup.Key)\n                        .Replace(ScriptConstants.INPUT_FILE_TYPE_NAME, \"string\")\n                )\n                .Distinct();\n\n            var parsedDescription = ParseDocReferences(description, definitions);\n            usings.AddRange(ExtractUsingsFromParsedDoc(parsedDescription, definitions));\n\n            var property = new ClassPropertyDefinition(\n                name,\n                parsedDescription,\n                typeNames,\n                propGroup.First().IsRequired,\n                isAbstract,\n                propGroup.All(p =>\n                    !string.IsNullOrEmpty(ExtractConstValueFromDescription(p.Description))\n                )\n            );\n            properties.Add(property);\n        }\n\n        var parsedDocs = ParseDocReferences(classDescription, definitions);\n        usings.AddRange(ExtractUsingsFromParsedDoc(parsedDocs, definitions));\n\n        // Generate the base class\n        var baseClass = new ClassDefinition(\n            className,\n            parsedDocs,\n            @namespace,\n            Path.Combine(telegramTypeGroup.SectionName.Pascalize(), className, $\"{className}.cs\"),\n            properties,\n            new List<ClassMethodDefinition>(),\n            ClassModelType.BaseModel,\n            usings.Distinct()\n        );\n\n        baseClasses.Add(baseClass);\n        yield return baseClass;\n    }\n\n    // Generate the classes for each type\n    foreach (var telegramType in definitions.Types)\n    {\n        var @namespace = string.Format(\n            \"{0}.{1}\",\n            ScriptConstants.PROJECT_NAME,\n            telegramType.SectionName.Pascalize()\n        );\n        var className = telegramType.Name;\n        var classDescription = telegramType.Description;\n        ICollection<ClassPropertyDefinition> properties = [];\n        List<string> usings = [];\n\n        // Generate the properties for the class\n        foreach (var prop in telegramType.Properties)\n        {\n            var name = prop.Name.Pascalize();\n            var description = prop.Description;\n            var typeNames = prop.Types.Select(tn =>\n                BuildType(tn, prop.ArrayLevels, prop.Name, telegramType.Name)\n                    .Replace(ScriptConstants.INPUT_FILE_TYPE_NAME, \"string\")\n            );\n\n            // Add usings for each type.\n            var references = definitions\n                .Types.Where(t => prop.Types.Contains(t.Name))\n                .Select(t => t.SectionName)\n                .Select(s => string.Format(\"{0}.{1}\", ScriptConstants.PROJECT_NAME, s.Pascalize()));\n            usings.AddRange(references);\n\n            string? value = null;\n\n            if (prop.IsRequired)\n            {\n                value = ExtractConstValueFromDescription(description);\n                if (value is null && prop.Types.Count() == 1 && prop.Types.First() == \"True\")\n                {\n                    value = \"true\";\n                }\n            }\n\n            var parsedPropDescription = ParseDocReferences(description, definitions);\n            usings.AddRange(ExtractUsingsFromParsedDoc(parsedPropDescription, definitions));\n\n            var property = new ClassPropertyDefinition(\n                name,\n                parsedPropDescription,\n                typeNames,\n                prop.IsRequired,\n                Value: value\n            );\n            properties.Add(property);\n        }\n\n        // Get the base class if any\n        var baseTypeName = definitions.TypeGroups.FirstOrDefault(g =>\n            g.Types.Contains(telegramType.Name)\n        );\n        var baseClass =\n            baseTypeName != null ? baseClasses.First(c => c.Name == baseTypeName.Name) : null;\n\n        var parsedDocs = ParseDocReferences(classDescription, definitions);\n        usings.AddRange(ExtractUsingsFromParsedDoc(parsedDocs, definitions));\n\n        string path;\n        // Make an exception for the Chat and ChatFullInfo classes\n        if (className == \"Chat\" || className == \"ChatFullInfo\")\n        {\n            path = Path.Combine(\n                telegramType.SectionName.Pascalize(),\n                Path.Combine(\"Chat\", $\"{className}.cs\")\n            );\n            if (className == \"ChatFullInfo\")\n            {\n                // Make ChatFullInfo inherit from Chat\n                baseClass = classes.First(c => c.Name == \"Chat\");\n            }\n        }\n        else\n        {\n            path = Path.Combine(\n                telegramType.SectionName.Pascalize(),\n                baseClass is null\n                    ? $\"{className}.cs\"\n                    : Path.Combine(baseClass.Name, $\"{className}.cs\")\n            );\n        }\n\n        // Generate the class\n        var classDefinition = new ClassDefinition(\n            className,\n            parsedDocs,\n            @namespace,\n            path,\n            properties,\n            new List<ClassMethodDefinition>(),\n            IsModelLikeArgs(className, definitions)\n                ? ClassModelType.ModelWithConstructor\n                : ClassModelType.Model,\n            usings.Distinct(),\n            baseClass\n        );\n\n        classes.Add(classDefinition);\n        yield return classDefinition;\n    }\n}\n\n/// <summary>\n/// Generates class definitions for all the methods in the Telegram Bot API.\n/// </summary>\n/// <remarks>\n/// The class definitions represents classes with extension methods for each method in the Telegram Bot API. There are also classes for the arguments of each method with complex arguments.\n/// </remarks>\n/// <param name=\"definitions\">The definitions of the Telegram Bot API.</param>\n/// <returns>The class definitions for all the methods in the Telegram Bot API.</returns>\nstatic IEnumerable<ClassDefinition> MapMethodsIntoClasses(this BotApiDefinitions definitions)\n{\n    var filesParameter = new ClassMethodParameterDefinition(\n        \"files\",\n        [\"The files to upload.\"],\n        \"IDictionary<string, InputFile>?\",\n        false\n    );\n\n    foreach (var telegramMethod in definitions.Methods)\n    {\n        var @namespace = string.Format(\n            \"{0}.{1}\",\n            ScriptConstants.PROJECT_NAME,\n            telegramMethod.SectionName.Pascalize()\n        );\n        var methodName = telegramMethod.Name.Pascalize();\n        var methodDescription = new List<string>(telegramMethod.Description);\n        var methods = new List<ClassMethodDefinition>();\n        var usings = new List<string>();\n\n        if (\n            telegramMethod.Parameters.Any(p =>\n                p.Types.Any(t => t == ScriptConstants.INPUT_FILE_TYPE_NAME)\n            )\n        )\n        {\n            usings.Add($\"{ScriptConstants.PROJECT_NAME}.AvailableTypes\");\n        }\n        var paramTypeNames = telegramMethod\n            .Parameters.SelectMany(p => p.Types)\n            .GroupTypes(definitions.TypeGroups)\n            .Distinct();\n        // Add usings for each type.\n        var paramReferences = definitions\n            .Types.Where(t => paramTypeNames.Contains(t.Name))\n            .Select(t => t.SectionName)\n            .Concat(\n                definitions\n                    .TypeGroups.Where(g => paramTypeNames.Contains(g.Name))\n                    .Select(g => g.SectionName)\n            )\n            .Select(s => string.Format(\"{0}.{1}\", ScriptConstants.PROJECT_NAME, s.Pascalize()));\n        usings.AddRange(paramReferences);\n\n        // Check if the method has any complex arguments\n        var hasAttachments = telegramMethod.Parameters.Any(p =>\n            p.Types.Any(t => HasAttachments(t, definitions))\n        );\n        var hasComplexArguments =\n            telegramMethod.Parameters.Any(p =>\n                p.ArrayLevels > 0 || p.Types.Any(t => char.IsUpper(AdjustTypeName(t, p.Name)[0]))\n            )\n            || telegramMethod.Parameters.Count() > 4;\n        // If the method has complex arguments, generate a class for the arguments and a method that receives the arguments class\n        if (hasComplexArguments)\n        {\n            var className = $\"{methodName}Args\";\n            var classDescription = $\"Represents the arguments of the \\\"{methodName}\\\" method.\";\n            var properties = new List<ClassPropertyDefinition>();\n            var argsUsings = new List<string>(usings);\n\n            // Generate the properties for the class\n            foreach (var param in telegramMethod.Parameters)\n            {\n                var name = param.Name.Pascalize();\n                var description = param.Description;\n                var typeNames = param.Types.Select(tn => AdjustTypeName(tn, param.Name));\n\n                // If there are any property of type InputFile, make sure `hasAttachments` is true.\n                if (typeNames.Any(t => HasAttachments(t, definitions)))\n                {\n                    hasAttachments = true;\n                }\n\n                var parsedPropdescription = ParseDocReferences(description, definitions);\n                argsUsings.AddRange(ExtractUsingsFromParsedDoc(parsedPropdescription, definitions));\n\n                var property = new ClassPropertyDefinition(\n                    name,\n                    parsedPropdescription,\n                    typeNames.Select(t => BuildType(t, param.ArrayLevels, param.Name)),\n                    param.IsRequired\n                );\n                properties.Add(property);\n            }\n\n            var classDefinition = new ClassDefinition(\n                className,\n                new List<string>() { classDescription },\n                @namespace,\n                Path.Combine(telegramMethod.SectionName.Pascalize(), \"Args\", $\"{className}.cs\"),\n                properties,\n                new List<ClassMethodDefinition>(),\n                hasAttachments\n                    ? ClassModelType.MethodArgumentsWithAttachments\n                    : ClassModelType.MethodArguments,\n                argsUsings.Distinct()\n            );\n\n            yield return classDefinition;\n\n            var returnType = telegramMethod.ReturnTypes.Count() > 1 ? \"TResult\" : null;\n            if (returnType is null)\n            {\n                var firstResultType = telegramMethod.ReturnTypes.First();\n                returnType = BuildType(firstResultType.Type, firstResultType.ArrayLevels);\n            }\n\n            var argumentsParameter = new ClassMethodParameterDefinition(\n                \"args\",\n                [$\"The arguments for the \\\"{methodName}\\\" method.\"],\n                className,\n                true\n            );\n\n            var parsedDocs = ParseDocReferences(methodDescription, definitions);\n            argsUsings.AddRange(ExtractUsingsFromParsedDoc(parsedDocs, definitions));\n\n            // Add a method\n            var method = new ClassMethodDefinition(\n                methodName,\n                parsedDocs,\n                [argumentsParameter],\n                returnType\n            );\n            methods.Add(method);\n        }\n\n        // Create method for all the possible return types and all the possible parameters\n        foreach (var returnTypeDef in telegramMethod.ReturnTypes)\n        {\n            var requiredTelegramParameters = telegramMethod.Parameters.Where(p =>\n                p.IsRequired || returnTypeDef.DependentParameters.Contains(p.Name)\n            );\n            var optionalTelegramParameters = telegramMethod.Parameters.Where(p =>\n                !p.IsRequired\n                && requiredTelegramParameters.All(rp =>\n                    !p.IsExclusiveWith.Contains(rp.Name)\n                    && !requiredTelegramParameters.Any(rp => rp.Name == p.Name)\n                )\n            );\n\n            // Create all the possible combinations of required parameters\n            var requiredParametersCombinations = requiredTelegramParameters.Select(p =>\n                p.Types.GroupTypes(definitions.TypeGroups)\n                    .Select(t => new ClassMethodParameterDefinition(\n                        p.Name.Camelize(),\n                        ParseDocReferences(p.Description, definitions),\n                        BuildType(t, p.ArrayLevels, p.Name),\n                        true\n                    ))\n            );\n            if (requiredParametersCombinations.Any())\n            {\n                // Apply cartesian product\n                requiredParametersCombinations = requiredParametersCombinations.Aggregate(\n                    (IEnumerable<IEnumerable<ClassMethodParameterDefinition>>)\n                        new[] { Enumerable.Empty<ClassMethodParameterDefinition>() },\n                    (acc, cur) => from a in acc from b in cur select a.Concat(new[] { b })\n                );\n            }\n            // Create all the possible combinations of optional parameters\n            var optionalParametersCombinations = optionalTelegramParameters.Select(p =>\n                p.Types.GroupTypes(definitions.TypeGroups)\n                    .Select(t => new ClassMethodParameterDefinition(\n                        p.Name.Camelize(),\n                        ParseDocReferences(p.Description, definitions),\n                        BuildType(t, p.ArrayLevels, p.Name),\n                        false\n                    ))\n            );\n            if (optionalParametersCombinations.Any())\n            {\n                // Apply cartesian product\n                optionalParametersCombinations = optionalParametersCombinations.Aggregate(\n                    (IEnumerable<IEnumerable<ClassMethodParameterDefinition>>)\n                        new[] { Enumerable.Empty<ClassMethodParameterDefinition>() },\n                    (acc, cur) => from a in acc from b in cur select a.Concat(new[] { b })\n                );\n            }\n\n            IEnumerable<IEnumerable<ClassMethodParameterDefinition>> parametersCombinations = [];\n\n            // Create all the possible combinations of required and optional parameters\n            // Optional parameters cannot have more than one combination, so if that is the case, use the required parameters combinations to restrict the optional parameters combinations.\n            if (optionalParametersCombinations.Count() > 1)\n            {\n                // Search which required parameter can be used to restrict the optional parameters combinations\n                var requiredParameter =\n                    requiredTelegramParameters\n                        .Reverse()\n                        .FirstOrDefault(p =>\n                            p.Types.GroupTypes(definitions.TypeGroups).Count()\n                                % optionalParametersCombinations.Count()\n                                == 0\n                            || optionalParametersCombinations.Count()\n                                % p.Types.GroupTypes(definitions.TypeGroups).Count()\n                                == 0\n                        )\n                    ?? throw new Exception(\n                        $\"Could not find a required parameter with the same count of types as the optional parameters in method {telegramMethod.Name}. There are no ways to restrict the optional parameters combinations.\"\n                    );\n\n                var buffer = new List<IEnumerable<ClassMethodParameterDefinition>>();\n                var discriminatingTypeNames = requiredParameter\n                    .Types.GroupTypes(definitions.TypeGroups)\n                    .Select(\n                        (t, i) =>\n                            (\n                                Index: i,\n                                Type: BuildType(\n                                    t,\n                                    requiredParameter.ArrayLevels,\n                                    requiredParameter.Name\n                                )\n                            )\n                    );\n                foreach (var rp in requiredParametersCombinations)\n                {\n                    var currentType = rp.First(p =>\n                        p.Name == requiredParameter.Name.Camelize()\n                    ).Type;\n                    var index = discriminatingTypeNames.First(t => t.Type == currentType).Index;\n                    buffer.Add(rp.Concat(optionalParametersCombinations.GetItemByIndex(index)));\n                }\n\n                // Create all the possible combinations of required and optional parameters\n                parametersCombinations = buffer;\n            }\n            else\n            {\n                if (requiredParametersCombinations.Count() == 0)\n                {\n                    parametersCombinations = optionalParametersCombinations;\n                }\n                else if (optionalParametersCombinations.Count() == 0)\n                {\n                    parametersCombinations = requiredParametersCombinations;\n                }\n                else\n                {\n                    parametersCombinations = requiredParametersCombinations.SelectMany(\n                        _ => optionalParametersCombinations,\n                        IEnumerable<ClassMethodParameterDefinition> (r, o) => r.Concat(o)\n                    );\n                }\n            }\n\n            var returnType = BuildType(returnTypeDef.Type, returnTypeDef.ArrayLevels);\n\n            if (parametersCombinations.Any())\n            {\n                var parsedDocs = ParseDocReferences(methodDescription, definitions);\n                var references = ExtractUsingsFromParsedDoc(\n                    parsedDocs.Concat(\n                        ParseDocReferences(\n                            parametersCombinations.SelectMany(c =>\n                                c.SelectMany(p => p.Description)\n                            ),\n                            definitions\n                        )\n                    ),\n                    definitions\n                );\n                usings.AddRange(references);\n                // If the method has attachments, add the files parameter to the combinations\n                if (hasAttachments)\n                {\n                    parametersCombinations = parametersCombinations.Select(p =>\n                        p.Any(x =>\n                        {\n                            // Check if the parameter is a string where the value can be a reference to an attachment\n                            if (\n                                x.Type == \"string\"\n                                && x.Description.Any(d => d.Contains(\"attach://\"))\n                            )\n                            {\n                                return true;\n                            }\n                            // Check if the parameter is a list where the primary type is a model with an attachment.\n                            var typeName = x.Type.Split('<').Last().Split('>').First();\n                            // If the type is InputFile, there is no need to add the files parameter for this combination.\n                            if (typeName == ScriptConstants.INPUT_FILE_TYPE_NAME)\n                            {\n                                return false;\n                            }\n                            return definitions.Types.Any(t =>\n                                t.Name == typeName\n                                && t.Properties.Any(p =>\n                                    p.Types.Any(t => HasAttachments(t, definitions))\n                                )\n                            );\n                        })\n                            ? p.Concat([filesParameter])\n                            : p\n                    );\n                }\n                // For each combination, create a sync and an async method\n                foreach (var parameters in parametersCombinations)\n                {\n                    var method = new ClassMethodDefinition(\n                        methodName,\n                        parsedDocs,\n                        parameters,\n                        returnType\n                    );\n                    methods.Add(method);\n                }\n            }\n            else\n            {\n                var method = new ClassMethodDefinition(\n                    methodName,\n                    ParseDocReferences(methodDescription, definitions),\n                    new List<ClassMethodParameterDefinition>(),\n                    returnType\n                );\n                methods.Add(method);\n            }\n        }\n\n        // Define the class name and description\n        var methodClassName = string.Format(\n            \"{0}Extensions\",\n            telegramMethod.SectionName.Pascalize()\n        );\n        var methodClassDescription = \"Extension methods for the Telegram Bot API.\";\n\n        if (telegramMethod.Parameters.Any(p => p.Types.Any(t => HasAttachments(t, definitions))))\n        {\n            usings.Add($\"{ScriptConstants.PROJECT_NAME}.AvailableTypes\");\n        }\n\n        // Add usings for each return type\n        foreach (var rt in telegramMethod.ReturnTypes)\n        {\n            var references = definitions\n                .Types.Where(t => t.Name == rt.Type)\n                .Select(t => t.SectionName)\n                .Concat(\n                    definitions.TypeGroups.Where(g => g.Name == rt.Type).Select(g => g.SectionName)\n                )\n                .Distinct()\n                .Select(s => string.Format(\"{0}.{1}\", ScriptConstants.PROJECT_NAME, s.Pascalize()));\n\n            usings.AddRange(references);\n        }\n\n        // Create the extension methods class\n        var methodClassDefinition = new ClassDefinition(\n            methodClassName,\n            new List<string>() { methodClassDescription },\n            @namespace,\n            Path.Combine(telegramMethod.SectionName.Pascalize(), $\"{telegramMethod.Name}.cs\"),\n            Enumerable.Empty<ClassPropertyDefinition>(),\n            methods,\n            ClassModelType.ExtensionMethods,\n            usings.Distinct()\n        );\n        yield return methodClassDefinition;\n    }\n}\n\n/// <summary>\n/// Generates class definitions for all the constants in the Telegram Bot API.\n/// </summary>\n/// <param name=\"definitions\">The definitions of the Telegram Bot API.</param>\n/// <returns>The class definitions for all the constants in the Telegram Bot API.</returns>\nstatic IEnumerable<ClassDefinition> MapConstantsIntoClasses(this BotApiDefinitions definitions)\n{\n    var groups = new[]\n    {\n        new\n        {\n            ClassName = \"PropertyNames\",\n            Description = \"Defines all the property names used by models and methods in the Telegram Bot API.\",\n            Values = definitions.PropertyNames.Order(),\n        },\n        new\n        {\n            ClassName = \"MethodNames\",\n            Description = \"Defines all the method names used by methods in the Telegram Bot API.\",\n            Values = definitions.MethodNames.Order(),\n        },\n    };\n\n    foreach (var g in groups)\n    {\n        var @namespace = ScriptConstants.PROJECT_NAME;\n        var fileName = $\"{g.ClassName}.cs\";\n        yield return new ClassDefinition(\n            g.ClassName,\n            [g.Description],\n            @namespace,\n            fileName,\n            g.Values.Select(v => new ClassPropertyDefinition(\n                v.Pascalize(),\n                [],\n                [\"string\"],\n                true,\n                Value: v\n            )),\n            [],\n            ClassModelType.Constants,\n            []\n        );\n    }\n}\n\n#region Utilities\n/// <summary>\n/// Check if the type or any of its properties has an attachment.\n/// </summary>\n/// <param name=\"typeName\">The name of the type.</param>\n/// <param name=\"definitions\">The definitions of the Telegram Bot API.</param>\nstatic bool HasAttachments(string typeName, BotApiDefinitions definitions)\n{\n    if (char.IsLower(typeName[0]))\n    {\n        return false;\n    }\n    if (typeName == ScriptConstants.INPUT_FILE_TYPE_NAME)\n    {\n        return true;\n    }\n\n    // Check if the type has any property of type InputFile\n    var type = definitions.Types.FirstOrDefault(t => t.Name == typeName);\n    if (type != null)\n    {\n        return type.Properties.Any(p => p.Description.Any(s => s.Contains(\"attach://\")))\n            || type.Properties.SelectMany(p => p.Types)\n                .Select(t => AdjustTypeName(t))\n                .Any(t =>\n                    t == ScriptConstants.INPUT_FILE_TYPE_NAME || HasAttachments(t, definitions)\n                );\n    }\n\n    // If the type is a group, check if any of the types in the group has an attachment\n    var group = definitions.TypeGroups.FirstOrDefault(g => g.Name == typeName);\n    return group != null && group.Types.Any(t => HasAttachments(t, definitions));\n}\n\n/// <summary>\n/// If all the type names are in the same group, returns the name of the group. Otherwise, returns the type names.\n/// </summary>\n/// <param name=\"typeNames\">The type names to simplify.</param>\n/// <param name=\"groups\">The type groups.</param>\n/// <returns>The simplified type names.</returns>\nstatic IEnumerable<string> GroupTypes(\n    this IEnumerable<string> typeNames,\n    IEnumerable<TelegramTypeGroup> groups\n)\n{\n    var groupName = typeNames.Any()\n        ? groups.FirstOrDefault(g => typeNames.All(t => g.Types.Contains(t)))?.Name\n        : null;\n    return groupName is null ? typeNames : new[] { groupName };\n}\n\nstatic string BuildType(\n    string name,\n    ushort arrayLevels,\n    string? propName = null,\n    string? parentName = null\n)\n{\n    string result = AdjustTypeName(name, propName, parentName);\n    for (int i = 0; i < arrayLevels; i++)\n    {\n        result = $\"IEnumerable<{result}>\";\n    }\n    return result;\n}\n\n/// <summary>\n/// Adjusts the type name to the correct type.\n/// </summary>\n/// <param name=\"type\">The type name to adjust.</param>\n/// <param name=\"propName\">The name of the property.</param>\nstatic string AdjustTypeName(string type, string? propName = null, string? parentName = null)\n{\n    switch (type)\n    {\n        case \"Int\":\n        case \"Integer\":\n            if (propName != null)\n            {\n                if ((new string[] { \"chat_id\", \"user_id\", \"file_size\" }).Any(propName.EndsWith))\n                {\n                    return \"long\";\n                }\n                else if (propName == \"id\" && parentName != null)\n                {\n                    if (parentName == \"Chat\" || parentName == \"User\")\n                    {\n                        return \"long\";\n                    }\n                }\n                // The following properties should never be signed integers but they will be treated as signed integers because CLS compliance.\n                // \"date\", \"size\", \"width\", \"height\", \"duration\", \"quantity\", \"limit\", \"amount\", \"amounts\", \"period\", \"radius\", \"heading\"\n            }\n            return \"int\";\n        case \"String\":\n            return \"string\";\n        case \"Float\":\n        case \"Float number\":\n            return \"float\";\n        case \"Boolean\":\n        case \"True\":\n            return \"bool\";\n    }\n\n    return type;\n}\n\n/// <summary>\n/// Extracts the constant value from the description.\n/// </summary>\n/// <param name=\"description\">The description of the constant.</param>\nstatic string? ExtractConstValueFromDescription(IEnumerable<string> description)\n{\n    var patterns = new[] { @\"always [\"\"“](?<value>.+)[\"\"”]\", @\"must be <em>(?<value>.+)</em>\" };\n    foreach (var pattern in patterns)\n    {\n        var fullDescription = string.Join(' ', description);\n        var match = Regex.Match(fullDescription, pattern);\n        if (match.Success)\n        {\n            return match.Groups[\"value\"].Value;\n        }\n    }\n    return null;\n}\n\n/// <summary>\n/// Checks if the model is used as an argument for a method.\n/// </summary>\n/// <param name=\"modelName\">The name of the model.</param>\n/// <param name=\"definitions\">The definitions of the Telegram Bot API.</param>\n/// <returns>True if the model is used as an argument for a method. False otherwise.</returns>\nstatic bool IsModelLikeArgs(string modelName, BotApiDefinitions definitions)\n{\n    var baseClassNames = new[]\n    {\n        \"InputMedia\",\n        \"ReplyMarkup\",\n        \"InputMessageContent\",\n        \"BotCommandScope\",\n        \"ReactionType\",\n        \"InputStoryContent\",\n        \"InputProfilePhoto\",\n    };\n    var baseClasses = definitions.TypeGroups.Where(g => baseClassNames.Contains(g.Name));\n    var @classes = new[]\n    {\n        \"KeyboardButton\",\n        \"KeyboardButtonRequestUsers\",\n        \"KeyboardButtonRequestChat\",\n        \"InlineKeyboardButton\",\n        \"ShippingOption\",\n        \"LabeledPrice\",\n        \"BotCommand\",\n        \"WebAppInfo\",\n        \"LoginUrl\",\n        \"InputPollOption\",\n        \"CopyTextButton\",\n    };\n\n    return @classes.Contains(modelName) || baseClasses.Any(g => g.Types.Contains(modelName));\n}\n\n/// <summary>\n/// Extracts the usings from the parsed doc.\n/// </summary>\n/// <param name=\"description\">A parsed description.</param>\n/// <param name=\"definitions\">The definitions of the Telegram Bot API.</param>\n/// <returns></returns>\nstatic IEnumerable<string> ExtractUsingsFromParsedDoc(\n    IEnumerable<string> description,\n    BotApiDefinitions definitions\n)\n{\n    var pattern = @\"<see cref=\"\"(?<type>[^\"\"]+)\"\"/>\";\n    var references = new List<string>();\n    foreach (var d in description)\n    {\n        var matches = Regex.Matches(d, pattern);\n        foreach (var m in matches.Cast<Match>())\n        {\n            var typeName = m.Groups[\"type\"].Value;\n            var group = definitions.TypeGroups.FirstOrDefault(g => g.Name == typeName);\n            var type = definitions.Types.FirstOrDefault(t => t.Name == typeName);\n            if (group != null || type != null)\n            {\n                var @using = string.Format(\n                    \"{0}.{1}\",\n                    ScriptConstants.PROJECT_NAME,\n                    type?.SectionName.Pascalize() ?? group?.SectionName.Pascalize()\n                );\n                references.Add(@using);\n            }\n        }\n    }\n\n    return references.Distinct();\n}\n\n/// <summary>\n/// Parses the references in the description.\n/// </summary>\n/// <param name=\"description\">The description to parse.</param>\n/// <param name=\"definitions\">The definitions of the Telegram Bot API.</param>\n/// <returns>The parsed description.</returns>\nstatic IEnumerable<string> ParseDocReferences(\n    IEnumerable<string> description,\n    BotApiDefinitions definitions\n)\n{\n    var anchorPattern = @\"<a href=\"\"(?<url>[^\"\"]+)\"\">(?:<em>)?(?<text>[^<>]+)(?:</em>)?</a>\";\n    var emojiPattern = @\"<img class=\"\"emoji\"\"[^<>]+alt=\"\"(?<emoji>[^\"\"]+)\"\">\";\n    var newDescription = description\n        .Where(d => !string.IsNullOrEmpty(d))\n        .Select(d =>\n        {\n            d = d.Replace(\"<br>\", \"<br />\");\n            d = d.Replace(\"<code>\", \"<em>\");\n            d = d.Replace(\"</code>\", \"</em>\");\n            d = d.Replace(\"<em>Optional</em>\", \"Optional\");\n            var matches = Regex.Matches(d, anchorPattern);\n\n            foreach (var m in matches.Cast<Match>())\n            {\n                var url = m.Groups[\"url\"].Value;\n                var text = m.Groups[\"text\"].Value;\n\n                if (url.StartsWith(\"/\"))\n                {\n                    url = $\"{ScriptConstants.TELEGRAM_CORE_WEBSITE_URL}{url}\";\n                    // Replace the href for the new url\n                    d = d.Replace(m.Value, $\"<a href=\\\"{url}\\\">{text}</a>\");\n                }\n                else if (url.StartsWith(\"#\"))\n                {\n                    // Check if the reference is a type\n                    var typeName =\n                        definitions.Types.FirstOrDefault(t => t.Name == text)?.Name ?? definitions\n                            .TypeGroups.FirstOrDefault(g => g.Name == text)\n                            ?.Name;\n                    if (typeName != null)\n                    {\n                        // Replace the anchor for a `see` tag\n                        d = d.Replace(m.Value, $\"<see cref=\\\"{typeName}\\\"/>\");\n                    }\n                    else\n                    {\n                        url = $\"{ScriptConstants.TELEGRAM_BOT_API_DOCS_URL}{url}\";\n                        // Replace the href for the new url\n                        d = d.Replace(m.Value, $\"<a href=\\\"{url}\\\">{text}</a>\");\n                    }\n                }\n            }\n\n            matches = Regex.Matches(d, emojiPattern);\n            foreach (var m in matches.Cast<Match>())\n            {\n                var emoji = m.Groups[\"emoji\"].Value;\n                d = d.Replace(m.Value, emoji);\n            }\n\n            return d;\n        });\n\n    if (!newDescription.Any())\n    {\n        newDescription = [\"No description available\"];\n    }\n\n    return newDescription;\n}\n\n#endregion\n"
  },
  {
    "path": "tools/models.csx",
    "content": "#nullable enable\n\nusing System.Text.Json.Serialization;\n\n#region Bot API Models\n\n/// <summary>\n/// Defines base properties for all Bot API Models and Methods.\n/// </summary>\n/// <param name=\"Name\">The name of this model, group or method.</param>\n/// <param name=\"Description\">The description of this model, group or method.</param>\n/// <param name=\"SectionName\">The name of the section where this model, group or method is defined.</param>\nrecord TelegramReferenceBase(string Name, IEnumerable<string> Description, string SectionName);\n\n/// <summary>\n/// Represents a Type in the Telegram Bot API.\n/// </summary>\n/// <param name=\"Name\">The name of this type.</param>\n/// <param name=\"SectionName\">The name of the section where this type is defined.</param>\n/// <param name=\"Description\">The description of this type.</param>\n/// <param name=\"Properties\">The properties of this type.</param>\nrecord TelegramType(\n    string SectionName,\n    string Name,\n    IEnumerable<string> Description,\n    IEnumerable<TelegramTypeProperty> Properties\n) : TelegramReferenceBase(Name, Description, SectionName);\n\n/// <summary>\n/// Represents a Model property in the Telegram Bot API.\n/// </summary>\n/// <param name=\"Name\">The name of this property.</param>\n/// <param name=\"Description\">The description of this property.</param>\n/// <param name=\"IsRequired\">Whether this property is required.</param>\n/// <param name=\"Types\">The types that this property can be.</param>\n/// <param name=\"ArrayLevels\">The number of array levels that this property can have.</param>\nrecord TelegramTypeProperty(\n    string Name,\n    IEnumerable<string> Description,\n    bool IsRequired,\n    IEnumerable<string> Types,\n    ushort ArrayLevels\n);\n\n/// <summary>\n/// Represents a group of related/derived types in the Telegram Bot API.\n/// </summary>\n/// <param name=\"SectionName\">The name of the section where this group is defined.</param>\n/// <param name=\"Name\">The name of this group.</param>\n/// <param name=\"Description\">The description of this group.</param>\n/// <param name=\"Types\">The names of the types in this group.</param>\nrecord TelegramTypeGroup(\n    string SectionName,\n    string Name,\n    IEnumerable<string> Description,\n    IEnumerable<string> Types\n) : TelegramReferenceBase(Name, Description, SectionName);\n\n/// <summary>\n/// Represents a Method in the Telegram Bot API.\n/// </summary>\n/// <param name=\"Name\">The name of this method.</param>\n/// <param name=\"SectionName\">The name of the section where this method is defined.</param>\n/// <param name=\"Description\">The description of this method.</param>\n/// <param name=\"Parameters\">The parameters of this method.</param>\n/// <param name=\"ReturnTypes\">The possible return types of this method and their conditions.</param>\nrecord TelegramMethod(\n    string SectionName,\n    string Name,\n    IEnumerable<string> Description,\n    IEnumerable<TelegramMethodParameter> Parameters,\n    IEnumerable<TelegramReturnType> ReturnTypes\n) : TelegramReferenceBase(Name, Description, SectionName);\n\n/// <summary>\n/// Represents a Method Parameter in the Telegram Bot API.\n/// </summary>\n/// <param name=\"Name\">The name of this parameter.</param>\n/// <param name=\"Description\">The description of this parameter.</param>\n/// <param name=\"IsRequired\">Whether this parameter is required.</param>\n/// <param name=\"Types\">The types that this parameter can be.</param>\n/// <param name=\"ArrayLevels\">The number of array levels that this parameter can have.</param>\n/// <param name=\"IsExclusiveWith\">The names of the parameters that this parameter is exclusive with.</param>\nrecord TelegramMethodParameter(\n    string Name,\n    IEnumerable<string> Description,\n    bool IsRequired,\n    IEnumerable<string> Types,\n    ushort ArrayLevels,\n    IEnumerable<string> IsExclusiveWith\n);\n\n/// <summary>\n/// Represents a Return Type of a Method in the Telegram Bot API.\n/// </summary>\n/// <param name=\"Type\">The return type.</param>\n/// <param name=\"ArrayLevels\">The number of array levels that this return type can have.</param>\n/// <param name=\"DependentParameters\">The parameters that determine when this return type is used.</param>\nrecord TelegramReturnType(string Type, ushort ArrayLevels, IEnumerable<string> DependentParameters);\n\n/// <summary>\n/// Represents the Bot API Definition.\n/// </summary>\n/// <param name=\"Types\">The models in the Bot API.</param>\n/// <param name=\"Methods\">The methods in the Bot API.</param>\n/// <param name=\"TypeGroups\">The model groups in the Bot API.</param>\n/// <param name=\"PropertyNames\">The names of the properties in the Bot API.</param>\nrecord BotApiDefinitions(\n    IEnumerable<TelegramType> Types,\n    IEnumerable<TelegramMethod> Methods,\n    IEnumerable<TelegramTypeGroup> TypeGroups\n)\n{\n    private IEnumerable<string>? propertyNames;\n\n    /// <summary>\n    /// Lists all the property names in the Bot API.\n    /// </summary>\n    /// <remarks>\n    /// This includes the names of the properties of the models and the names of the parameters of the methods.\n    /// </remarks>\n    public IEnumerable<string> PropertyNames =>\n        this.propertyNames ??= this\n            .Types.SelectMany(m => m.Properties)\n            .Select(p => p.Name)\n            .Union(this.Methods.SelectMany(m => m.Parameters).Select(p => p.Name))\n            .Distinct();\n\n    /// <summary>\n    /// Lists all the model names in the Bot API.\n    /// </summary>\n    public IEnumerable<string> MethodNames => this.Methods.Select(m => m.Name);\n};\n\n#endregion\n\n#region Class Generation\n\n/// <summary>\n/// Represents the type of class that will be generated.\n/// <list type=\"bullet\">\n/// <item><term>Model</term> <description>A model representing a type in the Bot API.</description></item>\n/// <item><term>ModelWithConstructor</term> <description>A model representing a type in the Bot API with a constructor.</description></item>\n/// <item><term>BaseModel</term> <description>A base model, usually for a group of related types.</description></item>\n/// <item><term>BaseModelWithConstructor</term> <description>A base model, usually for a group of related types, with a constructor.</description></item>\n/// <item><term>MethodArguments</term> <description>A class containing the arguments for a method.</description></item>\n/// <item><term>MethodArgumentsWithAttachments</term> <description>A class containing the arguments for a method with attachments.</description></item>\n/// <item><term>ExtensionMethods</term> <description>A class containing the extension methods for a method.</description></item>\n/// <item><term>Constants</term> <description>A class containing constants.</description></item>\n/// </list>\n/// </summary>\npublic enum ClassModelType\n{\n    Model,\n    ModelWithConstructor,\n    BaseModel,\n    BaseModelWithConstructor,\n    MethodArguments,\n    MethodArgumentsWithAttachments,\n    ExtensionMethods,\n    Constants\n}\n\n/// <summary>\n/// Represents a Class Definition.\n/// </summary>\n/// <param name=\"Namespace\">The namespace where this class is defined.</param>\n/// <param name=\"Name\">The name of this class.</param>\n/// <param name=\"Description\">The description of this class.</param>\n/// <param name=\"Properties\">The properties of this class.</param>\n/// <param name=\"Methods\">The methods of this class.</param>\n/// <param name=\"ClassType\">The type of class that will be generated.</param>\n/// <param name=\"Usings\">The usings that this class will have.</param>\n/// <param name=\"BaseClass\">The base class of this class.</param>\nrecord ClassDefinition(\n    string Name,\n    IEnumerable<string> Description,\n    string Namespace,\n    string FileName,\n    IEnumerable<ClassPropertyDefinition> Properties,\n    IEnumerable<ClassMethodDefinition> Methods,\n    ClassModelType ClassType,\n    IEnumerable<string> Usings,\n    ClassDefinition? BaseClass = null\n);\n\n/// <summary>\n/// Represents a Class Property Definition.\n/// </summary>\n/// <param name=\"Name\">The name of this property.</param>\n/// <param name=\"Description\">The description of this property.</param>\n/// <param name=\"Types\">The types that this property can be.</param>\n/// <param name=\"IsRequired\">Whether this property is required.</param>\n/// <param name=\"IsAbstract\">Whether this property is abstract.</param>\n/// <param name=\"Value\">Optional. The value of this property.</param>\nrecord ClassPropertyDefinition(\n    string Name,\n    IEnumerable<string> Description,\n    IEnumerable<string> Types,\n    bool IsRequired,\n    bool IsAbstract = false,\n    bool IsReadOnly = false,\n    string? Value = null\n);\n\n/// <summary>\n/// Represents a Class Method Definition.\n/// </summary>\n/// <param name=\"Name\">The name of this method.</param>\n/// <param name=\"Description\">The description of this method.</param>\n/// <param name=\"Parameters\">The parameters of this method.</param>\n/// <param name=\"ReturnType\">The return type of this method.</param>\nrecord ClassMethodDefinition(\n    string Name,\n    IEnumerable<string> Description,\n    IEnumerable<ClassMethodParameterDefinition> Parameters,\n    string ReturnType\n);\n\n/// <summary>\n/// Represents a Class Method Parameter Definition.\n/// </summary>\n/// <param name=\"Name\">The name of this parameter.</param>\n/// <param name=\"Description\">The description of this parameter.</param>\n/// <param name=\"Type\">The type of this parameter.</param>\n/// <param name=\"IsRequired\">Whether this parameter is required.</param>\nrecord ClassMethodParameterDefinition(\n    string Name,\n    IEnumerable<string> Description,\n    string Type,\n    bool IsRequired\n);\n\n#endregion\n"
  },
  {
    "path": "tools/omnisharp.json",
    "content": "{\n  \"script\": {\n    \"enableScriptNuGetReferences\": true,\n    \"defaultTargetFramework\": \"net8.0\"\n  }\n}\n"
  },
  {
    "path": "tools/scrapper.csx",
    "content": "#nullable enable\n#r \"nuget: AngleSharp, 1.1.0\"\n#load \"constants.csx\"\n#load \"models.csx\"\n\nusing System.Collections;\nusing System.Net.Http;\nusing System.Text.RegularExpressions;\nusing AngleSharp;\nusing AngleSharp.Dom;\nusing AngleSharp.Html.Dom;\nusing AngleSharp.Html.Parser;\nusing AngleSharp.Io;\n\n/// <summary>\n/// Scrapes the Bot API Definitions from the Telegram Bot API Documentation.\n/// </summary>\n/// <returns>The Bot API Definitions.</returns>\nstatic async Task<BotApiDefinitions> ScrapBotApiDefinitions()\n{\n    using var client = new HttpClient();\n    WriteLine(\"Fetching from {0}\", ScriptConstants.TELEGRAM_BOT_API_DOCS_URL);\n    var response = await client.GetAsync(ScriptConstants.TELEGRAM_BOT_API_DOCS_URL);\n    var content = await response.Content.ReadAsStreamAsync();\n    WriteLine(\"Parsing HTML...\");\n    var parser = new HtmlParser();\n    // Prepare AngleSharp\n    var document = parser.ParseDocument(content);\n\n    // Define initial variables\n    string? sectionName = null;\n    var types = new List<TelegramType>();\n    var methods = new List<TelegramMethod>();\n    var typeGroups = new List<TelegramTypeGroup>();\n\n    // Get the element with id \"dev_page_content\" which contains the documentation of all typess and methods\n    var devPageContent =\n        document.GetElementById(\"dev_page_content\")\n        ?? throw new Exception(\"Could not find element with id \\\"dev_page_content\\\"\");\n\n    // Define the initial section\n    var element = devPageContent.Children.FirstOrDefault(c =>\n        c.TagName.Equals(TagNames.H3, StringComparison.OrdinalIgnoreCase)\n    );\n\n    while (element is not null)\n    {\n        // Define a namespace for this section\n        sectionName = element.TextContent;\n        element = element.NextElementSibling;\n        while (\n            element is not null\n            && !element.TagName.Equals(TagNames.H3, StringComparison.OrdinalIgnoreCase)\n        )\n        {\n            if (\n                element.TagName.Equals(TagNames.H4, StringComparison.OrdinalIgnoreCase)\n                && !string.IsNullOrEmpty(element.TextContent)\n            )\n            {\n                //* If the value contains spaces, ignore it\n                if (element.TextContent.Contains(\" \"))\n                {\n                    element = element.NextElementSibling;\n                    continue;\n                }\n\n                //* If the value starts with uppercase, it's a type\n                if (char.IsUpper(element.TextContent.First()))\n                {\n                    var typeOrGroupName = element.TextContent;\n                    ICollection<string> typeOrGroupDescription = [];\n                    var typeProperties = new List<TelegramTypeProperty>();\n                    ICollection<string> groupTypes = [];\n\n                    do\n                    {\n                        element = element.NextElementSibling;\n\n                        if (\n                            element?.TagName.Equals(TagNames.P, StringComparison.OrdinalIgnoreCase)\n                            == true\n                        )\n                        {\n                            typeOrGroupDescription.Add(element.InnerHtml);\n                        }\n                        else if (\n                            element?.TagName.Equals(TagNames.Ul, StringComparison.OrdinalIgnoreCase)\n                            == true\n                        )\n                        {\n                            // Read each type from ul\n                            foreach (var li in element.Children)\n                            {\n                                // If the type name doesn't contain spaces, it's a type reference\n                                if (!li.TextContent.Contains(\" \"))\n                                {\n                                    groupTypes.Add(li.TextContent);\n                                }\n                            }\n                        }\n                        else if (\n                            element?.TagName.Equals(\n                                TagNames.Table,\n                                StringComparison.OrdinalIgnoreCase\n                            ) == true\n                        )\n                        {\n                            // Read each parameter from tbody\n                            var tbody =\n                                element.Children.FirstOrDefault(c =>\n                                    c.TagName.Equals(\n                                        TagNames.Tbody,\n                                        StringComparison.OrdinalIgnoreCase\n                                    )\n                                ) ?? throw new Exception(\"Could not find tbody element in table\");\n                            foreach (var tr in tbody.Children)\n                            {\n                                var propertyName = tr.Children[0].TextContent;\n                                var propType = tr.Children[1]\n                                    .TextContent.Replace(\" or\", \",\")\n                                    .Replace(\" and\", \",\");\n                                var arrayLevels = (ushort)Regex.Matches(propType, \"Array of\").Count;\n                                for (var i = 0; i < arrayLevels; i++)\n                                {\n                                    propType = propType.Replace(\"Array of \", string.Empty);\n                                }\n                                IEnumerable<string> propertyTypes = propType\n                                    .Split(\",\")\n                                    .Select(t => t.Trim());\n                                string description = tr.Children[2].InnerHtml;\n                                var required = !tr.Children[2].TextContent.StartsWith(\"Optional\");\n\n                                // If a parameter is exclusive with another, the description will contain something like those options:\n                                // - Required if <em>another parameter</em> is not specified\n                                // - Required if <em>another parameter</em> and <em>another parameter</em> are not specified\n                                var exclusiveWith = new List<string>();\n\n                                // Match \"Required if <em>another parameter</em> is not specified\"\n                                var match = Regex.Match(\n                                    description,\n                                    @\"Required if .*? (?:(?:are)|(?:is)) not specified\"\n                                );\n                                if (match.Success)\n                                {\n                                    // Extract all the parameters from the match\n                                    var parameters = Regex\n                                        .Matches(match.Value, @\"<em>(?<param>[\\w_]*)</em>\")\n                                        .Select(m => m.Groups[\"param\"].Value);\n                                    exclusiveWith.AddRange(parameters);\n                                }\n\n                                typeProperties.Add(\n                                    new TelegramTypeProperty(\n                                        propertyName,\n                                        [description],\n                                        required,\n                                        propertyTypes,\n                                        arrayLevels\n                                    )\n                                );\n                            }\n                            break;\n                        }\n                    } while (element != null && element is not IHtmlHeadingElement);\n\n                    // If there are at least one property, add the type name to the list\n                    if (\n                        typeProperties.Count > 0\n                        || typeOrGroupDescription.Any(d =>\n                            d.Contains(\"urrently holds no information\")\n                        )\n                    )\n                    {\n                        types.Add(\n                            new TelegramType(\n                                sectionName,\n                                typeOrGroupName,\n                                typeOrGroupDescription,\n                                typeProperties\n                            )\n                        );\n                    }\n                    // Check if this type is part of a group\n                    else if (groupTypes.Count > 0)\n                    {\n                        typeGroups.Add(\n                            new TelegramTypeGroup(\n                                sectionName,\n                                typeOrGroupName,\n                                typeOrGroupDescription,\n                                groupTypes\n                            )\n                        );\n                    }\n                }\n                //* Otherwise, it's a method\n                else\n                {\n                    var methodName = element.TextContent;\n                    ICollection<string> methodDescription = [];\n                    var methodParameters = new List<TelegramMethodParameter>();\n                    var methodReturnTypes = new List<TelegramReturnType>();\n\n                    do\n                    {\n                        element = element.NextElementSibling;\n\n                        if (\n                            element?.TagName.Equals(TagNames.P, StringComparison.OrdinalIgnoreCase)\n                            == true\n                        )\n                        {\n                            methodDescription.Add(element.InnerHtml);\n                        }\n                        else if (\n                            element?.TagName.Equals(\n                                TagNames.Table,\n                                StringComparison.OrdinalIgnoreCase\n                            ) == true\n                        )\n                        {\n                            // Read each parameter from tbody\n                            var tbody =\n                                element.Children.FirstOrDefault(c =>\n                                    c.TagName.Equals(\n                                        TagNames.Tbody,\n                                        StringComparison.OrdinalIgnoreCase\n                                    )\n                                ) ?? throw new Exception(\"Could not find tbody element in table\");\n                            foreach (var tr in tbody.Children)\n                            {\n                                var paramName = tr.Children[0].TextContent;\n                                var paramType = tr.Children[1]\n                                    .TextContent.Replace(\" or\", \",\")\n                                    .Replace(\" and\", \",\");\n                                var arrayLevels = (ushort)\n                                    Regex.Matches(paramType, \"Array of\").Count;\n                                for (var i = 0; i < arrayLevels; i++)\n                                {\n                                    paramType = paramType.Replace(\"Array of \", string.Empty);\n                                }\n                                IEnumerable<string> parameterTypes = paramType\n                                    .Split(\",\")\n                                    .Select(t => t.Trim());\n                                var required = tr.Children[2].TextContent == \"Yes\";\n                                var description = tr.Children[3].InnerHtml;\n\n                                // If a parameter is exclusive with another, the description will contain something like those options:\n                                // - Required if <em>another parameter</em> is not specified\n                                // - Required if <em>another parameter</em> and <em>another parameter</em> are not specified\n                                var exclusiveWith = new List<string>();\n\n                                // Match \"Required if <em>another parameter</em> is not specified\"\n                                var match = Regex.Match(\n                                    description,\n                                    @\"Required if .*? (?:(?:are)|(?:is)) not specified\"\n                                );\n                                if (match.Success)\n                                {\n                                    // Extract all the parameters from the match\n                                    var parameters = Regex\n                                        .Matches(match.Value, @\"<em>(?<param>[\\w_]*)</em>\")\n                                        .Select(m => m.Groups[\"param\"].Value);\n                                    exclusiveWith.AddRange(parameters);\n                                }\n\n                                methodParameters.Add(\n                                    new TelegramMethodParameter(\n                                        paramName,\n                                        [description],\n                                        required,\n                                        parameterTypes,\n                                        arrayLevels,\n                                        exclusiveWith\n                                    )\n                                );\n                            }\n                            break;\n                        }\n                    } while (element != null && element is not IHtmlHeadingElement);\n\n                    // Add the return types to the list\n                    methodReturnTypes.AddRange(\n                        ExtractReturnTypesFromDescription(string.Join('\\n', methodDescription))\n                    );\n\n                    // Add the method name to the list\n                    methods.Add(\n                        new TelegramMethod(\n                            sectionName,\n                            methodName,\n                            methodDescription,\n                            methodParameters,\n                            methodReturnTypes\n                        )\n                    );\n                }\n            }\n            else\n            {\n                element = element.NextElementSibling;\n            }\n        }\n    }\n\n    //* Add aditional groups\n    typeGroups.Add(\n        new TelegramTypeGroup(\n            \"Available types\",\n            \"ReplyMarkup\",\n            new string[]\n            {\n                \"Additional interface options. A JSON-serialized object for an <a href=\\\"/bots/features#inline-keyboards\\\">inline keyboard</a>, <a href=\\\"/bots/features#keyboards\\\">custom reply keyboard</a>, instructions to remove reply keyboard or to force a reply from the user.\",\n            },\n            new string[]\n            {\n                \"InlineKeyboardMarkup\",\n                \"ReplyKeyboardMarkup\",\n                \"ReplyKeyboardRemove\",\n                \"ForceReply\",\n            }\n        )\n    );\n\n    WriteLine(\n        \"Found {0} methods, {1} types and {2} type groups\",\n        methods.Count(),\n        types.Count(),\n        typeGroups.Count()\n    );\n\n    // Temporary fix\n    var InputPollMedia = typeGroups.First(g => g.Name == \"InputPollMedia\");\n    var InputPollOptionMedia = typeGroups.First(g => g.Name == \"InputPollOptionMedia\");\n    var InputMedia = typeGroups.First(g => g.Name == \"InputMedia\");\n    InputMedia = new TelegramTypeGroup(\n        InputMedia.SectionName,\n        InputMedia.Name,\n        InputMedia.Description,\n        InputMedia.Types.Union(InputPollMedia.Types).Union(InputPollOptionMedia.Types)\n    );\n\n    typeGroups = typeGroups\n        .Where(g =>\n            !new string[] { \"InputPollMedia\", \"InputPollOptionMedia\", \"InputMedia\" }.Contains(\n                g.Name\n            )\n        )\n        .Append(InputMedia)\n        .ToList();\n\n    return new BotApiDefinitions(types, methods, typeGroups);\n}\n\nstatic IEnumerable<TelegramReturnType> ExtractReturnTypesFromDescription(string description)\n{\n    var sentences = description.Split(\". \");\n    var sentenceWithReturns = sentences.Where(s =>\n        s.Contains(\"is returned\") || s.Contains(\"Returns\") || s.Contains(\"returns\")\n    );\n\n    foreach (var sentenceWithReturn in sentenceWithReturns)\n    {\n        // Methods that return more than one type will have a sentence like these:\n        // \"if the edited message is not an inline message, the edited Message is returned, otherwise True is returned.\"\n        // \"if the message is not an inline message, the edited Message is returned, otherwise True is returned.\"\n        var count = Regex.Matches(sentenceWithReturn, \"is returned\").Count;\n        // If true, the method returns only one type\n        if (count <= 1)\n        {\n            if (\n                sentenceWithReturn.Contains(\"<em>True</em> is returned\")\n                || sentenceWithReturn.Contains(\"Returns <em>True</em> on success\")\n            )\n            {\n                return [new TelegramReturnType(\"bool\", 0, Enumerable.Empty<string>())];\n            }\n\n            var arrayLevels = (ushort)Regex.Matches(sentenceWithReturn, \"[Aa]rray of\").Count;\n            // Extract the type from first Anchor element\n            var type = Regex\n                .Match(sentenceWithReturn, @\"<a.*?>(?<type>[\\w_]*)</a>\")\n                .Groups[\"type\"]\n                .Value;\n            if (string.IsNullOrEmpty(type))\n            {\n                type = Regex\n                    .Match(sentenceWithReturn, @\"<em>(?<type>[\\w_]*)</em>\")\n                    .Groups[\"type\"]\n                    .Value;\n            }\n            else if (type.EndsWith('s') && arrayLevels > 0)\n            {\n                type = type.Remove(type.Length - 1);\n            }\n\n            // If the type is still empty, try to extract it from the next sentence.\n            if (string.IsNullOrEmpty(type))\n            {\n                continue;\n            }\n\n            return [new TelegramReturnType(type, arrayLevels, Enumerable.Empty<string>())];\n        }\n        else if (description.Contains(\"message is not an inline message, the\"))\n        {\n            return\n            [\n                new TelegramReturnType(\"Message\", 0, new string[] { \"chat_id\", \"message_id\" }),\n                new TelegramReturnType(\"bool\", 0, new string[] { \"inline_message_id\" }),\n            ];\n        }\n    }\n\n    throw new Exception(\"Could not parse return types from description\");\n}\n"
  }
]