Improve punctuation.
This commit is contained in:
parent
8b763bedaf
commit
903d994799
@ -1435,7 +1435,7 @@ Changes in 1.2.0 (20 Mar 2018):
|
|||||||
See [using in .NET projects](README.md#using-dotnet) for more details.
|
See [using in .NET projects](README.md#using-dotnet) for more details.
|
||||||
* Added a C# example. See [README](example/csharp/README.md) for build and usage instructions.
|
* Added a C# example. See [README](example/csharp/README.md) for build and usage instructions.
|
||||||
* Added a build and usage example of TDLib SDK for Universal Windows Platform. See [README](example/uwp/README.md)
|
* Added a build and usage example of TDLib SDK for Universal Windows Platform. See [README](example/uwp/README.md)
|
||||||
for detailed build and usage instructions. Also see [Unigram](https://github.com/UnigramDev/Unigram), which is
|
for detailed build and usage instructions. Also, see [Unigram](https://github.com/UnigramDev/Unigram), which is
|
||||||
a full-featured client rewritten from scratch using TDLib SDK for Universal Windows Platform in less than 2 months.
|
a full-featured client rewritten from scratch using TDLib SDK for Universal Windows Platform in less than 2 months.
|
||||||
* Added a Swift example. See [README](example/swift/README.md) for build and usage instructions.
|
* Added a Swift example. See [README](example/swift/README.md) for build and usage instructions.
|
||||||
* Added an example of building TDLib for iOS, watchOS, tvOS, and also macOS. See [README](example/ios/README.md) for
|
* Added an example of building TDLib for iOS, watchOS, tvOS, and also macOS. See [README](example/ios/README.md) for
|
||||||
|
@ -80,7 +80,7 @@ function(get_git_head_revision _refspecvar _hashvar)
|
|||||||
# The following git command will return a non empty string that
|
# The following git command will return a non empty string that
|
||||||
# points to the super project working tree if the current
|
# points to the super project working tree if the current
|
||||||
# source dir is inside a git submodule.
|
# source dir is inside a git submodule.
|
||||||
# Otherwise the command will return an empty string.
|
# Otherwise, the command will return an empty string.
|
||||||
#
|
#
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND "${GIT_EXECUTABLE}" rev-parse --show-superproject-working-tree
|
COMMAND "${GIT_EXECUTABLE}" rev-parse --show-superproject-working-tree
|
||||||
|
@ -19,7 +19,7 @@ TDLib (Telegram Database library) is a cross-platform library for building [Tele
|
|||||||
`TDLib` has many advantages. Notably `TDLib` is:
|
`TDLib` has many advantages. Notably `TDLib` is:
|
||||||
|
|
||||||
* **Cross-platform**: `TDLib` can be used on Android, iOS, Windows, macOS, Linux, FreeBSD, OpenBSD, NetBSD, illumos, Windows Phone, WebAssembly, watchOS, tvOS, Tizen, Cygwin. It should also work on other *nix systems with or without minimal effort.
|
* **Cross-platform**: `TDLib` can be used on Android, iOS, Windows, macOS, Linux, FreeBSD, OpenBSD, NetBSD, illumos, Windows Phone, WebAssembly, watchOS, tvOS, Tizen, Cygwin. It should also work on other *nix systems with or without minimal effort.
|
||||||
* **Multilanguage**: `TDLib` can be easily used with any programming language that is able to execute C functions. Additionally it already has native Java (using `JNI`) bindings and .NET (using `C++/CLI` and `C++/CX`) bindings.
|
* **Multilanguage**: `TDLib` can be easily used with any programming language that is able to execute C functions. Additionally, it already has native Java (using `JNI`) bindings and .NET (using `C++/CLI` and `C++/CX`) bindings.
|
||||||
* **Easy to use**: `TDLib` takes care of all network implementation details, encryption and local data storage.
|
* **Easy to use**: `TDLib` takes care of all network implementation details, encryption and local data storage.
|
||||||
* **High-performance**: in the [Telegram Bot API](https://core.telegram.org/bots/api), each `TDLib` instance handles more than 24000 active bots simultaneously.
|
* **High-performance**: in the [Telegram Bot API](https://core.telegram.org/bots/api), each `TDLib` instance handles more than 24000 active bots simultaneously.
|
||||||
* **Well-documented**: all `TDLib` API methods and public interfaces are fully documented.
|
* **Well-documented**: all `TDLib` API methods and public interfaces are fully documented.
|
||||||
|
@ -888,7 +888,6 @@ int main() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TD_PORT_POSIX
|
#if TD_PORT_POSIX
|
||||||
// TODO: yield makes it extremely slow. Yet some backoff may be necessary.
|
|
||||||
// td::bench(RingBenchmark<SemQueue>());
|
// td::bench(RingBenchmark<SemQueue>());
|
||||||
// td::bench(RingBenchmark<td::PollQueue<qvalue_t>>());
|
// td::bench(RingBenchmark<td::PollQueue<qvalue_t>>());
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ This directory contains basic examples of TDLib usage from different programming
|
|||||||
If you are looking for documentation of all available TDLib methods, see the [td_api.tl](https://github.com/tdlib/td/blob/master/td/generate/scheme/td_api.tl) scheme or the
|
If you are looking for documentation of all available TDLib methods, see the [td_api.tl](https://github.com/tdlib/td/blob/master/td/generate/scheme/td_api.tl) scheme or the
|
||||||
automatically generated [HTML documentation](https://core.telegram.org/tdlib/docs/td__api_8h.html) for a list of all available TDLib
|
automatically generated [HTML documentation](https://core.telegram.org/tdlib/docs/td__api_8h.html) for a list of all available TDLib
|
||||||
[methods](https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1_function.html) and [classes](https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1_object.html).
|
[methods](https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1_function.html) and [classes](https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1_object.html).
|
||||||
Also take a look at our [Getting Started](https://core.telegram.org/tdlib/getting-started) tutorial for a description of basic TDLib concepts.
|
Also, take a look at our [Getting Started](https://core.telegram.org/tdlib/getting-started) tutorial for a description of basic TDLib concepts.
|
||||||
|
|
||||||
TDLib can be easily used from almost any programming language on any platform. See a [TDLib build instructions generator](https://tdlib.github.io/td/build.html) for detailed instructions on how to build TDLib.
|
TDLib can be easily used from almost any programming language on any platform. See a [TDLib build instructions generator](https://tdlib.github.io/td/build.html) for detailed instructions on how to build TDLib.
|
||||||
Choose your preferred programming language to see examples of usage and a detailed description:
|
Choose your preferred programming language to see examples of usage and a detailed description:
|
||||||
@ -119,7 +119,7 @@ provides an asynchronous interface for interaction with TDLib, automatically gen
|
|||||||
|
|
||||||
You can also use [TDLibCore](https://github.com/ph09nix/TDLibCore) library.
|
You can also use [TDLibCore](https://github.com/ph09nix/TDLibCore) library.
|
||||||
|
|
||||||
Also see [Unigram](https://github.com/UnigramDev/Unigram), which is a full-featured client rewritten from scratch in C# using TDLib SDK for Universal Windows Platform in less than 2 months,
|
Also, see [Unigram](https://github.com/UnigramDev/Unigram), which is a full-featured client rewritten from scratch in C# using TDLib SDK for Universal Windows Platform in less than 2 months,
|
||||||
[egram.tel](https://github.com/egramtel/egram.tel) – a cross-platform Telegram client written in C#, .NET Core, ReactiveUI and Avalonia, or
|
[egram.tel](https://github.com/egramtel/egram.tel) – a cross-platform Telegram client written in C#, .NET Core, ReactiveUI and Avalonia, or
|
||||||
[telewear](https://github.com/telewear/telewear) - a Telegram client for Samsung watches.
|
[telewear](https://github.com/telewear/telewear) - a Telegram client for Samsung watches.
|
||||||
|
|
||||||
@ -189,7 +189,7 @@ See [rust-tdlib](https://github.com/aCLr/rust-tdlib), or [tdlib](https://github.
|
|||||||
See [rtdlib](https://github.com/fewensa/rtdlib), [tdlib-rs](https://github.com/d653/tdlib-rs), [tdlib-futures](https://github.com/yuri91/tdlib-futures),
|
See [rtdlib](https://github.com/fewensa/rtdlib), [tdlib-rs](https://github.com/d653/tdlib-rs), [tdlib-futures](https://github.com/yuri91/tdlib-futures),
|
||||||
[tdlib-sys](https://github.com/nuxeh/tdlib-sys), [tdjson-rs](https://github.com/mersinvald/tdjson-rs), [rust-tdlib](https://github.com/vhaoran/rust-tdlib), or [tdlib-json-sys](https://github.com/aykxt/tdlib-json-sys) for examples of TDLib Rust bindings.
|
[tdlib-sys](https://github.com/nuxeh/tdlib-sys), [tdjson-rs](https://github.com/mersinvald/tdjson-rs), [rust-tdlib](https://github.com/vhaoran/rust-tdlib), or [tdlib-json-sys](https://github.com/aykxt/tdlib-json-sys) for examples of TDLib Rust bindings.
|
||||||
|
|
||||||
Also see [Telegrand](https://github.com/melix99/telegrand) – a Telegram client optimized for the GNOME desktop.
|
Also, see [Telegrand](https://github.com/melix99/telegrand) – a Telegram client optimized for the GNOME desktop.
|
||||||
|
|
||||||
<a name="erlang"></a>
|
<a name="erlang"></a>
|
||||||
## Using TDLib in Erlang projects
|
## Using TDLib in Erlang projects
|
||||||
|
@ -8,9 +8,9 @@ cd build
|
|||||||
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=../example/cpp/td ..
|
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=../example/cpp/td ..
|
||||||
cmake --build . --target install
|
cmake --build . --target install
|
||||||
```
|
```
|
||||||
Also see [building](https://github.com/tdlib/td#building) for additional details on TDLib building.
|
Also, see [building](https://github.com/tdlib/td#building) for additional details on TDLib building.
|
||||||
|
|
||||||
Then you can build the examples:
|
After this you can build the examples:
|
||||||
```
|
```
|
||||||
cd <path to TDLib sources>/example/cpp
|
cd <path to TDLib sources>/example/cpp
|
||||||
mkdir build
|
mkdir build
|
||||||
|
@ -35,4 +35,4 @@ After `TDLib` is built you can open and run TdExample project.
|
|||||||
It contains a simple console C# application with implementation of authorization and message sending.
|
It contains a simple console C# application with implementation of authorization and message sending.
|
||||||
Just open it with Visual Studio 2015 or later and run.
|
Just open it with Visual Studio 2015 or later and run.
|
||||||
|
|
||||||
Also see TdExample.csproj for example of including TDLib in C# project with all native shared library dependencies.
|
Also, see TdExample.csproj for example of including TDLib in C# project with all native shared library dependencies.
|
||||||
|
@ -19,7 +19,7 @@ If you want to compile TDLib for 32-bit/64-bit Java on Windows using MSVC, you w
|
|||||||
|
|
||||||
In Windows, use vcpkg toolchain file by adding parameter -DCMAKE_TOOLCHAIN_FILE=<VCPKG_DIR>/scripts/buildsystems/vcpkg.cmake
|
In Windows, use vcpkg toolchain file by adding parameter -DCMAKE_TOOLCHAIN_FILE=<VCPKG_DIR>/scripts/buildsystems/vcpkg.cmake
|
||||||
|
|
||||||
Then you can build this example:
|
After this you can compile the example source code:
|
||||||
```
|
```
|
||||||
cd <path to TDLib sources>/example/java
|
cd <path to TDLib sources>/example/java
|
||||||
mkdir build
|
mkdir build
|
||||||
@ -30,7 +30,7 @@ cmake --build . --target install
|
|||||||
|
|
||||||
Compiled TDLib shared library and Java example after that will be placed in bin/ and Javadoc documentation in `docs/`.
|
Compiled TDLib shared library and Java example after that will be placed in bin/ and Javadoc documentation in `docs/`.
|
||||||
|
|
||||||
Now you can run Java example:
|
After this you can run the Java example:
|
||||||
```
|
```
|
||||||
cd <path to TDLib sources>/example/java/bin
|
cd <path to TDLib sources>/example/java/bin
|
||||||
java '-Djava.library.path=.' org/drinkless/tdlib/example/Example
|
java '-Djava.library.path=.' org/drinkless/tdlib/example/Example
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
To run this example you need to [build](https://github.com/tdlib/td#building) TDLib and copy built tdjson shared library to this directory.
|
To run this example you need to [build](https://github.com/tdlib/td#building) TDLib and copy built tdjson shared library to this directory.
|
||||||
|
|
||||||
Then you can run the example:
|
After this you can run the example:
|
||||||
```
|
```
|
||||||
python tdjson_example.py
|
python tdjson_example.py
|
||||||
```
|
```
|
||||||
|
@ -9,7 +9,7 @@ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=../example/swift/td
|
|||||||
cmake --build . --target install
|
cmake --build . --target install
|
||||||
```
|
```
|
||||||
|
|
||||||
Then you can open and build the example with the latest Xcode.
|
After this you can open and build the example with the latest Xcode.
|
||||||
|
|
||||||
Description of all available classes and methods can be found at [td_json_client](https://core.telegram.org/tdlib/docs/td__json__client_8h.html)
|
Description of all available classes and methods can be found at [td_json_client](https://core.telegram.org/tdlib/docs/td__json__client_8h.html)
|
||||||
and [td_api](https://core.telegram.org/tdlib/docs/td__api_8h.html) documentation.
|
and [td_api](https://core.telegram.org/tdlib/docs/td__api_8h.html) documentation.
|
||||||
|
@ -22,7 +22,8 @@ powershell -ExecutionPolicy ByPass .\build.ps1 -vcpkg_root C:\vcpkg
|
|||||||
If you need to restart the build from scratch, call `.\build.ps1 -vcpkg_root C:\vcpkg -mode clean` first.
|
If you need to restart the build from scratch, call `.\build.ps1 -vcpkg_root C:\vcpkg -mode clean` first.
|
||||||
* Install Visual Studio Extension "TDLib for Universal Windows Platform" located at `build-uwp\vsix\tdlib.vsix`, which was created on the previous step by `build.ps1` script.
|
* Install Visual Studio Extension "TDLib for Universal Windows Platform" located at `build-uwp\vsix\tdlib.vsix`, which was created on the previous step by `build.ps1` script.
|
||||||
|
|
||||||
Now `TDLib` can be used from any UWP project, built in Visual Studio.
|
After this `TDLib` can be used from any UWP project, built in Visual Studio.
|
||||||
|
|
||||||
## Example of usage
|
## Example of usage
|
||||||
|
|
||||||
The `app/` directory contains a simple example of a C# application for Universal Windows Platform. Just open it with Visual Studio 2015 or later and run.
|
The `app/` directory contains a simple example of a C# application for Universal Windows Platform. Just open it with Visual Studio 2015 or later and run.
|
||||||
|
@ -432,7 +432,7 @@ animatedEmoji sticker:sticker sticker_width:int32 sticker_height:int32 fitzpatri
|
|||||||
//@first_name First name of the user; 1-255 characters in length
|
//@first_name First name of the user; 1-255 characters in length
|
||||||
//@last_name Last name of the user
|
//@last_name Last name of the user
|
||||||
//@vcard Additional data about the user in a form of vCard; 0-2048 bytes in length
|
//@vcard Additional data about the user in a form of vCard; 0-2048 bytes in length
|
||||||
//@user_id Identifier of the user, if known; otherwise 0
|
//@user_id Identifier of the user, if known; 0 otherwise
|
||||||
contact phone_number:string first_name:string last_name:string vcard:string user_id:int53 = Contact;
|
contact phone_number:string first_name:string last_name:string vcard:string user_id:int53 = Contact;
|
||||||
|
|
||||||
//@description Describes a location on planet Earth
|
//@description Describes a location on planet Earth
|
||||||
@ -649,11 +649,11 @@ user id:int53 first_name:string last_name:string usernames:usernames phone_numbe
|
|||||||
botInfo share_text:string description:string photo:photo animation:animation menu_button:botMenuButton commands:vector<botCommand> default_group_administrator_rights:chatAdministratorRights default_channel_administrator_rights:chatAdministratorRights = BotInfo;
|
botInfo share_text:string description:string photo:photo animation:animation menu_button:botMenuButton commands:vector<botCommand> default_group_administrator_rights:chatAdministratorRights default_channel_administrator_rights:chatAdministratorRights = BotInfo;
|
||||||
|
|
||||||
//@description Contains full information about a user
|
//@description Contains full information about a user
|
||||||
//@personal_photo User profile photo set by the current user for the contact; may be null. If null and user.profile_photo is null, then the photo is empty, otherwise unknown.
|
//@personal_photo User profile photo set by the current user for the contact; may be null. If null and user.profile_photo is null, then the photo is empty; otherwise, it is unknown.
|
||||||
//-If non-null, then it is the same photo as in user.profile_photo and chat.photo. This photo isn't returned in the list of user photos
|
//-If non-null, then it is the same photo as in user.profile_photo and chat.photo. This photo isn't returned in the list of user photos
|
||||||
//@photo User profile photo; may be null. If null and user.profile_photo is null, then the photo is empty, otherwise unknown.
|
//@photo User profile photo; may be null. If null and user.profile_photo is null, then the photo is empty; otherwise, it is unknown.
|
||||||
//-If non-null and personal_photo is null, then it is the same photo as in user.profile_photo and chat.photo
|
//-If non-null and personal_photo is null, then it is the same photo as in user.profile_photo and chat.photo
|
||||||
//@public_photo User profile photo visible if the main photo is hidden by privacy settings; may be null. If null and user.profile_photo is null, then the photo is empty, otherwise unknown.
|
//@public_photo User profile photo visible if the main photo is hidden by privacy settings; may be null. If null and user.profile_photo is null, then the photo is empty; otherwise, it is unknown.
|
||||||
//-If non-null and both photo and personal_photo are null, then it is the same photo as in user.profile_photo and chat.photo. This photo isn't returned in the list of user photos
|
//-If non-null and both photo and personal_photo are null, then it is the same photo as in user.profile_photo and chat.photo. This photo isn't returned in the list of user photos
|
||||||
//@is_blocked True, if the user is blocked by the current user
|
//@is_blocked True, if the user is blocked by the current user
|
||||||
//@can_be_called True, if the user can be called
|
//@can_be_called True, if the user can be called
|
||||||
@ -919,7 +919,7 @@ secretChatStateClosed = SecretChatState;
|
|||||||
//@id Secret chat identifier
|
//@id Secret chat identifier
|
||||||
//@user_id Identifier of the chat partner
|
//@user_id Identifier of the chat partner
|
||||||
//@state State of the secret chat
|
//@state State of the secret chat
|
||||||
//@is_outbound True, if the chat was created by the current user; otherwise false
|
//@is_outbound True, if the chat was created by the current user; false otherwise
|
||||||
//@key_hash Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 little-endian bytes, which must be split into groups of 2 bits, each denoting a pixel of one of 4 colors FFFFFF, D5E6F3, 2D5775, and 2F99C9.
|
//@key_hash Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 little-endian bytes, which must be split into groups of 2 bits, each denoting a pixel of one of 4 colors FFFFFF, D5E6F3, 2D5775, and 2F99C9.
|
||||||
//-The pixels must be used to make a 12x12 square image filled from left to right, top to bottom. Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers
|
//-The pixels must be used to make a 12x12 square image filled from left to right, top to bottom. Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers
|
||||||
//@layer Secret chat layer; determines features supported by the chat partner's application. Nested text entities and underline and strikethrough entities are supported if the layer >= 101,
|
//@layer Secret chat layer; determines features supported by the chat partner's application. Nested text entities and underline and strikethrough entities are supported if the layer >= 101,
|
||||||
@ -1419,7 +1419,7 @@ replyMarkupForceReply is_personal:Bool input_field_placeholder:string = ReplyMar
|
|||||||
|
|
||||||
//@description Contains a custom keyboard layout to quickly reply to bots
|
//@description Contains a custom keyboard layout to quickly reply to bots
|
||||||
//@rows A list of rows of bot keyboard buttons
|
//@rows A list of rows of bot keyboard buttons
|
||||||
//@is_persistent True, if the keyboard is supposed to be always shown when the ordinary keyboard is hidden
|
//@is_persistent True, if the keyboard is supposed to always be shown when the ordinary keyboard is hidden
|
||||||
//@resize_keyboard True, if the application needs to resize the keyboard vertically
|
//@resize_keyboard True, if the application needs to resize the keyboard vertically
|
||||||
//@one_time True, if the application needs to hide the keyboard after use
|
//@one_time True, if the application needs to hide the keyboard after use
|
||||||
//@is_personal True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply
|
//@is_personal True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply
|
||||||
@ -1912,10 +1912,10 @@ paymentOption title:string url:string = PaymentOption;
|
|||||||
//@product_photo Product photo; may be null
|
//@product_photo Product photo; may be null
|
||||||
paymentForm id:int64 invoice:invoice seller_bot_user_id:int53 payment_provider_user_id:int53 payment_provider:PaymentProvider additional_payment_options:vector<paymentOption> saved_order_info:orderInfo saved_credentials:vector<savedCredentials> can_save_credentials:Bool need_password:Bool product_title:string product_description:formattedText product_photo:photo = PaymentForm;
|
paymentForm id:int64 invoice:invoice seller_bot_user_id:int53 payment_provider_user_id:int53 payment_provider:PaymentProvider additional_payment_options:vector<paymentOption> saved_order_info:orderInfo saved_credentials:vector<savedCredentials> can_save_credentials:Bool need_password:Bool product_title:string product_description:formattedText product_photo:photo = PaymentForm;
|
||||||
|
|
||||||
//@description Contains a temporary identifier of validated order information, which is stored for one hour. Also contains the available shipping options @order_info_id Temporary identifier of the order information @shipping_options Available shipping options
|
//@description Contains a temporary identifier of validated order information, which is stored for one hour, and the available shipping options @order_info_id Temporary identifier of the order information @shipping_options Available shipping options
|
||||||
validatedOrderInfo order_info_id:string shipping_options:vector<shippingOption> = ValidatedOrderInfo;
|
validatedOrderInfo order_info_id:string shipping_options:vector<shippingOption> = ValidatedOrderInfo;
|
||||||
|
|
||||||
//@description Contains the result of a payment request @success True, if the payment request was successful; otherwise the verification_url will be non-empty @verification_url URL for additional payment credentials verification
|
//@description Contains the result of a payment request @success True, if the payment request was successful; otherwise, the verification_url will be non-empty @verification_url URL for additional payment credentials verification
|
||||||
paymentResult success:Bool verification_url:string = PaymentResult;
|
paymentResult success:Bool verification_url:string = PaymentResult;
|
||||||
|
|
||||||
//@description Contains information about a successful payment
|
//@description Contains information about a successful payment
|
||||||
@ -2388,7 +2388,7 @@ messagePinMessage message_id:int53 = MessageContent;
|
|||||||
//@description A screenshot of a message in the chat has been taken
|
//@description A screenshot of a message in the chat has been taken
|
||||||
messageScreenshotTaken = MessageContent;
|
messageScreenshotTaken = MessageContent;
|
||||||
|
|
||||||
//@description A theme in the chat has been changed @theme_name If non-empty, name of a new theme, set for the chat. Otherwise chat theme was reset to the default one
|
//@description A theme in the chat has been changed @theme_name If non-empty, name of a new theme, set for the chat. Otherwise, chat theme was reset to the default one
|
||||||
messageChatSetTheme theme_name:string = MessageContent;
|
messageChatSetTheme theme_name:string = MessageContent;
|
||||||
|
|
||||||
//@description The auto-delete or self-destruct timer for messages in the chat has been changed @message_auto_delete_time New value auto-delete or self-destruct time, in seconds; 0 if disabled @from_user_id If not 0, a user identifier, which default setting was automatically applied
|
//@description The auto-delete or self-destruct timer for messages in the chat has been changed @message_auto_delete_time New value auto-delete or self-destruct time, in seconds; 0 if disabled @from_user_id If not 0, a user identifier, which default setting was automatically applied
|
||||||
@ -2403,10 +2403,10 @@ messageForumTopicCreated name:string icon:forumTopicIcon = MessageContent;
|
|||||||
//@icon_custom_emoji_id New unique identifier of the custom emoji shown on the topic icon; 0 if none. Must be ignored if edit_icon_custom_emoji_id is false
|
//@icon_custom_emoji_id New unique identifier of the custom emoji shown on the topic icon; 0 if none. Must be ignored if edit_icon_custom_emoji_id is false
|
||||||
messageForumTopicEdited name:string edit_icon_custom_emoji_id:Bool icon_custom_emoji_id:int64 = MessageContent;
|
messageForumTopicEdited name:string edit_icon_custom_emoji_id:Bool icon_custom_emoji_id:int64 = MessageContent;
|
||||||
|
|
||||||
//@description A forum topic has been closed or opened @is_closed True, if the topic was closed, otherwise the topic was reopened
|
//@description A forum topic has been closed or opened @is_closed True, if the topic was closed; otherwise, the topic was reopened
|
||||||
messageForumTopicIsClosedToggled is_closed:Bool = MessageContent;
|
messageForumTopicIsClosedToggled is_closed:Bool = MessageContent;
|
||||||
|
|
||||||
//@description A General forum topic has been hidden or unhidden @is_hidden True, if the topic was hidden, otherwise the topic was unhidden
|
//@description A General forum topic has been hidden or unhidden @is_hidden True, if the topic was hidden; otherwise, the topic was unhidden
|
||||||
messageForumTopicIsHiddenToggled is_hidden:Bool = MessageContent;
|
messageForumTopicIsHiddenToggled is_hidden:Bool = MessageContent;
|
||||||
|
|
||||||
//@description A profile photo was suggested to a user in a private chat @photo The suggested chat photo. Use the method setProfilePhoto with inputChatPhotoPrevious to apply the photo
|
//@description A profile photo was suggested to a user in a private chat @photo The suggested chat photo. Use the method setProfilePhoto with inputChatPhotoPrevious to apply the photo
|
||||||
@ -4044,7 +4044,7 @@ pushMessageContentChatChangePhoto = PushMessageContent;
|
|||||||
//@description A chat title was edited @title New chat title
|
//@description A chat title was edited @title New chat title
|
||||||
pushMessageContentChatChangeTitle title:string = PushMessageContent;
|
pushMessageContentChatChangeTitle title:string = PushMessageContent;
|
||||||
|
|
||||||
//@description A chat theme was edited @theme_name If non-empty, name of a new theme, set for the chat. Otherwise chat theme was reset to the default one
|
//@description A chat theme was edited @theme_name If non-empty, name of a new theme, set for the chat. Otherwise, the chat theme was reset to the default one
|
||||||
pushMessageContentChatSetTheme theme_name:string = PushMessageContent;
|
pushMessageContentChatSetTheme theme_name:string = PushMessageContent;
|
||||||
|
|
||||||
//@description A chat member was deleted
|
//@description A chat member was deleted
|
||||||
@ -4397,7 +4397,7 @@ targetChatInternalLink link:InternalLinkType = TargetChat;
|
|||||||
internalLinkTypeActiveSessions = InternalLinkType;
|
internalLinkTypeActiveSessions = InternalLinkType;
|
||||||
|
|
||||||
//@description The link is a link to an attachment menu bot to be opened in the specified or a chosen chat. Process given target_chat to open the chat.
|
//@description The link is a link to an attachment menu bot to be opened in the specified or a chosen chat. Process given target_chat to open the chat.
|
||||||
//-Then call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then use getAttachmentMenuBot to receive information about the bot.
|
//-Then, call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot.
|
||||||
//-If the bot isn't added to attachment menu, then user needs to confirm adding the bot to attachment menu. If user confirms adding, then use toggleBotIsAddedToAttachmentMenu to add it.
|
//-If the bot isn't added to attachment menu, then user needs to confirm adding the bot to attachment menu. If user confirms adding, then use toggleBotIsAddedToAttachmentMenu to add it.
|
||||||
//-If the attachment menu bot can't be used in the opened chat, show an error to the user. If the bot is added to attachment menu and can be used in the chat, then use openWebApp with the given URL
|
//-If the attachment menu bot can't be used in the opened chat, show an error to the user. If the bot is added to attachment menu and can be used in the chat, then use openWebApp with the given URL
|
||||||
//@target_chat Target chat to be opened
|
//@target_chat Target chat to be opened
|
||||||
@ -4423,15 +4423,15 @@ internalLinkTypeBotStart bot_username:string start_parameter:string autostart:Bo
|
|||||||
//-If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator,
|
//-If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator,
|
||||||
//-check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user,
|
//-check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user,
|
||||||
//-and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat.
|
//-and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat.
|
||||||
//-Then if start_parameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat, otherwise just send /start message with bot's username added to the chat.
|
//-Then, if start_parameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat; otherwise, just send /start message with bot's username added to the chat.
|
||||||
//@bot_username Username of the bot
|
//@bot_username Username of the bot
|
||||||
//@start_parameter The parameter to be passed to sendBotStartMessage
|
//@start_parameter The parameter to be passed to sendBotStartMessage
|
||||||
//@administrator_rights Expected administrator rights for the bot; may be null
|
//@administrator_rights Expected administrator rights for the bot; may be null
|
||||||
internalLinkTypeBotStartInGroup bot_username:string start_parameter:string administrator_rights:chatAdministratorRights = InternalLinkType;
|
internalLinkTypeBotStartInGroup bot_username:string start_parameter:string administrator_rights:chatAdministratorRights = InternalLinkType;
|
||||||
|
|
||||||
//@description The link is a link to a Telegram bot, which is supposed to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot,
|
//@description The link is a link to a Telegram bot, which is supposed to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot,
|
||||||
//-ask the current user to select a channel chat to add the bot to as an administrator. Then call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator,
|
//-ask the current user to select a channel chat to add the bot to as an administrator. Then, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator,
|
||||||
//-check that the current user can edit its administrator rights and combine received rights with the requested administrator rights. Then show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed rights
|
//-check that the current user can edit its administrator rights and combine received rights with the requested administrator rights. Then, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed rights
|
||||||
//@bot_username Username of the bot
|
//@bot_username Username of the bot
|
||||||
//@administrator_rights Expected administrator rights for the bot
|
//@administrator_rights Expected administrator rights for the bot
|
||||||
internalLinkTypeBotAddToChannel bot_username:string administrator_rights:chatAdministratorRights = InternalLinkType;
|
internalLinkTypeBotAddToChannel bot_username:string administrator_rights:chatAdministratorRights = InternalLinkType;
|
||||||
@ -4476,7 +4476,7 @@ internalLinkTypeMessage url:string = InternalLinkType;
|
|||||||
//@contains_link True, if the first line of the text contains a link. If true, the input field needs to be focused and the text after the link must be selected
|
//@contains_link True, if the first line of the text contains a link. If true, the input field needs to be focused and the text after the link must be selected
|
||||||
internalLinkTypeMessageDraft text:formattedText contains_link:Bool = InternalLinkType;
|
internalLinkTypeMessageDraft text:formattedText contains_link:Bool = InternalLinkType;
|
||||||
|
|
||||||
//@description The link contains a request of Telegram passport data. Call getPassportAuthorizationForm with the given parameters to process the link if the link was received from outside of the application, otherwise ignore it
|
//@description The link contains a request of Telegram passport data. Call getPassportAuthorizationForm with the given parameters to process the link if the link was received from outside of the application; otherwise, ignore it
|
||||||
//@bot_user_id User identifier of the service's bot
|
//@bot_user_id User identifier of the service's bot
|
||||||
//@scope Telegram Passport element types requested by the service
|
//@scope Telegram Passport element types requested by the service
|
||||||
//@public_key Service's public key
|
//@public_key Service's public key
|
||||||
@ -5051,7 +5051,7 @@ updateChatPermissions chat_id:int53 permissions:chatPermissions = Update;
|
|||||||
//@positions The new chat positions in the chat lists
|
//@positions The new chat positions in the chat lists
|
||||||
updateChatLastMessage chat_id:int53 last_message:message positions:vector<chatPosition> = Update;
|
updateChatLastMessage chat_id:int53 last_message:message positions:vector<chatPosition> = Update;
|
||||||
|
|
||||||
//@description The position of a chat in a chat list has changed. Instead of this update updateChatLastMessage or updateChatDraftMessage might be sent
|
//@description The position of a chat in a chat list has changed. An updateChatLastMessage or updateChatDraftMessage update might be sent instead of the update
|
||||||
//@chat_id Chat identifier
|
//@chat_id Chat identifier
|
||||||
//@position New chat position. If new order is 0, then the chat needs to be removed from the list
|
//@position New chat position. If new order is 0, then the chat needs to be removed from the list
|
||||||
updateChatPosition chat_id:int53 position:chatPosition = Update;
|
updateChatPosition chat_id:int53 position:chatPosition = Update;
|
||||||
@ -5274,7 +5274,7 @@ updateInstalledStickerSets sticker_type:StickerType sticker_set_ids:vector<int64
|
|||||||
//@description The list of trending sticker sets was updated or some of them were viewed @sticker_type Type of the affected stickers @sticker_sets The prefix of the list of trending sticker sets with the newest trending sticker sets
|
//@description The list of trending sticker sets was updated or some of them were viewed @sticker_type Type of the affected stickers @sticker_sets The prefix of the list of trending sticker sets with the newest trending sticker sets
|
||||||
updateTrendingStickerSets sticker_type:StickerType sticker_sets:trendingStickerSets = Update;
|
updateTrendingStickerSets sticker_type:StickerType sticker_sets:trendingStickerSets = Update;
|
||||||
|
|
||||||
//@description The list of recently used stickers was updated @is_attached True, if the list of stickers attached to photo or video files was updated, otherwise the list of sent stickers is updated @sticker_ids The new list of file identifiers of recently used stickers
|
//@description The list of recently used stickers was updated @is_attached True, if the list of stickers attached to photo or video files was updated; otherwise, the list of sent stickers is updated @sticker_ids The new list of file identifiers of recently used stickers
|
||||||
updateRecentStickers is_attached:Bool sticker_ids:vector<int32> = Update;
|
updateRecentStickers is_attached:Bool sticker_ids:vector<int32> = Update;
|
||||||
|
|
||||||
//@description The list of favorite stickers was updated @sticker_ids The new list of file identifiers of favorite stickers
|
//@description The list of favorite stickers was updated @sticker_ids The new list of file identifiers of favorite stickers
|
||||||
@ -5642,7 +5642,7 @@ getMessage chat_id:int53 message_id:int53 = Message;
|
|||||||
//@description Returns information about a message, if it is available without sending network request. This is an offline request @chat_id Identifier of the chat the message belongs to @message_id Identifier of the message to get
|
//@description Returns information about a message, if it is available without sending network request. This is an offline request @chat_id Identifier of the chat the message belongs to @message_id Identifier of the message to get
|
||||||
getMessageLocally chat_id:int53 message_id:int53 = Message;
|
getMessageLocally chat_id:int53 message_id:int53 = Message;
|
||||||
|
|
||||||
//@description Returns information about a message that is replied by a given message. Also returns the pinned message, the game message, the invoice message, and the topic creation message for messages
|
//@description Returns information about a message that is replied by a given message. Also, returns the pinned message, the game message, the invoice message, and the topic creation message for messages
|
||||||
//-of the types messagePinMessage, messageGameScore, messagePaymentSuccessful, and topic messages without replied message respectively
|
//-of the types messagePinMessage, messageGameScore, messagePaymentSuccessful, and topic messages without replied message respectively
|
||||||
//@chat_id Identifier of the chat the message belongs to
|
//@chat_id Identifier of the chat the message belongs to
|
||||||
//@message_id Identifier of the reply message
|
//@message_id Identifier of the reply message
|
||||||
@ -5684,7 +5684,7 @@ loadChats chat_list:ChatList limit:int32 = Ok;
|
|||||||
//@limit The maximum number of chats to be returned
|
//@limit The maximum number of chats to be returned
|
||||||
getChats chat_list:ChatList limit:int32 = Chats;
|
getChats chat_list:ChatList limit:int32 = Chats;
|
||||||
|
|
||||||
//@description Searches a public chat by its username. Currently, only private chats, supergroups and channels can be public. Returns the chat if found; otherwise an error is returned @username Username to be resolved
|
//@description Searches a public chat by its username. Currently, only private chats, supergroups and channels can be public. Returns the chat if found; otherwise, an error is returned @username Username to be resolved
|
||||||
searchPublicChat username:string = Chat;
|
searchPublicChat username:string = Chat;
|
||||||
|
|
||||||
//@description Searches public chats by looking for specified query in their username and title. Currently, only private chats, supergroups and channels can be public. Returns a meaningful number of results.
|
//@description Searches public chats by looking for specified query in their username and title. Currently, only private chats, supergroups and channels can be public. Returns a meaningful number of results.
|
||||||
|
@ -91,8 +91,7 @@ namespace mtproto {
|
|||||||
* A notification about new session.
|
* A notification about new session.
|
||||||
* It is reasonable to store unique_id with current session, in order to process duplicated notifications once.
|
* It is reasonable to store unique_id with current session, in order to process duplicated notifications once.
|
||||||
*
|
*
|
||||||
* Causes all older than first_msg_id to be re-sent.
|
* Causes all messages older than first_msg_id to be re-sent and notifies about a gap in updates
|
||||||
* Also there is a gap in updates, so getDifference MUST be sent
|
|
||||||
* output:
|
* output:
|
||||||
* - new_session_created#9ec20908 first_msg_id:long unique_id:long server_salt:long = NewSession
|
* - new_session_created#9ec20908 first_msg_id:long unique_id:long server_salt:long = NewSession
|
||||||
*
|
*
|
||||||
|
@ -23,7 +23,7 @@ namespace td {
|
|||||||
* Requests can be sent using the method ClientManager::send from any thread.
|
* Requests can be sent using the method ClientManager::send from any thread.
|
||||||
* New updates and responses to requests can be received using the method ClientManager::receive from any thread after
|
* New updates and responses to requests can be received using the method ClientManager::receive from any thread after
|
||||||
* the first request has been sent to the client instance. ClientManager::receive must not be called simultaneously from
|
* the first request has been sent to the client instance. ClientManager::receive must not be called simultaneously from
|
||||||
* two different threads. Also note that all updates and responses to requests should be applied in the same order as
|
* two different threads. Also, note that all updates and responses to requests should be applied in the same order as
|
||||||
* they were received, to ensure consistency.
|
* they were received, to ensure consistency.
|
||||||
* Some TDLib requests can be executed synchronously from any thread using the method ClientManager::execute.
|
* Some TDLib requests can be executed synchronously from any thread using the method ClientManager::execute.
|
||||||
*
|
*
|
||||||
@ -177,7 +177,7 @@ class ClientManager final {
|
|||||||
* The TDLib instance is created for the lifetime of the Client object.
|
* The TDLib instance is created for the lifetime of the Client object.
|
||||||
* Requests to TDLib can be sent using the Client::send method from any thread.
|
* Requests to TDLib can be sent using the Client::send method from any thread.
|
||||||
* New updates and responses to requests can be received using the Client::receive method from any thread,
|
* New updates and responses to requests can be received using the Client::receive method from any thread,
|
||||||
* this function must not be called simultaneously from two different threads. Also note that all updates and
|
* this function must not be called simultaneously from two different threads. Also, note that all updates and
|
||||||
* responses to requests should be applied in the same order as they were received, to ensure consistency.
|
* responses to requests should be applied in the same order as they were received, to ensure consistency.
|
||||||
* Given this information, it's advisable to call this function from a dedicated thread.
|
* Given this information, it's advisable to call this function from a dedicated thread.
|
||||||
* Some service TDLib requests can be executed synchronously from any thread using the Client::execute method.
|
* Some service TDLib requests can be executed synchronously from any thread using the Client::execute method.
|
||||||
|
@ -595,7 +595,7 @@ void SecretChatActor::run_pfs() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PfsState::SendCommit: {
|
case PfsState::SendCommit: {
|
||||||
// must wait till pfs_state is saved to binlog. Otherwise we may save ActionCommit to binlog without pfs_state,
|
// must wait till pfs_state is saved to binlog. Otherwise, we may save ActionCommit to binlog without pfs_state,
|
||||||
// which has the new auth_key.
|
// which has the new auth_key.
|
||||||
if (saved_pfs_state_message_id_ < pfs_state_.wait_message_id) {
|
if (saved_pfs_state_message_id_ < pfs_state_.wait_message_id) {
|
||||||
return;
|
return;
|
||||||
@ -1183,7 +1183,7 @@ Status SecretChatActor::do_inbound_message_decrypted(unique_ptr<log_event::Inbou
|
|||||||
// 1. [] => Add log event. [save_log_event]
|
// 1. [] => Add log event. [save_log_event]
|
||||||
// 2. [save_log_event] => Save SeqNoState [save_changes]
|
// 2. [save_log_event] => Save SeqNoState [save_changes]
|
||||||
// 3. [save_log_event] => Add message to MessageManager [save_message]
|
// 3. [save_log_event] => Add message to MessageManager [save_message]
|
||||||
// Note: if we are able to add message by random_id, we may not wait for (log event). Otherwise we should force
|
// Note: if we are able to add message by random_id, we may not wait for (log event). Otherwise, we should force
|
||||||
// binlog flush.
|
// binlog flush.
|
||||||
// 4. [save_log_event] => Update qts [qts]
|
// 4. [save_log_event] => Update qts [qts]
|
||||||
// 5. [save_changes; save_message; ?qts) => Remove log event [remove_log_event]
|
// 5. [save_changes; save_message; ?qts) => Remove log event [remove_log_event]
|
||||||
|
@ -479,10 +479,10 @@ class SecretChatActor final : public NetQueryCallback {
|
|||||||
// This is completly flawed.
|
// This is completly flawed.
|
||||||
// (A-start_save_to_binlog ----> B-start_save_to_binlog+change_memory ----> A-finish_save_to_binlog+surprise)
|
// (A-start_save_to_binlog ----> B-start_save_to_binlog+change_memory ----> A-finish_save_to_binlog+surprise)
|
||||||
//
|
//
|
||||||
// Instead I suggest general solution that is already used with SeqNoState and qts
|
// Instead, I suggest general solution that is already used with SeqNoState and qts
|
||||||
// 1. We APPLY CHANGE to memory immediately AFTER corresponding EVENT is SENT to the binlog.
|
// 1. We APPLY CHANGE to memory immediately AFTER corresponding EVENT is SENT to the binlog.
|
||||||
// 2. We SEND CHANGE to database only after corresponding EVENT is SAVED to the binlog.
|
// 2. We SEND CHANGE to database only after corresponding EVENT is SAVED to the binlog.
|
||||||
// 3. Then we are able to ERASE EVENT just AFTER the CHANGE is SAVED to the binlog.
|
// 3. Then, we are able to ERASE EVENT just AFTER the CHANGE is SAVED to the binlog.
|
||||||
//
|
//
|
||||||
// Actually the change will be saved to binlog too.
|
// Actually the change will be saved to binlog too.
|
||||||
// So we can do it immediatelly after EVENT is SENT to the binlog, because SEND CHANGE and ERASE EVENT will be
|
// So we can do it immediatelly after EVENT is SENT to the binlog, because SEND CHANGE and ERASE EVENT will be
|
||||||
|
@ -508,8 +508,7 @@ void UpdatesManager::set_date(int32 date, bool from_update, string date_source)
|
|||||||
}
|
}
|
||||||
auto now = G()->unix_time();
|
auto now = G()->unix_time();
|
||||||
if (date_ > now + 1) {
|
if (date_ > now + 1) {
|
||||||
LOG(ERROR) << "Receive wrong by " << (date_ - now) << " date = " << date_ << " from " << date_source
|
LOG(ERROR) << "Receive wrong by " << (date_ - now) << " date = " << date_ << " from " << date_source;
|
||||||
<< ". Now = " << now;
|
|
||||||
date_ = now;
|
date_ = now;
|
||||||
if (date_ <= date) {
|
if (date_ <= date) {
|
||||||
return;
|
return;
|
||||||
|
@ -375,7 +375,7 @@ class FileManager final : public FileLoadManager::Callback {
|
|||||||
|
|
||||||
// After on_upload_ok all uploads of this file will be paused till merge, delete_partial_remote_location or
|
// After on_upload_ok all uploads of this file will be paused till merge, delete_partial_remote_location or
|
||||||
// explicit upload request with the same file_id.
|
// explicit upload request with the same file_id.
|
||||||
// Also upload may be resumed after some other merges.
|
// Also, upload may be resumed after some other merge.
|
||||||
virtual void on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputFile> input_file) = 0;
|
virtual void on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputFile> input_file) = 0;
|
||||||
virtual void on_upload_encrypted_ok(FileId file_id, tl_object_ptr<telegram_api::InputEncryptedFile> input_file) = 0;
|
virtual void on_upload_encrypted_ok(FileId file_id, tl_object_ptr<telegram_api::InputEncryptedFile> input_file) = 0;
|
||||||
virtual void on_upload_secure_ok(FileId file_id, tl_object_ptr<telegram_api::InputSecureFile> input_file) = 0;
|
virtual void on_upload_secure_ok(FileId file_id, tl_object_ptr<telegram_api::InputSecureFile> input_file) = 0;
|
||||||
|
@ -1517,7 +1517,7 @@ void Session::loop() {
|
|||||||
long_poll_connection_.wakeup_at_ = 0;
|
long_poll_connection_.wakeup_at_ = 0;
|
||||||
|
|
||||||
// NB: order is crucial. First long_poll_connection, then main_connection
|
// NB: order is crucial. First long_poll_connection, then main_connection
|
||||||
// Otherwise queries could be sent with big delay
|
// Otherwise, queries could be sent with big delay
|
||||||
|
|
||||||
connection_check_mode(&main_connection_);
|
connection_check_mode(&main_connection_);
|
||||||
connection_check_mode(&long_poll_connection_);
|
connection_check_mode(&long_poll_connection_);
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
* Requests can be sent using td_send and the received client identifier.
|
* Requests can be sent using td_send and the received client identifier.
|
||||||
* New updates and responses to requests can be received through td_receive from any thread after the first request
|
* New updates and responses to requests can be received through td_receive from any thread after the first request
|
||||||
* has been sent to the client instance. This function must not be called simultaneously from two different threads.
|
* has been sent to the client instance. This function must not be called simultaneously from two different threads.
|
||||||
* Also note that all updates and responses to requests must be applied in the order they were received for consistency.
|
* Also, note that all updates and responses to requests must be applied in the order they were received for consistency.
|
||||||
* Some TDLib requests can be executed synchronously from any thread using td_execute.
|
* Some TDLib requests can be executed synchronously from any thread using td_execute.
|
||||||
* TDLib client instances are destroyed automatically after they are closed.
|
* TDLib client instances are destroyed automatically after they are closed.
|
||||||
* All TDLib client instances must be closed before application termination to ensure data consistency.
|
* All TDLib client instances must be closed before application termination to ensure data consistency.
|
||||||
@ -118,7 +118,7 @@ TDJSON_EXPORT void td_set_log_message_callback(int max_verbosity_level, td_log_m
|
|||||||
* A TDLib client instance can be created through td_json_client_create.
|
* A TDLib client instance can be created through td_json_client_create.
|
||||||
* Requests then can be sent using td_json_client_send from any thread.
|
* Requests then can be sent using td_json_client_send from any thread.
|
||||||
* New updates and request responses can be received through td_json_client_receive from any thread. This function
|
* New updates and request responses can be received through td_json_client_receive from any thread. This function
|
||||||
* must not be called simultaneously from two different threads. Also note that all updates and request responses
|
* must not be called simultaneously from two different threads. Also, note that all updates and request responses
|
||||||
* must be applied in the order they were received to ensure consistency.
|
* must be applied in the order they were received to ensure consistency.
|
||||||
* Given this information, it's advisable to call this function from a dedicated thread.
|
* Given this information, it's advisable to call this function from a dedicated thread.
|
||||||
* Some service TDLib requests can be executed synchronously from any thread by using td_json_client_execute.
|
* Some service TDLib requests can be executed synchronously from any thread by using td_json_client_execute.
|
||||||
|
@ -186,9 +186,8 @@ class MpmcSleepyWaiter {
|
|||||||
// This may put it in a Sleep for some time.
|
// This may put it in a Sleep for some time.
|
||||||
// After wait returns worker will be in Search state again.
|
// After wait returns worker will be in Search state again.
|
||||||
//
|
//
|
||||||
// Suppose worker found a work and ready to process it.
|
// If a worker found a work and ready to process it, then it may call stop_wait.
|
||||||
// Then it may call stop_wait. This will cause transition from
|
// This will cause transition from Search to Work state.
|
||||||
// Search to Work state.
|
|
||||||
//
|
//
|
||||||
// Main invariant:
|
// Main invariant:
|
||||||
// After notify is called there should be at least on worker in Search or Work state.
|
// After notify is called there should be at least on worker in Search or Work state.
|
||||||
|
@ -43,10 +43,9 @@ class ObjectPool {
|
|||||||
// Pattern of usage: 1. Read an object 2. Check if read was valid via is_alive
|
// Pattern of usage: 1. Read an object 2. Check if read was valid via is_alive
|
||||||
//
|
//
|
||||||
// It is not very usual case of acquire/release use.
|
// It is not very usual case of acquire/release use.
|
||||||
// Instead of publishing an object via some flag we do the opposite.
|
// We publish new generation via destruction of the data instead of publishing the object via some flag.
|
||||||
// We publish new generation via destruction of the data.
|
|
||||||
// In usual case if we see a flag, then we are able to use an object.
|
// In usual case if we see a flag, then we are able to use an object.
|
||||||
// In our case if we have used an object and it is already invalid, then generation will mismatch
|
// In our case if we have used an object and it is already invalid, then generation will mismatch.
|
||||||
bool is_alive() const {
|
bool is_alive() const {
|
||||||
if (!storage_) {
|
if (!storage_) {
|
||||||
return false;
|
return false;
|
||||||
@ -216,7 +215,7 @@ class ObjectPool {
|
|||||||
std::atomic<Storage *> head_{static_cast<Storage *>(nullptr)};
|
std::atomic<Storage *> head_{static_cast<Storage *>(nullptr)};
|
||||||
bool check_empty_flag_ = false;
|
bool check_empty_flag_ = false;
|
||||||
|
|
||||||
// TODO(perf): allocation Storages in chunks? Anyway we won't be able to release them.
|
// TODO(perf): allocation Storages in chunks? Anyway, we won't be able to release them.
|
||||||
// TODO(perf): memory order
|
// TODO(perf): memory order
|
||||||
// TODO(perf): use another non lockfree list for release on the same thread
|
// TODO(perf): use another non lockfree list for release on the same thread
|
||||||
// only one thread, so no aba problem
|
// only one thread, so no aba problem
|
||||||
|
@ -574,7 +574,7 @@ class UdpSocketFdImpl {
|
|||||||
|
|
||||||
auto error = Status::PosixError(sendmsg_errno, PSLICE() << "Send from " << get_native_fd() << " has failed");
|
auto error = Status::PosixError(sendmsg_errno, PSLICE() << "Send from " << get_native_fd() << " has failed");
|
||||||
switch (sendmsg_errno) {
|
switch (sendmsg_errno) {
|
||||||
// Still may send some other packets, but there is no point to resend this particular message
|
// We still may send some other packets, but there is no point to resend this particular message
|
||||||
case EACCES:
|
case EACCES:
|
||||||
case EMSGSIZE:
|
case EMSGSIZE:
|
||||||
case EPERM:
|
case EPERM:
|
||||||
@ -583,7 +583,7 @@ class UdpSocketFdImpl {
|
|||||||
is_sent = true;
|
is_sent = true;
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
// Some general problems, which may be fixed in future
|
// Some general issues, which may be fixed in the future
|
||||||
case ENOMEM:
|
case ENOMEM:
|
||||||
case EDQUOT:
|
case EDQUOT:
|
||||||
case EFBIG:
|
case EFBIG:
|
||||||
|
@ -99,7 +99,7 @@
|
|||||||
#undef TD_HAVE_ATOMIC_SHARED_PTR
|
#undef TD_HAVE_ATOMIC_SHARED_PTR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Also no atomic operations on std::shared_ptr when clang __has_feature(cxx_atomic) is defined and zero
|
// Also, no atomic operations on std::shared_ptr when clang __has_feature(cxx_atomic) is defined and zero
|
||||||
#if defined(__has_feature)
|
#if defined(__has_feature)
|
||||||
#if !__has_feature(cxx_atomic)
|
#if !__has_feature(cxx_atomic)
|
||||||
#undef TD_HAVE_ATOMIC_SHARED_PTR
|
#undef TD_HAVE_ATOMIC_SHARED_PTR
|
||||||
|
Loading…
Reference in New Issue
Block a user