From f2c3458b3af1d712ae95a74ba53e23ffd23eb10f Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:48:28 +0200 Subject: [PATCH 01/74] fix urls --- book.toml | 2 +- src/README.md | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/book.toml b/book.toml index 0b5c7d0..c0042d0 100644 --- a/book.toml +++ b/book.toml @@ -1,5 +1,5 @@ [book] -authors = ["Poulad Ashrafpour", "Aleksey Usatov", "karb0f0s", "Miha Zupan"] +authors = ["Poulad Ashrafpour", "Aleksey Usatov", "karb0f0s", "Miha Zupan", "Wizou"] multilingual = false src = "src" title = "A guide to Telegram.Bot library" diff --git a/src/README.md b/src/README.md index dee005e..4e4351a 100644 --- a/src/README.md +++ b/src/README.md @@ -41,10 +41,10 @@ This book is filled with ready-to-use snippets of code, but you can also find fu |Visit our|URL| |--|--| -|Nuget feed|https://nuget.voids.site/packages/Telegram.Bot| -|Github repo|https://github.com/TelegramBots/Telegram.Bot| -|Examples repo|https://github.com/TelegramBots/Telegram.Bot.Examples| -|Telegram news channel|https://t.me/tgbots_dotnet| -|Telegram support group|https://t.me/joinchat/B35YY0QbLfd034CFnvCtCA| -|Team page|https://github.com/orgs/TelegramBots/people| +|Nuget feed|| +|Github repo|| +|Examples repo|| +|Telegram news channel|| +|Telegram support group|| +|Team page|| From a3d4a59636675bb1fc9f4eeb2b8adb35fb864217 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Mon, 8 Jul 2024 22:56:48 +0200 Subject: [PATCH 02/74] dotnet nuget add source --- src/1/quickstart.md | 3 ++- src/README.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/1/quickstart.md b/src/1/quickstart.md index 54cd7f9..93db7a8 100644 --- a/src/1/quickstart.md +++ b/src/1/quickstart.md @@ -24,7 +24,8 @@ Create a new console project for your bot and add a reference to `Telegram.Bot` ```bash dotnet new console -dotnet add package Telegram.Bot --source https://nuget.voids.site/v3/index.json +dotnet nuget add source https://nuget.voids.site/v3/index.json +dotnet add package Telegram.Bot ``` The code below fetches Bot information based on its access token by calling the Bot API [`getMe`] method. Open `Program.cs` and use the following content: diff --git a/src/README.md b/src/README.md index 4e4351a..8cb99aa 100644 --- a/src/README.md +++ b/src/README.md @@ -19,7 +19,8 @@ In the mean time, latest versions are available on our [special nuget feed](http Follow the pictures below to configure the Package source in Visual Studio: ![In Visual Studio](1/docs/NugetPackageManager.jpg) -Alternatively you can set up a `nuget.config` file at the root of your project/solution: +Alternatively you can use command line: `dotnet nuget add source https://nuget.voids.site/v3/index.json` +Or set up a `nuget.config` file at the root of your project/solution: ```xml From db7bf676eb8063936ab4cc9175c7df3ec32f60f7 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 9 Jul 2024 00:15:29 +0200 Subject: [PATCH 03/74] updated nuget screenshots --- .gitignore | 1 + Examples/Examples.csproj | 2 +- src/1/docs/NugetPackageManager.jpg | Bin 123439 -> 0 bytes src/1/docs/NugetPackageManager.png | Bin 0 -> 49537 bytes src/README.md | 6 +++--- 5 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 src/1/docs/NugetPackageManager.jpg create mode 100644 src/1/docs/NugetPackageManager.png diff --git a/.gitignore b/.gitignore index 38803a1..ffeeb8f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Executables *.exe +*.pdn # msBook compiled book book diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj index 94ba07e..f162798 100644 --- a/Examples/Examples.csproj +++ b/Examples/Examples.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/1/docs/NugetPackageManager.jpg b/src/1/docs/NugetPackageManager.jpg deleted file mode 100644 index 0f8cf14d8266714e87cb0e6de282b28ae67031eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123439 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 xFzD8E)K0(MsQ<|ZRDhJy75N7d;W- diff --git a/src/1/docs/NugetPackageManager.png b/src/1/docs/NugetPackageManager.png new file mode 100644 index 0000000000000000000000000000000000000000..a7bf19e61fd08fb9f7cfa5c614b6d01ec52261ac GIT binary patch literal 49537 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 F{{h3N$?pIF literal 0 HcmV?d00001 diff --git a/src/README.md b/src/README.md index 8cb99aa..ecf0f54 100644 --- a/src/README.md +++ b/src/README.md @@ -16,8 +16,8 @@ in developing Telegram chatbots with examples. In the mean time, latest versions are available on our [special nuget feed](https://nuget.voids.site/packages/Telegram.Bot): `https://nuget.voids.site/v3/index.json` -Follow the pictures below to configure the Package source in Visual Studio: -![In Visual Studio](1/docs/NugetPackageManager.jpg) +See the screenshots below to configure the Package source in Visual Studio: +![In Visual Studio](1/docs/NugetPackageManager.png) Alternatively you can use command line: `dotnet nuget add source https://nuget.voids.site/v3/index.json` Or set up a `nuget.config` file at the root of your project/solution: @@ -25,7 +25,7 @@ Or set up a `nuget.config` file at the root of your project/solution: - + ``` From 074cf171fe8ba73d5a8897f9dd8cf403bb2f3799 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 9 Jul 2024 00:39:53 +0200 Subject: [PATCH 04/74] horizontal nuget screenshot --- src/1/docs/NugetPackageManager.png | Bin 49537 -> 49628 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/1/docs/NugetPackageManager.png b/src/1/docs/NugetPackageManager.png index a7bf19e61fd08fb9f7cfa5c614b6d01ec52261ac..b28dd4559b6a9c74b7445f03d837ac69034c0f59 100644 GIT binary patch literal 49628 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 F{{h3N$?pIF From 10ff84bfa6380749db5920ff85f6cec0c0e3a3aa Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:16:34 +0200 Subject: [PATCH 05/74] some FAQ fixes --- src/2/reply-markup.md | 5 ++++- src/FAQ.md | 31 ++++++++++++++++--------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/2/reply-markup.md b/src/2/reply-markup.md index 9e8c4d6..116a284 100644 --- a/src/2/reply-markup.md +++ b/src/2/reply-markup.md @@ -64,7 +64,10 @@ Unlike custom reply keyboards, pressing buttons on inline keyboards doesn't resu ### Callback buttons -When a user presses a [callback button], no messages are sent to the chat. Instead, your bot simply receives the relevant query. Upon receiving the query, your bot can display some result in a notification at the top of the chat screen or in an alert. In this example we use `InlineKeyboardButton.WithCallbackData` helper method to create a button with a text and callback data. +When a user presses a [callback button], no messages are sent to the chat, and your bot simply receives an `update.CallbackQuery` instead. +Upon receiving this, your bot should answer to that query within 10 seconds, using `AnswerCallbackQueryAsync` _(or else the button gets momentarily disabled)_ + +In this example we use `InlineKeyboardButton.WithCallbackData` helper method to create a button with a text and callback data: ```c# {{#include ../../Examples/2/ReplyMarkup.cs:usings}} diff --git a/src/FAQ.md b/src/FAQ.md index 1fb36e0..f633aff 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -3,11 +3,12 @@ I recommend you read all of these as you will learn many interesting things. Or you can use Ctrl-F to search for a specific topic. ### _1. Can you give me documentation/examples links?_ -- Follow [this installation guide](README.md#-installation) to install the latest versions of the library. -- You are on the [main documentation website](https://telegrambots.github.io/book/). -- Here are [some bot examples](https://github.com/TelegramBots/Telegram.Bot.Examples) -- Search the [official API documentation](https://core.telegram.org/bots/api) and [official FAQ](https://core.telegram.org/bots/faq). +- Follow [this installation guide](https://telegrambots.github.io/book/#-installation) to install the latest versions of the library. +- Here is on the [main documentation website](https://telegrambots.github.io/book/). +- You can find [more bot example projects](https://github.com/TelegramBots/Telegram.Bot.Examples) here +- Search the [official API documentation](https://core.telegram.org/bots/api) and [official bots FAQ](https://core.telegram.org/bots/faq). - check tooltips in your IDE, or navigate with F12 on API methods and read/expand comments. + >If you're C# beginner, you should learn about [async programming](https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/). ### _2. My update handler fails or stops executing at some point_ @@ -20,7 +21,7 @@ Not all messages are text messages, `message.Text` could be null (see also `mess So please use a debugger to check the content of your variables or structure fields and make sure your code can handle all cases. ### _4. How to add buttons under a message?_ -Pass an [InlineKeyboardMarkup](https://telegrambots.github.io/book/2/reply-markup.html#inline-keyboards) into the `replyMarkup` parameter when sending the message. You will likely need to create a `List>` for rows&columns +Pass an [InlineKeyboardMarkup](/2/reply-markup.md#inline-keyboards) into the `replyMarkup` parameter when sending the message. You will likely need to create a `List>` for rows&columns _See also next question._ ### _5. How to handle a click on such inline buttons?_ @@ -31,26 +32,26 @@ Your code should answer to the query within 10 seconds, using `AnswerCallbackQue ### _6. How to show a popup text to the user?_ It is only possible with inline callback button _(see above questions)_. -In `AnswerCallbackQueryAsync`, pass parameter `showAlert: true` to display as a popup. +Use `AnswerCallbackQueryAsync` with some text, and pass parameter `showAlert: true` to display the text as an alert box instead of a short popup. ### _7. How to fill the input textbox of the user with some text?_ -You can't. The closest you can do is setup a `ReplyKeyboardMarkup` for buttons with pre-made texts under the textbox +You can't. The closest you can do is setup a [ReplyKeyboardMarkup](/2/reply-markup.md#custom-keyboards) for buttons with pre-made texts under the textbox ### _8. How to fetch previous messages?_ -You can't with Bot API but it's possible with [WTelegramBot](https://www.nuget.org/packages/WTelegramBot). +You can't with Bot API but it's possible with [WTelegramBot](https://www.nuget.org/packages/WTelegramBot#readme-body-tab). Normally, bots only get messages at the moment they are posted. You could archive them all in a database for later retrieval. ### _9. How to fetch a list of all users in chat?_ -You can't with Bot API but it's possible with [WTelegramBot](https://www.nuget.org/packages/WTelegramBot). -Normally, bots can only get the list of administrators (`GetChatAdministratorsAsync`) or detail about one specific member (`GetChatMemberAsync`) +You can't with Bot API but it's possible with [WTelegramBot](https://www.nuget.org/packages/WTelegramBot#readme-body-tab). +Normally, bots can only get the list of administrators (`GetChatAdministratorsAsync`) or detail about one specific member (`GetChatMemberAsync`) Alternatively, you can keep track of users by observing new messages in a chat and saving user info into a database. ### _10. How to send a private message to some random user?_ You can't. Bots can only send private messages to users that have already initiated a private chat with your bot. ### _11. How to detect if a user blocked my bot?_ -You would have received an `update.MyChatMember` with `NewChatMember.Status == ChatMemberStatus.Kicked` -If you didn't record that info, you can try to `SendChatActionAsync` and see if it raise an exception. +You would have received an `update.MyChatMember` with `NewChatMember.Status == ChatMemberStatus.Kicked` +If you didn't record that info, you can try to `SendChatActionAsync` and see if it raises an exception. ### _12. How to set a caption to a media group (album)?_ Set the `media.Caption` (and `media.ParseMode`) on the first media @@ -70,14 +71,14 @@ A credit-card is necessary but you shouldn't get charged if you stay within quot Other cloud providers might also offer similar services. ### _16. Is there some limitation/maximum about feature X?_ -See https://limits.tginfo.me for a list of limitations. +See for a list of limitations. ### _17. How to populate the bot Menu button / commands list?_ You can either do this via [@BotFather](https://t.me/BotFather) _(static entries)_, or you can use `SetMyCommandsAsync` for more advanced settings ⚠️ This can only be filled with bot commands, starting with a `/` and containing only latin characters `a-z_0-9` ### _18. How to receive `ChatMember` updates?_ -You should specify all update types including ChatMember in `AllowedUpdates` array on `StartReceiving`:`ReceiverOptions` or `SetWebhookAsync` +You should specify all update types **including ChatMember** in `AllowedUpdates` array on `StartReceiving`:`ReceiverOptions` or `SetWebhookAsync` ### _19. How to get rid of past updates when I restart my bot?_ Pass true into `StartReceiving`:`ReceiverOptions`:`DropPendingUpdates` or `SetWebhookAsync`:`dropPendingUpdates` @@ -114,7 +115,7 @@ You can call API methods (like sending messages) from several instances in paral ### _25. How do I get the user id from a username?_ -You can't with Bot API but it's possible with [WTelegramBot](https://www.nuget.org/packages/WTelegramBot). +You can't with Bot API but it's possible with [WTelegramBot](https://www.nuget.org/packages/WTelegramBot#readme-body-tab). Alternatively, you could store in database the mapping of `UserId`<->`Username`. Remember that not every user has a username. From 3fe6e5e2ab29708ec079fd6aade0933d00e20537 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:18:55 +0200 Subject: [PATCH 06/74] more fix --- src/FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/FAQ.md b/src/FAQ.md index f633aff..4336caa 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -21,7 +21,7 @@ Not all messages are text messages, `message.Text` could be null (see also `mess So please use a debugger to check the content of your variables or structure fields and make sure your code can handle all cases. ### _4. How to add buttons under a message?_ -Pass an [InlineKeyboardMarkup](/2/reply-markup.md#inline-keyboards) into the `replyMarkup` parameter when sending the message. You will likely need to create a `List>` for rows&columns +Pass an [InlineKeyboardMarkup](2/reply-markup.md#inline-keyboards) into the `replyMarkup` parameter when sending the message. You will likely need to create a `List>` for rows&columns _See also next question._ ### _5. How to handle a click on such inline buttons?_ @@ -35,7 +35,7 @@ It is only possible with inline callback button _(see above questions)_. Use `AnswerCallbackQueryAsync` with some text, and pass parameter `showAlert: true` to display the text as an alert box instead of a short popup. ### _7. How to fill the input textbox of the user with some text?_ -You can't. The closest you can do is setup a [ReplyKeyboardMarkup](/2/reply-markup.md#custom-keyboards) for buttons with pre-made texts under the textbox +You can't. The closest you can do is setup a [ReplyKeyboardMarkup](2/reply-markup.md#custom-keyboards) for buttons with pre-made texts under the textbox ### _8. How to fetch previous messages?_ You can't with Bot API but it's possible with [WTelegramBot](https://www.nuget.org/packages/WTelegramBot#readme-body-tab). From f3b501b339beda0710af0bc97d726d69374beec6 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 9 Jul 2024 20:12:47 +0200 Subject: [PATCH 07/74] added Mini Apps --- src/4/README.md | 5 +- src/4/tests.md | 155 ----------------------------------------------- src/4/webapps.md | 16 +++++ src/README.md | 2 + src/SUMMARY.md | 2 +- 5 files changed, 22 insertions(+), 158 deletions(-) delete mode 100644 src/4/tests.md create mode 100644 src/4/webapps.md diff --git a/src/4/README.md b/src/4/README.md index bb7074b..95a9a9f 100644 --- a/src/4/README.md +++ b/src/4/README.md @@ -1,11 +1,12 @@ # Advanced -- [Login Widget](login-widget.md) +- [Proxy](proxy.md) +- [Mini Apps](webapps.md) - [Passport](passport/) - [Quickstart](passport/quickstart.md) - [Files & Documents](passport/files-docs.md) - [Data Errors](passport/errors.md) - [RSA Key](passport/key.md) - [Decryption FAQ](passport/faq.md) -- [Proxy](proxy.md) +- [Login Widget](login-widget.md) - [Logging](logging.md) diff --git a/src/4/tests.md b/src/4/tests.md deleted file mode 100644 index bba9afd..0000000 --- a/src/4/tests.md +++ /dev/null @@ -1,155 +0,0 @@ -# Systems Integration Tests - -Integration tests are meant to test the project with real data from Telegram. They are semi-automated tests and tester(s) need to interact with bot for some cases during the test execution. Tests could be used as a playground for exploring Bot API methods. - -## Sample Test Diagnostics Output - -All the test output goes into the supergroup/private chats specified in configurations or interactively during test execution. You can see some samples of test output below. - -Admin bots can change chat photo. - -![Test Case: Set Chat Photo](docs/testcase-chatphoto.jpg) - -Invoices could be paid in private chats. - -![Test Case: Set Chat Photo](docs/testcase-payment.jpg) - -## How Tests Works - -These integration tests are written just like regular unit tests with xUnit framework so they seem to be unit tests. When you run test(s), bot makes a request to Bot API and you should see results(message or service notification) in the chat with bot. - -When you build the solution, you will see them in Test Explorer window. Tests could be run through .NET Core's CLI as well and that's how this project's CI is set up. - -A bot, of course, is needed to test Bot API. This document refers to its user name as _MyTestBot_. - -_Tester_ refers to user name of person testing the bot. Multiple testers could interact with bot during -test execution. If super group chat has other members that are not listed as testers, bot ignores their -messages during test execution. Testers must have user names assigned and their user names should be set -in test configurations before hand. - -All the tests happen in two chats. A Super Group chat and a Private chat with one of the testers. - -Test cases that need tester's interaction to continue, have a limit of usually 2 minutes to wait for receiving an expected update from API. - -Tests could be run individually, in collections, or all at once. All the test collection and test cases within them are ordered and tests will not run in parallel. - -## Test Environment Setup - -Create a Super Group and add bot to it. Promote bot to admin and make sure it has all the permissions. This group needs to have another regular(non-admin) member to be used in tests for chat administration methods(such as Kick, Restrict, Unban). A super group with 2 testers in it, one admin and the other non-admin member, is enough. - -Bot should have some features enabled, usually through BotFather, in order to pass tests. These features are listed below: - -- Inline Queries -- Payment Provider - -For making testing process more convenient, set the following commands for MyTestBot as well. The purpose for these commands is explained in the sections below. - -```text -test - Start test execution - me - Select me for testing admin methods -``` - -## Test Configurations - -You can see a list of configuration keys in `appsettings.json` file. Make a copy of this file and store your configurations there. In addition to `appsettings.json` and `appsettings.Development.json`, environment variables prefixed by `TelegramBot_` are also read into program. - -```bash -cp appsettings.json appsettings.Development.json -``` - -### Required Settings - -Only 2 values must be provided before test execution. - -#### API Token - -This is required for executing any test case. - -```json -{ - "ApiToken": "MyTestBot-API-TOKEN" - /* ... */ -} -``` - -#### Allowed Users - -A comma separated list indicating user name(s) of tester(s). Any update coming from users other than the ones listed here are discarded during test execution. - -```json -{ - /* ... */ - "AllowedUserNames": "tester1, Tester2, TESTER3" - /* ... */ -} -``` - -### Optional Settings - -The following settings are not required for two reasons. Either bot can ask for them during test execution or it is not a required setting for all test cases. - -Bot will ask testers in supergroup/private chat for the necessary information. It would be faster to set all the optional settings as well because it makes testing process faster and less manual. - -> For obtaining values of necessary settings, you can set breakpoints in some test methods and extract values such as chat id or user id. - -#### Supergroup Chat Id - -Bot send messages to this chat in almost all test cases except cases like sending payments that must be to a private chat. - -If not set, before starting any test method, bot waits for a tester to send it a `/test` command in a super group chat (that bot is also a member of). - -```json -{ - /* ... */ - "SuperGroupChatId": -1234567890 - /* ... */ -} -``` - -#### Payment Settings - -##### [Required] Payment Provider Token - -This token is **required** for any test case regarding payments and must be provided before starting tests. - -Consult Telegram API documentations and talk to BotFather to get a test token from a payment provider. - -```json -{ - /* ... */ - "PaymentProviderToken": "MY-PAYMENT-PROVIDER-TOKEN" - /* ... */ -} -``` - -##### TesterPrivateChatId - -Invoices could only be sent to private chats. If not set, bot will wait for a tester to send it `/test` command in a private chat. - -```json -{ - /* ... */ - "TesterPrivateChatId": 1234567890 - /* ... */ -} -``` - -#### Chat Administration - -For this type of tests, bot should be a privileged admin of that super group. Methods such as kick or unban will be performed on a regular (non-admin) tester in that chat. - -If the following 3 settings are not set, bot will ask a tester to send it `/me` command in a private chat with bot. - -- Regular Member's User Id -- Regular Member's User Name -- Regular Member's Private Chat Id - -```json -{ - /* ... */ - "RegularMemberUserId": 1234567890, - "RegularMemberUserName": "tester3", - "RegularMemberPrivateChatId": 1234567890 - /* ... */ -} -``` diff --git a/src/4/webapps.md b/src/4/webapps.md new file mode 100644 index 0000000..6f2d16e --- /dev/null +++ b/src/4/webapps.md @@ -0,0 +1,16 @@ +# Telegram Mini Apps + +If standard Telegram Bot features aren't enough to fit your needs, +you may want to consider building a [Mini App](https://core.telegram.org/bots/webapps) instead. + +This take the form of an integrated browser window showing directly web pages from your bot website, +so you have more control with HTML/JS to display the interface you like. + +Mini Apps can be launched from various ways: +- [Keyboard Buttons](../2/reply-markup.md#custom-keyboards): `KeyboardButton.WithWebApp` +- [Inline Buttons](../2/reply-markup.md#inline-keyboards): `InlineKeyboardButton.WithWebApp` +- Chat menu button (left of user textbox): via @BotFather or `SetChatMenuButtonAsync` +- Inline-mode results with a "Switch to Mini App" button: `AnswerInlineQueryAsync` with parameter `InlineQueryResultsButton.WebApp` +- Direct link like https://t.me/botusername/appname?startapp=command + +To read more about Mini Apps, see diff --git a/src/README.md b/src/README.md index ecf0f54..df9b6b3 100644 --- a/src/README.md +++ b/src/README.md @@ -11,6 +11,8 @@ in developing Telegram chatbots with examples. ➡️ Access the book pages via the Table Of Content (top/left), or start your journey with our [_Quickstart_](1/quickstart.md) guide. +Also don't miss our [Frequently Asked Questions](FAQ.md) which answers a lot of issues. + ## 🧩 Installation ⚠️ _Latest versions of the library are not available on Nuget․org due to false-positive malware detection. We are working with Nuget/ESET teams to resolve this issue._ diff --git a/src/SUMMARY.md b/src/SUMMARY.md index d9b98ad..d394531 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -26,6 +26,7 @@ - [Stickers](3/sticker.md) - [Advanced](4/README.md) - [Proxy](4/proxy.md) + - [Mini Apps](4/webapps.md) - [Passport](4/passport/README.md) - [Quickstart](4/passport/quickstart.md) - [Files & Documents](4/passport/files-docs.md) @@ -33,7 +34,6 @@ - [RSA Key](4/passport/key.md) - [Decryption FAQ](4/passport/faq.md) - [Login Widget](4/login-widget.md) - - [Systems Integration Tests](4/tests.md) - [Logging](4/logging.md) - [Migration guide => v14](Migration-Guide-to-Version-14.x.md) - [Migration guide => v17](Migration-Guide-to-Version-17.x.md) From 327dd9225fb95f08aab7da3e1f86c2538fea1021 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 9 Jul 2024 21:43:48 +0200 Subject: [PATCH 08/74] added some badges --- src/2/forward-copy-delete.md | 11 ++++++++++- src/4/webapps.md | 4 +++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/2/forward-copy-delete.md b/src/2/forward-copy-delete.md index fb632da..8230a32 100644 --- a/src/2/forward-copy-delete.md +++ b/src/2/forward-copy-delete.md @@ -8,12 +8,15 @@ _Note: When you use the plural form of the copy/forward methods, it will keep Me ## Forward message(s) +[![forward message method](https://img.shields.io/badge/Bot_API_method-forwardMessage-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#forwardmessage) +[![forward messages method](https://img.shields.io/badge/Bot_API_method-forwardMessages-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#forwardmessages) + You can **forward** message(s) from a source chat to a target chat _(it can be the same chat)_. They will appear with a "Forwarded from" header. ```csharp // Forward a single message -await bot.CopyMessageAsync(targetChatId, sourceChatId, messageId); +await bot.ForwardMessageAsync(targetChatId, sourceChatId, messageId); // Forward an incoming message (from the update) onto a target ChatId await bot.ForwardMessageAsync(chatId, update.Message.Chat, update.Message.MessageId); @@ -24,6 +27,9 @@ await bot.ForwardMessagesAsync(targetChatId, sourceChatId, new int[] { 123, 124, ## Copy message(s) +[![copy message method](https://img.shields.io/badge/Bot_API_method-copyMessage-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#copymessage) +[![copy messages method](https://img.shields.io/badge/Bot_API_method-copyMessages-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#copymessages) + If you don't want the "Forwarded from" header, you can instead **copy** the message(s). This will make them look like new messages. @@ -45,6 +51,9 @@ await bot.CopyMessagesAsync(targetChatId, sourceChatId, new int[] { 123, 124, 12 ## Delete message(s) +[![delete message method](https://img.shields.io/badge/Bot_API_method-deleteMessage-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#deletemessage) +[![delete messages method](https://img.shields.io/badge/Bot_API_method-deleteMessages-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#deletemessages) + Finally you can **delete** message(s). This is particularly useful for cleaning unwanted messages in groups. diff --git a/src/4/webapps.md b/src/4/webapps.md index 6f2d16e..b8ed210 100644 --- a/src/4/webapps.md +++ b/src/4/webapps.md @@ -1,9 +1,11 @@ # Telegram Mini Apps +[![Mini App bot API](https://img.shields.io/badge/Bot_API_Doc-Mini%20Apps-blue.svg?style=flat-square)](https://core.telegram.org/bots/webapps) + If standard Telegram Bot features aren't enough to fit your needs, you may want to consider building a [Mini App](https://core.telegram.org/bots/webapps) instead. -This take the form of an integrated browser window showing directly web pages from your bot website, +This take the form of an integrated browser window showing directly web pages from your bot WebApp, so you have more control with HTML/JS to display the interface you like. Mini Apps can be launched from various ways: From 4b43880a3c67b1f41170e00e385921086c2dc6eb Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:30:14 +0200 Subject: [PATCH 09/74] Use Markdown alerts --- src/1/quickstart.md | 1 + src/2/send-msg/text-msg.md | 1 + src/4/passport/files-docs.md | 3 ++- src/4/passport/key.md | 3 ++- src/Migration-Guide-to-Version-21.x.md | 3 ++- 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/1/quickstart.md b/src/1/quickstart.md index 93db7a8..48d7829 100644 --- a/src/1/quickstart.md +++ b/src/1/quickstart.md @@ -17,6 +17,7 @@ Bot token is a key that required to authorize the bot and send requests to the B Now that you have a bot, it's time to bring it to life! +> [!NOTE] > We recommend a recent .NET version like .NET 8, but we also support older .NET Framework (4.6.1+), .NET Core (2.0+) or .NET (5.0+) ne diff --git a/src/2/send-msg/text-msg.md b/src/2/send-msg/text-msg.md index 89305b0..650f15d 100644 --- a/src/2/send-msg/text-msg.md +++ b/src/2/send-msg/text-msg.md @@ -7,6 +7,7 @@ Text is a powerful interface for your bot and [`sendMessage`] probably is the mo Text messages are easy to send and fast to display on devices with slower networking. _Don't send boring plain text to users all the time_. Telegram allows you to format the text using HTML or Markdown. +> [!IMPORTANT] > We highly recommend you use HTML instead of Markdown because Markdown has lots of annoying aspects ## Send Text Message diff --git a/src/4/passport/files-docs.md b/src/4/passport/files-docs.md index a1db8f7..bf7b42c 100644 --- a/src/4/passport/files-docs.md +++ b/src/4/passport/files-docs.md @@ -126,7 +126,8 @@ using (System.IO.Stream stream = System.IO.File.OpenWrite("/path/to/front-side.j } ``` -> **Warning**: This method is convenient to use but gives you the least amount of control over the operations. +> [!WARNING] +> This method is convenient to use but gives you the least amount of control over the operations. ### Reverse Side File diff --git a/src/4/passport/key.md b/src/4/passport/key.md index 451e713..55b5888 100644 --- a/src/4/passport/key.md +++ b/src/4/passport/key.md @@ -36,7 +36,8 @@ static RSA GetPrivateKey() { } ``` -> **Note**: You don't necessarily need to have a dependency on the [BouncyCastle package] in your bot project. +> [!NOTE] +> You don't necessarily need to have a dependency on the [BouncyCastle package] in your bot project. > The section below offers a better alternative. ## From RSA Parameters diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/Migration-Guide-to-Version-21.x.md index 4f7af38..6e891d7 100644 --- a/src/Migration-Guide-to-Version-21.x.md +++ b/src/Migration-Guide-to-Version-21.x.md @@ -105,7 +105,8 @@ This way, you won't need to pass a cancellationToken to every method call after ## Polling system now catch exceptions in your HandleUpdate code (v21.3) ->⚠️ That's a change of behaviour, but most of you will probably welcome this change +> [!WARNING] +> That's a change of behaviour, but most of you will probably welcome this change If you forgot to wrap your HandleUpdateAsync code in a big `try..catch`, and your code happen to throw an exception, this would previously stop the polling completely. From 842c98b41bfc48a1691d18eca569e8ea846078b0 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:04:13 +0200 Subject: [PATCH 10/74] add mdbook--alerts --- .github/workflows/ci.yml | 17 +++++++++++++---- book.toml | 2 ++ src/README.md | 4 +++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 154299d..fcd36d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,10 +17,19 @@ jobs: run: dotnet restore - name: Build run: dotnet build --configuration Release --no-restore - - name: Setup mdBook - uses: peaceiris/actions-mdbook@v2 - with: - mdbook-version: '0.4.35' + - name: Install mdBook + run: | + curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh + rustup update + cargo install --force --version ${MDBOOK_VERSION} mdbook + cargo install --force mdbook-alerts + - name: Setup Pages + id: pages + uses: actions/configure-pages@v4 + # - name: Setup mdBook + # uses: peaceiris/actions-mdbook@v2 + # with: + # mdbook-version: '0.4.35' - name: Setup nodejs uses: actions/setup-node@v4 with: diff --git a/book.toml b/book.toml index c0042d0..c0c9b47 100644 --- a/book.toml +++ b/book.toml @@ -9,3 +9,5 @@ language = "en" [output.html] git-repository-url = "https://github.com/TelegramBots/book" additional-css = ["theme/custom.css"] + +[preprocessor.alerts] diff --git a/src/README.md b/src/README.md index df9b6b3..93d83f5 100644 --- a/src/README.md +++ b/src/README.md @@ -14,7 +14,9 @@ in developing Telegram chatbots with examples. Also don't miss our [Frequently Asked Questions](FAQ.md) which answers a lot of issues. ## 🧩 Installation -⚠️ _Latest versions of the library are not available on Nuget․org due to false-positive malware detection. We are working with Nuget/ESET teams to resolve this issue._ + +> [!IMPORTANT] +> _Latest versions of the library are not available on Nuget․org due to false-positive malware detection. We are working with Nuget/ESET teams to resolve this issue._ In the mean time, latest versions are available on our [special nuget feed](https://nuget.voids.site/packages/Telegram.Bot): `https://nuget.voids.site/v3/index.json` From 1f4b6a540065a168188dfc0eaeb60e8dc8453719 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:05:47 +0200 Subject: [PATCH 11/74] fix build --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fcd36d5..b498910 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: run: dotnet build --configuration Release --no-restore - name: Install mdBook run: | - curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh + curl https://sh.rustup.rs -sSf | sh rustup update cargo install --force --version ${MDBOOK_VERSION} mdbook cargo install --force mdbook-alerts From 50ee4703d6e9de43311d3d561367d58ba7a9d58a Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:09:29 +0200 Subject: [PATCH 12/74] fix ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b498910..88154d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: - name: Install mdBook run: | curl https://sh.rustup.rs -sSf | sh - rustup update + rustup -y update cargo install --force --version ${MDBOOK_VERSION} mdbook cargo install --force mdbook-alerts - name: Setup Pages From 485b5da0e59818e74a4a459ec1746a8d61f0eba3 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:16:01 +0200 Subject: [PATCH 13/74] fix ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 88154d0..4b01a37 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: run: dotnet build --configuration Release --no-restore - name: Install mdBook run: | - curl https://sh.rustup.rs -sSf | sh + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y rustup -y update cargo install --force --version ${MDBOOK_VERSION} mdbook cargo install --force mdbook-alerts From 450fd52caf46f0b01e3c868628a69c69897c112c Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:18:49 +0200 Subject: [PATCH 14/74] fix ci.yml --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b01a37..cb0386e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,6 @@ jobs: - name: Install mdBook run: | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - rustup -y update cargo install --force --version ${MDBOOK_VERSION} mdbook cargo install --force mdbook-alerts - name: Setup Pages From 7dab7f3bdea0f46a25b9a0e4cfde6163573ca1a5 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:19:27 +0200 Subject: [PATCH 15/74] fix ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb0386e..bceee3f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: - name: Install mdBook run: | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - cargo install --force --version ${MDBOOK_VERSION} mdbook + cargo install --force --version 0.4.36 mdbook cargo install --force mdbook-alerts - name: Setup Pages id: pages From 1e3847c733d7850743074184ae261ffcbaae4f1b Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:29:42 +0200 Subject: [PATCH 16/74] ci.yml --- .github/workflows/ci.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bceee3f..fb49be8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,18 +17,14 @@ jobs: run: dotnet restore - name: Build run: dotnet build --configuration Release --no-restore - - name: Install mdBook + - name: Setup mdBook + uses: peaceiris/actions-mdbook@v2 + with: + mdbook-version: '0.4.36' + - name: Install mdbook-linkcheck run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - cargo install --force --version 0.4.36 mdbook - cargo install --force mdbook-alerts - - name: Setup Pages - id: pages - uses: actions/configure-pages@v4 - # - name: Setup mdBook - # uses: peaceiris/actions-mdbook@v2 - # with: - # mdbook-version: '0.4.35' + curl -LSfs https://japaric.github.io/trust/install.sh | \ + sh -s -- --git lambdalisue/rs-mdbook-alerts - name: Setup nodejs uses: actions/setup-node@v4 with: From 3e79c82bdc92111d36bcccbf2de7c5af23b67f8c Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:39:15 +0200 Subject: [PATCH 17/74] ci.yml --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fb49be8..e233a2c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,10 +21,10 @@ jobs: uses: peaceiris/actions-mdbook@v2 with: mdbook-version: '0.4.36' - - name: Install mdbook-linkcheck - run: | - curl -LSfs https://japaric.github.io/trust/install.sh | \ - sh -s -- --git lambdalisue/rs-mdbook-alerts + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + - run: cargo install mdbook-alerts - name: Setup nodejs uses: actions/setup-node@v4 with: From bc7c082d0c9aa1c541cac7e372c3c4135e45e25c Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:51:34 +0200 Subject: [PATCH 18/74] typo --- src/1/quickstart.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/1/quickstart.md b/src/1/quickstart.md index 48d7829..789e9dc 100644 --- a/src/1/quickstart.md +++ b/src/1/quickstart.md @@ -19,7 +19,6 @@ Now that you have a bot, it's time to bring it to life! > [!NOTE] > We recommend a recent .NET version like .NET 8, but we also support older .NET Framework (4.6.1+), .NET Core (2.0+) or .NET (5.0+) -ne Create a new console project for your bot and add a reference to `Telegram.Bot` package: From 15cbd24ac2301f2a3989969a3764c42f3f22bc7e Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:08:37 +0200 Subject: [PATCH 19/74] doc v21.5 --- src/Migration-Guide-to-Version-21.x.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/Migration-Guide-to-Version-21.x.md index 6e891d7..d816229 100644 --- a/src/Migration-Guide-to-Version-21.x.md +++ b/src/Migration-Guide-to-Version-21.x.md @@ -124,4 +124,23 @@ Now the Polling system will catch your exceptions, pass them to your HandleError >{ > if (source is HandleErrorSource.HandleUpdateError) throw ex; > ... ->``` \ No newline at end of file +>``` + +## New helpers/extensions to simplify your code (v21.5) + +- When replying to a message, you can now simply pass a `Message` for _replyParameters:_ rather than a `Message.MessageId` +- `Update.AllTypes` is a constant array containing all `UpdateType`s. You can pass it for the _allowedUpdates:_ parameter (`GetUpdatesAsync`/`SetWebhookAsync`) +- Message has now 2 extensions methods: `.ToHtml()` and `.ToMarkdown()` to convert the message text/caption and their entities into a simple Html or Markdown string. +- You can also use methods `Markdown.Escape()` and `HtmlText.Escape()` to sanitize reserved characters from strings +- Reply/Inline Keyboard Markup now have construction methods to simplify building keyboards dynamically: +```csharp +var replyMarkup = new InlineKeyboardMarkup() + .AddButton(InlineKeyboardButton.WithUrl("Link to Repository", "https://github.com/TelegramBots/Telegram.Bot")) + .AddNewRow().AddButton("callback").AddButton("caption", "data") + .AddNewRow("with", "three", "buttons") + .AddNewRow().AddButtons("A", "B", InlineKeyboardButton.WithSwitchInlineQueryCurrentChat("switch")); +``` + +As [previously announced](#request-structures), the Request-typed methods are gone. +But you can still send Request structures via the `MakeRequestAsync` method. + From 3fec0238e56d174e9c5a77d2fe9da190ef14d59e Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:16:09 +0200 Subject: [PATCH 20/74] new ReplyKeyboardMarkup(true) --- src/Migration-Guide-to-Version-21.x.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/Migration-Guide-to-Version-21.x.md index d816229..bcfaece 100644 --- a/src/Migration-Guide-to-Version-21.x.md +++ b/src/Migration-Guide-to-Version-21.x.md @@ -140,6 +140,7 @@ var replyMarkup = new InlineKeyboardMarkup() .AddNewRow("with", "three", "buttons") .AddNewRow().AddButtons("A", "B", InlineKeyboardButton.WithSwitchInlineQueryCurrentChat("switch")); ``` +- Same for ReplyKeyboardMarkup (and you can use `new ReplyKeyboardMarkup(true)` to resize keyboard) As [previously announced](#request-structures), the Request-typed methods are gone. But you can still send Request structures via the `MakeRequestAsync` method. From 22728ad62c41bb85d8ea8d1873798c27da1b2f48 Mon Sep 17 00:00:00 2001 From: wiz0u <11647984+wiz0u@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:47:40 +0200 Subject: [PATCH 21/74] Update Migration-Guide-to-Version-21.x.md --- src/Migration-Guide-to-Version-21.x.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/Migration-Guide-to-Version-21.x.md index bcfaece..43d2abd 100644 --- a/src/Migration-Guide-to-Version-21.x.md +++ b/src/Migration-Guide-to-Version-21.x.md @@ -3,7 +3,7 @@ Important notes: - Don't bother about version 20, migrate directly to version 21.* - You won't find this version on Nuget: [See this guide to install it in your programs](https://telegrambots.github.io/book/index.html#-installation). -- Version 21.1 supports [Bot API 7.5](https://core.telegram.org/bots/api-changelog#june-18-2024) _(including [Telegram Stars payments](#payments-with-telegram-stars))_ +- Version 21.6 supports [Bot API 7.7](https://core.telegram.org/bots/api-changelog) _(including [Telegram Stars payments](#payments-with-telegram-stars))_ - Library is now based on System.Text.Json and doesn't depend on NewtonsoftJson anymore. _([See below](#webhooks-with-systemtextjson))_ ## Renamed parameter _replyToMessageId:_ → _replyParameters:_ @@ -66,7 +66,7 @@ Request structures _(types ending with `Request`)_ are NOT the recommended way t They are to be considered as low-level raw access to Bot API structures for advanced programmers, and might change/break at any time in the future. If you have existing code using them, you can use the `MakeRequestAsync` method to send those requests. -(Other methods based on those requests will be removed soon) +_(Other methods based on those requests will be removed soon)_ ## Payments with Telegram Stars From 423e943338f69878024d33117e44fd195d6581a9 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:21:03 +0200 Subject: [PATCH 22/74] Less warnings --- Examples/.editorconfig | 10 ++++++++++ Examples/3/LongPolling.cs | 2 ++ 2 files changed, 12 insertions(+) diff --git a/Examples/.editorconfig b/Examples/.editorconfig index d91f42c..e0b9a8e 100644 --- a/Examples/.editorconfig +++ b/Examples/.editorconfig @@ -27,6 +27,16 @@ csharp_empty_block_style = together csharp_max_line_length = 120 # Solution Files + +# CS1998: Async method lacks 'await' operators and will run synchronously +dotnet_diagnostic.CS1998.severity = silent + +# IDE0062: Make local function 'static' +dotnet_diagnostic.IDE0062.severity = silent + +# CA2016: Forward the 'CancellationToken' parameter to methods +dotnet_diagnostic.CA2016.severity = none + [*.sln] indent_style = tab diff --git a/Examples/3/LongPolling.cs b/Examples/3/LongPolling.cs index 17a9817..64592d5 100644 --- a/Examples/3/LongPolling.cs +++ b/Examples/3/LongPolling.cs @@ -2,6 +2,8 @@ namespace BookExamples.Chapter3; +#pragma warning disable CS0168 // Variable is declared but never used + internal class ExampleBot { private async Task LongPolling() From dbed18d2d89a0683cac6817eaef9a49cc600dee8 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Sun, 14 Jul 2024 14:16:42 +0200 Subject: [PATCH 23/74] improve readability --- src/README.md | 10 ++-------- theme/custom.css | 10 ++++++++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/README.md b/src/README.md index 93d83f5..6833a62 100644 --- a/src/README.md +++ b/src/README.md @@ -4,14 +4,8 @@ **[Telegram.Bot](https://github.com/TelegramBots/Telegram.Bot)** is the most popular .NET client for [Telegram Bot API](https://core.telegram.org/bots/api), allowing [developers to build bots](https://core.telegram.org/bots) for [Telegram](https://www.telegram.org) messaging app. -Telegram Bot API is [officially documented](https://core.telegram.org/bots/api) but this book covers all you need to know to create a -chatbot in .NET. There are also many concrete examples written in C#. -The guides here can even be useful to bot developers using other languages/platforms as it shows best practices -in developing Telegram chatbots with examples. - -➡️ Access the book pages via the Table Of Content (top/left), or start your journey with our [_Quickstart_](1/quickstart.md) guide. - -Also don't miss our [Frequently Asked Questions](FAQ.md) which answers a lot of issues. +This book covers all you need to know to create a chatbot in .NET, with many concrete examples written in C#. +Begin with our [_Quickstart_](1/quickstart.md), or choose from the Table Of Content (left/top), and don't miss our useful [Frequently Asked Questions](FAQ.md). ## 🧩 Installation diff --git a/theme/custom.css b/theme/custom.css index 3f1d4cd..c9722cc 100644 --- a/theme/custom.css +++ b/theme/custom.css @@ -1,3 +1,13 @@ :root { --content-max-width: 900px; } + +/* mdbook margins are way too big */ +h2, h3 { + margin-block-start: 1em; + margin-block-end: 0.5em; +} +h4, h5 { + margin-block-start: 0.8em; + margin-block-end: 0.4em; +} From ecb4b1d247545026c5b698e1b3a7ebd265781eba Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Sun, 14 Jul 2024 14:22:01 +0200 Subject: [PATCH 24/74] faster ci? --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e233a2c..1eb7fce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,9 +21,9 @@ jobs: uses: peaceiris/actions-mdbook@v2 with: mdbook-version: '0.4.36' - - uses: actions-rs/toolchain@v1 - with: - toolchain: stable + # - uses: actions-rs/toolchain@v1 + # with: + # toolchain: stable - run: cargo install mdbook-alerts - name: Setup nodejs uses: actions/setup-node@v4 From 3ace22164e9393a50d47148f46106f84ea7357e1 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:08:06 +0200 Subject: [PATCH 25/74] ci: try with taiki-e/install-action@v2 & cargo binstall --- .github/workflows/ci.yml | 26 ++++++++++++++++---------- Examples/Examples.csproj | 1 + 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1eb7fce..8b405ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,18 +17,24 @@ jobs: run: dotnet restore - name: Build run: dotnet build --configuration Release --no-restore - - name: Setup mdBook - uses: peaceiris/actions-mdbook@v2 + + - name: Install mdbook and cargo-binstall binaries + uses: taiki-e/install-action@v2 with: - mdbook-version: '0.4.36' - # - uses: actions-rs/toolchain@v1 + tool: mdbook,cargo-binstall + - name: Install mdbook extensions + run: cargo binstall -y mdbook-mermaid mdbook-alerts + + # - name: Setup mdBook + # uses: peaceiris/actions-mdbook@v2 # with: - # toolchain: stable - - run: cargo install mdbook-alerts - - name: Setup nodejs - uses: actions/setup-node@v4 - with: - node-version: '18' + # mdbook-version: '0.4.36' + # - run: cargo install mdbook-alerts + # - name: Setup nodejs + # uses: actions/setup-node@v4 + # with: + # node-version: '18' + # - name: Setup linter and spellchecker cli # run: npm install --location=global markdownlint-cli cspell # - name: Lint markdown files diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj index f162798..e940e1b 100644 --- a/Examples/Examples.csproj +++ b/Examples/Examples.csproj @@ -8,6 +8,7 @@ + From 6fe013f16863db6ad4779c9c9445a4771a0de641 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:21:14 +0200 Subject: [PATCH 26/74] test --- src/3/updates/webhook.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3/updates/webhook.md b/src/3/updates/webhook.md index 769ccd3..2c0b424 100644 --- a/src/3/updates/webhook.md +++ b/src/3/updates/webhook.md @@ -91,7 +91,7 @@ Telegram will consider it a temporary failure and will RESEND the same update a ```csharp if (update.Id <= LastUpdateId) return; LastUpdateId = update.Id; - // put your code to handle the Update here. + // your code to handle the Update here. ``` - Most web hostings will recycle your app after some HTTP inactivity (= stop your app and restart it on the next HTTP request) To prevent issues like this: From 1a8164db36cb7a7da7df79832a5816d26b68dafb Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:41:41 +0200 Subject: [PATCH 27/74] Update for v21.7 --- src/3/updates/webhook.md | 6 +++--- src/Migration-Guide-to-Version-21.x.md | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/3/updates/webhook.md b/src/3/updates/webhook.md index 2c0b424..5181a8f 100644 --- a/src/3/updates/webhook.md +++ b/src/3/updates/webhook.md @@ -5,7 +5,7 @@ With Webhook, your application gets notified automatically by Telegram when new updates arrive for your bot. -Your application will receive HTTP POST requests with an Update structure in the body, using specific JSON serialization settings as presented in `Telegram.Bot.Serialization.JsonSerializerOptionsProvider.Options`. +Your application will receive HTTP POST requests with an Update structure in the body, using specific JSON serialization settings `Telegram.Bot.JsonBotAPI.Options`. Below, you will find how to configure an **ASP.NET Core Web API** project to make it work with Telegram.Bot, either with Controllers or Minimal APIs @@ -63,7 +63,7 @@ public async Task Post() { Update update; using (var body = await Request.Content.ReadAsStreamAsync()) - update = System.Text.Json.JsonSerializer.Deserialize(body, JsonSerializerOptionsProvider.Options); + update = System.Text.Json.JsonSerializer.Deserialize(body, JsonBotAPI.Options); await HandleUpdate(update); return Ok(); } @@ -87,7 +87,7 @@ Useful [step-by-step guide](https://medium.com/@oktaykopcak/81c8c4a9a853) - [Official webhook guide](https://core.telegram.org/bots/webhooks) - If your update handler throws an exception or takes too much time to return, Telegram will consider it a temporary failure and will RESEND the same update a bit later. - So you may want to prevent handling the same update.Id twice: + You may want to prevent handling the same update.Id twice: ```csharp if (update.Id <= LastUpdateId) return; LastUpdateId = update.Id; diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/Migration-Guide-to-Version-21.x.md index 43d2abd..5f9365d 100644 --- a/src/Migration-Guide-to-Version-21.x.md +++ b/src/Migration-Guide-to-Version-21.x.md @@ -145,3 +145,18 @@ var replyMarkup = new InlineKeyboardMarkup() As [previously announced](#request-structures), the Request-typed methods are gone. But you can still send Request structures via the `MakeRequestAsync` method. +## Simplified polling with events (v21.7) + +Instead of `StartReceiving`/`ReceiveAsync` system, you can now simply set 2 or 3 events on the botClient: +- `bot.OnMessage += ...` to receive Message updates +- `bot.OnUpdate += ...` to receive other updates _(or all updates if you don't set `OnMessage`)_ +- `bot.OnError += ...` to handle errors/exceptions during polling or your handlers + +Note: The second argument to `OnMessage` events specify which kind of update it was (if it's an _edited_, _channel_ or _business_ message) + +When you assign those events, polling starts automatically, you don't have anything to do. +Polling will stop when you remove (`-=`) your events, or when you cancel the [global cancellation token](#global-cancellation-token-v212) + +You can also use `await bot.DropPendingUpdateAsync()` before setting those events in order to ignore past updates. + +The [Console example project]((https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console)) has been updated to demonstrate these events. \ No newline at end of file From ed4ea1a7517ef8e16e5c868f02b2b8aaae6bb0d5 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:47:13 +0200 Subject: [PATCH 28/74] fix url --- src/Migration-Guide-to-Version-21.x.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/Migration-Guide-to-Version-21.x.md index 5f9365d..f6072ea 100644 --- a/src/Migration-Guide-to-Version-21.x.md +++ b/src/Migration-Guide-to-Version-21.x.md @@ -159,4 +159,4 @@ Polling will stop when you remove (`-=`) your events, or when you cancel the [gl You can also use `await bot.DropPendingUpdateAsync()` before setting those events in order to ignore past updates. -The [Console example project]((https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console)) has been updated to demonstrate these events. \ No newline at end of file +The [Console example project](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console) has been updated to demonstrate these events. \ No newline at end of file From a237a29aaedca127dc297abb4b45b1fed4e9988f Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:38:21 +0200 Subject: [PATCH 29/74] little fix --- src/Migration-Guide-to-Version-21.x.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/Migration-Guide-to-Version-21.x.md index f6072ea..210c721 100644 --- a/src/Migration-Guide-to-Version-21.x.md +++ b/src/Migration-Guide-to-Version-21.x.md @@ -157,6 +157,6 @@ Note: The second argument to `OnMessage` events specify which kind of update it When you assign those events, polling starts automatically, you don't have anything to do. Polling will stop when you remove (`-=`) your events, or when you cancel the [global cancellation token](#global-cancellation-token-v212) -You can also use `await bot.DropPendingUpdateAsync()` before setting those events in order to ignore past updates. +You can also use `await bot.DropPendingUpdatesAsync()` before setting those events in order to ignore past updates. The [Console example project](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console) has been updated to demonstrate these events. \ No newline at end of file From 2c48dad5c65a3b3cacd963da25a00053f57eb6c9 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:39:46 +0200 Subject: [PATCH 30/74] minor change --- src/Migration-Guide-to-Version-21.x.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/Migration-Guide-to-Version-21.x.md index 210c721..9acc852 100644 --- a/src/Migration-Guide-to-Version-21.x.md +++ b/src/Migration-Guide-to-Version-21.x.md @@ -152,11 +152,10 @@ Instead of `StartReceiving`/`ReceiveAsync` system, you can now simply set 2 or 3 - `bot.OnUpdate += ...` to receive other updates _(or all updates if you don't set `OnMessage`)_ - `bot.OnError += ...` to handle errors/exceptions during polling or your handlers -Note: The second argument to `OnMessage` events specify which kind of update it was (if it's an _edited_, _channel_ or _business_ message) +Note: Second argument to `OnMessage` event specifies which kind of update it was (_edited_, _channel_ or _business_ message?) When you assign those events, polling starts automatically, you don't have anything to do. Polling will stop when you remove (`-=`) your events, or when you cancel the [global cancellation token](#global-cancellation-token-v212) -You can also use `await bot.DropPendingUpdatesAsync()` before setting those events in order to ignore past updates. - -The [Console example project](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console) has been updated to demonstrate these events. \ No newline at end of file +You can also use `await bot.DropPendingUpdatesAsync()` before setting those events to ignore past updates. +The [Console example project](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console) has been updated to demonstrate these events. From 54315dbf32aaab3372d4715ea8b1275ef2bbb8e3 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Fri, 19 Jul 2024 00:53:12 +0200 Subject: [PATCH 31/74] updating documentation for bot.OnUpdate --- .editorconfig | 2 +- Examples/1/ExampleBot.cs | 35 -------------- Examples/1/Quickstart.cs | 18 ------- Examples/2/ReplyMarkup.cs | 75 +++++++++++------------------- Examples/2/SendMessage.cs | 4 +- Examples/3/Files.cs | 2 +- Examples/3/Inline.cs | 2 +- Examples/3/LongPolling.cs | 35 -------------- Examples/Examples.csproj | 2 +- src/1/example-bot.md | 52 +++++++++++++-------- src/1/full-bot.md | 69 +++++++++++++++++++++++++++ src/1/quickstart.md | 12 +++-- src/2/reply-markup.md | 12 ++--- src/2/send-msg/native-polls-msg.md | 2 +- src/3/updates/README.md | 2 +- src/3/updates/polling.md | 44 ++++++++++++++++-- src/SUMMARY.md | 3 +- 17 files changed, 190 insertions(+), 181 deletions(-) delete mode 100644 Examples/1/ExampleBot.cs delete mode 100644 Examples/1/Quickstart.cs delete mode 100644 Examples/3/LongPolling.cs create mode 100644 src/1/full-bot.md diff --git a/.editorconfig b/.editorconfig index 0cd4bdf..5bd33ed 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,4 +5,4 @@ indent_size = 2 # Markdown Files [*.md] trim_trailing_whitespace = false -indent_size = 2 +indent_size = 4 diff --git a/Examples/1/ExampleBot.cs b/Examples/1/ExampleBot.cs deleted file mode 100644 index 5bb14ac..0000000 --- a/Examples/1/ExampleBot.cs +++ /dev/null @@ -1,35 +0,0 @@ -// ANCHOR: usings -using Telegram.Bot; -using Telegram.Bot.Types; -using Telegram.Bot.Types.Enums; -// ANCHOR_END: usings - -namespace BookExamples.Chapter1; - -internal class ExampleBot -{ - private async Task BookExamples() - { -// ANCHOR: example-bot -using var cts = new CancellationTokenSource(); -var bot = new TelegramBotClient("{YOUR_ACCESS_TOKEN_HERE}", cancellationToken: cts.Token); -bot.StartReceiving(OnUpdate, async (bot, ex, ct) => Console.WriteLine(ex)); - -var me = await bot.GetMeAsync(); -Console.WriteLine($"@{me.Username} is running... Press Enter to terminate"); -Console.ReadLine(); -cts.Cancel(); // stop the bot - -// method that handle updates coming for the bot: -async Task OnUpdate(ITelegramBotClient bot, Update update, CancellationToken ct) -{ - if (update.Message is null) return; // we want only updates about new Message - if (update.Message.Text is null) return; // we want only updates about new Text Message - var msg = update.Message; - Console.WriteLine($"Received message '{msg.Text}' in {msg.Chat}"); - // let's echo back received text in the chat - await bot.SendTextMessageAsync(msg.Chat, $"{msg.From} said: {msg.Text}"); -} -// ANCHOR_END: example-bot - } -} diff --git a/Examples/1/Quickstart.cs b/Examples/1/Quickstart.cs deleted file mode 100644 index dea7476..0000000 --- a/Examples/1/Quickstart.cs +++ /dev/null @@ -1,18 +0,0 @@ -// ANCHOR: usings -using Telegram.Bot; -// ANCHOR_END: usings - -namespace BookExamples.Chapter1; - -internal class Quickstart -{ - private async Task BookExamples() - { -// ANCHOR: quickstart -var bot = new TelegramBotClient("{YOUR_ACCESS_TOKEN_HERE}"); - -var me = await bot.GetMeAsync(); -Console.WriteLine($"Hello, World! I am user {me.Id} and my name is {me.FirstName}."); -// ANCHOR_END: quickstart - } -} diff --git a/Examples/2/ReplyMarkup.cs b/Examples/2/ReplyMarkup.cs index bb517c3..a1b95c1 100644 --- a/Examples/2/ReplyMarkup.cs +++ b/Examples/2/ReplyMarkup.cs @@ -10,104 +10,83 @@ namespace BookExamples.Chapter2; internal class ReplyMarkup { - public readonly ITelegramBotClient bot = new TelegramBotClient("{YOUR_ACCESS_TOKEN_HERE}"); + public readonly ITelegramBotClient bot = new TelegramBotClient("YOUR_BOT_TOKEN"); public readonly ChatId chatId = 12345; private async Task SingleRowMarkup() { // ANCHOR: single-row -var buttons = new KeyboardButton[] -{ - "Help me", "Call me ☎️", -}; +var replyMarkup = new ReplyKeyboardMarkup(true) + .AddButtons("Help me", "Call me ☎️"); -var sent = await bot.SendTextMessageAsync(chatId, "Choose a response", - replyMarkup: new ReplyKeyboardMarkup(buttons) { ResizeKeyboard = true }); +var sent = await bot.SendTextMessageAsync(chatId, "Choose a response", replyMarkup: replyMarkup); // ANCHOR_END: single-row } private async Task MultipleRowMarkup() { // ANCHOR: multiple-row -var buttons = new KeyboardButton[][] -{ - new KeyboardButton[] { "Help me" }, - new KeyboardButton[] { "Call me ☎️", "Write me ✉️" }, -}; +var replyMarkup = new ReplyKeyboardMarkup(true) + .AddButton("Help me") + .AddNewRow("Call me ☎️", "Write me ✉️"); -var sent = await bot.SendTextMessageAsync(chatId, "Choose a response", - replyMarkup: new ReplyKeyboardMarkup(buttons) { ResizeKeyboard = true }); +var sent = await bot.SendTextMessageAsync(chatId, "Choose a response", replyMarkup: replyMarkup); // ANCHOR_END: multiple-row } private async Task RequestInfo() { // ANCHOR: request-info -var buttons = new[] -{ - KeyboardButton.WithRequestLocation("Share Location"), - KeyboardButton.WithRequestContact("Share Contact"), -}; +var replyMarkup = new ReplyKeyboardMarkup() + .AddButton(KeyboardButton.WithRequestLocation("Share Location")) + .AddButton(KeyboardButton.WithRequestContact("Share Contact")); -var sent = await bot.SendTextMessageAsync(chatId, "Who or Where are you?", - replyMarkup: new ReplyKeyboardMarkup(buttons)); +var sent = await bot.SendTextMessageAsync(chatId, "Who or Where are you?", replyMarkup: replyMarkup); // ANCHOR_END: request-info } private async Task RemoveKeyboard() { // ANCHOR: remove-keyboard -var sent = await bot.SendTextMessageAsync(chatId, "Removing keyboard", - replyMarkup: new ReplyKeyboardRemove()); +await bot.SendTextMessageAsync(chatId, "Removing keyboard", replyMarkup: new ReplyKeyboardRemove()); // ANCHOR_END: remove-keyboard } private async Task CallbackButtons() { // ANCHOR: callback-buttons -var buttons = new InlineKeyboardButton[][] -{ - new[] // first row - { - InlineKeyboardButton.WithCallbackData("1.1", "11"), - InlineKeyboardButton.WithCallbackData("1.2", "12"), - }, - new[] // second row - { - InlineKeyboardButton.WithCallbackData("2.1", "21"), - InlineKeyboardButton.WithCallbackData("2.2", "22"), - }, -}; +var inlineMarkup = new InlineKeyboardMarkup() + .AddButton("1.1", "11") // first row, first button + .AddButton("1.2", "12") // first row, second button + .AddNewRow() + .AddButton("2.1", "21") // second row, first button + .AddButton("2.2", "22");// second row, second button var sent = await bot.SendTextMessageAsync(chatId, "A message with an inline keyboard markup", - replyMarkup: new InlineKeyboardMarkup(buttons)); + replyMarkup: inlineMarkup); // ANCHOR_END: callback-buttons } private async Task UrlButtons() { // ANCHOR: url-buttons -var buttons = new[] -{ - InlineKeyboardButton.WithUrl("Repository Link", "https://github.com/TelegramBots/Telegram.Bot") -}; +var inlineMarkup = new InlineKeyboardMarkup() + .AddButton(InlineKeyboardButton.WithUrl("Repository Link", "https://github.com/TelegramBots/Telegram.Bot")); var sent = await bot.SendTextMessageAsync(chatId, "A message with an inline keyboard markup", - replyMarkup: new InlineKeyboardMarkup(buttons)); + replyMarkup: inlineMarkup); // ANCHOR_END: url-buttons } private async Task SwitchToInline() { // ANCHOR: switch-to-inline -var buttons = new[] -{ - InlineKeyboardButton.WithSwitchInlineQuery("switch_inline_query"), - InlineKeyboardButton.WithSwitchInlineQueryCurrentChat("switch_inline_query_current_chat"), -}; +var inlineMarkup = new InlineKeyboardMarkup() + .AddButton(InlineKeyboardButton.WithSwitchInlineQuery("switch_inline_query")) + .AddButton(InlineKeyboardButton.WithSwitchInlineQueryCurrentChat("switch_inline_query_current_chat")); var sent = await bot.SendTextMessageAsync(chatId, "A message with an inline keyboard markup", - replyMarkup: new InlineKeyboardMarkup(buttons)); + replyMarkup: inlineMarkup); // ANCHOR_END: switch-to-inline } } diff --git a/Examples/2/SendMessage.cs b/Examples/2/SendMessage.cs index 9d8ad3b..8b46f1d 100644 --- a/Examples/2/SendMessage.cs +++ b/Examples/2/SendMessage.cs @@ -7,7 +7,7 @@ namespace Examples.Chapter2; internal class SendMessage { - public readonly ITelegramBotClient bot = new TelegramBotClient("{YOUR_ACCESS_TOKEN_HERE}"); + public readonly ITelegramBotClient bot = new TelegramBotClient("YOUR_BOT_TOKEN"); public readonly ChatId chatId = 12345; public readonly Update update = new (); @@ -90,7 +90,7 @@ private async Task SendPoll() // ANCHOR_END: send-poll // ANCHOR: stop-poll -Poll poll = await bot.StopPollAsync(pollMessage.Chat.Id, pollMessage.MessageId); +Poll poll = await bot.StopPollAsync(pollMessage.Chat, pollMessage.MessageId); // ANCHOR_END: stop-poll } diff --git a/Examples/3/Files.cs b/Examples/3/Files.cs index e835b98..c1e2cde 100644 --- a/Examples/3/Files.cs +++ b/Examples/3/Files.cs @@ -5,7 +5,7 @@ namespace Examples.Chapter3; internal class Files { - public readonly ITelegramBotClient bot = new TelegramBotClient("{YOUR_ACCESS_TOKEN_HERE}"); + public readonly ITelegramBotClient bot = new TelegramBotClient("YOUR_BOT_TOKEN"); public readonly ChatId chatId = 12345; public readonly Update update = new(); diff --git a/Examples/3/Inline.cs b/Examples/3/Inline.cs index 79e627a..7bdcd9b 100644 --- a/Examples/3/Inline.cs +++ b/Examples/3/Inline.cs @@ -10,7 +10,7 @@ namespace BookExamples.Chapter3; internal class Inline { - public readonly ITelegramBotClient bot = new TelegramBotClient("{YOUR_ACCESS_TOKEN_HERE}"); + public readonly ITelegramBotClient bot = new TelegramBotClient("YOUR_BOT_TOKEN"); // ANCHOR: arrays private readonly string[] sites = { "Google", "Github", "Telegram", "Wikipedia" }; private readonly string[] siteDescriptions = diff --git a/Examples/3/LongPolling.cs b/Examples/3/LongPolling.cs deleted file mode 100644 index 64592d5..0000000 --- a/Examples/3/LongPolling.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Telegram.Bot; - -namespace BookExamples.Chapter3; - -#pragma warning disable CS0168 // Variable is declared but never used - -internal class ExampleBot -{ - private async Task LongPolling() - { -// ANCHOR: long-polling -CancellationTokenSource cts = new(); -var bot = new TelegramBotClient("{YOUR BOT TOKEN HERE}", cancellationToken: cts.Token); - -int? offset = null; -while (!cts.IsCancellationRequested) -{ - var updates = await bot.GetUpdatesAsync(offset, timeout: 2); - foreach (var update in updates) - { - offset = update.Id + 1; - try - { - // put your code to handle one Update here. - } - catch (Exception ex) - { - // log exception and continue - } - if (cts.IsCancellationRequested) break; - } -} -// ANCHOR_END: long-polling - } -} diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj index e940e1b..6102bda 100644 --- a/Examples/Examples.csproj +++ b/Examples/Examples.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/1/example-bot.md b/src/1/example-bot.md index 3959fd1..7f21a63 100644 --- a/src/1/example-bot.md +++ b/src/1/example-bot.md @@ -1,18 +1,36 @@ -# Full Example - Your first bot +# Your First Chat Bot -On the [previous page] we got an access token and used the [`getMe`] method to check our setup. +On the [previous page](quickstart.md) we got a bot token and used the [`getMe`](https://core.telegram.org/bots/api#getme) method to check our setup. Now, it is time to make an _interactive_ bot that gets users' messages and replies to them like in this screenshot: ![Example Image](docs/shot-example_bot.jpg) Copy the following code to `Program.cs`. -> ⚠️ Replace `{YOUR_ACCESS_TOKEN_HERE}` with the access token from the [`@BotFather`]. +> ⚠️ Replace `YOUR_BOT_TOKEN` with the bot token obtained from [`@BotFather`]. ```c# -{{#include ../../Examples/1/ExampleBot.cs:usings}} - -{{#include ../../Examples/1/ExampleBot.cs:example-bot}} +using Telegram.Bot; +using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; + +using var cts = new CancellationTokenSource(); +var bot = new TelegramBotClient("YOUR_BOT_TOKEN", cancellationToken: cts.Token); +var me = await bot.GetMeAsync(); +bot.OnMessage += OnMessage; + +Console.WriteLine($"@{me.Username} is running... Press Enter to terminate"); +Console.ReadLine(); +cts.Cancel(); // stop the bot + +// method that handle messages received by the bot: +async Task OnMessage(Message msg, UpdateType type) +{ + if (msg.Text is null) return; // we only handle Text messages here + Console.WriteLine($"Received {type} '{msg.Text}' in {msg.Chat}"); + // let's echo back received text in the chat + await bot.SendTextMessageAsync(msg.Chat, $"{msg.From} said: {msg.Text}"); +} ``` Run the program: @@ -22,27 +40,21 @@ dotnet run ``` It runs waiting for text messages unless forcefully stopped by pressing Enter. Open a private chat with your bot in -Telegram and send a text message to it. Bot should reply in no time. +Telegram and send a text message to it. Bot should reply immediately. + +By setting `bot.OnMessage`, the bot client starts polling Telegram servers for messages received by the bot. +This is done automatically in the background, so your program continue to execute and we use `Console.ReadLine()` to keep it running until you press Enter. -By invoking [`StartReceiving(...)`] bot client starts fetching updates using [`getUpdates`] method for the bot -from Telegram servers. This operation does not block the caller thread, because it is done on the ThreadPool. We use `Console.ReadLine()` to keep the app running. +When user sends a message, the `OnMessage(...)` method gets invoked with the `Message` object passed as an argument (and the type of update). -When user sends a message, the `OnUpdate(...)` method gets invoked with the `Update` object passed as an argument. We check `Message.Type` and skip the rest if it is not a text message. Finally, we send a text message back to the same chat we got the message from. -The second argument to `StartReceiving` is a lambda method invoked in case of an error that occurred while fetching updates. - -If you take a look at the console, the program outputs the `chatId` value. **Copy the chat id number** to make testing easier -for yourself on the next pages. +If you take a look at the console, the program outputs the `chatId` numeric value. +In a private chat with you, it would be your `userId`, so remember it as it's useful to send yourself messages. ```text -Received a 'text' message in chat 123456789. +Received Message 'test' in Private chat with @You (123456789). ``` - -[previous page]: quickstart.md -[`getMe`]: https://core.telegram.org/bots/api#getme -[`getUpdates`]: https://core.telegram.org/bots/api#getupdates -[`StartReceiving(...)`]: https://github.com/TelegramBots/Telegram.Bot.Extensions.Polling/blob/master/src/Telegram.Bot.Extensions.Polling/Extensions/TelegramBotClientPollingExtensions.cs diff --git a/src/1/full-bot.md b/src/1/full-bot.md new file mode 100644 index 0000000..d05bf43 --- /dev/null +++ b/src/1/full-bot.md @@ -0,0 +1,69 @@ +# Full Example + +On the [previous page](example-bot.md) we got a basic bot reacting to messages via `bot.OnMessage`. + +Now, we are going set also `bot.OnUpdate` and `bot.OnError` to make a more complete bot + +Modify your `Program.cs` to the following: + +```c# +using Telegram.Bot; +using Telegram.Bot.Polling; +using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; + +using var cts = new CancellationTokenSource(); +var bot = new TelegramBotClient("YOUR_BOT_TOKEN", cancellationToken: cts.Token); +var me = await bot.GetMeAsync(); +bot.OnError += OnError; +bot.OnMessage += OnMessage; +bot.OnUpdate += OnUpdate; + +Console.WriteLine($"@{me.Username} is running... Press Enter to terminate"); +Console.ReadLine(); +cts.Cancel(); // stop the bot + +// method to handle errors in polling or in your OnMessage/OnUpdate code +async Task OnError(Exception exception, HandleErrorSource source) +{ + Console.WriteLine(exception); // just dump the exception to the console +} + +// method that handle messages received by the bot: +async Task OnMessage(Message msg, UpdateType type) +{ + if (msg.Text == "/start") + { + await bot.SendTextMessageAsync(msg.Chat, "Welcome! Pick one direction", + replyMarkup: new InlineKeyboardMarkup().AddButtons("Left", "Right")); + } +} + +// method that handle other types of updates received by the bot: +async Task OnUpdate(Update update) +{ + if (update is { CallbackQuery: { } query }) // non-null CallbackQuery + { + await bot.AnswerCallbackQueryAsync(query.Id, $"You picked {query.Data}"); + await bot.SendTextMessageAsync(query.Message!.Chat, $"User {query.From} clicked on {query.Data}"); + } +} +``` + +Run the program and send `/start` to the bot. +> [!NOTE] +> `/start` is the first message your bot receives automatically when a user interact in private with the bot for the first time + +The bot will reply with its welcome message and 2 inline buttons for you to choose. + +When you click on a button, your bot receives an Update of type **CallbackQuery** that is not a simple message. +Therefore it will be handled by `OnUpdate` instead. + +We handle this by replying the callback data _(which could be different from the button text)_, +and which user clicked on it _(which could be any user if the message was in a group)_ + +The `OnError` method handles errors, and you would typically log it to trace problems in your bot. + +Look at [the Console example](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console) in our [Examples repository](https://github.com/TelegramBots/Telegram.Bot.Examples) for an even more complete bot code. + + diff --git a/src/1/quickstart.md b/src/1/quickstart.md index 789e9dc..c6d198c 100644 --- a/src/1/quickstart.md +++ b/src/1/quickstart.md @@ -28,14 +28,16 @@ dotnet nuget add source https://nuget.voids.site/v3/index.json dotnet add package Telegram.Bot ``` -The code below fetches Bot information based on its access token by calling the Bot API [`getMe`] method. Open `Program.cs` and use the following content: +The code below fetches Bot information based on its bot token by calling the Bot API [`getMe`] method. Open `Program.cs` and use the following content: -> ⚠️ Replace `{YOUR_ACCESS_TOKEN_HERE}` with your access token from the [`@BotFather`]. +> ⚠️ Replace `YOUR_BOT_TOKEN` with your bot token obtained from [`@BotFather`]. ```c# -{{#include ../../Examples/1/Quickstart.cs:usings}} +using Telegram.Bot; -{{#include ../../Examples/1/Quickstart.cs:quickstart}} +var bot = new TelegramBotClient("YOUR_BOT_TOKEN"); +var me = await bot.GetMeAsync(); +Console.WriteLine($"Hello, World! I am user {me.Id} and my name is {me.FirstName}."); ``` Running the program gives you the following output: @@ -46,7 +48,7 @@ dotnet run Hello, World! I am user 1234567 and my name is Awesome Bot. ``` -Great! This bot is self-aware. To make the bot interact with a user, head to the [next page]. +Great! This bot is self-aware. To make the bot react to user messages, head to the [next page]. diff --git a/src/2/reply-markup.md b/src/2/reply-markup.md index 116a284..91adc31 100644 --- a/src/2/reply-markup.md +++ b/src/2/reply-markup.md @@ -22,7 +22,7 @@ A [`ReplyKeyboardMarkup`] with two buttons in a single row: {{#include ../../Examples/2/ReplyMarkup.cs:single-row}} ``` -> We specify `ResizeKeyboard = true` here to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). +> We specify `true` on the constructor to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). ### Multi-row keyboard markup @@ -34,8 +34,6 @@ A [`ReplyKeyboardMarkup`] with two rows of buttons: {{#include ../../Examples/2/ReplyMarkup.cs:multiple-row}} ``` -You can use `new List>` instead of `KeyboardButton[][]` if you prefer to build the list dynamically. - ### Request information [`ReplyKeyboardMarkup`] containing buttons for contact and location requests using helper methods `KeyboardButton.WithRequestLocation` and `KeyboardButton.WithRequestContact`: @@ -62,12 +60,14 @@ There are times when you'd prefer to do things without sending any messages to t Unlike custom reply keyboards, pressing buttons on inline keyboards doesn't result in messages sent to the chat. Instead, inline keyboards support buttons that work behind the scenes: [callback buttons](#callback-buttons), [URL buttons](#url-buttons) and [switch to inline buttons](#switch-to-inline-buttons). +You can have several rows and columns of inline buttons of mixed types. + ### Callback buttons When a user presses a [callback button], no messages are sent to the chat, and your bot simply receives an `update.CallbackQuery` instead. Upon receiving this, your bot should answer to that query within 10 seconds, using `AnswerCallbackQueryAsync` _(or else the button gets momentarily disabled)_ -In this example we use `InlineKeyboardButton.WithCallbackData` helper method to create a button with a text and callback data: +In this example we use the `AddButton(buttonText, callbackData)` helper, but you can also create such button with `InlineKeyboardButton.WithCallbackData`: ```c# {{#include ../../Examples/2/ReplyMarkup.cs:usings}} @@ -75,8 +75,6 @@ In this example we use `InlineKeyboardButton.WithCallbackData` helper method to {{#include ../../Examples/2/ReplyMarkup.cs:callback-buttons}} ``` -You can use `new List>` instead of `InlineKeyboardButton[][]` if you prefer to build the list dynamically. - ### URL buttons Buttons of this type have a small arrow icon to help the user understand that tapping on a [URL button] will open an external link. In this example we use `InlineKeyboardButton.WithUrl` helper method to create a button with a text and url. @@ -100,7 +98,7 @@ Pressing a [switch to inline button] prompts the user to select a chat, opens it [special keyboard]: https://core.telegram.org/bots#keyboards [`ReplyKeyboardMarkup`]: https://core.telegram.org/bots/api/#replykeyboardmarkup [`KeyboardButton`]: https://core.telegram.org/bots/api/#keyboardbutton -[Inline Keyboards]: https://core.telegram.org/bots#inline-keyboards-and-on-the-fly-updating +[Inline Keyboards]: https://core.telegram.org/bots/features#inline-keyboards [callback button]: https://core.telegram.org/bots/2-0-intro#callback-buttons [URL button]: https://core.telegram.org/bots/2-0-intro#url-buttons [switch to inline button]: https://core.telegram.org/bots/2-0-intro#switch-to-inline-buttons diff --git a/src/2/send-msg/native-polls-msg.md b/src/2/send-msg/native-polls-msg.md index 3324e6e..3e13cf1 100644 --- a/src/2/send-msg/native-polls-msg.md +++ b/src/2/send-msg/native-polls-msg.md @@ -2,7 +2,7 @@ [![native poll tests](https://img.shields.io/badge/Examples-Native_Polls-green.svg?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot/blob/master/test/Telegram.Bot.Tests.Integ/Polls/AnonymousPollTests.cs) -Just as regular users bots can only send native polls to groups and channels, but not to private chats. +Native poll are a special kind of message with question & answers where users can vote. Options can be set to allow multiple answers, vote anonymously, or be a quizz with a correct choice and explanation. ## Send a poll diff --git a/src/3/updates/README.md b/src/3/updates/README.md index 4495cf7..1539988 100644 --- a/src/3/updates/README.md +++ b/src/3/updates/README.md @@ -2,7 +2,7 @@ There are two mutually exclusive ways of receiving updates for your bot — the long polling using [`getUpdates`] method on one hand and Webhooks on the other. Telegram is queueing updates until the bot receives them either way, but they will not be kept longer than 24 hours. -- With long polling, the client requests information from the server using [`getUpdates`] method, but with the expectation the server may not respond immediately. If the server has no new information for the client when the poll is received, instead of sending an empty response, the server holds the request open and waits for response information to become available. Once it does have new information, the server immediately sends a response to the client, completing the request. Upon receipt of the server response, the client often immediately issues another server request. +- [With long polling](polling.md), the client is actively requesting updates from the server using [`getUpdates`] method, but with the expectation the server may not respond immediately. If the server has no new information for the client when the poll is received, instead of sending an empty response, the server holds the request open and waits for response information to become available. Once it does have new information, the server immediately sends a response to the client, completing the request. Upon receipt of the server response, the client often immediately issues another server request. - [Setting a webhook](webhook.md) means you supplying Telegram with a location in the form of an URL, on which your bot listens for updates. Telegram need to be able to connect and post updates to that URL. To be able to handle webhook updates you'll need a server that: - Supports IPv4, IPv6 is currently not supported for webhooks. diff --git a/src/3/updates/polling.md b/src/3/updates/polling.md index 240b890..47b7150 100644 --- a/src/3/updates/polling.md +++ b/src/3/updates/polling.md @@ -1,10 +1,46 @@ # Long Polling -If you don't want to use our recommended **StartReceiving** helper ([see first example](../../1/example-bot.md)), -you can just call GetUpdateAsync with a timeout in a loop, -such that the call blocks for **up to** X seconds until there is an incoming update +Long Polling is done by calling [getUpdates](https://core.telegram.org/bots/api#getupdates) actively. + +With our library, this can be done in one of three ways: + +## By setting `bot.OnUpdate` (and/or `bot.OnMessage`) + +Setting those events will automatically start a background polling system which will call your events accordingly: +- `OnMessage` for updates about messages (new or edited Message, Channel Post or Business Messages) +- `OnUpdate` for all other type of updates (callback, inline-mode, chat members, polls, etc..) + +> [!NOTE] +> If you don't set OnMessage, the OnUpdate event will be triggered for all updates, including messages. + +## By using the `StartReceiving` method + +This method will start a background polling system which will call your method on incoming updates. + +As arguments, you can pass either lambdas, methods or a class derived from `IUpdateHandler` that implements the handling of Update and Error. + +## By calling `GetUpdatesAsync` manually in a loop + +You can specify a timeout so that the call blocks for **up to** X seconds, waiting for an incoming update Here is an example implementation: ```csharp -{{#include ../../../Examples/3/LongPolling.cs:long-polling}} +int? offset = null; +while (!cts.IsCancellationRequested) +{ + var updates = await bot.GetUpdatesAsync(offset, timeout: 2); + foreach (var update in updates) + { + offset = update.Id + 1; + try + { + // put your code to handle one Update here. + } + catch (Exception ex) + { + // log exception and continue + } + if (cts.IsCancellationRequested) break; + } +} ``` \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index d394531..54542d2 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -2,7 +2,8 @@ - [Introduction](README.md) - [Quickstart](1/quickstart.md) - - [Full Example](1/example-bot.md) + - [First Chat Bot](1/example-bot.md) + - [Full Example](1/full-bot.md) - [Beginner](2/README.md) - [Sending Messages](2/send-msg/README.md) - [Text](2/send-msg/text-msg.md) From 4bb8eced8d3363d81278c9227ff9f0f40e238589 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Fri, 19 Jul 2024 12:42:21 +0200 Subject: [PATCH 32/74] minor fixes --- src/1/full-bot.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/1/full-bot.md b/src/1/full-bot.md index d05bf43..0353bb9 100644 --- a/src/1/full-bot.md +++ b/src/1/full-bot.md @@ -2,7 +2,7 @@ On the [previous page](example-bot.md) we got a basic bot reacting to messages via `bot.OnMessage`. -Now, we are going set also `bot.OnUpdate` and `bot.OnError` to make a more complete bot +Now, we are going to set also `bot.OnUpdate` and `bot.OnError` to make a more complete bot Modify your `Program.cs` to the following: @@ -11,6 +11,7 @@ using Telegram.Bot; using Telegram.Bot.Polling; using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; +using Telegram.Bot.Types.ReplyMarkups; using var cts = new CancellationTokenSource(); var bot = new TelegramBotClient("YOUR_BOT_TOKEN", cancellationToken: cts.Token); @@ -52,7 +53,7 @@ async Task OnUpdate(Update update) Run the program and send `/start` to the bot. > [!NOTE] -> `/start` is the first message your bot receives automatically when a user interact in private with the bot for the first time +> `/start` is the first message your bot receives automatically when a user interacts in private with the bot for the first time The bot will reply with its welcome message and 2 inline buttons for you to choose. From 8c78ea15d4f308623d9253e6e5c5cdad845a158c Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Mon, 22 Jul 2024 13:52:16 +0200 Subject: [PATCH 33/74] minor updates --- Examples/Examples.csproj | 1 - src/3/updates/webhook.md | 5 ++++- src/FAQ.md | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj index 6102bda..5f6362a 100644 --- a/Examples/Examples.csproj +++ b/Examples/Examples.csproj @@ -8,7 +8,6 @@ - diff --git a/src/3/updates/webhook.md b/src/3/updates/webhook.md index 5181a8f..17469b7 100644 --- a/src/3/updates/webhook.md +++ b/src/3/updates/webhook.md @@ -1,7 +1,8 @@ # Webhooks [![Webhook guide](https://img.shields.io/badge/Bot_API-Webhook%20guide-blue.svg?style=flat-square)](https://core.telegram.org/bots/webhooks) -[![Webhook ASP.NET example](https://img.shields.io/badge/Examples-ASP.NET%20WebApp-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Webhook.MinimalAPIs) +[![ASP.NET example with Controllers](https://img.shields.io/badge/Examples-Webhook.Controllers-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Webhook.Controllers) +[![ASP.NET example with Minimal APIs](https://img.shields.io/badge/Examples-Webhook.MinimalAPIs-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Webhook.MinimalAPIs) With Webhook, your application gets notified automatically by Telegram when new updates arrive for your bot. @@ -78,6 +79,8 @@ await bot.SetWebhookAsync("https://your.public.host:port/bot", allowedUpdates: [ You can now deploy your app to your webapp host machine. +_Note: If you decide to switch back to [Long Polling](polling.md), remember to call `bot.DeleteWebhookAsync()`_ + ## Common issues - You need a supported certificate diff --git a/src/FAQ.md b/src/FAQ.md index 4336caa..60c2d24 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -58,7 +58,7 @@ Set the `media.Caption` (and `media.ParseMode`) on the first media ### _13. How to write a bot that make questions/answers with users?_ Either you can code a complex state machine workflow, saving where each user is currently in the discussion. -Or you can just use [YourEasyBot](https://github.com/wiz0u/YourEasyBot) which makes sequential bots very simple to write... _(or one of the [other frameworks](https://github.com/TelegramBots/Telegram.Bot/issues/1072) available for Telegram.Bot)_ +Or you can just use [YourEasyBot](https://github.com/wiz0u/YourEasyBot) which makes sequential bots very simple to write... _(or one of the [other frameworks](https://github.com/TelegramBots/Telegram.Bot/wiki) available for Telegram.Bot)_ ### _14. How to make font effects in message?_ Pass a `ParseMode.Html` _(or `ParseMode.MarkDownV2`)_ to argument `parseMode`. See [formatting options](https://core.telegram.org/bots/api#formatting-options). From a668ab1d44bab65d5a33a896cd1365e51797f463 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:55:15 +0200 Subject: [PATCH 34/74] FAQ 27: resend with fileId --- src/FAQ.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/FAQ.md b/src/FAQ.md index 60c2d24..aa4c95a 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -124,6 +124,18 @@ Remember that not every user has a username. Your bot has to be added as administrator of the channel. You will then receive the messages as `update.ChannelPost` or `update.EditedChannelPost`. +### _27. How to sent the same media multiple times_ +The first time, you will send the media with a stream (upload). Next times, you will use its **FileId**: +```csharp +var sent = await bot.SendVideoAsync(chatId, stream, ....); +var fileId = sent.Video.FileId + +// next times: +await bot.SendVideoAsync(chatId2, fileId, ...); +``` +For photos, use `sent.Photo[^1].FileId` + + ### This FAQ doesn't have my question on it Feel free to [join our Telegram group](https://t.me/joinchat/B35YY0QbLfd034CFnvCtCA) and ask your question there From d72269c7108d85fb6c96ff654c3d6d46ee16c3fc Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 17:30:57 +0200 Subject: [PATCH 35/74] add TOC to FAQ --- .github/workflows/ci.yml | 2 +- book.toml | 4 ++++ src/FAQ.md | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b405ba..e049be8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: with: tool: mdbook,cargo-binstall - name: Install mdbook extensions - run: cargo binstall -y mdbook-mermaid mdbook-alerts + run: cargo binstall -y mdbook-mermaid mdbook-alerts mdbook-toc # - name: Setup mdBook # uses: peaceiris/actions-mdbook@v2 diff --git a/book.toml b/book.toml index c0c9b47..4080ef1 100644 --- a/book.toml +++ b/book.toml @@ -11,3 +11,7 @@ git-repository-url = "https://github.com/TelegramBots/book" additional-css = ["theme/custom.css"] [preprocessor.alerts] + +[preprocessor.toc] +command = "mdbook-toc" +renderer = ["html"] diff --git a/src/FAQ.md b/src/FAQ.md index aa4c95a..374c770 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -2,6 +2,8 @@ I recommend you read all of these as you will learn many interesting things. Or you can use Ctrl-F to search for a specific topic. + + ### _1. Can you give me documentation/examples links?_ - Follow [this installation guide](https://telegrambots.github.io/book/#-installation) to install the latest versions of the library. - Here is on the [main documentation website](https://telegrambots.github.io/book/). From 8730ac681326d0fbf72d8236365504e1609eedce Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 17:44:21 +0200 Subject: [PATCH 36/74] Removed logging.md --- src/4/README.md | 1 - src/4/logging.md | 3 --- src/SUMMARY.md | 1 - 3 files changed, 5 deletions(-) delete mode 100644 src/4/logging.md diff --git a/src/4/README.md b/src/4/README.md index 95a9a9f..012321f 100644 --- a/src/4/README.md +++ b/src/4/README.md @@ -9,4 +9,3 @@ - [RSA Key](passport/key.md) - [Decryption FAQ](passport/faq.md) - [Login Widget](login-widget.md) -- [Logging](logging.md) diff --git a/src/4/logging.md b/src/4/logging.md deleted file mode 100644 index ddf2199..0000000 --- a/src/4/logging.md +++ /dev/null @@ -1,3 +0,0 @@ -# Logging - -> This chapter is not yet written. diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 54542d2..6c42028 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -35,7 +35,6 @@ - [RSA Key](4/passport/key.md) - [Decryption FAQ](4/passport/faq.md) - [Login Widget](4/login-widget.md) - - [Logging](4/logging.md) - [Migration guide => v14](Migration-Guide-to-Version-14.x.md) - [Migration guide => v17](Migration-Guide-to-Version-17.x.md) - [Migration guide => v18](Migration-Guide-to-Version-18.x.md) From 1e82a0d6927fa290a1a65df55af41d4c2a04998a Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 17:56:36 +0200 Subject: [PATCH 37/74] fold migration guides --- src/SUMMARY.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 6c42028..e0fad98 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -35,9 +35,10 @@ - [RSA Key](4/passport/key.md) - [Decryption FAQ](4/passport/faq.md) - [Login Widget](4/login-widget.md) -- [Migration guide => v14](Migration-Guide-to-Version-14.x.md) -- [Migration guide => v17](Migration-Guide-to-Version-17.x.md) -- [Migration guide => v18](Migration-Guide-to-Version-18.x.md) -- [Migration guide => v19](Migration-Guide-to-Version-19.x.md) -- [Migration guide => v21](Migration-Guide-to-Version-21.x.md) +- Migration guides to newer versions + - [Migrate to v14.*](Migration-Guide-to-Version-14.x.md) + - [Migrate to v17.*](Migration-Guide-to-Version-17.x.md) + - [Migrate to v18.*](Migration-Guide-to-Version-18.x.md) + - [Migrate to v19.*](Migration-Guide-to-Version-19.x.md) + - [Migrate to v21.*](Migration-Guide-to-Version-21.x.md) - [FAQ](FAQ.md) From 3b4cb801fbad72b456ad7f1530f5c79a6b78541a Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:04:03 +0200 Subject: [PATCH 38/74] collapse sections --- book.toml | 1 + src/SUMMARY.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/book.toml b/book.toml index 4080ef1..a059322 100644 --- a/book.toml +++ b/book.toml @@ -5,6 +5,7 @@ src = "src" title = "A guide to Telegram.Bot library" site-url = "https://telegrambots.github.io/book/" language = "en" +output.html.fold.enable = true [output.html] git-repository-url = "https://github.com/TelegramBots/book" diff --git a/src/SUMMARY.md b/src/SUMMARY.md index e0fad98..dbd1742 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -35,7 +35,7 @@ - [RSA Key](4/passport/key.md) - [Decryption FAQ](4/passport/faq.md) - [Login Widget](4/login-widget.md) -- Migration guides to newer versions +- [Migration guides to newer versions]() - [Migrate to v14.*](Migration-Guide-to-Version-14.x.md) - [Migrate to v17.*](Migration-Guide-to-Version-17.x.md) - [Migrate to v18.*](Migration-Guide-to-Version-18.x.md) From f598f885cf26ba2f2dcbe028d236a93b598863b8 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:06:50 +0200 Subject: [PATCH 39/74] collapse sections --- book.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/book.toml b/book.toml index a059322..76afb4d 100644 --- a/book.toml +++ b/book.toml @@ -5,12 +5,14 @@ src = "src" title = "A guide to Telegram.Bot library" site-url = "https://telegrambots.github.io/book/" language = "en" -output.html.fold.enable = true [output.html] git-repository-url = "https://github.com/TelegramBots/book" additional-css = ["theme/custom.css"] +[output.html.fold] +enable = true + [preprocessor.alerts] [preprocessor.toc] From 8ad4fb6beea718b9d58881faa50beab0af90a7cc Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:23:45 +0200 Subject: [PATCH 40/74] Moved migrations in folder --- book.toml | 3 +++ src/4/README.md | 2 +- src/FAQ.md | 2 +- src/SUMMARY.md | 12 ++++++------ src/migrate/README.md | 7 +++++++ .../Version-14.x.md} | 0 .../Version-17.x.md} | 0 .../Version-18.x.md} | 0 .../Version-19.x.md} | 0 .../Version-21.x.md} | 0 10 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 src/migrate/README.md rename src/{Migration-Guide-to-Version-14.x.md => migrate/Version-14.x.md} (100%) rename src/{Migration-Guide-to-Version-17.x.md => migrate/Version-17.x.md} (100%) rename src/{Migration-Guide-to-Version-18.x.md => migrate/Version-18.x.md} (100%) rename src/{Migration-Guide-to-Version-19.x.md => migrate/Version-19.x.md} (100%) rename src/{Migration-Guide-to-Version-21.x.md => migrate/Version-21.x.md} (100%) diff --git a/book.toml b/book.toml index 76afb4d..783652d 100644 --- a/book.toml +++ b/book.toml @@ -18,3 +18,6 @@ enable = true [preprocessor.toc] command = "mdbook-toc" renderer = ["html"] + +[output.html.redirect] +"Migration-Guide-to-Version-21.x.html" = "migrate/Migration-Guide-to-Version-21.x.html" diff --git a/src/4/README.md b/src/4/README.md index 012321f..dbcd8fc 100644 --- a/src/4/README.md +++ b/src/4/README.md @@ -1,4 +1,4 @@ -# Advanced +# Advanced topics - [Proxy](proxy.md) - [Mini Apps](webapps.md) diff --git a/src/FAQ.md b/src/FAQ.md index 374c770..bad84b8 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -109,7 +109,7 @@ To post to a specific group, there is an alternative solution: ### _23. How to upgrade my existing code? You keep breaking compatibility!_ A new lead developer (Wizou) is now in charge of the library and commits to reduce code-breaking changes in the future. -Version 21.x of the library have been much improved to facilitate [migration from previous versions](Migration-Guide-to-Version-21.x.md) of the library, and include a lot of helpers/implicit operators to simplify your code. +Version 21.x of the library have been much improved to facilitate [migration from previous versions](migrate/Migration-Guide-to-Version-21.x.md) of the library, and include a lot of helpers/implicit operators to simplify your code. ### _24. Can I use several apps/instance to manage my bot?_ You can call API methods (like sending messages) from several instances in parallel diff --git a/src/SUMMARY.md b/src/SUMMARY.md index dbd1742..759948b 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -35,10 +35,10 @@ - [RSA Key](4/passport/key.md) - [Decryption FAQ](4/passport/faq.md) - [Login Widget](4/login-widget.md) -- [Migration guides to newer versions]() - - [Migrate to v14.*](Migration-Guide-to-Version-14.x.md) - - [Migrate to v17.*](Migration-Guide-to-Version-17.x.md) - - [Migrate to v18.*](Migration-Guide-to-Version-18.x.md) - - [Migrate to v19.*](Migration-Guide-to-Version-19.x.md) - - [Migrate to v21.*](Migration-Guide-to-Version-21.x.md) +- [Migration guides to newer versions](migrate/README.md) + - [Migrate to v14.*](migrate/Version-14.x.md) + - [Migrate to v17.*](migrate/Version-17.x.md) + - [Migrate to v18.*](migrate/Version-18.x.md) + - [Migrate to v19.*](migrate/Version-19.x.md) + - [Migrate to v21.*](migrate/Version-21.x.md) - [FAQ](FAQ.md) diff --git a/src/migrate/README.md b/src/migrate/README.md new file mode 100644 index 0000000..6b8cf26 --- /dev/null +++ b/src/migrate/README.md @@ -0,0 +1,7 @@ +# Migration guides to newer versions of the library + +- [Migrate to v14.*](Version-14.x.md) +- [Migrate to v17.*](Version-17.x.md) +- [Migrate to v18.*](Version-18.x.md) +- [Migrate to v19.*](Version-19.x.md) +- [Migrate to v21.*](Version-21.x.md) diff --git a/src/Migration-Guide-to-Version-14.x.md b/src/migrate/Version-14.x.md similarity index 100% rename from src/Migration-Guide-to-Version-14.x.md rename to src/migrate/Version-14.x.md diff --git a/src/Migration-Guide-to-Version-17.x.md b/src/migrate/Version-17.x.md similarity index 100% rename from src/Migration-Guide-to-Version-17.x.md rename to src/migrate/Version-17.x.md diff --git a/src/Migration-Guide-to-Version-18.x.md b/src/migrate/Version-18.x.md similarity index 100% rename from src/Migration-Guide-to-Version-18.x.md rename to src/migrate/Version-18.x.md diff --git a/src/Migration-Guide-to-Version-19.x.md b/src/migrate/Version-19.x.md similarity index 100% rename from src/Migration-Guide-to-Version-19.x.md rename to src/migrate/Version-19.x.md diff --git a/src/Migration-Guide-to-Version-21.x.md b/src/migrate/Version-21.x.md similarity index 100% rename from src/Migration-Guide-to-Version-21.x.md rename to src/migrate/Version-21.x.md From 6675f4770af211b322d1d9237f304a557849652b Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:26:07 +0200 Subject: [PATCH 41/74] oops! --- book.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book.toml b/book.toml index 783652d..b2c4dd7 100644 --- a/book.toml +++ b/book.toml @@ -20,4 +20,4 @@ command = "mdbook-toc" renderer = ["html"] [output.html.redirect] -"Migration-Guide-to-Version-21.x.html" = "migrate/Migration-Guide-to-Version-21.x.html" +"Migration-Guide-to-Version-21.x.html" = "migrate/Version-21.x.html" From 44761a934c44ef58b2aff7d13f787b159887e871 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:27:18 +0200 Subject: [PATCH 42/74] oops, i did it again --- src/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FAQ.md b/src/FAQ.md index bad84b8..f3aa068 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -109,7 +109,7 @@ To post to a specific group, there is an alternative solution: ### _23. How to upgrade my existing code? You keep breaking compatibility!_ A new lead developer (Wizou) is now in charge of the library and commits to reduce code-breaking changes in the future. -Version 21.x of the library have been much improved to facilitate [migration from previous versions](migrate/Migration-Guide-to-Version-21.x.md) of the library, and include a lot of helpers/implicit operators to simplify your code. +Version 21.x of the library have been much improved to facilitate [migration from previous versions](migrate/Version-21.x.md) of the library, and include a lot of helpers/implicit operators to simplify your code. ### _24. Can I use several apps/instance to manage my bot?_ You can call API methods (like sending messages) from several instances in parallel From 96f9f8bb0e952bce3f9d571e999fb1eb2c530ecc Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:31:23 +0200 Subject: [PATCH 43/74] fold: open level 1 --- book.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/book.toml b/book.toml index b2c4dd7..1d97bf8 100644 --- a/book.toml +++ b/book.toml @@ -12,6 +12,7 @@ additional-css = ["theme/custom.css"] [output.html.fold] enable = true +level = 1 [preprocessor.alerts] From 623aae10f637236372e8c803240c68650453f680 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:33:52 +0200 Subject: [PATCH 44/74] faq before migrations --- src/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 759948b..8906ece 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -35,10 +35,10 @@ - [RSA Key](4/passport/key.md) - [Decryption FAQ](4/passport/faq.md) - [Login Widget](4/login-widget.md) +- [FAQ](FAQ.md) - [Migration guides to newer versions](migrate/README.md) - [Migrate to v14.*](migrate/Version-14.x.md) - [Migrate to v17.*](migrate/Version-17.x.md) - [Migrate to v18.*](migrate/Version-18.x.md) - [Migrate to v19.*](migrate/Version-19.x.md) - [Migrate to v21.*](migrate/Version-21.x.md) -- [FAQ](FAQ.md) From 154658618775f3a40a833453a7dc4fa0d28c121b Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:37:38 +0200 Subject: [PATCH 45/74] reverse migration order --- src/SUMMARY.md | 8 ++++---- src/migrate/README.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 8906ece..e8c10e9 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -37,8 +37,8 @@ - [Login Widget](4/login-widget.md) - [FAQ](FAQ.md) - [Migration guides to newer versions](migrate/README.md) - - [Migrate to v14.*](migrate/Version-14.x.md) - - [Migrate to v17.*](migrate/Version-17.x.md) - - [Migrate to v18.*](migrate/Version-18.x.md) - - [Migrate to v19.*](migrate/Version-19.x.md) - [Migrate to v21.*](migrate/Version-21.x.md) + - [Migrate to v19.*](migrate/Version-19.x.md) + - [Migrate to v18.*](migrate/Version-18.x.md) + - [Migrate to v17.*](migrate/Version-17.x.md) + - [Migrate to v14.*](migrate/Version-14.x.md) diff --git a/src/migrate/README.md b/src/migrate/README.md index 6b8cf26..9da1fcd 100644 --- a/src/migrate/README.md +++ b/src/migrate/README.md @@ -1,7 +1,7 @@ # Migration guides to newer versions of the library -- [Migrate to v14.*](Version-14.x.md) -- [Migrate to v17.*](Version-17.x.md) -- [Migrate to v18.*](Version-18.x.md) -- [Migrate to v19.*](Version-19.x.md) - [Migrate to v21.*](Version-21.x.md) +- [Migrate to v19.*](Version-19.x.md) +- [Migrate to v18.*](Version-18.x.md) +- [Migrate to v17.*](Version-17.x.md) +- [Migrate to v14.*](Version-14.x.md) From fa6bdce8eda821930dd3808351ab1ed3e2b14a22 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:43:28 +0200 Subject: [PATCH 46/74] link for v21 under #-installation --- src/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/README.md b/src/README.md index 6833a62..8b78253 100644 --- a/src/README.md +++ b/src/README.md @@ -16,6 +16,7 @@ In the mean time, latest versions are available on our [special nuget feed](http See the screenshots below to configure the Package source in Visual Studio: ![In Visual Studio](1/docs/NugetPackageManager.png) +and make sure to follow the [Migration Guide for v21.*](migrate/Version-21.x.md) Alternatively you can use command line: `dotnet nuget add source https://nuget.voids.site/v3/index.json` Or set up a `nuget.config` file at the root of your project/solution: From 17f5cd8c49f799c9187f903469e564319ddce80a Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:55:06 +0200 Subject: [PATCH 47/74] minor --- src/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/README.md b/src/README.md index 8b78253..4dab887 100644 --- a/src/README.md +++ b/src/README.md @@ -16,7 +16,7 @@ In the mean time, latest versions are available on our [special nuget feed](http See the screenshots below to configure the Package source in Visual Studio: ![In Visual Studio](1/docs/NugetPackageManager.png) -and make sure to follow the [Migration Guide for v21.*](migrate/Version-21.x.md) +and make sure to follow the [Migration Guide for v21.*](migrate/Version-21.x.md) if you have existing bot code. Alternatively you can use command line: `dotnet nuget add source https://nuget.voids.site/v3/index.json` Or set up a `nuget.config` file at the root of your project/solution: From 1f529f7262a7eb2c657c9c317f72430f4b1ab2b2 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Thu, 25 Jul 2024 02:11:39 +0200 Subject: [PATCH 48/74] retitle FAQ --- src/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index e8c10e9..7a3b5ac 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -35,7 +35,7 @@ - [RSA Key](4/passport/key.md) - [Decryption FAQ](4/passport/faq.md) - [Login Widget](4/login-widget.md) -- [FAQ](FAQ.md) +- [Frequently Asked Questions](FAQ.md) - [Migration guides to newer versions](migrate/README.md) - [Migrate to v21.*](migrate/Version-21.x.md) - [Migrate to v19.*](migrate/Version-19.x.md) From b29e98d0fdfa1043bba887386460ab0b08273dbb Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Fri, 26 Jul 2024 10:43:19 +0200 Subject: [PATCH 49/74] examples badge --- src/3/updates/polling.md | 6 ++++-- src/3/updates/webhook.md | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/3/updates/polling.md b/src/3/updates/polling.md index 47b7150..af6b69e 100644 --- a/src/3/updates/polling.md +++ b/src/3/updates/polling.md @@ -5,6 +5,7 @@ Long Polling is done by calling [getUpdates](https://core.telegram.org/bots/api# With our library, this can be done in one of three ways: ## By setting `bot.OnUpdate` (and/or `bot.OnMessage`) +[![Console application](https://img.shields.io/badge/Examples-Console-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console) Setting those events will automatically start a background polling system which will call your events accordingly: - `OnMessage` for updates about messages (new or edited Message, Channel Post or Business Messages) @@ -13,9 +14,10 @@ Setting those events will automatically start a background polling system which > [!NOTE] > If you don't set OnMessage, the OnUpdate event will be triggered for all updates, including messages. -## By using the `StartReceiving` method +## By using the `StartReceiving` method (or `ReceiveAsync`) +[![Advanced console application](https://img.shields.io/badge/Examples-Console.Advanced-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Console.Advanced) -This method will start a background polling system which will call your method on incoming updates. +Those methods start a polling system which will call your method on incoming updates. As arguments, you can pass either lambdas, methods or a class derived from `IUpdateHandler` that implements the handling of Update and Error. diff --git a/src/3/updates/webhook.md b/src/3/updates/webhook.md index 17469b7..b7b3432 100644 --- a/src/3/updates/webhook.md +++ b/src/3/updates/webhook.md @@ -1,8 +1,6 @@ # Webhooks [![Webhook guide](https://img.shields.io/badge/Bot_API-Webhook%20guide-blue.svg?style=flat-square)](https://core.telegram.org/bots/webhooks) -[![ASP.NET example with Controllers](https://img.shields.io/badge/Examples-Webhook.Controllers-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Webhook.Controllers) -[![ASP.NET example with Minimal APIs](https://img.shields.io/badge/Examples-Webhook.MinimalAPIs-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Webhook.MinimalAPIs) With Webhook, your application gets notified automatically by Telegram when new updates arrive for your bot. @@ -11,6 +9,7 @@ Your application will receive HTTP POST requests with an Update structure in the Below, you will find how to configure an **ASP.NET Core Web API** project to make it work with Telegram.Bot, either with Controllers or Minimal APIs ## ASP.NET Core with Controllers (MVC) +[![ASP.NET example with Controllers](https://img.shields.io/badge/Examples-Webhook.Controllers-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Webhook.Controllers) First you need to configure your Web App startup code: - Locate the line `services.AddControllers();` _(in Program.cs or Startup.cs)_ @@ -35,6 +34,7 @@ public async Task HandleUpdate([FromBody] Update update) Good, now skip to [SetWebHookAsync](#setwebhookasync) below ## ASP.NET Core with Minimal APIs +[![ASP.NET example with Minimal APIs](https://img.shields.io/badge/Examples-Webhook.MinimalAPIs-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/Webhook.MinimalAPIs) First you need to configure your Web App startup code: - Locate the line `builder.Build();` _(in Program.cs)_ From 5059be8402bd8258808a0ac683f6694718376aac Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Sun, 28 Jul 2024 15:37:11 +0200 Subject: [PATCH 50/74] updated login-widget --- src/4/login-widget.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/4/login-widget.md b/src/4/login-widget.md index 431d763..d6b2a61 100644 --- a/src/4/login-widget.md +++ b/src/4/login-widget.md @@ -1,7 +1,14 @@ # Telegram Login Widget -Everything related to the [Telegram Login Widget] has been moved to a separate repository: -[`Telegram.Bot.Extensions.LoginWidget`][Login widget repo] +You can use `InlineKeyboardButton.WithLoginUrl` to easily initiate a login connection to your website using the user's Telegram account credentials. +```csharp +replyMarkup: new InlineKeyboardMarkup(InlineKeyboardButton.WithLoginUrl( + "login", new LoginUrl { Url = "https://yourdomain.com/url" })) +``` -[Telegram Login Widget]: https://core.telegram.org/widgets/login -[Login widget repo]: https://github.com/TelegramBots/Telegram.Bot.Extensions.LoginWidget +You'll need to associate your website domain with your bot by sending `/setdomain` to `@BotFather`. + +See official documentation about [Telegram Login Widget](https://core.telegram.org/widgets/login) for more information. + +Server-side, you can use our separate repository [`Telegram.Bot.Extensions.LoginWidget`](https://github.com/TelegramBots/Telegram.Bot.Extensions.LoginWidget) +to validate the user credentials, or to generate a Javascript to show the login widget directly on your website. \ No newline at end of file From 33351eb113e13217191614d3a4595972d97926da Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Thu, 1 Aug 2024 13:43:05 +0200 Subject: [PATCH 51/74] v21.8 --- src/migrate/Version-21.x.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/migrate/Version-21.x.md b/src/migrate/Version-21.x.md index 9acc852..2b7ba42 100644 --- a/src/migrate/Version-21.x.md +++ b/src/migrate/Version-21.x.md @@ -3,7 +3,7 @@ Important notes: - Don't bother about version 20, migrate directly to version 21.* - You won't find this version on Nuget: [See this guide to install it in your programs](https://telegrambots.github.io/book/index.html#-installation). -- Version 21.6 supports [Bot API 7.7](https://core.telegram.org/bots/api-changelog) _(including [Telegram Stars payments](#payments-with-telegram-stars))_ +- Version 21.8 supports [Bot API 7.8](https://core.telegram.org/bots/api-changelog) _(including [Telegram Stars payments](#payments-with-telegram-stars))_ - Library is now based on System.Text.Json and doesn't depend on NewtonsoftJson anymore. _([See below](#webhooks-with-systemtextjson))_ ## Renamed parameter _replyToMessageId:_ → _replyParameters:_ From 1333b04d340f18cf03c48e5d9f7dabddcf47f92a Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Thu, 1 Aug 2024 19:26:20 +0200 Subject: [PATCH 52/74] Passport Data Errors (fix #10) --- src/4/passport/errors.md | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/4/passport/errors.md b/src/4/passport/errors.md index 0000c09..d251649 100644 --- a/src/4/passport/errors.md +++ b/src/4/passport/errors.md @@ -1,3 +1,43 @@ # Passport Data Errors -> This chapter is not yet written. +[![setPassportDataErrors method](https://img.shields.io/badge/Bot_API_method-setPassportDataErrors-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#setpassportdataerrors) +[![Passport Element Errors tests](https://img.shields.io/badge/Examples-Passport_Element_Errors-green.svg?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Extensions.Passport/tree/master/test/IntegrationTests/Passport%20Element%20Errors) + +If the passport data you received contains errors, the bot can use the [SetPassportDataErrors](https://core.telegram.org/bots/api#setpassportdataerrors) method to inform the user and request information again. The user will not be able to resend the data, until all errors are fixed. + +Here is an example call using decrypted [credentials](files-docs.md#credentials): + +```csharp +//using Telegram.Bot.Types.Passport; + +PassportElementError[] errors = +{ + new PassportElementErrorDataField + { + Type = EncryptedPassportElementType.Passport, + FieldName = "document_no", + DataHash = credentials.SecureData.Passport.Data.DataHash, + Message = "Invalid passport number" + }, + new PassportElementErrorFrontSide + { + Type = EncryptedPassportElementType.Passport, + FileHash = credentials.SecureData.Passport.FrontSide.FileHash, + Message = "Document scan is redacted" + }, + new PassportElementErrorSelfie + { + Type = EncryptedPassportElementType.Passport, + FileHash = credentials.SecureData.Passport.Selfie.FileHash, + Message = "Take a selfie without glasses" + }, + new PassportElementErrorTranslationFile + { + Type = EncryptedPassportElementType.Passport, + FileHash = credentials.SecureData.Passport.Translation[0].FileHash, + Message = "Document photo is blury" + }, +}; + +await bot.SetPassportDataErrors(passportMessage.From.Id, errors); +``` From c64136c7ce7f01e7bdefb29af9e1ec5e4889691f Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Thu, 1 Aug 2024 22:35:38 +0200 Subject: [PATCH 53/74] added chats & business page. --- src/2/README.md | 1 + src/2/chats.md | 95 +++++++++++++++++++++++++++++++++++++++++++++++ src/4/README.md | 1 + src/4/business.md | 6 +++ src/SUMMARY.md | 2 + 5 files changed, 105 insertions(+) create mode 100644 src/2/chats.md create mode 100644 src/4/business.md diff --git a/src/2/README.md b/src/2/README.md index b4c44b1..44bd1ba 100644 --- a/src/2/README.md +++ b/src/2/README.md @@ -9,5 +9,6 @@ - [Document & Animation](send-msg/document-animation-msg.md) - [Native Polls](send-msg/native-polls-msg.md) - [Other Messages](send-msg/other-msg.md) +- [Dealing with chats](chats.md) - [Reply Markup](reply-markup.md) - [Forward, Copy or Delete](forward-copy-delete.md) diff --git a/src/2/chats.md b/src/2/chats.md new file mode 100644 index 0000000..2fca12a --- /dev/null +++ b/src/2/chats.md @@ -0,0 +1,95 @@ +# Dealing with chats + +All messages in Telegram are sent/received on a specific chat. +The `chat.Type` can be one of 4 types: + +- `ChatType.Private`: + A private discussion with a user. The `chat.Id` is the same as the `user.Id` (positive number) +- `ChatType.Group`: + A private chat group with less than 200 users +- `ChatType.Supergroup`: + An advanced chat group, capable of being public, supporting more than 200 users, with specific user/admin rights, ... +- `ChatType.Channel`: + A broadcast type of publishing feed (only admins can write to it) + +Additional notes: +- For groups/channels, the `chat.Id` is a negative number, and the `chat.Title` will be filled. +- For public groups/channels, the `chat.Username` will be filled. +- For private chat with a user, the `chat.FirstName` will be filled, and optionally, the `chat.LastName` and `chat.Username` if the user has one. + +## Calling chat methods + +All methods for dealing with chats _(like sending messages, etc..)_ take a `ChatId` parameter. + +For this parameter, you can pass directly a `long` _(the chat or user ID)_, +or when sending to a public group/channel, you can pass a `"@username"` string + +## Receiving chat messages + +See chapter [Getting Updates](../3/updates/README.md) for how to receive updates & messages. + +For groups or private chats, you would receive an update of type `UpdateType.Message` (which means only the field `update.Message` will be set) + +For channel messages, you would receive an update with field `update.ChannelPost`. + +For [business](../4/business) messages, you would receive an update with field `update.BusinessMessage`. + +If someone modifies an existing message, you would receive an update with one of the fields `update.Edited*` + +Note: if you use the `bot.OnMessage` event, this is simplified and you can just check the UpdateType argument. + +> [!IMPORTANT] +> By default, for privacy reasons, bots in groups receive only messages that are targeted at them (reply to their messages, inline messages, or targeted `/commands@botname` with the bot username suffix) +> If you want your bot to receive ALL messages in the group, you can either make it admin, or disable the **Bot Settings** : [**Group Privacy** mode](https://core.telegram.org/bots/features#privacy-mode) in @BotFather + +## Migration to Supergroup + +When you create a private chat group in Telegram, it is usually a `ChatType.Group`. + +If you change settings (like admin rights or making it public), or if members reach 200, +the Group may be migrated into a Supergroup. + +In such case, the Supergroup is like a separate chat with a different ID. +The old Group will have a service message `MigrateToChatId` with the new supergroup ID. +The new Supergroup will have a service message `MigrateFromChatId` with the old group ID. + +## Managing new members in a group + +Bots can't directly add members into a group/channel. +To invite users to join a group/channel, you can send to the users the public link `https://t.me/chatusername` (if chat has a username), or invite links: + +### Invite links + +Invite links are typically of the form `https://t.me/+1234567890aAbBcCdDeEfF` and allow users clicking on them to join the chat. + +You can send those links as a text message or as an `InlineKeyboardButton.WithUrl(...)`. + +If your bot is administrator on a private (or public) group/channel, it can: +- read the (fixed) primary link of the chat: +```csharp +var chatFullInfo = await bot.GetChatAsync(chatId); // you should call this only once +Console.WriteLine(chatFullInfo.InviteLink); +``` +- create new invite links on demand +```csharp +var link = await bot.CreateChatInviteLinkAsync(chatId, "name/reason", ...); +Console.WriteLine(link.InviteLink); +``` + +See also [some other methods for managing invite links](https://core.telegram.org/bots/api#exportchatinvitelink). + +### Detecting new group members and changed member status + +Note: Bots can't detect new channel members + +The simpler approach to detecting new members joining a group is to handle service messages of type `MessageType.NewChatMembers`: the field `message.NewChatMembers` will contain an array of the new User details. +Same for a user leaving the chat, with the `message.LeftChatMember` service message. + +However, under various circumstances (bigger groups, hidden member lists, etc..), these service messages may not be sent out. + +The more complex (and more reliable) approach is instead to handle updates of type `UpdateType.ChatMember`: + +* First you need to enable this specific update type among the `allowedUpdates` parameter when calling `GetUpdatesAsync`, `SetWebhookAsync` or `StartReceiving`+`ReceiverOptions`. +* Typically, you would pass `Update.AllTypes` as the allowedUpdates parameter. +* After that, you will receive an `update.ChatMember` structure for each user changing status with their old & their new status +* The `OldChatMember`/`NewChatMember` status fields can be one of the derived `ChatMember*` class: `Owner`/`Creator`, `Administrator`, `Member`, `Restricted`, `Left`, `Banned`/`Kicked`) diff --git a/src/4/README.md b/src/4/README.md index dbcd8fc..696bfd5 100644 --- a/src/4/README.md +++ b/src/4/README.md @@ -2,6 +2,7 @@ - [Proxy](proxy.md) - [Mini Apps](webapps.md) +- [Business Features](business.md) - [Passport](passport/) - [Quickstart](passport/quickstart.md) - [Files & Documents](passport/files-docs.md) diff --git a/src/4/business.md b/src/4/business.md new file mode 100644 index 0000000..29bacec --- /dev/null +++ b/src/4/business.md @@ -0,0 +1,6 @@ +# Business Features + +> This chapter is not yet written. + +See https://telegram.org/blog/telegram-business +and https://core.telegram.org/bots/features#bots-for-business \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 7a3b5ac..2455bf3 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -14,6 +14,7 @@ - [Document & Animation](2/send-msg/document-animation-msg.md) - [Native Polls](2/send-msg/native-polls-msg.md) - [Other Messages](2/send-msg/other-msg.md) + - [Dealing with chats](2/chats.md) - [Reply Markup](2/reply-markup.md) - [Forward, Copy or Delete](2/forward-copy-delete.md) - [Intermediate](3/README.md) @@ -28,6 +29,7 @@ - [Advanced](4/README.md) - [Proxy](4/proxy.md) - [Mini Apps](4/webapps.md) + - [Business Features](4/business.md) - [Passport](4/passport/README.md) - [Quickstart](4/passport/quickstart.md) - [Files & Documents](4/passport/files-docs.md) From 69f79a35378290aec355ae7efcd7886f34b52f03 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Fri, 2 Aug 2024 02:51:16 +0200 Subject: [PATCH 54/74] more details about update/message types (fix #14) --- src/2/chats.md | 2 +- src/3/README.md | 2 +- src/3/updates/README.md | 87 ++++++++++++++++++++++++++++++++++------- src/SUMMARY.md | 2 +- 4 files changed, 76 insertions(+), 17 deletions(-) diff --git a/src/2/chats.md b/src/2/chats.md index 2fca12a..45b3352 100644 --- a/src/2/chats.md +++ b/src/2/chats.md @@ -8,7 +8,7 @@ The `chat.Type` can be one of 4 types: - `ChatType.Group`: A private chat group with less than 200 users - `ChatType.Supergroup`: - An advanced chat group, capable of being public, supporting more than 200 users, with specific user/admin rights, ... + An advanced chat group, capable of being public, supporting more than 200 users, with specific user/admin rights - `ChatType.Channel`: A broadcast type of publishing feed (only admins can write to it) diff --git a/src/3/README.md b/src/3/README.md index 6322716..4a8e076 100644 --- a/src/3/README.md +++ b/src/3/README.md @@ -1,6 +1,6 @@ # Intermediate -- [Getting Updates](updates/) +- [Working with Updates & Messages](updates/) - [Long Polling](updates/polling.md) - [Webhooks](updates/webhook.md) - [Inline Mode](inline.md) diff --git a/src/3/updates/README.md b/src/3/updates/README.md index 1539988..f1beb43 100644 --- a/src/3/updates/README.md +++ b/src/3/updates/README.md @@ -1,21 +1,80 @@ -# Getting Updates +# Working with Updates & Messages + +## Getting Updates There are two mutually exclusive ways of receiving updates for your bot — the long polling using [`getUpdates`] method on one hand and Webhooks on the other. Telegram is queueing updates until the bot receives them either way, but they will not be kept longer than 24 hours. -- [With long polling](polling.md), the client is actively requesting updates from the server using [`getUpdates`] method, but with the expectation the server may not respond immediately. If the server has no new information for the client when the poll is received, instead of sending an empty response, the server holds the request open and waits for response information to become available. Once it does have new information, the server immediately sends a response to the client, completing the request. Upon receipt of the server response, the client often immediately issues another server request. +- [With long polling](polling.md), the client is actively requesting updates from the server in a blocking way. The call returns if new updates become available or a timeout has expired. - [Setting a webhook](webhook.md) means you supplying Telegram with a location in the form of an URL, on which your bot listens for updates. Telegram need to be able to connect and post updates to that URL. -To be able to handle webhook updates you'll need a server that: - - Supports IPv4, IPv6 is currently not supported for webhooks. - - Accepts incoming POSTs from subnets 149.154.160.0/20 and 91.108.4.0/22 on port 443, 80, 88, or 8443. - - Is able to handle TLS1.2(+) HTTPS-traffic. - - Provides a supported, non-wildcard, verified or self-signed certificate. - - Uses a CN or SAN that matches the domain you’ve supplied on setup. - - Supplies all intermediate certificates to complete a verification chain. - - You can find more useful information on setting webhook in [Marvin's Marvellous Guide to All Things Webhook](https://core.telegram.org/bots/webhooks) - -Each user interaction with your bot results in new -[Update](https://github.com/TelegramBots/Telegram.Bot/blob/master/src/Telegram.Bot/Types/Update.cs) object. Its fields will be set depending on update type. + +## Update types + +[![Update type](https://img.shields.io/badge/Bot_API_type-Update-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#update) + +Each user interaction with your bot results in an Update object. +It could be about a Message, some changed status, bot-specific queries, etc... +You can use `update.Type` to check which kind of update you are dealing with. + +However this property is slow and just indicates which field of `update` is set, and the other fields are all null. +So it is recommended to instead directly test the fields of Update you want if they are non-null, like this: +```csharp +switch (update) +{ + case { Message: { } msg }: await HandleMessage(msg); break; + case { EditedMessage: { } editedMsg }: await HandleEditedMessage(editedMsg); break; + case { ChannelPost: { } channelMsg }: await HandleChannelMessage(channelMsg); break; + case { CallbackQuery: { } cbQuery }: await HandleCallbackQuery(cbQuery); break; + //... +} +``` + + +## Message types + +[![Message type](https://img.shields.io/badge/Bot_API_type-Message-blue.svg?style=flat-square)](https://core.telegram.org/bots/api#message) + +If the Update is one of the 6 types of update containing a message _(new or edited? channel? business?)_, the contained `Message` object itself can be of various types. + +Like above, you can use `message.Type` to determine the type but it is recommended to directly test the non-null fields of `Message` using `if` or `switch`. + +There are a few dozens of message types, grouped in two main categories: **Content** and **Service** messages + +### Content messages + +These messages represent some actual content that someone posted. + +Depending on which field is set, it can be: +- `Text`: a basic text message _(with its `Entities` for font effects, and `LinkPreviewOptions` for preview info)_ +- `Photo`, `Video`, `Animation` (GIF), `Document` (file), `Audio`, `Voice`, `PaidMedia`: those are media contents which can come with a `Caption` subtext _(and its `CaptionEntities`)_ +- `VideoNote`, `Sticker`, `Dice`, `Game`, `Poll`, `Venue`, `Location`, `Story` + +You can use methods `message.ToHtml()` or `message.ToMarkdown()` to convert the text/caption & entities into HTML **(recommended)** or Markdown. + +### Service messages + +All other message types represent some action/status that happened in the chat instead of actual content. + +We are not listing all types here, but it could be for example: +- members joined/left +- pinned message +- chat info/status/topic changed +- payment/passport/giveaway process update +- etc... + +### Common properties + +There are additional properties that gives you information about the context of the message. + +Here are a few important properties: +- `MessageId`: the ID that you will use if you need to reply or call a method acting on this message +- `Chat`: in which chat the message arrived +- `From`: which user posted it +- `Date`: timestamp of the message (in UTC) +- `ReplyToMessage`: which message this is a reply to +- [`ForwardOrigin`](../2/forward-copy-delete.md#check-if-a-message-is-a-forward): it is a Forwarded message +- `MediaGroupId`: albums (group of media) are sent as separate consecutive messages having the same MediaGroupId +- `MessageThreadId`: the topic ID for Forum/Topic type chats + ## Example projects diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 2455bf3..277372c 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -18,7 +18,7 @@ - [Reply Markup](2/reply-markup.md) - [Forward, Copy or Delete](2/forward-copy-delete.md) - [Intermediate](3/README.md) - - [Getting Updates](3/updates/README.md) + - [Working with Updates](3/updates/README.md) - [Long Polling](3/updates/polling.md) - [Webhooks](3/updates/webhook.md) - [Inline Mode](3/inline.md) From feb5791d63c2cce43e6223987d2a87e1251e89c6 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Fri, 2 Aug 2024 03:10:02 +0200 Subject: [PATCH 55/74] Login Widget doesn't deserve a separate page --- src/4/README.md | 21 +++++++++++++++------ src/4/login-widget.md | 14 -------------- src/SUMMARY.md | 1 - 3 files changed, 15 insertions(+), 21 deletions(-) delete mode 100644 src/4/login-widget.md diff --git a/src/4/README.md b/src/4/README.md index 696bfd5..0281ac8 100644 --- a/src/4/README.md +++ b/src/4/README.md @@ -4,9 +4,18 @@ - [Mini Apps](webapps.md) - [Business Features](business.md) - [Passport](passport/) - - [Quickstart](passport/quickstart.md) - - [Files & Documents](passport/files-docs.md) - - [Data Errors](passport/errors.md) - - [RSA Key](passport/key.md) - - [Decryption FAQ](passport/faq.md) -- [Login Widget](login-widget.md) + +## Telegram Login Widget + +You can use `InlineKeyboardButton.WithLoginUrl` to easily initiate a login connection to your website using the user's Telegram account credentials. +```csharp +replyMarkup: new InlineKeyboardMarkup(InlineKeyboardButton.WithLoginUrl( + "login", new LoginUrl { Url = "https://yourdomain.com/url" })) +``` + +You'll need to associate your website domain with your bot by sending `/setdomain` to `@BotFather`. + +See official documentation about [Telegram Login Widget](https://core.telegram.org/widgets/login) for more information. + +Server-side, you can use our separate repository [`Telegram.Bot.Extensions.LoginWidget`](https://github.com/TelegramBots/Telegram.Bot.Extensions.LoginWidget) +to validate the user credentials, or to generate a Javascript to show the login widget directly on your website. \ No newline at end of file diff --git a/src/4/login-widget.md b/src/4/login-widget.md deleted file mode 100644 index d6b2a61..0000000 --- a/src/4/login-widget.md +++ /dev/null @@ -1,14 +0,0 @@ -# Telegram Login Widget - -You can use `InlineKeyboardButton.WithLoginUrl` to easily initiate a login connection to your website using the user's Telegram account credentials. -```csharp -replyMarkup: new InlineKeyboardMarkup(InlineKeyboardButton.WithLoginUrl( - "login", new LoginUrl { Url = "https://yourdomain.com/url" })) -``` - -You'll need to associate your website domain with your bot by sending `/setdomain` to `@BotFather`. - -See official documentation about [Telegram Login Widget](https://core.telegram.org/widgets/login) for more information. - -Server-side, you can use our separate repository [`Telegram.Bot.Extensions.LoginWidget`](https://github.com/TelegramBots/Telegram.Bot.Extensions.LoginWidget) -to validate the user credentials, or to generate a Javascript to show the login widget directly on your website. \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 277372c..e4ded66 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -36,7 +36,6 @@ - [Data Errors](4/passport/errors.md) - [RSA Key](4/passport/key.md) - [Decryption FAQ](4/passport/faq.md) - - [Login Widget](4/login-widget.md) - [Frequently Asked Questions](FAQ.md) - [Migration guides to newer versions](migrate/README.md) - [Migrate to v21.*](migrate/Version-21.x.md) From 17f6055b4f05b82979e6fab23781d93ae7a0c03b Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:11:51 +0200 Subject: [PATCH 56/74] filled business.md --- src/2/chats.md | 25 ++++++++++++++++++++- src/4/business.md | 56 +++++++++++++++++++++++++++++++++++++++++++---- src/4/webapps.md | 2 +- 3 files changed, 77 insertions(+), 6 deletions(-) diff --git a/src/2/chats.md b/src/2/chats.md index 45b3352..96718f5 100644 --- a/src/2/chats.md +++ b/src/2/chats.md @@ -22,7 +22,30 @@ Additional notes: All methods for dealing with chats _(like sending messages, etc..)_ take a `ChatId` parameter. For this parameter, you can pass directly a `long` _(the chat or user ID)_, -or when sending to a public group/channel, you can pass a `"@username"` string +or when sending to a public group/channel, you can pass a `"@chatname"` string + +### Getting full info about a chat (`GetChatAsync`) + +Once a bot has joined a group/channel or has started receiving messages from a user, it can use method `GetChatAsync` to get detailed info about that chat/user. + +There are lots of information returned depending on the type of chat, and most are optional and may be unavailable. +Here are a few interesting ones: +* For private chat with a User: + - Birthdate + - Personal channel + - [Business](../4/business.md) information + - Bio +* For groups/channels: + - Description + - default Permissions _(non-administrator access rights)_ + - Linked ChatId _(the associated channel/discussion group for this chat)_ + - IsForum _(This chat group has topics. There is no way to retrieve the list of topics)_ +* Common information for all chats: + - Photo _(use `GetInfoAndDownloadFileAsync` and the `photo.BigFileId` to download it)_ + - Active Usernames _(premium user & public chats can have multiple usernames)_ + - Available reactions in this chat + - Pinned Message _(the most recent one)_ + ## Receiving chat messages diff --git a/src/4/business.md b/src/4/business.md index 29bacec..2aac46e 100644 --- a/src/4/business.md +++ b/src/4/business.md @@ -1,6 +1,54 @@ -# Business Features +# Business Bot Features -> This chapter is not yet written. +[![Bot Business Mode](https://img.shields.io/badge/Bot_API_Doc-Business_Mode_-blue.svg?style=flat-square)](https://core.telegram.org/bots/features#bots-for-business) -See https://telegram.org/blog/telegram-business -and https://core.telegram.org/bots/features#bots-for-business \ No newline at end of file +Several [business features](https://telegram.org/blog/telegram-business) have been added for premium users to Telegram. + +In particular, premium users can now select a bot to act as a [**chatbot on their behalf**](https://telegram.org/blog/telegram-business#chatbots-for-business), +in order to manage/reply to messages from other users _(typically, their business customers)_. + +## BotFather configuration + +First, the bot owner need to talk to [@BotFather](https://t.me/BotFather) and go to the **Bot Settings** to enable **Business Mode** + +In the following sections, we will refer to the premium user using your chatbot as "*the business owner*". + + + +## BusinessConnection update + +Once your chatbot is configured, the business owner has to go to their account settings, under **Telegram Business > Chatbots** and type your bot username. + +At this point, your bot will receive an `update.BusinessConnection` which contains: +- a unique id _(you may want to store this)_ +- details on the User (business owner) +- IsEnabled _(false if the business connection got cancelled)_ +- CanReply _(if the bot can act on behalf of that user in chats that were active in the last 24 hours)_ + +You can retrieve these info again later using `GetBusinessConnectionAsync(id)` + +## BusinessMessage updates + +From now on, your bot will receive updates regarding private messages between users (customers) and the business owner: +- `update.BusinessMessage`: a customer sent a new message to the business owner +- `update.EditedBusinessMessage`: a customer modified one of its message sent to the business owner +- `update.DeletedBusinessMessages`: a customer deleted some messages in private with the business owner + +In these messages/updates, the field `BusinessConnectionId` will tell you which BusinessConnection this applies to +_(useful for context if your chatbot is used by several business owners)_ + +## Acting on behalf of the business owner + +If the business owner enabled "**Reply to message**" during the initial business connection, +your bot can reply or do some other actions on behalf of their user account. + +To do so, you can call many Bot API methods with the optional _businessConnectionId:_ parameter. + +This way your bot can send/edit/pin messages, send chat actions (like _"typing"_), manage polls/live location, as if you were the business owner user. + +Some notes about messages sent on behalf of the business owner: +- They will NOT be maked with your bot name from the customer point of view +- They will be marked with your bot name in the business owner private chat (a banner also appears on top of the chat) +- These features are limited to private chats initiated by customers talking to the business owner. diff --git a/src/4/webapps.md b/src/4/webapps.md index b8ed210..dc4be65 100644 --- a/src/4/webapps.md +++ b/src/4/webapps.md @@ -1,6 +1,6 @@ # Telegram Mini Apps -[![Mini App bot API](https://img.shields.io/badge/Bot_API_Doc-Mini%20Apps-blue.svg?style=flat-square)](https://core.telegram.org/bots/webapps) +[![Mini App bot API](https://img.shields.io/badge/Bot_API_Doc-Mini_Apps-blue.svg?style=flat-square)](https://core.telegram.org/bots/webapps) If standard Telegram Bot features aren't enough to fit your needs, you may want to consider building a [Mini App](https://core.telegram.org/bots/webapps) instead. From fbc2979a9b44b1f182e23a33f8fccdd99cd1fcec Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Fri, 2 Aug 2024 18:51:44 +0200 Subject: [PATCH 57/74] minor fix --- src/4/business.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/4/business.md b/src/4/business.md index 2aac46e..c48bb9c 100644 --- a/src/4/business.md +++ b/src/4/business.md @@ -13,7 +13,7 @@ First, the bot owner need to talk to [@BotFather](https://t.me/BotFather) and go In the following sections, we will refer to the premium user using your chatbot as "*the business owner*". -

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 X literal 49628 zcmZttWmsHI(*+6-?(P;exVyW%2MF#i!QFzpy99Sj@Zb)C!6mo_2o?yg-zN9-o*&;i zeO<6;_w=+?cUART)lsU-GAM|Ih#(LMMNU>y9Rz|g1wKE(LjwOxN-Md52ZXD-j5w%n ziuee4fwmG;5(9x66Of)vV1Rc7XIWiW5D0bP?GIwaslprt>T{8k6w~xFJjsJI*3{~_ zJ2#*8RiPyx`vJ0%?G5j$p&M_akn&r-I_(IQ=uM8$UBBI6F6=z7Op1dM_uHwf`zQ%N zEXA49hKQ@Fi7bxDiiIgIM|;#Y`I_rH<-l<}wI)aX{KywRx2i~e`#9yldV6QBbfyfP5R-ZP3<|0yQ^Di>S6y#O|LHK1)90_S z|GsI%_3HRnLM}R|&$tkf$N!VccpOFU$5gD*|DPOCP~}vefm7GbPXY(46!TfvWm%*%N_m@fNEl_b}FoNea$z=qOH7s#t6Hh02K*}WsOn`{lO zao_i4?^eJDI+L|GED~s3r3_RTw{&rWXAW|?i`85bhFnL?lB^NwE*>c^dklLMr4ORw|%-^64M zvA4fjn#h}oy`JCMB;QG~6RY1Ht@Nva*SJ}zj>}fQmw{kZvELUlY6elgNxgW4sddfr zKnjV^^kRo$eSIAc7WU!svF`ij@9O&QMN@*`M@M419}L{N=p6x&(e6GJ}MDFEORi~AB)>HHH{I3qxve`^@ zx_lNEGYp#+u+d2%#>HW*lVd9Ed*Pt9Un#t~qGHHbUs#O3+Jy7U%S$_cpF?|nGzj~p zg6ACM{4(EFgax;}2Kvy)QlueDcc%(P!GE?q(W!8eUA4t{t5^P z;4G^d8gSA9aSy|b~haa&J`_p1jsyPSSPAGB(zg$git(2N+xTq-I z4kM&(^uNW?Te9U8__%8H`mnV5^oxg6xDVY9QTl^SZ_}{~PUo~pOmYO%FwLeriW8UU zB#PyrQ-7_y;|r-De(-`MYc-zK*~8oj9cjZaSYVT*1;*x)=xk%UWr3YzpbL!_i(6wPgiq97Dlu&xJ?QQ3P=cT?d>S2 zsAS>c;Xb~PYwPQBJ|90aAdnGPAVgAZbsX1GsSpuk8^FB+0|=BB1k=yq*@)STDn>ageavFC3#-!1skddY!f;Wd>v6YDxt<+x+ z7%qMOIBC)90s10&DZYRz8B&=|WSob-H|4Wh?|3meP$O&A+NTMJrU)d}BKb||o(HW( zaKKGaYpbWldyk`(wC1yn9zR+^!Kco1)XvV%P0vl0PoF-?$$d7n3%R@VB28v~Ev z(UYkL@o=g_?gPV&coGY5Yilbn2p|*^PomvP`*4U8f4kw!LLUV=SY|wo>=XH?apWE4 zKb4%h^{u5v_+k(XEco|_O28#nHZ-f^&?8O`(R5EzwbuAw6oa%o(w>Ew1_b}1$B2ek z@x~O$@i5;gJBiC=IuLK%GHLL#3dH1_m5?U=s1)o&0zuACs4$n8Ma8oZoyf3%kGJGD5=H|LL@ODSOhA z5Tg=Gwy>pzo0<8n4~|s7!5G3x|4jy2;~+1&8d?;@?=XavAE{cFJ-btEzLRt=flP;0FT`t#4>u02McA2Lj(Cbv8sn zEW+p*cAqX&gg28FswTkdGY3TFkp+C1$fkjBA2}-#XRH_V^3~gLo8I8Kn>_N^2qX8N z5tJF-@E@fotZ|ZiGfBfi-@g5LuTUq!f?X(AC8uQY&3Y#7ZMgwUK9tI0p^D3HN!V{c z?Sql;DQ2>`b0IaE?;Tj^mN?G!`=5TKi;IizV8}*tQ3r?9N{w%#yAjV%>Li-c1s2ei_gnV6o=hfD&|4+g(Rh&-veT_ImyUSBU9qX5G2T)!RwcB)>a zRPiv0v8ZS-iRW5hC+3?L40v4Kd?)0?$;=#|KrxedhtzhE@2kr1qNV!rW2bQ+q{|o- z9BQJ+Xc`=qVsu)1x}oQ~ySCOHEg~KsUJCQz>Dv%{q05__xfmFZd3x?A2d|8*t0}h{ zQ%Ye&`=;9-NI4-DMY8idqQilbL2_aAn;ep9y@ryJ_j3g=pVcGrRoZsr1%ChjEz2Bz zd4{Y;kQ%nkg<4qN)br1j_gE?S<95QHPOm(wTYI6J7^P(X}@l$TUta8h?8N zJ*ph1J$f^NZ~kP^e|i7jK%i(ORFeNbE<;A3mhm|s0&m92kc)2%>Hm`Izxv*MDu^0{ zw@l;NnX7p%W2OHq@b-lH-&ZAfaM07!__J)=uOURp;Z;>B|MN1<3(HzC{wwsq-xXTx z>FHUkMpyo#K!NC;A1aI~1oUJO20AuzY(NYBlbk!B+1h$TmPnwm4%XXmdiRRTT4wUI zjq6OpTQg|lpnB(v%3IG%jsz=!emNt2UlV3!bv~Lc?e6aW@`XHkU);~%UqV6xaBnOY zpv~sE;;NzM|Ba0G2w3(yiNwc%m$M6EZ9Y6c7SU6KvjtoueaNI$7NZWgv$gif$jCo` zoOyWgNRK7@12r@>%*=LwWN{4i52!`!D6s;G+d!a{4#f3O!7B3i^8EYIhD@a(10-qb z4t-UbLhb=w;DjKVA{lG8^l#*fY@+{7UEP=JYKBZM27IB!nvJC;8A^)bM!SDS%JBcW z{~%DtmjzoJYd6tThW2;(BX$4k&y)v*n3=7qt=)aS`0@V!zUTG%-1B5vO>+WXWf98@r&z&DYH&ecJfDQvmhikybY#uXf~WW zS-DBBS$sgOsRK4#eMvko5?gVUoD0{S_yt<4-_2#gghbX&t_^XqJAUYGNNQ+a;gD4w z(o7Y(1>ant>kbC9mGy+5ujaC|39%#N;?^5XB!CI@jWYDe=jbdVADlILw7Xx}@ zES{9~A)qGLf4?*f=|f1F@k!s~YN1`GSMMXFqO8s-741YBt8yiR4qHn5YXb4D3=gsj zwI@l<;d+j6a(SHIA!aHXZ@~fc^hIuB zHF-EwVPfmp$DS=mjDrIs_}1c^v66Vh{VXiZdt~it+Jh<>q7qdBx)-i0Th#!=izxBX z#*$#84%l5HY3ki2)7ruQM;Q$%a`e0;0tZfIlb8_KgQ+hCe}7H>y}YEL6Krg3JUqDn zdmx7mOy62mAbozgbiu=e4`K2^05c%7`Jqe!{*OD7Vh!rj?^zi`>291C8&2hI5i?Zm zAlk|br(gCaOG}rD3DBLTmC#8@CONq|XESjq7(8b@nwM`3WT}VGm(hcGTJZ3&$L{=^ zPH^v%E-8QXE81xd^~c6mP`)n_T*<*BJjgbQLyu>T8$M8_SS?s!?)DNaf=Ei5h>QLK zOUW}&DQ(6nqKa+vjfA`3QnN&0_8TiagDQDDbDHSHoahHDddzq4;sdxxv)aG4wiXuz z2M1FDMxNEbqP||l4L@bS<#8$N>IS__w!t+(JZdSCR~z4$ zjUvkBKakh4LHCDzKVd;RwNlXeq|Wf2%<5CpFHJ&j&F{PHe@)cXQ7o><};RnH5B=Ou}yrSBr7Z*8`XIIU)YQ}`ai^1L!k4FCBsimXJDs|vj`{+BMvqUIxD0D%epF3q zd9U(BY@pH5#7QD@ayB-+dAawkg|9Qx7k)}Xf==^FUIA=u8*8!lx3K+3WJyi-th#WY z{y@4342K$J5u7JgXf300Q}oK!4r7_|eu;03G(-A?swbK^0aw@rU!_*SqK&s^VlPAs zqB7H}VYV`EFq3XeU*mdHUg<#c>7}?33%f^Z#wN`r>)LSL}V3p zkFXy~HB_VtA1oToRE?RJlrM!Fvm&i3}BXFe5>D*_+}#k?p!1ZxC^CxL+tXRT8^z z-Q<4$O}Y$RyL&f6qTm|@~~A3vqaRfR!%=NH8c14%8|%x~X!81vd2 z5^>UJXNT%gY=8XvR%34vmnHnNUA~8`2`Pkc>ffi=jnR!%Rlb}e^@9Le*N#Kl?5j)a zjMcu2hQi03Qi;FR$tANj`{=k3!FWm~4oO2Bv)hyWS9J*M7JC@&7FCJqH1GirHJ*QG z6Hip$tBkmMnpU1NHgPyH_e!KDbHTKuHXGL{rPMaXHgBQpMrNvM&=!H|KgnxQI;n-2 zJic#1_}&~jSB^HSOlY>_Zy<}TlA4F7bFba7%EAMa6c*EANaboZk%;|Kspyh^k)G|#2dqH9*Ek0wN3GZI|#)NPhRE3lclK+vR=l{6-K1rMDiGEg> z75cQuxII!w+(W|-T;qf3N)=)^D#4U_EW_Sh5D-y?J-FvTVx-iOJMj`=bZ1PU`ILHP zdy86g&p_oUMvSDmHD{lN^2o{=636%D2Rv{c$7UWyOPVtak&%(V-~Y;y ziJxvpgNMKCLklow#rN~`Q*|4TB~VCb9Gjdp0FJP9ta@81(8TJ0Azk7pb)k~Ss2N(x zh+TCq6&tSxLn@L()I!_XKZvfSRd8u)&cicHUdl#tN-D&B+#*UOja>jalZSnQ1hHn9 z7qJt}LtSBsJegp`3$57E zGjO>==8)T=wfiNdO_qRdlZ8lcobNRIHfm~(@l5!fkXiU(i+*71^KW2V%sYEj;^3}C z@!%zjGqUi;lwbt+m`{sfYQ;mvw(lunf5*qRGBGG~5m>pjn2XV=g%S!Vdbm{!@_Ua+ z|AFrSMsrSH)RZZSPl{iEKZWs-Bg#UJQ!@%BX27tm{rIzlc^m%2OY2Lm>o<8+<5S1I z4O3SWh<9zq;bvh2bPdK>nBgpP8;m)oyN!f*f-twJO}~jQ$G)jGPq6B9K|ngWex0os zaxrMQ`;ZzN!Nk4miX7MC_*g3lEzdpWzyxF8NP-s6R~1Gk!;Y=Y1tYWz*@eRDr8t%S-ozf1>WtFzGmj+0B5XQ3WPLl{P&ocm{l>= z88K)S&P5!U(HVj%fA}*}MAiACNp&uf|L$cl)w9UF$I%m2zkym|JlCwZqCQXebu#il<|)o7st>e#16Q$!;-Xw@Wwo`>$fZxn#^%E&KNhCX(sV#=fq zeK1mT)kS47`xKt1 zvd)q;kg^i&L;dI{F1i+SQlSs$qfnO2)(7Ae^78WZ^z^ct^-EUf=J?3UB1ZAhj0YcB zjJk7kg~@CXRD|1eE9)#v?{}z!rHKRo2-IK%N92zHQgl~-K1*FtpmWjWd%9lA z2Y1h3j^kcw9G!)_M5NtExzsQ<(X_6R2%e+`g*CHq1VqaTh{+7KBu(g2q0yTH-n_+_m!|H}9W|yzd3lB3 z8)g#{!T5afCZw+0>vzT>gOA}j(Ou|JURim5pQJ^5-&ac_BT_w{N^WR#zu!{Jg&fkG z>CF#Kv9kXlp$4^s4;(OLpZ2E)D3?1y6};W(5qIAY#*6Vx#Rwi>D9=z|cSSagsfs$W z<*pCL324l9ZvH^o9jh3#kSAVYr?~{WAxsKV;PVt#?QOtjX+X|OUo;}X4L_;P=-cS) zSQa5^;K|1#FTZPR?n{-_5c+&sks3MWB_7~a#Dmn=>?!HTvx{x~`tq!qY6&K+G3@gB z;Rd~s>n_x(p$uawthSsxlFY76u^i&L5|h!xoR(ps*UPatXpc)CLWE~KO3E**(=7-= z^o;ZivMs$tjC+`+gkm9?Iu% z-lCC+=~DwU0+Mzex`+G{9cCeNROZFzh!am%0beOlxBA^@qD6!dl?(8RmrEU zR77VfC6$$NZS9%YK9A{=(hhKi;7Z(8p0#iz2{{sOmMur`!Bnq&*E9b#TnTr}ydnB) zs+RUhGO|K$P`R_gXlapXisa} zX$VZmA=yC_mv=19n4S@w2x)}`yesnQxLPz}B^J(#hPb$%AxTLy#h)RQ_3J2dXk+80 z)+%TXOf-vT5sUS`UY}>wIS^dXc5LTyBlcv}ZKv;3Ojh z!AyhQj~At+rIWANf_jdER`EuX8%FmGmD$Kbb$CBm_XR(7=L!gjHXdb>(D^nPUrD*I z^u_K2-lpnarxTShlEt|&zKA4ld%H9o?DE5j(B3=VIz(TDT=OL)C&;Bt0x>$#TMw!c zf`$PaHKZpqX1lR5q1i7>u)`OIb9-Voi?WHv^~!^~I*O)U7p`Hg#}2pT`wd^+Xcgv- z>AUM^E~NJ*K{*!(1fOXx(_nmZO`8)U(iM90uzPbpt7|yG{Z9_-Qrdp55CBH#LPJt4 zOKz#!Z^5wp`3nF0m1kT&hG-!;`TM0f*WgNU?s_zXuL}WzZVh!LA$EhbkcZ|hb8i1< zeH6G@01?{4Mmp~)NXkvX_a%%43oj*Bs?V_MM#jeKw>qxZ=zbm6ks*V^{RJ}z68rXH zqe5o(>mIw*0#k*}8lmk$0vgijd_P;Cwy0>O!%Dy@nzSG=Ps6$A-AV0_&PCRUk_k$C z?{QNa5~(Rq@tbZUtCn$ltDvLm#0swKzFC;Ks+7STC2Goz?!pV`1|+sHP|K_F*ik@z zolM65mb_z`){ifsKx3O&YuYuy=c4x48y!5Q4P_d5Hm(rY=wmcUcM?OCu+D?03d84P z%=|;kNz~loLRo*X(t|rmI10BR_dfs?Z4t z+D!(+T^2D^dCA)!2>K?-gj>PySjc96TjgV%mb+#{1|%4?gzZmYNnY&0eJ1g)9)7>T zJGifgLNzh5U>fNQkqbss)66UQ16D^?eUD}s7 zNO=x-N2jig>_cBs@6SnSU#U{)9eNdBWYdDiR$(&s^0dErrU77y$@&xhK-xkp5)&Oe zM9pjQPxn|nkc(3S`fc(xVnD=#33VvZ-{3O+k=9LX*sGb(-E*DuTVT^TnsBEfA#*adUpd+D~fG z*t6f}MCGQqX3RUtt=V?&`)#rkA-SZy)Fe0V&Jew zDDiZ&fK525^Ak_ZPu&y+k|p2ec2=%X_@Ge&(GN0=>QZMSYk39n%#knf7NSqztCcs5 zI5RnkJTLr2D#n0ys}pUKKMG#KWBme~Y8(}2U53!5-3izGP;~(*OF)>B@)9nXIzQWP zRu0c-pT08qT46jDr-)~29HSDas;n?R>Koz73>8;QnT?Ij7csiB>=>kEGa(@%pmSxo z{{GK048M^(;0X&f$;6(rpbZ-UT=5CPv|e9G-LM z$80`cW}>uPw4CC*p5Aw*q-NNpOJ!&=<|?w`)u2~W&0eOWO04AJiP1-zx~+I04X=rR zEzw;yh2Qu{PJpI`ZrrBp%urT`x6)p|k8|8wtjnwChdV~EE1@khi(15(p|u$a3l`sC zS2N+#XwZd&B&b!jKlvbGV(fN?Xh`F2YfH2}4FOW*Zb0dA=J*d;-Gx8C5vTYJN_j{1 zG|^Rj*p=Rv_cf_clI+VFzK4NavEZI;yJYwXDfw}7Tc+egY0Gn6ukA8z$B0L+y^lAW zZ%_ygrHXEgySw%Hv4!}snDofj>5h(8NIeVJ!9(Uus=*FiUU zD2^1e3uzB0*f7lJLJQ^$}YTvxIlrZu@OOm0>zdLb+AfK`&$K>OALzZsIA643 z3m4GA&RlJx@*k=lBrmE&hV+KWgFqGljtt{dNd)8L^)6?cq4Ps#wqoJJ{{ZtgkSf+F zBr`H#g+UfNu0Dk6WG-dA2AQJO5dUSq)c^`=q@e`=L?b=^+~Y_18y+3Yj_ZGXgfyZK z@caL$3f3cFByYu?2^<|ALqkJ3+4*UkMdA(q3w;^-zb0V;`dlG{d1mx*dTs6G_*mip z19M+O2QWi(_d#p>@5S6iy5bTNHp!7LCxricLl<7;6q3=>qbvbpb@w(ug#so9#0nYd z6tb9}4#0~Y9UWz5)GBP~_nyDiMfHQ`~MN(5@M|44u!Ik*ahAh}ooxCdf`;&>AxB7h8F zs5phxi7;=3Mq6Uyv?w8DP^E&a1`$desq@_1oPydwRE-JGF*m^J14vuyz`SMF1icBa z7aH!3ig6|%%r>StX@=~zW_1zX2H2m>L4aETR7ps&v{F#Mlr?;&{oziLH9Tk-S`{mn zev*k~k|~c9GM0(FFMz!7<*kEw05t%J2_asdD_BfqZgn+uIM`)qQfa|u{_JccrOXv5 zG>rehUrR_RDk}2EK@AK|%ng_}T5}Q-dVU`Bd*^>00<^0?fM1O;J;3}gUW#}mfwY{Q zPqPX^J=ttV0w)eC1(@GHN*R^lY!JSgs1j=xXR8|!8Zb1}e}1i_@o|ZllateZ9y%&2 zN=r)%&>G3PgT&N5^dc$4G9X*q9Fy}6ci2^DWx298w7C|GiI!~Z&q?N$5FdDIUB@yZ zGB|E*L&C#h3E$=ppPHYaa2|RN3y{bzWCemW4ln>b4OOL}fT|_z3U#c=umFqHd1&>> zXwecv+A%RGXZbxiu0BcFH+g_|f%RX;bh7~MADX_4*J1tHgfmu}^z3wZJ7l#vKfs3) zg%9i$*qId`BnOoIuX1KhtgEXlPR`u()6)fO&X*SmAWp1=KzRq!4)S_DgiRaE7@>!1 z&P3w|;{V+ao&emZ=t-)z`Gw6ntNUkz#-)+n5u<#Cyk`kqg_0hcxawUXm`eC^w0L{l zgtIOl*aJORvoVF#nUH`9)&y$wViV^I9x^2$CYEIK^6|-@EUW!!bar+&Yt6}@7cda6 zkByIyKW*DgZvaN0F8GyX>rt%}*(Ay(`=I=Tu1`ca-N7sYhAf!0l)bE$mjFiRPTY@8 zpb)oB{QYW6Hv1CYZ+OW`M1PDwtnl0<{9FL-1Ee4XaVMwx8EZyH#;51=z#g-a_@*ZI zRPn$1arF_a1_W@lHVQ}CNoNg$ny4K13{r&w>uAx{R5~c%$)V%=!5O1H>gI_ZrP))V_7UT;UlJ*Hp5hp`gt0 z|8@?B!0-1~f=C{2bbz1`nft~ChqRtWn_V!5zj$t;p+-QJZWaU5M=Zr}VNOB3@}Ol) zXU!r&lm@k})WWv74sKjipUeiCrxg}Pk$_C|=w$xbv4-^h8yhH=^Z;A{27`GB<7kv~ zt^fZyH-wCxgQJ^W21>jU=-ltir^jDVZd2HBEeaqu>kKL42-s);VC+Q1@ zA{BXka;@)v7+-bjao-zFDl9A{eQ{oy#{ z5&-B))*3L4?{n7iB9S6>d)Ixk!$*QTY`TcjSBwGf&I}P*W1S2zPwdO~NZ2)Q(Hv|s z=l^7*1}%j5@+KAMZAiqC;bBA9Nv^M!lj7TDWo0}YUd5fAIZXSe%pO;--8J2Sgzh_c z52WvAH8DgKQT;6@zq5+mzP=Q;bbEjMr#j160j<2Spykwkp8*i705EeD!-CrV`qE9n zVF?Qd_ZEP5cL#6^onO9e->jZnTl2mii1aLOY$)4R^;+15NYbzfvmOq?K`L5)6oSAV z7(;*#IUEm33d%|Ih&MX{{XvsU@9UM4wqXUaGM|7K*6x2+*pmb6qAilr=_#U@NXEMA z*oIZOy2V?NN=;2)LsW~XBFrkTYHdyDI?UO$P#u++*ZJl|7h9*regz2j@Y(dgby#jN z8H&cC1(?LrZ{JdZ0lx&?^|xC6Ea>?dc%3VXRx5o>?Hbs|{Nph&ec1B~+5Yt@H-!dG zUlHI^ZR?Vxb0M_!)ehINzO?^2+rH-diEPFUkbcVYka%FEl^z-6ev^Xy^!XY;XR_kH?M3|@gq;D#wd$96c;+${TIec&DtM-m?wXXoHR zV#fuMl#@4$Q2|RTiC(;zMV5ZPuZeb(#ACZfaAy2(DLRKxGh%Suz9#Ly93pIq-;5G@ z$=P1=9qumLEPU9IW;h0t!@TB4xbi zjJafkW5JAGKM5dzDSLT?%r68kRi;P(=<2C{`0$}2byz>NLBv{==- zAk@&wtk=SjRpx2%+1XLbYFGD^VV1ckh%lDT5dsBd*zt`C|A^Zd_?^*Y!^L_S#&Ey$ z+x_eMEd<%Uem&~;?$#`!1b-$#M0sLeg|eiCcH9!{)9ptBM0j0&l-y6Ne-+0XSlB$PZpirh<*eP2D>3a3h zvg=7&nM)JJP3d9h3PikKC5FP9nwpu-fC1_(r2^@`rMvh`*E!zOG!N5l%Zi9R0*%SX z**F;>5lm3BxSL3HD)=+TL3C5c1$mSA zzV4?|a3cZ}$3IEEt`Ct)n>m@`FgI?QqrYRGq2uTmyc;GymUb;n?_7e(0CV%h4lI!O?U#k=n5@> zz^+~cuoFp`goOXcAZrB9Om*CWf)W)^uEs84Z0lK=X+48POR1&eP0DqEs5w2_&*+k#OW{yS7^&>|q zjgp^rL)A|@R-KP@$GNcV@xo7z@g5=&cfrkJ>{iM(<4|5bihYlQa?tANe-Ds+4=F0B zKk@{e08#=7{5U;4e42E6`Fk-E_-yogz500ec;UH8QdcXKmYPb8j{awuC@|pRNa?(* zHDl3pFmfKcZV98I4&oy2bB$nrmeJ7o!)J^4;mC~&5Hf{7eU~^W0wGtCYuJO#Ge28$ z+@9fl$BnMS=eViE<0oD*4yybSQ(A5#3xkR%^1_z3=48-A`L*N$o2W%%-3}~V&|Zu# zcgEQI%m0ZNA&Ie@kNPGtX@xm{V1M7x(p#rAXaW0rp)p*+I%*=>KT% z#H4;ALc*e=_RhhCR8kY%vhfvEM#;FsfFkxbRJI+6*xbWIYblgyNT05E&ovblKx_aF zUF839+ClG}`V5`kqH<;~S;kEpJS43_qQ@s|VbFLAtht)%gnnsDLNpH$SAm2grSVd~0&K}wq z$6MRHl94xQy!zM?Qc7bq>OqD|>B9dwXlBvoWneHhc7g|uK!UJf^O!zc6XMNMVq!z| z@fwfO;#ZTFBn>QZ31K{!x9{5BbhA4}!S&OxBx%FU5mY#}n`MOgf!6~P`^6YVn}-LAP>>sXYo>8ijoQ7gJ?z8r6uSqy3E0c zWE|u`C~ABbNfuUa6|;%@RTJ2Y_xOJGunz<+Y-6l)ZoI1LCthX^-@km~2E>YNAr^7u zlU)k?z`!mL-niW#<`oCfif7;dP8AlCCGVrh49#u`h*HuYlA7Za;6?0)GutWPR>R6p zj4v)^t~>{tnS9}6LW^0!_xHd>;TzP^D+7=3&LaYF$mi$^CF#^=ZiNWMl*rU?OukK{ zX5|oROKCXpriKrC?3!?Zj*?bm488qrQ$=p)0DJA*C#`FNO`ki7t18qyBUaBdYR9QF zwi4e_&gkh)o?;+*MTf`~D|=pCqP`vR`GMU@b$4%8@7j!mZX{G~a%}{$At+vQf8uuK`NXl_>hcEq96mSoY{OwMpGgu9JkT;#t4kfWp?uN?2 z_8cDJ!DR8es{GYniN-V&h%{xc6Tp21AhrvDgQz;JXNt6{wbz{oP^kFrNB{Z*G2#Y5 z?6C$H;41_Nivfs}zrQ~%p8vt^?QJpW!TVxIDrL;=<|HdW->_DDV$mZONgp5JR@J<7 z1;j*?-mwE-Qf9BQ7R1VCU_9Z8SssY(kVeo78{z7y5rW}3K%l-$Y5r# zF7`Fj9wVdxN`Q8}3J~TFO%J{(9vK8I?BBzgVk&+h2Jz39Sn-V4;WRn6bpLBY;FH-W zDzUey;ezKAtHUVV=WiN6aQ)kEkACHMi)ppuA?s#lm*r;#=W_}}h>BCAm?-LCGfRj& zN_Xfj1i>@Px>9h)#3yWV1E}f|scn*b&35~AZk^Rn9WoTD7U^CT15(-Y|D_XG$C zIKIe>^|chs^c1j}g^#&iZuNnWf7`0$^1ck=8R>ub!gznSdTSW)k{*L4gm+V(1!1JbOs z*nSRta+jXRco7tCImR3K32Pku(G6cr8H<%dXD0W9oN-)mEq$MNTV>&Wk{Mzo4Kd-n z2KpFu!p4!_-d^CQi1!}6RyH&=G~ke43k%;df_!ZCo6O}L9nV5wkYwvHB{dQg6GeA_ zxA`dd?wEQS6e>L-C>6kQqm^%os!RG$o?XRrT?g*q1b}F2ouR& zab(GxZhyO_WY57pbkJI3AixDTkIhU&kKj>IfcS%*5QQ;dqT2Vz>iHDY#OSUYG;|iO zbj5Abhe}yOb1t!(Pvgw$3kj1Y^T?K*&c=4V8$@K{9b--?ju?K0CU+d6JIYp#LwMu9wz6WxPtJZsi(ln{S;>I?9R z3vu^eLpzTb4f)Tyqi)1omAbvZCoX6DUXap&^ZqU=>Q;R6FsxE7Zpw&vi(>gN+855E z(WANYO|M-PLz$pGRI1Z@z2@HlnLj}KdN;DRwg%AoctT&3^)pF&Nh{|X!y(s zKWkZy)cc3q-6eght!ug@z_u===cq6jRYk7Yg!Cd4M-RVpLq@xlT|V|pSvcOrMO~M< zlM(u|Lld#Y6*Rn|g7Io(+%{-jw~pwZ61;3tVCWkV$wHlsq;wOFg{@t|fiIX9HrizD`{HXX$>KF73fy!FX^!U&Y236`@;UyCaGiY*d`#wUWTp92pH8nL8D-7$w zqoch%0tq;JahA_<96c2dkA+oZ@ny!wqn9>H$HzuI!fwy8=%h>b^>MflC(SmN+itDx zh0}WdbI0z#`o)_L?0?`OU#>*wl1i4@hc?97FHoCdM(dK#_cI+gEsjU}zU`zRh6Kuq z+<5R-mqRJy&DXFrW!&<#Hk_%~cn{6z^2{2V>;0@(!q)yLm74a*xU}+wh${gLXqK5| zboYBmEQuty{wq(50xhd}?R?n#WETQfM{-F8Jy`dqPLbb<1I67+A!e}l&duKW#-7bh za9)NaPDn(Lp-K=-!(1f6)XA(ee!O$}SumwDv$>fd%o2g>pO%=&%F7Gr{ez()UmsuJ z*VD}azk@u_JR#p3V0HRh?6Z-Q7G!Z)1>CHZD=FDN<59fHlbMov?O^^dPjLa&_%Zx^ z7ADzBPM3Y6DbCO>KIWz4kS+zpI~fGhr(`x#EMGkACUkZ!XH3T|FlI+19Sb3H|376% zNy*8XEzp`^d`?{mhk(0-UT~}LeI;%$7DR#%5WTM#q)x2g6U0AKEfg?V&36*%WOk_X z-US(h#hv|4<%=pMBo`Yg&cuIH^q~S09xdQPXM!wGPSpQVG5GTQSY2H$$4f?LeEoaD ztdf#!%~k5Is}duSR-miC>B!CXyf<-B1tOaB+qJ)`qyM;$r;=iCr~)xbb0(-{pJYN| zK;XynXW!DKMqyq1(Vt)6$MH9^D6x$H`a5^21LsvjF^-Xkl<_UA(!v66=fQ5c@X zG}nv46xonso#ad6J{^wGKBVsSIN`P-*lsG?qssC&tOFfKqVa%Y#AO_UyT^D;PZt^{ zeFon*oUnxpd}Wyu6Au(4F{0t-cGz4i)kL>?ejU?$Fca#NyV6KpR-?Sq0l^w^{rQsn zwXYNgaUfG5qdN9jJ|1Ctj6!y#k~fcSaB`AKP*9MX`eyoz1b|oEp84MbR|Sj$?uP(- zvOkg0bGKt`U~szm`qKKp6M2zT3>4IYPmz@Ic_b(8e(7nwlh@t{;I;%78gSKhaZ#Jl zq>opAEMDn3YYeA6A&qc&}we{e7b0-CgR#DvGr%>wW9cl` zmsM&8-q;O412{Bg!b{4?kctH4O7Dqo=4xrFYp4(b^pr-jS(l*JdZS1_*_SRscWh!( zUa`=N6(0N-w=fDkX8q+BhmXF#zQ7%t4)OTK$l{WC}(~hQP9?4wC>5MNq6|t}r#$jz^-V zR{AH-&&}h(gNIM;m&t;?|4|Cqm?tcc2(94WUQsQreZVwEKmzFbSDkR+z61DpNyG7I?be-eoGC)N}RlM(C9tx1*z@C`8<`$?>8>fIXNjitKsj+>Rn0WXwInJFF$aZz}BVAhPPZ zNcnt1WXW4fNv7ZJ*FGnwilavW(nk`OOl-tW<)!dq@IyX?ABOhyyakZs%uGJo*zOw+ z_OsaN=*1(q*3E#3goOHxj3wZP1ptJi|D(ASb?hJ`VmH13{9jO`d510*NRYl3L4Rsa z#i@k+Agg2%Iw&*BSc$A<&&mm_@RmgxLV9-^qA(mo4=Wb-9}%WV%q8};TL1{F3`3@5 z3gPLj^4J<6cZ}JgY(s1&yebibY^IqK{A5b@o|2dmpZUIhySQazyh zTr;1l{I>f&@l1XKP_%aF^rx{Fhj8~}Wcv=Aby_!gMP%xDE{L6L@Km>sPsh_Yp?xF$ zHn7=IV?tRdK%)iGg;dudAU|YnY#1xCk~_OK-0S9K*Zc>x0|jMG~=>1j)h;d{|3E( zhEl^i;j*V}mU5S3icXfh_XEJ*&tp`le7_0tRo+Y?h_xGN0eBW-0{cZHhpvKJly@F` z`2$v@I6Ot;ZWHg|Dk3c{bR?@2<%mMEixw7>$`@VW5uCTqE!YJi~k z9FG>!tUVCuN;|hJ1o=jG0v$?6Cr1R8abrm;vHIbKYiqi|p@+*^N|#j*%6gnB4P#`~6!rtfy3kvQi;i#%v&4(GL+4BS~BD+)!;& zvQ;;hl2bONSj4ZeRfar-4`Kr$1Vabl5tgsr2x?p!6U$GoJKX@gMH0;xfa|sB|G7=W+WZ>cS{{Pr|3$Lo8u3wlA>F$tLy1S&MMY_97 zx=XrI=>`Eoy6ey--Q8V>hC_NcKF>S8cYOEmKj4hBW34skucmeW#YWQBCbE7N4nZT6 znKQRjl$kkAL@||3c#OShhTOMP*QkwoM1orKGQ~=sh-A$+4fkXuYI1DFEzFuGA@?F* z{!CVT#g$4uzan4Wvp+V(+RSa5KAV1CB#R;%-csgJ^z&dydo#1&%K7mwTy7edGTODvgTB zlJ15(YPZA-p2c@*XIclG#+fz(+vv$3OqKg4M78f@FyDnBOllER7wGL-O4?s!{ngDQ^s2_*VsR_>(!oE!)$$1 z@s5BRSdc(OB@ipG`pM54K6Po+g3$lto!0@Byya(5pXw$m4E8E62AP)nj`={Fu5+CJ zqkEYJR>M2ee9~R=@-W5f_pIc}D$@ePMYP6HTL^{xTe*RXY8tTk{T9V)X-yMRT(HHa z+G}$`d4(-aoQG@+2N82Y7R;;kNAVIf`EDp2tJSrMx{PUmI_o4x^FmlVp3Ju-Tsn+HSjXF+MXcG!DUoW101*e!6Hxu>=o-YpOE|ikwXgMcy0d?DS0(Km9WF!u z{iW9wCq8o9`O{|xn(m@^ebCE?pWl9r)-}g;TERk!9O0wQAnniXg3TbW0DvEWYO)4W5c$b?kK^Kv2 zbOYKR?Y6c$uEMz9-rmmhgWpd9?hOW|e@{;T{?R_$-Br8-G$G`c0f^-#0{&y>1XQme z8K1g-QW~Z*HIlDIhr3MC0jY49a6OBgfz^+ifb}ccFW(71{M5QD$%eosKBF&VqE+(` zjC4=l30$!g*9?96YVReqq3*E|)#xtpLzn#|C)eyQ+|BAI={n^*HGQ-m-SC$A8ghku zLZ8@$qfTo$>1$-w4vp70y+Or6F(&A>>o^xM@zmN*FUsTU{h_HUegt`bRsZ;H3Jl!;EEG4lMTy?rE@~0-b@A6N-&U zY|3iys?nN{fBbz^JAzP`S#`=xwbI2eGEd)bcD)FByk&UGyxBk7Ap1ABspD0RC^lS= z$^K7#igbf_2SSZ|#_{)h^!0*p+rbNl{+(-iofZK5w*|eDPH$$-_NdZ$IAcXBaJ@?nglUGit9J-u;Og&U0P)wXoft zO6htu@-WEOeZ*p}r-7ZCUUH@A6bvlPR31;S=II21iWcx*y6xXqUZ$>sa{r;Uj<)AN z6kUKXItK0>INUqgIz67`m5~>U6qtJV9!M*zePby)Q zKS4q0vb$&l5kLB_?BqdXAeV5A)EnA z6oet&@uThMz50=_1+H}P^Lp2Fj<4VBmRUf6A#o%0|M=vAvY^F^t5k`~Q@?`6i#;5; zcS3k{Kfmk2y8-!+qOU}g+!qEN9HHk9)<6^qBdVTOHkur*s@EEd(DdJ7s-0O+xA57O zrji2=zD{^ll=w-rD?kJe5VEmhfA>cmj{h8Rx!8yw4If$w;@EvS{v_9eXY^Vb{kuB9 z8chh&@Z4Ass|KZ{Sjx(FE_C?%wF4P9Mwdn$IU;%nQm$|jm(;TZ?-gk5h8KPzfBXW7 zMN{m*#r4+NYnvz`$1a4Iv*y+$lTIc74lhKfM-cg9mJ$~_N>uxwYyseqEb}_M4{vAD zEC{rysw~^Z27)CzL%F#01oRAM*Vg2=QKv=OR9^hto{79%tTjuK6M8>NM5Q+Dp-Q|T z;P5g*|7O_tEytQe&huIzXl$vuDhpH^df@rx?wLO2Y5d9kAt zpByPapqQ$xY-~Q9Y77^7Ts~fI?6?+ne6c^9b4E4 z>V?sFZ<$;?dP|Cr&BA%lH^hhQsvkkj7O{Zd@RUQm#KIwI6` zQer7`<}_AS)#DbG*F4dA19vD=$w{)eh^4Jj>n<3HX(ywExVtLOaj?okpH5;GAc;`# zGp~mM&rxK$AavdgOwxf=$j>kv z1;2qB5(3-aF08K)1nrzckU{O`wYBZVtz{h)3c=7ur58N|hF~;#G3dLo{!-YpgkG#K zEpyjhq8`uNqnhvI{N|@tX6EN@_md&ey&Hjj99&#{6Z6ZnYg2o#ur%G$>w zIVV0I`?>+o9UX1Amn4<#b;oCwexGl%?l|A=_**TViZBwL9$ z$nn*yX@pP&__c310wP^LwUFMxAZXuIB0!}x_TSTWixi(`y|J<0-Mx;N*U-U^PdDJ< z^Xji}H}yqJ={PAYJXH5N_}}wqZG?r}ec3?S*;*2l^Yio5(-L2>LSUa)v+Pfq34B@w z!?kX@JdH*a73K6*jfzyE2nEA_(Gf<*1;Q`aWHdN%PL-gwRej`oQ=^1|754+Fv}+Wp z2>L_8AAQ2P(;q9vB`xsc*dFdrze8Y5#~R9GW|*Nr{PLjv{-@Qc?)6r4(WA{vY70(* zjo1Ht4V>gBl@oBeIZ3@flNy&J=<~1@8U_d}x%5Gvc^AHZ`ikm(iDw}Gg(cU#f?X4z ztI&$uy`UEnHdKT_ImJF1DR5RS!^Wh>-_zF0BuQ?-I$PJkH9wnvq&!c`{P&?#<}9G< z?iAw|EZ}|;5uW1VB%7K+g6Gaf91BEXH8wWp>G(`$42W;8-<6YG;}YwPpVtBXsMUyy~nJnDJxZrnqR*`O2*JlEmI zrkpB3Ej6S==drQ-AjnBUlAn*r-<_VYuv##A_9Um}cq$$aCZ^;^Z!fRDk;wLoBHgpc z#vGBS!LV?Om-xST6Ay?l&s~paf2HP@Zti|Jd1xpo_+-=rz0?;+O&<>#+W=Iw{pmWln83Udk%EoncNeRgdEU$xtpocO2KhgX6F{g~z za~mF<9X9X@_zN|pzR~Q=CWPXX2{0P@;qf<0`t!u+5XMfS2pTmZc>%H#axSu}qPG z7t#k4Yg_wgaI2%pONrh5asWVZCIR$x{*&ze1rB{_X&LAdJTY(R|1e7cxt`8rMfcTf zXl%Lk5rBce);>#4q1ZO)(-z<oMPbjYB2yu00tOdF0P5!CbE-la&q!j8;`|5!E32LD@Sb1Dp~jzOaGL4 zH@pKfVCa$gtJ2hw-AO@3#c3=+hzK8_B^9T&+3OMVh$sbtAX;+~Ck;-otSCv0nXn}GN@5?pL)o4We?-rlixlgS%1)c2I@2tANh_PrtphG}zx)1mCC4wny;L<=_5@=6KL16?&N;B$(6(#$$`QySU&pE|jx}Vd>{zKhZ$s zk%@_k(0&)oBjwpF4zhc2nX<@B?)9@UqUc}9Q?m;+bQh#qAH95Tb$ncuiAjix<2?<{ z%ZR#0x60=bdeEbgY|f0}zGVKH&+vT-c0`MOzaA9i)jc@YQWT zrB$MX9j&d&NlBetT!73W^!NyX{ziH8=JpQd{PyDF`h244HT4n51vG5)+yr7trw>sN zys~&k^Jl$1AK?)~rJH@cZ6$f&sjKNQ#Tyz3rBBDmy_2)3=HQ-+NWD*rFjlN}XVMj@ zwN1>S4G?bB1Bc>k=ioA;;&#--aswNR?`1;%zK4v5f7Zdt{3Ymo-+jpVsgfh-w}5lL zx4Xj1?ED&6Z_}>m-7=v0D`o+KN78D?UpD11PTD5u`Dnfh$6)Rp9)^MxCgvwMCUSv~ zcYc|Zi)#jW-YYAg4Fd!WitjLx-k>92-C>-74@(7f{I?Ywi;7s#k&yx8i~Xs7`RS>6 zS0bln+4?r!Isy;L_LE~c+y!q~CU?-b&KvWon%WWgQ11MsLan7_Aq&{&*&@FSL&HzK z9esrrEP|}7sf_G`-O~z;wbfEJcW9KBikq2CO_#QC))wukB}B0PXjBy$G&|EHxCaWt883ZkIiK+b1u2)40K=9@7vbV!AePq zDI7PRiHAcbOie{aMM*ihx(X}zd?F8g@dmoO)ARG9KJGCoDJgv>Ky2WwO}!maY-@Om zp;1YrVW4!#DQ&ox93>?~6snO~V7k~f64-`YT-)J~dwUiR=`H4W0=OGf5@=87k;TG- zO|;Ij?~4fGSJjDeW{?4ilNd$X9sst>6mWGa0!vQ!aiS0yw*Kw$ySb@%cD{%vFtj&b ziHi2{sN)X*8g_e!;rntpV14MptmmpY6GO;qC|W*OP+q^gb75*FBHi zulXW!C57B!V&r@~Z=J+lWXh~_3x-Cj#iYiNZY3p2ivTJd9rG1z0It9xaT%G6Lo=zX zT@>J4V|Q`oUCT`V()VL>vi9j27I3*#wmq~A9uOs}P9jIj4ZYKZ+~3#N)n)QIZvl3Y zmxp6k(EVOnPk0B*U$AcNy_uyYa57XY1Bcer7&t#a3sL0$V7Vupv8=3AITP}7kjRQb z4mqMcwm#W-85e!W3F-)U7uCrf(C&JgU1FIhZVjEhsz@*|46C0(AQTSx_8ZN-ju0PK zvH^5Wn}jW;F8N#o4`JG`Fk@w;U3Pu=%~Vaul=gk0kVr1$*XM){3;I?ZzAp(2V!}E0 za*WFx2l|BYdIC^1Ya8xXBm4=!Wu-rT@58OY)ecm)Tl0A_t{k3a$R#>CwrQ5cp4}*N zJ3BlScHdDkWOaY*R9dtLsKi7b?fx1CoGsSg82VpmoA=!b^gNYSG&?(V<4x9X!N35l zf9tXG{MRrkgz&Gxkq?2u!y$y#)qB8&ORf6)SbX`@JvJ7XFi}-j0lH1rb;uFqeaqvp zmMi7b{A+im`AU6O9oTs#x~W!HWxNkM^|S&5)OxX5O$V1k*6-50PrJ{mak=ZQh!{hQ zM0}K0c^bAFfA;?#uYG9CelKGytA*X@Sh7=l|CbkFr(|YM z(am5vaD9-{T;Dh*aM~L=WJULHa9nRS|9STJ*pQauc{sx0??V-wl)T77v2FO|GwCsZm{p$1h(CXuPd+nOT zL4kpa8W$0Pgn@E(dkb>SOPsUC5z{Y=+dugCX_@1kpd z>BZCH_nq(e2t7g}EG#_k($_H)=dw%f$Lx4}HLbcWCsZ}x6mFaTyxD1RIwj!2pAsP2 z`B+6YB%KZC&`Nl=G^F1`S6kK(R*F7x93pHY@SUUhwHTR?54Lcf{ zJO_u!Z@_IMjrBv@GDzBB>50YOhZtafq(LC~pe750by|l)OloJDsN1irE9<`P<%Ucg z0vptO0maauCY>9{cR0A_IkUY(CEInVr*CPeoJr+>Q691enGko>`tXX6tD<$iH4giV zE76Vj(2V@+muCOKF-%CX#aL8ibhP1@RmH~D?CcsNV?YJ-EB)K)seOsBqq2u-&tl0z znhsilahQ;>u%N&aVeFh@+3C?qlW%o(aWT*>2JD^im&9but#(@}&8B*{2($|cuW}{d z&RJAn&0rZ>gzB7Ne)hCImoM!8Ca%c*Ua5AgML?25lN>zFa+l~7Q@$?FJ>e+&VA3G~ ztOu746f=kv{?HJ)%%NNlY_ydql!RIu(?~G z2Y}H4COOdI-f~Li)5R)dz-0lR=$KZE$q-s2(H<==jlQ$b(o~FKfa|fns8-ERm}k~o zHU>{6yUZ>&M<=KA%b(FD;xvRz3i?8h1~6-MsAxSP)RnrSchOdNECYHvAIV2;-)JO- zyS)z_vfo@{)srrFcGLcC%<6qI`e!fH`yG+3mzn{(64GaEHjagM9%BjRlgSteNoM9nkrg5>HK)(I<+&F8Az50l!E5E zW&;J-?Q3jpQX8+ngasyyn>4DlC*};$G4KVGRzfSnzJAX@ zyT7_xKRLBLcjj77yAxitH+=-O6aPfKM}gs1_{7K>&% zJlw&aB}9&og-43NOMpvGNK8b`K0G}v$i*c@!>84wB_Jqx?SeCzf^q5-6)eIz;~r>r z2Uzb`cS}06l2VZx`2YEPJ3klH|AYsK2ZComC^~GNav4h*ndx2m(a{uLo%AE6JjBZa zvQuV2AoD2tp4-2wxVDzrOZ-TGSfgC)`ARUQ9Q3kRcP|%hF+gmxy&w8jQZLc_G>ODP zx5?=uvk9^TAMMuC%+6kog_Y>wke-{{$?sxP+3}Km?ASIsJkaQ9R8`+z(B3}1+M_1Q z8|i-bC9}p^U6T;mjjPaxGr@sF*9X_*YY73poUS}7zO?za65oj3;Gf|+EWzly>pEgn zqC=E2osvI2#B1deEYt$yc1)7kt&j~ahq>y9;Cb&tbMxZ^5=$oL>4Kv=WA8bg-t*Vj zM6%Prom#W98|v8{){G@P&YqV6^?8E)N z$DJ!T4^JjnmX-Bc8?~SING9ay&zEh`Dt&1j-A^U~--GG+KWm~sU_H;Bn5uKx@;PCH z;v8<5u=qyJOb2kLXGlu1Wq_lHqlc#Ma9@Ae!_iRza7c~wazP;XkN5CRTMRgsnab*H z8mzwzp`dT-2iIEhY9bq)WJpw4-A4nY$xQadM6cWx5KagIQUURmW8(&*kAWbA=K~7bIi+2w-P^~z>rJ4kG?--bPMVx0#+7qY(vgXIyas$e>ocD#Hc4y;021LK7+W#e1+T zaqETd$ISfgOj_d9;wd_oslzecAMr6=;TsBPad9uP+3>@DCcy&lELfsc+IZMB8bMBN z&ayn58!GgjE;T2)c~uXJhH=-Dh@Bh>m?~m(M7w_P*{o;_;M>5J-c zdiY0alu4~)8)Rpzs!q0e>dVSnX=%YduzWBSUjso0bs5j=2iSi6SlY-7vbX_KY;SIE zB*-R}!ZEzmGTq4YfPjxy{_p~-nbL5xpAIiZGlU-yepA0!6S(XC5b8B)5;*)C!JwcB zWcb6t!b(6JrDI`Y28ujg&qJjetvFqgX|gmwAJI0h`OECBdQ?WlL}ik3?ni}2b8;k$ zoS*$Y8xu?+LcMBhYnzY|d1t8W(!IQF*@YL~CcJ`!jV&m+tfQN;Dm-!3Ha{Vj14RA< zGamX(njem6W6Z0{YEM0HCVSR>Cjo2$+<)!v0dzh-c^5*~HlH^nHBKB#>&c$@^U;sYt-AjX6sZyA{-tX_Hh4zj((k{IPeS`jC%FWE$nOV zhRSCGb;%~{)d$3f$&@ho^}?n3<>|@gRgsBhG9n^8JmKkq`SG4r)7umNip!`ddx`Ti z^nlxJ6PC8+F-0O9n?#O-;lcB< zcO(uO_52JBzP`E2;kQM%xBlG8@slD8zCH8IA=dhZYOllxGt!n&9FN85R z<~@-Zw83yE$-N6w#bZXkvFJMiJAY|C=%-GloYhD*go~?o+^y^^sx?^pee^%y zl}RJI2B>0|BOyUQSf}h=ND82$B$xsHO44MMvjtR?n)_R7Jvco+>iB8Ch~N5pBmc$t zIZ(M`T3f^WN74M!60Tsny2KrbQ&CNYL zT-aBEeUwq_sRpF%r*~iO+^|mYm43fm) zU(W0#q2n7K9M}DR&{ndj%S9v<;QK`(sILa}q( zUtG#kJjD9-8CU9crXydore97qa{zuI=&~m~PTe;Ed_weP;LrV)rJ#TyVi@7INnLhK zhL5eSZa_dsfLLxZy@Ki$LU$JC78e&c zHxv1ZqMl_yJ23;A^vY5JIcij36Atuuujd5-d@D!$mzT#&Z5LPJ1vxD>Co3($=^ya7 z^FGX_U3k@HpVq3LoYQikp}t{eF7xCF++wmhd-bj2+-bgno40{SpHD5|!9?wwp_r^) zrvF%`*38MohLPfEBxkWLVC@qWTtYxV_(ovRPI;sAeRgFft~Eyw*tQZzxytr$-hF(< zm!6Zar_h2M;V*t)*bq)f?>x6`3L+6Yd#P={X}j0%eM4w*vY+#&5y(eOfMz(bkmh>#BBWI1+CW}Z|QnvP4OBLtu&q$S?yHS>jrX_dz1WI$|SXi`ljf}a$K8{vNjB`SLMUVI`v^p^2vinGQXduIgX;+{NbPtj7mD1U4#*tsYJrCvv(z z!140(UfR!1&(5uVsV-~x0y?0=p`F81isB3sBD~WgXHzbRkmvT*)huR3f)0r9Upy3o z<9$OcOwu45#Ww(&2wvS|>XHzlZ`0N$QqcUvQ|K@sVn-c_U&y7OFPCP7s;e02X$KCa z2Y+QfKC_=+*gHC+y+J<)gNcc2AV97Ah?swd zgDb84@%b5eWvlvGWFaBXYbElIIoa83FG0`%l=6LfetsVe#v;SR!p0^h#3jYW#=^%t zF6vXuh_Qhwy+|WZmoeG_o=(6)Zg0fSE$X8{aMDQoHB&I4eCVwP`_1R8+LTTT*H~9S>lelU5)YS3h4%mlzwii#<#!fod_h-;8r z4(aX5si~vG*gJStnY!Vjz#Dj<6K#`)Yl#{(_ne}26I)r)tVzpuLG>FMgOoCPgONNe z`isk3sdd-`4^ajNLcd`xru1k6*4er258WMeiX>QAM1u7GJnmYUSlGmSXJ?gecVg>r zEv6$mZ`=TA>j1cpDF{hPQQx3nUR~XspHHw6f4PW~-rn0h-9Ft`7Dz{pn2m!-wHX!e z4&|&sL+R3`rFT}vt!}NiX1|noa)7KED+OeC#*vLsHReb1ndtvSf5tZY2o=HLPszvU zIm9{3^|8d?Lhc;456JZj)W5UgO84=YO#K=)`tA)sdet-D zhzVx4oIR(cv=s6%LGS}_AWl;~RZ-o(T#?ga1QqFxIN2l%J?z3RVY5pdXv3O3#4j~= zPuRB;ZZjQE`#Ff6fo+4}hv%>`&7^i6INM;&-yixdfa_zaa!&9n8X7uUYVPmu?EzHz zEKpQ?)WIV_1_lPkBhzrOu($;+#xfT?m04L04MnfZXJ%LZ0DHZ>;^?ZdFun$NU={%? znxu?W!5NMtg{ZQlT`3z;!WBvBFiR2yA07%(!IL|v%gCwfN6xzzXlT=cXz1wlOUSL% zk)3*CD%zlXedG+;G=Z^yFNWW zzCJwc0-UBl>wkh>^$A4yg%&2){$z7FU0q)TLZg+nxvh#>;Gx|k!aV@nkmsYPj~6x2 z^#A~w%1vB@M(v@e+iW$?EFO1JseG)ZP+fW&5T67Ghrt%IH@wHH6mTK88ss=0ptk&_ zw4l;7qSXuui27wQ3(J{0%01SL#;o{M2b2WBy z6079&^z^)k|LXaOzyX<fnV3Py#h%1 zw!5+QwSc?w_>b%N*9Gl4Pqt?={abhI&jV{7FE8U;jcWmCS+I|P-A)!JL2Dr3*&N=u z6i`v^k7ZF{65@Vnq|AF58eKC$iw_+4BPOdkK}SvI`K?=W}-&$5n@o}8Q& zNFMYYA&)n=u5X9@!EM0w&d(Hv zqQGIMj4?hoR#D+_a?=(_SkMxLHVfZEJ_1~CsVUlNlPHNC;P;?1sezECl#m{c!4 zz~$8fq0=dvqE|6b?6AHtK@zS4c@St^#=Wa^BKW+*9Ux&IxmpKAOtjGrYV^*7~-})y=KmqwWs%*3bXqoN*nb z0a4%d8CZWTeJLxI|FNF=cS%d_veDEL)%0bz|h5_NHE63m<;J> z_L1Rsg3v=b`1*HC-YIYSB7Y8Iq<;f5owch>b@)QGO!o3`Rz?uYzp!}xs0{&#A&&%c zL7z%=%mmc3j59mSCG8wt!pvqun>9WDL}E#sv)UJ_(AR_$eV`iqPr`|Z{aPX#GPbt%A080_nyJ37!QI^zSXsa+f`AyB33go3)wQtUKtn~F7_)0yaXW0s z`TMlDl2`G<0*tclY?^x221lIXR#^%Ah4jd6Ax(ICdLxEO_8;vPGih;ofZL+cZnDVA zVF9`2Y8L*rJr0)h^9?U8?a!uGl)F4nZj^w za3Xh5Y0=F9QkF4IrB0Rt2BwxN{V;xUF)UQzFd!AVhrq)F zw4u+V7Q$mV0%CrCKH|fpYH~`WqmPda&{M0aP45m9EH5vqm>4>auXtS%7iCIua47O|Gnw=5%mA8c_WKKq!jf8MlqbNDz0A|29oaA#(VO<%8^^hf%Jp>oOgq%|3*JKhWFH8AHp) zfb{&)-Q%vIp*{=vOjlK4+&0LP_)GvoTt}HTr!!%Yh&^mj z`{FGY=M$`iukZ7Uu+ZuX+}lAkT?_~W;VWGDI8uC^#ICU4lM2r&JGSmpN=`La04Bnv1ZR(i^yKf+v9w+E>rzuwx3vq^6ZbDqb5c=Fb+bLg z!jff?0n2;#hYSvOQgx)d?BLUVq^6^m%3*Q4u(5>D&IqT&tl6MCH-IC^Q<#s_j;uu;^i}~9V4Z;W_XY-yEUBt4(+Ny8+Xe*COYWvAr$$Y z*by7qdY}-rgl3;5Tl$SuZsTOOI#%G#JnnB?+K=qX$-u}WRBP?UmYS(Vtqgg)%VC~{ zjOb<~_)$CxcS?GW9RkZO%HOq~0|x%mm&du+(kKHI8n`nPT(*+YOdWbPXH9zXg)Qs^ z^bQP?@EZ9_iwwVha#73Kb|Vx2l#6{|jD9wM%QZcCumJ`i?rxtE5E6GHwFY1?*eV49&Gr2;Fz{x8ogHZYthbGbd4^o_}Z&C?yYR@PTasl3Rm}?KiHbMnaoELrHv^`!f|o zWrOO-pm%uS>$w=V0*nXKo)PD$Ft8e=o*j;^9U+OR3b&uR;vm%LanQb*;m=N{nA_> z8vTSfbKX#@h)F`f#jEUb-je4sq~Y)R)Qx_!`Ib@E?Fv}f1Sd>eT3d?^jjTLBD?F_L zjgM5Amz=P0*$Rcwtvd z#&E#0K8NT7+MR*(Sxv9GsL~HW7e)0<)xLPyBb`!D8~vl=9Kk;}ZIzb?AD=_p>+^xh z)SSgTxsxZbYXv)Vyr{&O2J2PMcARFYfUs_3X!BRP*V z@4a<+(tZ=#Ei2=o0i)#zYtvF9cku@hjH9zbVW)UgZw96nmTSUGEe5FwFr5v&q%~d_ zn`s8R>I43XggE^B`1b~!YrG+mj>G$)Q3#nKGoaXJ`vCYEQsNDP9nxwhGq;Ke1f6HF_5#jc z)A3L)Z$5y?>Xx z18l)blUNWh$YJmeh}@q`gsCuNmX68aIB`v{DJjJ#vFc-O`R3}`4}#-Hm)p&zmg~>W zpj>e1aa1)EnHi;MztYeKg=Fj&MtNZfdGlXENI zVmvmR6XV$o_Nu^SFLXQt13lyLm|_bI?vgDJ-Ttuk$+8H+6Csyv61UB5r@UR==dZ>K zFC!T=6}PvluWTFrG56?f)$N*61So0sWYd_1b1nj2$X7srt24d>Cf66EQSVIWK+~ z+aQJk~0KbPO(1*Lb1^knQg!xLbu{ z$!zQAK6{l-7JKy|auC;0=*BYIDAj-?9p2ibQ(8LL9F$&#z_)shg^3@lzj;!U=aA^p zksvF;=##uy=s*{vyC|-Rgj&1(!jHb1f1CcKj8Q3!re@gAAV)LtQZK)5eR2YSi{u&6 z5nsqC#$=)?d8y0hMowhRA^I`jZ8gkp053sjpyB5&=DP$*V7yJDT){skk|9Cu!?$qQ zd0dA=8q30RG*|-nKRmQz#CVPI-NOxvbf+S(sF8a0B{UClWpZ*HV^77i_8(Z@@n+f? z`WU^4!R=jeJ>SEhoT8^EnX5DOE98P-6?DvJS_Z@c08f^3l@D> z><=^WYU@~b8G&ZV*Bkq=$%AR*o`Sh6$o8v!WGM;;u#X%S8bbZAY<=foora+3IG_(rN0+m4&Fu}d!<)+ds z5~!y!adEGK!Ra%jqi8d5I6)Vma4?zhouTt{C{#T_63pUTX}@AQqA zzup&QdvoGvm}e;KGXANLvzqI#(pu?mSHOhI&l`?~iv0U+GQ$69>#L)xde^NtutB;@ zknZl5lr9M=>FyBea?>p(4bt5p-7SrDcSuNgehYu+obTK_?)rzpfW6k*Z$8gE=QAfK zIsO}T(+<6E?pRCBG1-H?cY`7bp?&(4_LAApblR4YvHMoHKS=TLhOh6& zxw@^Y@8?VXkzl@d2%Bpp)sWFqNuhANsj)<9rq67{3RIauUew#V|6waqq^eBel7bb@ zEssI7a4bG7Wur`UUH(1gFuJI~yXU{aAn8CW{Fm8&cGP_I|@&j-NoD zxx_UiB9xZg{#*(D5e_s{o-te-rf*jfy$w61!Lz^4;~U8h=$K19TI;Ff2|8ZT zW$$~KYtx?{g0GQvt{YrW3xO`rhf`2c0E*mVVgSM<^HWJM0kV0c(;lV*rs!Q>Op)Is z9ZXIb;HNO9LlG(6sZ~T*R75yv(Is6qIeS7oq@bltTVu@rQa+fw)npYZ8E43dSKRdl zboc?Uy=H@c6G#()$%@d`BkaU#2fuUI5dcOddRc@3dztZZrAW!{9Z-i;)?cE-{QkJ8 zt*xz!O04=p8b+xH0A2#aXm>dI-R7H|%CwyRZ_ zw~tF1M~V6WYC~XV@QQR~!GQ4jCfCP1d3_a5Io3TyfcGxyEF9b~{6v-bN>xP)QpsUz zkjDC3w}1jLIolckE*4eyQmbbG4X9>7t-K-Wc4zsEiW;Q&|M^iRBkWT}ebD0qR1Q_2 zGa!7?b5n?Et>r(^FF&yI5qV8!=OR;f znKL@PFco;qkA$iNNzI(l>7k84=V{I!r`&S1#oYQ>m;7NKE|tA{Eev%<$Wt(Oe`dRv zc39cgIbexDGdZky4GljX8Yr5yh@23xE*NxMcW!Lj>V5O_!Ve%WU&uwB$T)CT09+7> zTEOM2<;-~dw;JUeELMA#X}qi+Cd*uTOGym6ICEN^0fY?G9VZ>Q*02}R^wQF#gy2CF z)+QUB@3oKW#b0w9bU3t;TW3-}Z-ZsMXPPZO@KeJ?McYS`uQ{Hm z0iNQ+X64a9z7MJt7+f~PTL57rp1gd{dcxfrVNU;yLq4i@^;1W)Og zB^dsO8br;omfC>}y9&lhRaK$q{v3VBqw^-xAwsl$ zGvx4FSrTR&0${(TnH~4tj0dM&Q!iyS<5AKS@xsp6 zin^nV-DCRxuhBPZD4KuxLyE)I=T@x3wQ)5*F|DP7l*Xh;;wRA8DC<|hE5757SmN=8 z;ew(U#e_1*{t(2M2VPr;dWpXyUc9!yk^jggx~+W#*7a=rFCA4$w9riQ$G1zN+N9%DrCfw;E@Ze9lLTcyB; z6#j*Ktg6H1aI-ZiJupTjA%oR6-3m4U*xIeEjrOT;Vx z;EsTsmmp=&Y}~8q6DBEg_J`rsL$(qi7K9EkjFy*{fHTVcVWjuP_K@LGTzh-_vKb=1 zeSM4G-wTlhzzHT+!`Jrqj#dHtxM*tfvnHcY%eb3b)4EO}Qu6oJgw?mSUT0 zqS`lX5s6zX9YI{3l#cuju??I1kI*`IE4nkA>-?04<=BzZ{7X~=7}WWkTy@w%`JY3i zn5=r5!rY8D45h^xKLshJ^-_o1W9`mGOuF#DeIS?!d$SQ5BBPjKBNo1j?Sq_Kx3uVs z5w$Fv`-6xkwF^y-z!<}s-Zn)JtCp@jJT6`m9+dM{v7!c-&Q^)uKkCSQOL@ozTlEB| z;KMR?YhNd?rj2%Yw}TU!UwYfOpkQga_b-ON@d+~~xmdUJiiX5e6yM})N`FL{6j>%q zWwaKw@XDDlG4E!)Z@*g3X3Te>+J#ptGA;1<(e>-iG-*4kI`0(pT!c8FW;Go8S9C_m z>EEI=X`{%fD7W|S!QlJ%$%*xe!M$SUujCP5vbj+}eZ1oX!#tXS91QWgrr0S=r`-4T zlFA);8)Aekova@Xux(Jv=+YyaLh{YQthbN<;Fd z8T+}}QdL5>g0^Zs8Ri|uWayf?b0!FTwPxt*HmhJ_X>U=P2pNu+DY2!DW#(&B%v#gM zgJ=ctzzH!74DQL;awCLQwZe8Ls+h$+jy71H4jBoUS-i*sNJg$@HvM!0M5u-+@zms% z!1Q(1%A0SagRZs@t{M8?@@Y4JOE-0X0Vj1fbLH#2d@^}GV}ruBYiAMK@V5Y)XAPlR z5xM9E=uDlk_(+J7=+Cae*+VmWo=rw<0}LE62Mpa`1?f)LbU;DcC3vA2*%*^AZ4=D<&=6ciCa(zsFZ z^FxDQ^CeJ3=hrOXsY9z{z*g*3r!$3ol?9PF*du(S_%}j&=`cm#vRAo|!mu(&a^Gdv z6e+xJO={PES9-qnl`8ZHI1)>; zPyL|{Sg5p~vn?kY5Y^W*7ZUo#7%98oT zU>gVecqEAoh#OopAAz9_eQPNIqB}&nkA=4@`%)b0MX3%eVBphl(w(;1E9_^aR=t*} z`P-8dPFQ2Ol2`*DDYyu|sQxL1->1;sX151779yt{IgCv?c9gWqm=SQ8n|3x(qp!m# zDl=Ve;(ot@&N4dR(N(FM=9a)|NebImTqhM0LpOLa3+S=FAYsv2Ivrc!Cx7U1F;Pb2UM8UiZ zoCLcJ!<>i$ejo}6K=iEh^S>nh3}SDoLmH3kt&ObEeDvftv7+zZqt5h~H6G&=cCA)j zK5IX=3C3dIKH4jj43wznIO*+UUjys;<~|~zqaQYM9TuSK!`yX(Ug{R2A{ z>q8roYI3exNnEM8Ps<1kJ9hNenfsiZNVXn&*!q^5Kw~#Jj2}J~7i928W=H^z1~s4T z|IATqkh<^M-wqO92|wVSe)WFTZr`$fvK=K@TYkbB%HR+28)SknfFphy5}iu4yG_rw{gMMj)dI07>kp4ydT6f89+o2m2Rd+yKo3O>>q!c=ka5z$tmXq|vR zbrucm303Gu3&00-3(CTyA=k=a3Ze568Gy}FL&^=(snN8AppiFhfS?b&6f5uR!pPkn zCKm@%mD3b9mS0m-)zodkdr9gTZAF1q80JU0C1Ol$XveN9eq{#nd?M$PH9yue;GpEQ z_<6%CQ0CtsH_W$JlZ=FhTfu-|#UnfgU;Cw>me@-QiB$My@1+SRB`SDu!k!s7BbOOw zei9S)iUFkuV%htGdvEC@KF_w!5ka4FTI88jO4_|NbPjyosCoLsB3vK1lxD6~lJ_;F zTZWJ)tnM;UM_F&;n7h1qsU?UozX2AR2H2XZTx>(urx9{t0T`Da(Uk}|ip_sGIZgEJ zwy9U2QjvU6=Wn?-3|JE&Rgya7Lf@#A4N~q!+;38`tiEYN3`}L@bwF}~%ghc$h`fzg z(|Bvh^;F%DSFvFCWnk!ggVE_mzm(-l;i+21_*3tC=veLttezf&44KP}S-od=w!<&B zDCd1SX;YCVJ5sA*-f43W?OyHEicg&_`bQ>5U#f0gXBp}pfc0oBL(+7v^xi7tiyW(7 zN8}eDq>;hMVt-vHCSyyl8BhM;q!#ZT65tDzsW#X@M2tvG*=2qCtHaXECsbn)oa`1h*Qw|s9YVD z+mxZST!xM3UnHt*>q!B%#g(*&K#J_RZFOaFOa;-CP#rq3ZHP6NXGx;RWW54e9!{UX zxJ1`t300oBZd+?pb+(w-MS6ulIzoaD&QuT}<0p!3is4K;&|O_(n+kslk{I~Gx|(B~ zppv?zV_QH`AH+C=h2cy+7+uCp08^fK;u1pe!{gmn9~}`YUL5C7GAqqA8d=-|InM-J z2dn6d<{T*=^)n5^jYTAIe?UlXq(B_cWXrN&Jct{=qaHsxO}8Y{G=&{k`Qe^U}JH&h* znPyiZ-E7y7b|}+Om6A^dp-2!Ifz{$xAv~n%q@;`rLnN%ihi7&{*vzS}&auszhZF%i zhwfuyypJN09NDEA6``VmGU6al6}MZTpyhQuI;6QKmd`Nn1fTAnlE%>HEMD7mv_?lC zP8}lCaR=ohGJz;wh5j+3{0bdn{?6|MVaKe8Hy^XO6#^Nt@_`u42D2r7d2y*dK99@% zQloh)yHRE99sC<|MIp(Cpqvw2WVAz4L!$_B1j;g;-3gW(RrvpE;0!318k=-f^C zLAX9T^^N7RM7mxnBCcVY+W?7&5&_t>OMxPNFd-` zn9$Eh1SOguc-Q2i*I`E1hlIbx%U2_!H`w>UCfvVx-&ntPB{S4eo~w1`CZ^k(Qz347 z%&n?QpfWr%+rKu6XzbqJ?F6ygUlge+5Xfe-3bP$_SSwp(o0;8Fa0k9?xjT|1*!@|h z(!Sd=cjXgiQ%nVj2{>C~ojz^S(LFOljYP&WX0}eq&<;}g9U9tZApM@{c>pPOHE}z? zlv4c$I9F0ton!LIBG(@#yI6y{$DIE&6bZ$)0R!*R`ZG{!0oO)fgaYxU-W=EMNF5Rifehltv~MJ5 z!@k86yl(x@!R!!H#9A+s@v0A6y5&n+rxbGA7w(aVL9DZ`7WvobS8DH*NEQOI(1gR) zm~PUb5r5AdZKw>Bq)bZtb|1g(vC&s>dKH%}bI^r;e2bJ1b$RK0*pAFWqi7i}1cWS< z*L1~pS#941cr%w8$Xle|EjDqRAz@Pq2HG571qVbD=xJm5zh@W+{7XRwnB;tHz)x0* z*B7Xv3a!bKlJF~J!hob%r=+|Y<)7&!Em1*=sP89Vc;up3W@*KqNuA~;wzslT060|z zatRGNkH~Ym0Ppzy;nm1c3npVbpw1OeZh#R8;LaE+49MIKO1870B3R7P@($>$F=f{*>=x{(Z{_ zjC@5z%S&DQ<$&cP7h=1-yJB#3&*upt=Z3qy!7XxLbEj$#ss<)NtlL~6_7_Ls+}Yr6 zeP@Te*z-&_GRmcW6Ml{tklz&hN1x^fnr6g6Ut@?WmRD?ILW}NW!EBW>GD@5(!WHsU z%$w14QU?Pm$eIpe5|V~2Dqhk^X}GAa3ob*(K~1$Tc|lD9C9>iT2JK?B^(eDSnQGF4 zL$y$+4#oBBXu6#D?^H_Zo@WiYdgOQRhW0$jIbBcaAogq3tW znRJ`69Zs85MXEh>grIyhfIUBH!Fk~d>7JZCpP-t3>pD2Gv~+lIAV)zi*}VEm+;R{Y zLV9|No*!gh)L!(l5gWRAeA(U5+Iho^Q7S*Mv@wcg+Q6KuXAaT3?DPoP=XSK&^g80% zu+-q;vMb(V7})a|EHgWNL{m>^TS%1pN^+L{Ed5LP$NhbG^Gpg(g<_9vz_jV!4KlPV zvSD>jm7qFN&z-U7-5342lb;np2^&S|WU{}z@Z9U}@QV)d^+Aasz(EI_G-FPkh6oIl z57@ZxO-s!PiEOGu1NaOI%Hw6l7b-b0P`C{EXlFcK6xi9>ZRiIB5Wwf%Q3(l&z<_{; z8493=YKog{YoyhyH{F7D$WZamy66VrnD z7^elU+3-tglOjQHGV-@S$7aL(v`&&i-CC_f{a%%w*3mLHDIb?@pmBL^$L?<`O-!Cb6rCs<9AMzNu=&``*Ct>BAH_?d{mR zAtiTWfAPn+fK_TpRRQ(5oDNPkdL#@{DE8t$=evlAl#bKm#1B6cSy)uCeqtwGSV61n ztd@UCh&zv=jM7EJP zk;{2JK$shls~7%#`>tYE-y2Y+Z1~1d(K2DcI_KUXs`cadhtBnHfbh9!>#;Lv?Z0$4 za!{r*)}nh_GlZ;>Tv?$)PpuA(khMH-YLFQ%_iV}{TC#1JwKC%SgM(3=zjU;_3B!XV z+Ff`A2}HcWC;WafS(Be_jZ~qF#ih0H(GMy?p5)^d-dAKh@zc4gJ6gN|munMV6KhT^ z0f^v;S<7GRccgS68Yz$-s_jI`e~Kt1YV0ihPA56C038sci3PA!zCQ2oMMY96YGKI>nxGNMTlM`+F<5xP&;MSk z!6{warLU@ux3_z>KUz#g7|~w3QXCmM#JGMktm(!tvEJ z8Pp?%*+}3TBD*ZcypF(;oeplUgLwRJLL%VG@bzC}W*`Hv&L&Vyqd>cYEufu-ayZf` zZMFU9M62897t(RUY?3XN^(@(J4$L>R+#c4ZXo)(aOaIsRwXm#zN!gX)zvyLVA@$84 zd*buUbAP-R>cj9~7Jh#Iot7_x*sP(27{{}lf2>_n363>@ujD#~1rjJoCMX zMI?m?#fmsUto$z}>YK-pD1h9htvcB&JvgVYN1V6My~nJr-4XQEk;HHuq&fy-eS!c4 z%9pD{Q@PGpK-6G(gloTg#<6)Pjns-6{p}V)AlqD%UPdeT2;Dhl+!KjTaPvhY@D!L{03&7a_g7eO;xMJrf}J3Wu5sAg+wyV=pKZ zN2DZ^HyFVWENnRKzf=AJX=t86_Gz1pG;CmPIiRsd8-1|+Vt}j@BHiFnL>HPqodoMR2He}z;#Nc7Xgu-Z{w`p_%p}L&5Ao{ z!QS$V2}~SiC4*zRr@tiGcZMIT4m6=$-d4-???jBkOI2CEu#*AmI26Dl1VvDFD`DBt z^T%q0daqe~rhMVNsqlODvPdaG$j2e^{vi7f5(h~k{gmp9*r2(zI>=i=hcCwkB_Qcf zN|b1`Xr{T_V%D99UK?2U9TbU^mx^p$DEf)$1)KsUt-TE1d@>3EDO?j12QYUE4J>)~ zRq$V%fPBmxzvJXk$bhC1d#OH+^m6iM83idmGTh{ht)CVgTvR;Vzi283Z~sGp`HyXa z!JFh^W@LrM1S&_yMd}3CUcPJ?Byj8iHAB5p?7KK+4+MHDD~S&>AA=3X3Gw4(MDK82 zX|1p>sjU$4$lWQ$`^4nJwbuw8SSiJJnl6Jdb6C-Ab}QpC7&vpw!atI4VzH+W82R%G z7X+|S(f8oy%rSDkjAUS*Z2vnH`xg_C@@1CF%W^>_^u+wOU zNborMrX>9#_RZB4w6#ga6f~yJXZb?pA%4|SbI5%S)AC?gvc-;WPI`IgqG zL_z6!0GH(D%7-}(wf>oYnru1uoP=sC@$nW z^?hVLON`D{M861@QmA70b3h&X;Zt+8X^rrhk!F43&!I!OM$-7rCePcxxpOS`T3d8f zrk{!m)6wt^a9@nNU$piw-Qfda4F`ttm30^F$~?-c7%&5o`4J+j(s&5M^yIK>i1FK<@`{C2^7S2bLK$@JbtURzsR7M&~4 zbmi&wH5!`6n za%h=eJG;st=+@R&Z*RAQF`<{DB+H*bO#FYq4liICh2a9w(2zgtu*R;P{3`|`u@yhn z^*So;SUj;It|bL^u$^RCj+QA3@T42I|H;$r~){x!2L z+yDu7TCY-3{Kj;~S94lc055LX{%N{;?^R5Dv)~&iuzDt}`^DY3ls){&%B*-CwuO~d z*w?RLBO<^=zBqcnF;)nPH=sZcC_bGSxMehm5PQIjhE#rkmsqij(-uo-wQBbmmdE1; zEQDals{m!6&$0-OnF~weDKGQYV9I`)x7_SA^6C$TjTN-(F@DwPqUQK!b5Q8egK6N# zQ!X$lN1`d$5UHqUMv?e{mnDrr3Z~Q$S{SH~dYL2!J%<9n9?yG4IicrHexqbb5#C#h z`<9oNuK}huP`N->@fVKDO^UB7u1imGr|3`j9co4MDyq=zyHV`O3rx zq16jLexq;qIyvjT%FD0FuP70O5DHv-kCm_TvJ1S~rguMXi4 z(GSaP|2QAoiIg}mc(~lHZErj8VJu==3AejyLb8=sIVYyN%e&*^73@`InJ@O!8d4D|~4I;o$Rt-myff#0n zhi8)!iYTzs8+=mZr5q!;oIK$)y_f=1XjuW96~tRaVGUggE8@+|&SlUG3~|>-lRurw z!hg^rL=6Et>i(DxA`;TY)#v?#aEV5vTli`^u{e ziI*E9zwA)=K#D|`NsZ6<@=He;VA=_6Q(}MikPyy|y;=&srOt&FPjcjJPlG>S{yI8Z zQy4&ig9}njA(T{8038EGWuP?=mx^DAjBdrT)W-A~A2W4pQYF!Clr3Y5(DcAir;ZW0 z7Rd#RDNQuD%~Fr;<#YCNY$ zJ9FCQvguSwO35`V`7CL4iGPR;m$Qw(Y~Av1aINo*RPFNtR#zX|OPc`R>?YSKT+MOZ z#5eyHD_g1L(Iq$OBhU!{*E$Zcd|PI?A&`M4zk0@#`z z!sGy4nnoh@~=U;hoEd!&W58j`L_TgdWu1&*x zz14lAuexLi)Yim(+OknabdeysL3xm*HH(iQKUyda$}Q>_kb#n#-d0~h0S;qyQvY7A zj1jFVI#&E>3Hybv=(!!)4!Vp(uiA@0eos@NaGaW%Vb-jKNb0}|n4YG`lz!<-m+84C zO&#Q?Da|#_MUvFT-asB$P!qcRK;`nDRCj!^zyZt?I>AGOud@$d+5;*i`US4#0!uwDdR!#=P+95vfJmE-yEm0jSs~k2_ zN!i)MjMFE)tgy&7tt86D)%DMjv-Wl{Ni7X?y9;ilaWtzwPPB`Z7-?ilcG-u@5 z_Ia5w0q~t^-x}6m@!5`2EJQeI^xqETLXNA;d&>gTI}+$x!N|$cbeJtT?{NhZW46|T ztbIV}Tbe?lWn!{Nifhh___j5L!dM#STcyqulDg51RjXdQI{G!>*rEXuNx%x4ac)<8 z;Qqr*BHo!6l_;t@SW^SbupSnVEo%yFj*6oJyX3=k?yTi3Fp3CNyWi3#5^KUsH@M8q zSGaMBYCF%j^OiuBhbiH+9ayPgGT=!M$%|~D`9yD7J$B*)3;g&?9J=Nh>m&7kt|r6@ z44+1$NM@?b+^%Smd(b_iD=k4+;^MgX(h!DKN_436;$&(T0Q=v-uk)T7A9tw{rY8B4 z%z&Pu_xb7h>WC%3?BFZRO>dup$}O}QN+=3K_d`{Q`ZsklPwB+M^)B%kvDkWBj1+9j z4GRL@M0r(`Cd(+@#B90%x|IB@D$HovDwR!6+r%FjCVO+SMkxj}=*$Ed2K|Lt*o%kX zKabT`RO#AuK>i#{X*i5F&i2RViKk_Z9Y1VE_=f~~M=)!xU}3QNCH*9W-=B3H<;g}B zH(-NaP&Zq#acNF3DGF_!i(2o5U2NtOq|<%Enl0D8SIY%Pxj;JI9Wr;Y{b3)v>)O_7 zU0lC@t)sExHVC@<@LCJZzTz^`#M+~N9{{))5an$aCw}Al5i<_)ZKK4dKv%E{f?K&f z1#WS6;m7(A|?Nqk*f%ss^;H;2GN=B;g!TzMhO^ZXB!RFHe-nB;0zfkrDj?h0A`9IpQ- z%pa_acYv>w9vU;}!eIqf+kX9GKp8xygO0KBW(%nq329J{81uKk)MiRTb03CDmKO` zqQB&=z%p&iv9wxpE@+nS%*w+R1ALKjzR^+kQXAaiw8gzlIZxMP8I>DSBNh-<8krV? zcwVx+$iyq7L~a9BwFUm|cot8o(Lclm-eMNnP|)1dJ2i_}aS~rPlA&Bu|A;1jM)Cu{ zDVW^*sI7glzrSUtsv5^{RmpJ*2V*Vc2BSS47cV?kgNkvAzf3pI;}EEGI!F>Ssk-EM zV0?$%XxGrSh%tfC_0KV0<>T3IpU}Qfx^ryD87ej0E6+VM-=74pvIL5vG1Ym05$Zi3gMJv0&Ay{2s*K_KwGW53ierHz@lh(qMMeEeDd$%jzjJYU`O#dJ zaWEQ*Ss8gRCweG7>xD66JwJc-@Q!73Bx6P@hN0WL_=s0WcWkjtQ($xDU5PU zIMhto`@3)&bj|y!(m=FVAZ`s2{g&rmk}5@&Z!P`^mY0egsPO9%Euse5^?xK{6;9q3 zLD1vQQEq*e?4XB8;g$0pzvn~^>=FezqHlbn_Jc=iQ@Snh!f$sWK`e2$NO%>}|ZCgAzK< z4R#MYsS0fSHEv@G`}egky6kkXch7o#FY^*{-bF%#0a&WJ&QRIpq^GRuXoQ`SN~OL@kvEFhFEl+_1LKL{=D&sWyk)>>$8Bu(wy;<>yr{m}P3$*y6bq40{lB{u& zh0}X~wB_frQd-kT+LEW&E01SF*1e}^a$_~P+jkxWFFg>!bvyN}egDmSs=KVTl8kf@ ze*tgs<~!E*DhWmO?c^no>z?uHMfcp5GWr zKSQrNAHIHme6J^(M0(x@&M6;gg~zhN40s8&NOj5NLD7LT7}UJivj>U98l@Hk#SJBQ z1NI+F;ju{NqgCLsN->G3$A?Eos(`9LkVx!rEpSgUH%P=!%pA)CPcTaIi5U$#S5fPo z_FW%*U67fVmlO`{OH>bnFizYZ2(!d%=1LybbCi$4ZHa>BBnezil$Boo41zG7%m1oz z?CVqs-R^I1Aw`4k;1>HkmuD*Us)|uS(V5R)w?!_$y7@tsFcx+zEqe~UnlB}A226)w zzru5P&G5R@Sy&L|?-D}q#??`2l=S1%Wi*x{|7gL4M3^TLbd8O~i_oeuW>d$jKZ_cw zs-I6cdM73tXsBLNo`9deAQ^9O@8LQ?r{44Gu+{TgX%9rYXp>8tJ$ii;ta|+ABvCkP zLXb?tk6U4mSO>^=(7~w7P*q_Dv3cXf- zVc{rND3Q8(=_C<9zmV9xyzMpF{6GZGl(dJpL=*yN^>Cv|n=PoENU z`W>BITwF{~M;BxNvI+KZ2nZagFEu$^o0*weTFMYeC4oqhY$@fVg?X<0vxL1iZr}}} hA(3+yNoxmt&oEFIMQYmx1ABiTE} [!IMPORTANT] > _Latest versions of the library are not available on Nuget․org due to false-positive malware detection. We are working with Nuget/ESET teams to resolve this issue._ -In the mean time, latest versions are available on our [special nuget feed](https://nuget.voids.site/packages/Telegram.Bot): `https://nuget.voids.site/v3/index.json` +In the mean time, latest versions are available on our [special nuget source](https://dev.azure.com/tgbots/Telegram.Bot/_artifacts/feed/release/NuGet/Telegram.Bot): +`https://pkgs.dev.azure.com/tgbots/Telegram.Bot/_packaging/release/nuget/v3/index.json` See the screenshots below to configure the Package source in Visual Studio: ![In Visual Studio](1/docs/NugetPackageManager.png) and make sure to follow the [Migration Guide for v21.*](migrate/Version-21.x.md) if you have existing bot code. -Alternatively you can use command line: `dotnet nuget add source https://nuget.voids.site/v3/index.json` +Alternatively you can use command line: +``` +dotnet nuget add source "https://pkgs.dev.azure.com/tgbots/Telegram.Bot/_packaging/release/nuget/v3/index.json" -n Telegram.Bot +``` Or set up a `nuget.config` file at the root of your project/solution: ```xml - + ``` @@ -41,7 +45,7 @@ This book is filled with ready-to-use snippets of code, but you can also find fu |Visit our|URL| |--|--| -|Nuget feed|| +|Nuget feed|| |Github repo|| |Examples repo|| |Telegram news channel|| From 25a033605f237167dcf704169d341b90f1b45fd0 Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:38:01 +0200 Subject: [PATCH 71/74] updated webapps.md --- src/4/webapps.md | 25 +++++++++++++++++++++++++ src/migrate/Version-21.x.md | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/4/webapps.md b/src/4/webapps.md index dc4be65..3481ba9 100644 --- a/src/4/webapps.md +++ b/src/4/webapps.md @@ -1,6 +1,7 @@ # Telegram Mini Apps [![Mini App bot API](https://img.shields.io/badge/Bot_API_Doc-Mini_Apps-blue.svg?style=flat-square)](https://core.telegram.org/bots/webapps) +[![MiniApp example project](https://img.shields.io/badge/Examples-MiniApp-green?style=flat-square)](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/MiniApp) If standard Telegram Bot features aren't enough to fit your needs, you may want to consider building a [Mini App](https://core.telegram.org/bots/webapps) instead. @@ -8,6 +9,14 @@ you may want to consider building a [Mini App](https://core.telegram.org/bots/we This take the form of an integrated browser window showing directly web pages from your bot WebApp, so you have more control with HTML/JS to display the interface you like. + + +Check our [full example project](https://github.com/TelegramBots/Telegram.Bot.Examples/tree/master/MiniApp) based on Razor pages, and including a clone of the above [@DurgerKingBot](https://t.me/DurgerKingBot) and more demo to test features. + +## Starting Mini-Apps + Mini Apps can be launched from various ways: - [Keyboard Buttons](../2/reply-markup.md#custom-keyboards): `KeyboardButton.WithWebApp` - [Inline Buttons](../2/reply-markup.md#inline-keyboards): `InlineKeyboardButton.WithWebApp` @@ -15,4 +24,20 @@ Mini Apps can be launched from various ways: - Inline-mode results with a "Switch to Mini App" button: `AnswerInlineQueryAsync` with parameter `InlineQueryResultsButton.WebApp` - Direct link like https://t.me/botusername/appname?startapp=command +## Integration +Your web pages must include this script in the `` part: +```html + +``` + +Your Javascript can then access a [Telegram.WebApp](https://core.telegram.org/bots/webapps#initializing-mini-apps) object supporting many [properties and methods](https://core.telegram.org/bots/webapps#initializing-mini-apps), as well as [event handlers](https://core.telegram.org/bots/webapps#events-available-for-mini-apps). + +In particular, you may want to use your Telegram.Bot backend to validate the authenticity of `Telegram.WebApp.initData`. + +This can be done using our `AuthHelpers.ParseValidateData` method and the bot token, to make sure the requests come from Telegram and obtain information about Telegram user and context. + +## For more details + To read more about Mini Apps, see + +Visit our example project: \ No newline at end of file diff --git a/src/migrate/Version-21.x.md b/src/migrate/Version-21.x.md index 1ab06b6..85110f0 100644 --- a/src/migrate/Version-21.x.md +++ b/src/migrate/Version-21.x.md @@ -3,7 +3,7 @@ Important notes: - Don't bother about version 20, migrate directly to version 21.* - You won't find this version on Nuget: [See this guide to install it in your programs](https://telegrambots.github.io/book/index.html#-installation). -- Version 21.8 supports [Bot API 7.8](https://core.telegram.org/bots/api-changelog) _(including [Telegram Stars payments](../4/payments.md))_ +- Version 21.10 supports [Bot API 7.9](https://core.telegram.org/bots/api#august-14-2024) _(including [Telegram Stars payments](../4/payments.md))_ - Library is now based on System.Text.Json and doesn't depend on NewtonsoftJson anymore. _([See below](#webhooks-with-systemtextjson))_ ## Renamed parameter _replyToMessageId:_ → _replyParameters:_ From 5b67a2143c4539c793b6eb8ab80c6b2dc1946699 Mon Sep 17 00:00:00 2001 From: Lucas Maximiliano Marino Date: Tue, 27 Aug 2024 17:14:32 +0200 Subject: [PATCH 72/74] docs: add question number 28 This information is not easily available unless you debug, search for issues (even in other frameworks!) or read lots of messages in the telegram group chat. --- src/FAQ.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/FAQ.md b/src/FAQ.md index a28b8dd..7a92d1f 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -146,6 +146,13 @@ await bot.SendVideoAsync(chatId2, fileId, ...); ``` For photos, use `sent.Photo[^1].FileId` +### _28. Why are my updates being processed sequentially when I'm using webhooks?_ +Telegram servers send updates to your webhook sequentially, one at a time. They will not send the next update until you have acknowledged the current one. To acknowledge an update, you must respond with an HTTP Status Code 200. + +Telegram not pushing updates concurrently means that even if you're using webhooks with ASP.NET Core, you won't be able to leverage ASP.NET Core's built-in concurrency features. + +For most use cases and lightweight bots, this sequential processing should not pose a problem. However, if your bot handles long-running processes for some or all updates, it may be beneficial to implement an internal queue using [Channels](https://learn.microsoft.com/en-us/dotnet/core/extensions/channels) or a queue implementation such as `Queue` or `ConcurrentQueue`. + ### This FAQ doesn't have my question on it From f9a5279da4c6f4097fcb4d8267fcbf7904e96faa Mon Sep 17 00:00:00 2001 From: Lucas Maximiliano Marino Date: Tue, 27 Aug 2024 17:15:33 +0200 Subject: [PATCH 73/74] docs: add bit about contributing back We should encourage other people to share their findings! --- src/FAQ.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/FAQ.md b/src/FAQ.md index 7a92d1f..f87e611 100644 --- a/src/FAQ.md +++ b/src/FAQ.md @@ -156,4 +156,6 @@ For most use cases and lightweight bots, this sequential processing should not p ### This FAQ doesn't have my question on it -Feel free to [join our Telegram group](https://t.me/joinchat/B35YY0QbLfd034CFnvCtCA) and ask your question there +Feel free to [join our Telegram group](https://t.me/joinchat/B35YY0QbLfd034CFnvCtCA) and ask your question there. + +Consider contributing to this FAQ or any other part of the documentation if your question may be of interest for others. \ No newline at end of file From fb4eaeea04d829abddd1fea347815ad74d43c5af Mon Sep 17 00:00:00 2001 From: Lucas Maximiliano Marino Date: Tue, 27 Aug 2024 17:20:05 +0200 Subject: [PATCH 74/74] docs: update webhook documentation with link to question 28 in common issues --- src/3/updates/webhook.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/3/updates/webhook.md b/src/3/updates/webhook.md index 2c5eb27..d1b8436 100644 --- a/src/3/updates/webhook.md +++ b/src/3/updates/webhook.md @@ -104,3 +104,5 @@ Telegram will consider it a temporary failure and will RESEND the same update a - Have a service like [cron-job.org](https://cron-job.org/) ping your webapp every 5 minutes to keep it active. _(host will likely still recycle your app after a few days)_ - Host your app on a VPS machine rather than a webapp host. +- Updates are arriving sequentially, is this behaviour correct? + - Check question [Question 28 in the FAQ](../../FAQ.md#28-why-are-my-updates-being-processed-sequentially-when-im-using-webhooks). \ No newline at end of file