WTelegramClient 1.7.1
See the version list below for details.
dotnet add package WTelegramClient --version 1.7.1
NuGet\Install-Package WTelegramClient -Version 1.7.1
<PackageReference Include="WTelegramClient" Version="1.7.1" />
paket add WTelegramClient --version 1.7.1
#r "nuget: WTelegramClient, 1.7.1"
// Install WTelegramClient as a Cake Addin #addin nuget:?package=WTelegramClient&version=1.7.1 // Install WTelegramClient as a Cake Tool #tool nuget:?package=WTelegramClient&version=1.7.1
Telegram Client API library written 100% in C# and .NET Standard
How to use
⚠️ This library relies on asynchronous C# programming (async/await
) so make sure you are familiar with this before proceeding.
After installing WTelegramClient through Nuget, your first Console program will be as simple as:
static async Task Main(string[] _)
{
using var client = new WTelegram.Client();
var user = await client.LoginUserIfNeeded();
Console.WriteLine($"We are logged-in as {user.username ?? user.first_name + " " + user.last_name} (id {user.id})");
}
When run, this will prompt you interactively for your App api_id and api_hash (that you obtain through Telegram's API development tools page) and try to connect to Telegram servers.
Then it will attempt to sign-in as a user for which you must enter the phone_number and the verification_code that will be sent to this user (for example through SMS or another Telegram client app the user is connected to).
If the verification succeeds but the phone number is unknown to Telegram, the user might be prompted to sign-up (accepting the Terms of Service) and enter their first_name and last_name.
And that's it, you now have access to the full range of Telegram services, mainly through calls to await client.Some_TL_Method(...)
Saved session
If you run this program again, you will notice that only api_id and api_hash are requested, the other prompts are gone and you are automatically logged-on and ready to go.
This is because WTelegramClient saves (typically in the encrypted file bin\WTelegram.session) its state and the authentication keys that were negociated with Telegram so that you needn't sign-in again every time.
That file path is configurable, and under various circumstances (changing user or server address) you may want to change it or simply delete the existing session file in order to restart the authentification process.
Non-interactive configuration
Your next step will probably be to provide a configuration to the client so that the required elements (in bold above) are not prompted through the Console but answered by your program.
To do this, you need to write a method that will provide the answers, and pass it on the constructor:
static string Config(string what)
{
switch (what)
{
case "api_id": return "YOUR_API_ID";
case "api_hash": return "YOUR_API_HASH";
case "phone_number": return "+12025550156";
case "verification_code": Console.Write("Code: "); return Console.ReadLine();
case "first_name": return "John"; // if sign-up is required
case "last_name": return "Doe"; // if sign-up is required
case "password": return "secret!"; // if user has enabled 2FA
default: return null; // let WTelegramClient decide the default config
}
}
...
using var client = new WTelegram.Client(Config);
There are other configuration items that are queried to your method but returning null
let WTelegramClient choose a default adequate value.
Those shown above are the only ones that have no default values and <u>should be provided</u> by your method.
Returning null
for verification_code or password will show a prompt for console apps, or an error otherwise.
Another simpler approach is to pass Environment.GetEnvironmentVariable
as the config callback and define the configuration items as environment variables.
Undefined variables get the default null
behavior.
Finally, if you want to redirect the library logs to your logger instead of the Console, you can install a delegate in the WTelegram.Helpers.Log
static property.
Its int
argument is the log severity, compatible with the classic LogLevel enum
Example of API call
ℹ️ The Telegram API makes extensive usage of base and derived classes, so be ready to use the various syntaxes C# offer to check/cast base classes into the more useful derived classes (is
, as
, case DerivedType
)
To find which derived classes are available for a given base class, the fastest is to check our TL.Schema.cs source file as they are listed in groups. Intellisense tooltips on API structures/methods will also display a web link to the adequate Telegram documentation page.
The Telegram API object classes are defined in the TL
namespace, and the API functions are available as async methods of Client
.
Below is an example of calling the messages.getAllChats API function and enumerating the various groups/channels the user is in, and then using client.SendMessageAsync
helper function to easily send a message:
using TL;
...
var chats = await client.Messages_GetAllChats(null);
Console.WriteLine("This user has joined the following:");
foreach (var (id, chat) in chats.chats)
switch (chat)
{
case Chat smallgroup when (smallgroup.flags & Chat.Flags.deactivated) == 0:
Console.WriteLine($"{id}: Small group: {smallgroup.title} with {smallgroup.participants_count} members");
break;
case Channel channel when (channel.flags & Channel.Flags.broadcast) != 0:
Console.WriteLine($"{id}: Channel {channel.username}: {channel.title}");
break;
case Channel group:
Console.WriteLine($"{id}: Group {group.username}: {group.title}");
break;
}
Console.Write("Type a chat ID to send a message: ");
long chatId = long.Parse(Console.ReadLine());
var target = chats.chats[chatId];
Console.WriteLine($"Sending a message in chat {chatId}: {target.Title}");
await client.SendMessageAsync(target, "Hello, World");
Terminology in Telegram Client API
In the API, Telegram uses some terms/classnames that can be confusing as they differ from the terms shown to end-users:
Channel
: A (large) chat group (sometimes called supergroup) or a broadcast channel (thebroadcast
flag differenciate those)Chat
: A private simple chat group with few people (it may be migrated to a supergroup/channel when it doesn't fit anymore)- Chats : In plural, it means either
Chat
orChannel
Peer
: Either aChat
,Channel
or a private chat with aUser
- Dialog : The current status of a chat with a
Peer
(draft, last message, unread count, pinned...) - DC (DataCenter) : There are a few datacenters depending on where in the world the user (or an uploaded media file) is from.
- Access Hash : For more security, Telegram requires you to provide the specific
access_hash
for chats, files and other resources before interacting with them (not required for a simpleChat
). This is like showing a pass that proves you are entitled to access it. You obtain this hash when you first gain access to a resource and occasionnally later when some events about this resource are happening or if you query the API. You should remember this hash if you want to access that resource later.
Other things to know
The Client class also offers an Update
event that is triggered when Telegram servers sends unsollicited Updates or notifications/information/status/service messages, independently of your API requests. See Examples/Program_ListenUpdates.cs
An invalid API request can result in a RpcException
being raised, reflecting the error code and status text of the problem.
You can find more code examples in EXAMPLES.md and in the Examples subdirectory.
The other configuration items that you can override include: session_pathname, server_address, device_model, system_version, app_version, system_lang_code, lang_pack, lang_code, user_id
Optional API parameters have a default value of null
when unset. Passing null
for a required string/array is the same as empty (0-length). Required API parameters/fields can sometimes be set to 0 or null
when unused (check API documentation or experiment).
I've added several useful converters, implicit cast or helper properties to various API object so that they are more easy to manipulate.
Beyond the TL async methods, the Client class offers a few other methods to simplify the sending/receiving of files, medias or messages.
This library works best with .NET 5.0+ and is also available for .NET Standard 2.0 (.NET Framework 4.6.1+ & .NET Core 2.0+)
Troubleshooting guide
Here is a list of common issues and how to fix them so that your program work correctly:
Are you using the Nuget package or the library source code? <br/>It is not recommended to copy/compile the source code of the library for a normal usage. <br/>When built in DEBUG mode, the source code connects to Telegram test servers. So you can either:
- Recommended: Use the official Nuget package or the private nuget feed of development builds
- Build your code in RELEASE mode
- Modify your config callback to reply to "server_address" with the IP address of Telegram production servers (as found on your API development tools)
After
ConnectAsync()
, are you callingLoginUserIfNeeded()
? <br/>If you don't authenticate as a user (or bot), you have access to a very limited subset of Telegram APIsDid you use
await
with every Client methods? <br/>This library is completely Task-based and you should learn, understand and use the asynchronous model of C# programming before proceeding further.Are you keeping a live reference to the Client instance and dispose it only at the end of your program? <br/>If you create the instance in a submethod and don't store it somewhere permanent, it might be destroyed by the garbage collector at some point. So as long as the client must be running, make sure the reference is stored in a (static) field or somewhere appropriate. <br/>Also, as the Client class inherits
IDisposable
, remember to callclient.Dispose()
when your program ends (or exit ausing
scope).Is your program ending immediately instead of waiting for Updates? <br/>Your program must be running/waiting continuously in order for the background Task to receive and process the Updates. So make sure your main program doesn't end immediately. For a console program, this is typical done by waiting for a key or some close event.
Is every Telegram API call rejected? (typically with an exception message like
AUTH_RESTART
) <br/>The user authentification might have failed at some point (or the user revoked the authorization). It is therefore necessary to go through the authentification again. This can be done by deleting the WTelegram.session file, or at runtime by callingclient.Reset()
Library uses and limitations
This library can be used for any Telegram scenarios including:
- Sequential or parallel automated steps based on API requests/responses
- Real-time monitoring of incoming Updates/Messages
- Download/upload of files/media
- etc...
It has been tested in a Console app, WinForms app, ASP.NET webservice.
Secret chats (end-to-end encryption, PFS) and connection to CDN DCs have not been tested yet.
Please don't use this library for Spam or Scam. Respect Telegram Terms of Service or you might get banned from Telegram servers.
Developers feedbacks are welcome in the Telegram channel @WTelegramClient
If you like this library, please consider a donation. ❤ This will help the project keep going.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- IndexRange (>= 1.0.0)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Formats.Asn1 (>= 5.0.0)
- System.Memory (>= 4.5.4)
- System.Text.Json (>= 5.0.2)
-
net5.0
- No dependencies.
NuGet packages (7)
Showing the top 5 NuGet packages that depend on WTelegramClient:
Package | Downloads |
---|---|
WTelegramClient.Extensions.Updates
Extensions over WtelegramClient For Dealing With Updates |
|
WTelegramBot
Telegram Bot API (local server) library providing more extended features Release Notes: - Bot API 7.11 - renaming of methods without Async suffix |
|
MTProto
A MTProto client library based on wiz0u/WTelegramClient |
|
ProfitSniper.Profitview
Package Description |
|
WTC.Abstractions.Types
Telegram Type Abstractions For WTelegramClient |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on WTelegramClient:
Repository | Stars |
---|---|
yiyungent/KnifeHub
🧰 简单易用的效率工具平台
|
|
DamianMorozov/TgDownloader
Telegram Downloader
|
Version | Downloads | Last updated |
---|---|---|
4.2.3-dev.2 | 67 | 11/2/2024 |
4.2.3-dev.1 | 47 | 11/1/2024 |
4.2.2 | 622 | 10/31/2024 |
4.2.2-dev.7 | 45 | 10/29/2024 |
4.2.2-dev.5 | 120 | 10/24/2024 |
4.2.2-dev.4 | 31 | 10/24/2024 |
4.2.2-dev.3 | 96 | 10/17/2024 |
4.2.2-dev.2 | 48 | 10/15/2024 |
4.2.2-dev.1 | 34 | 10/15/2024 |
4.2.1 | 3,973 | 10/7/2024 |
4.1.11-dev.4 | 43 | 10/7/2024 |
4.1.11-dev.3 | 72 | 9/30/2024 |
4.1.11-dev.2 | 98 | 9/22/2024 |
4.1.11-dev.1 | 56 | 9/21/2024 |
4.1.10 | 2,829 | 9/19/2024 |
4.1.10-dev.3 | 120 | 9/8/2024 |
4.1.10-dev.2 | 62 | 9/7/2024 |
4.1.10-dev.1 | 44 | 9/7/2024 |
4.1.9 | 2,036 | 9/7/2024 |
4.1.9-dev.2 | 58 | 9/6/2024 |
4.1.9-dev.1 | 72 | 9/5/2024 |
4.1.8 | 4,276 | 8/14/2024 |
4.1.7 | 805 | 8/10/2024 |
4.1.7-dev.1 | 57 | 8/10/2024 |
4.1.6 | 1,066 | 7/31/2024 |
4.1.6-dev.1 | 37 | 7/29/2024 |
4.1.5 | 1,925 | 7/20/2024 |
4.1.5-dev.2 | 59 | 7/20/2024 |
4.1.5-dev.1 | 140 | 7/12/2024 |
4.1.4 | 1,496 | 7/7/2024 |
4.1.3 | 320 | 7/6/2024 |
4.1.2 | 517 | 7/2/2024 |
4.1.2-dev.8 | 61 | 7/1/2024 |
4.1.2-dev.7 | 165 | 6/15/2024 |
4.1.2-dev.6 | 53 | 6/15/2024 |
4.1.2-dev.5 | 142 | 6/4/2024 |
4.1.2-dev.4 | 82 | 5/28/2024 |
4.1.2-dev.3 | 55 | 5/27/2024 |
4.1.2-dev.2 | 188 | 5/7/2024 |
4.1.2-dev.1 | 76 | 5/1/2024 |
4.1.1 | 11,539 | 4/28/2024 |
4.1.1-dev.5 | 58 | 4/28/2024 |
4.1.1-dev.2 | 60 | 4/27/2024 |
4.1.1-dev.1 | 56 | 4/27/2024 |
4.0.1 | 1,685 | 4/24/2024 |
4.0.1-dev.6 | 79 | 4/22/2024 |
4.0.1-dev.5 | 70 | 4/18/2024 |
4.0.1-dev.4 | 57 | 4/17/2024 |
4.0.1-dev.3 | 72 | 4/16/2024 |
4.0.1-dev.2 | 69 | 4/14/2024 |
4.0.1-dev.1 | 68 | 4/13/2024 |
4.0.0 | 2,548 | 4/5/2024 |
4.0.0-dev.8 | 65 | 4/4/2024 |
4.0.0-dev.7 | 56 | 4/3/2024 |
4.0.0-dev.6 | 93 | 3/30/2024 |
4.0.0-dev.5 | 65 | 3/29/2024 |
4.0.0-dev.4 | 73 | 3/28/2024 |
4.0.0-dev.2 | 80 | 3/26/2024 |
4.0.0-dev.1 | 80 | 3/26/2024 |
3.7.2 | 1,838 | 3/24/2024 |
3.7.2-dev.3 | 71 | 3/23/2024 |
3.7.2-dev.2 | 81 | 3/19/2024 |
3.7.2-dev.1 | 78 | 3/13/2024 |
3.7.1 | 3,443 | 3/8/2024 |
3.6.7-dev.13 | 54 | 3/8/2024 |
3.6.7-dev.12 | 61 | 3/8/2024 |
3.6.7-dev.11 | 53 | 3/8/2024 |
3.6.7-dev.9 | 67 | 3/8/2024 |
3.6.7-dev.8 | 81 | 3/4/2024 |
3.6.7-dev.7 | 125 | 2/25/2024 |
3.6.7-dev.6 | 86 | 2/21/2024 |
3.6.7-dev.5 | 74 | 2/19/2024 |
3.6.7-dev.4 | 76 | 2/18/2024 |
3.6.7-dev.3 | 72 | 2/18/2024 |
3.6.7-dev.1 | 56 | 2/18/2024 |
3.6.6 | 2,687 | 2/1/2024 |
3.6.5 | 3,005 | 1/18/2024 |
3.6.4 | 584 | 1/16/2024 |
3.6.4-dev.2 | 69 | 1/16/2024 |
3.6.4-dev.1 | 65 | 1/15/2024 |
3.6.3 | 4,652 | 12/31/2023 |
3.6.3-dev.1 | 82 | 12/31/2023 |
3.6.2 | 1,410 | 12/23/2023 |
3.6.2-dev.2 | 77 | 12/23/2023 |
3.6.2-dev.1 | 105 | 12/17/2023 |
3.6.1 | 2,980 | 11/30/2023 |
3.6.1-dev.7 | 68 | 11/30/2023 |
3.6.1-dev.6 | 78 | 11/29/2023 |
3.6.1-dev.2 | 95 | 11/25/2023 |
3.6.1-dev.1 | 156 | 11/17/2023 |
3.5.10-dev.1 | 109 | 11/11/2023 |
3.5.9 | 2,797 | 11/6/2023 |
3.5.8 | 1,571 | 10/28/2023 |
3.5.8-dev.5 | 81 | 10/28/2023 |
3.5.8-dev.4 | 133 | 10/24/2023 |
3.5.8-dev.3 | 81 | 10/24/2023 |
3.5.8-dev.2 | 110 | 10/19/2023 |
3.5.8-dev.1 | 114 | 10/9/2023 |
3.5.7 | 2,483 | 10/4/2023 |
3.5.6 | 1,422 | 9/22/2023 |
3.5.5 | 1,083 | 9/18/2023 |
3.5.5-dev.1 | 68 | 9/18/2023 |
3.5.4 | 3,061 | 9/6/2023 |
3.5.4-dev.2 | 84 | 9/6/2023 |
3.5.3 | 7,973 | 7/21/2023 |
3.5.2-dev.21 | 88 | 7/21/2023 |
3.5.2-dev.20 | 177 | 7/7/2023 |
3.5.2-dev.19 | 102 | 7/6/2023 |
3.5.2-dev.16 | 88 | 7/5/2023 |
3.5.2-dev.15 | 136 | 6/27/2023 |
3.5.2-dev.3 | 901 | 5/18/2023 |
3.5.2-dev.1 | 82 | 5/17/2023 |
3.5.1 | 24,511 | 5/17/2023 |
3.5.1-dev.4 | 85 | 5/17/2023 |
3.5.1-dev.3 | 477 | 5/9/2023 |
3.5.1-dev.2 | 148 | 5/5/2023 |
3.5.1-dev.1 | 103 | 5/2/2023 |
3.4.3-dev.4 | 90 | 5/1/2023 |
3.4.3-dev.3 | 98 | 4/29/2023 |
3.4.3-dev.2 | 177 | 4/25/2023 |
3.4.3-dev.1 | 113 | 4/25/2023 |
3.4.2 | 4,698 | 4/24/2023 |
3.4.2-dev.2 | 85 | 4/24/2023 |
3.4.2-dev.1 | 100 | 4/23/2023 |
3.4.1 | 1,080 | 4/21/2023 |
3.4.1-dev.5 | 83 | 4/21/2023 |
3.4.1-dev.4 | 164 | 4/9/2023 |
3.4.1-dev.2 | 89 | 4/8/2023 |
3.4.1-dev.1 | 112 | 4/2/2023 |
3.3.4-dev.1 | 99 | 4/1/2023 |
3.3.3 | 2,313 | 3/26/2023 |
3.3.3-dev.2 | 109 | 3/26/2023 |
3.3.3-dev.1 | 155 | 3/16/2023 |
3.3.2 | 1,961 | 3/9/2023 |
3.3.2-dev.2 | 92 | 3/9/2023 |
3.3.2-dev.1 | 95 | 3/9/2023 |
3.3.1 | 936 | 3/8/2023 |
3.3.1-dev.1 | 95 | 3/8/2023 |
3.2.3-dev.5 | 199 | 2/26/2023 |
3.2.3-dev.4 | 141 | 2/17/2023 |
3.2.3-dev.3 | 98 | 2/15/2023 |
3.2.3-dev.2 | 102 | 2/14/2023 |
3.2.3-dev.1 | 95 | 2/13/2023 |
3.2.2 | 9,528 | 2/6/2023 |
3.2.2-dev.7 | 110 | 2/5/2023 |
3.2.2-dev.6 | 117 | 2/4/2023 |
3.2.2-dev.5 | 128 | 1/26/2023 |
3.2.2-dev.4 | 174 | 1/12/2023 |
3.2.2-dev.3 | 127 | 1/9/2023 |
3.2.2-dev.2 | 118 | 1/7/2023 |
3.2.2-dev.1 | 123 | 1/6/2023 |
3.2.1 | 3,617 | 12/29/2022 |
3.2.1-dev.2 | 113 | 12/29/2022 |
3.2.1-dev.1 | 108 | 12/29/2022 |
3.1.6-dev.2 | 138 | 12/19/2022 |
3.1.6-dev.1 | 108 | 12/15/2022 |
3.1.5 | 2,406 | 12/7/2022 |
3.1.4-dev.6 | 100 | 12/7/2022 |
3.1.4-dev.5 | 102 | 12/5/2022 |
3.1.4-dev.4 | 118 | 12/2/2022 |
3.1.4-dev.3 | 123 | 11/26/2022 |
3.1.4-dev.2 | 105 | 11/26/2022 |
3.1.4-dev.1 | 105 | 11/26/2022 |
3.1.3 | 2,085 | 11/23/2022 |
3.1.3-dev.5 | 102 | 11/23/2022 |
3.1.3-dev.3 | 109 | 11/20/2022 |
3.1.2 | 1,832 | 11/12/2022 |
3.0.3 | 1,891 | 11/1/2022 |
3.0.2 | 2,073 | 10/26/2022 |
3.0.1 | 1,297 | 10/21/2022 |
3.0.0 | 3,297 | 10/8/2022 |
2.6.4 | 4,362 | 9/14/2022 |
2.6.3 | 1,820 | 9/2/2022 |
2.6.2 | 4,257 | 8/6/2022 |
2.5.2 | 3,954 | 7/1/2022 |
2.5.1 | 19,123 | 6/15/2022 |
2.4.1 | 24,675 | 5/20/2022 |
2.3.3 | 1,690 | 5/14/2022 |
2.3.2 | 1,986 | 5/7/2022 |
2.3.1 | 3,824 | 4/13/2022 |
2.2.1 | 4,844 | 3/28/2022 |
2.1.4 | 1,329 | 3/23/2022 |
2.1.3 | 1,410 | 3/18/2022 |
2.1.2 | 31,297 | 2/27/2022 |
2.1.1 | 3,004 | 2/13/2022 |
2.0.3 | 1,695 | 2/7/2022 |
2.0.2 | 1,185 | 2/4/2022 |
2.0.1 | 1,586 | 1/30/2022 |
2.0.0 | 1,611 | 1/24/2022 |
1.9.4 | 1,391 | 1/19/2022 |
1.9.3 | 1,203 | 1/17/2022 |
1.9.2 | 3,319 | 1/11/2022 |
1.9.1 | 1,211 | 1/3/2022 |
1.8.3 | 1,017 | 12/30/2021 |
1.8.2 | 1,698 | 12/25/2021 |
1.8.1 | 1,101 | 12/21/2021 |
1.7.6 | 1,311 | 12/12/2021 |
1.7.5 | 1,265 | 12/6/2021 |
1.7.4 | 1,570 | 12/1/2021 |
1.7.3 | 2,170 | 11/27/2021 |
1.7.2 | 1,577 | 11/20/2021 |
1.7.1 | 1,016 | 11/10/2021 |
1.6.4 | 1,067 | 11/6/2021 |
1.6.3 | 977 | 11/3/2021 |
1.6.2 | 977 | 10/31/2021 |
1.6.1 | 1,001 | 10/31/2021 |
1.5.1 | 1,016 | 10/25/2021 |
1.4.1 | 963 | 10/20/2021 |
1.3.1 | 951 | 10/19/2021 |
1.3.0 | 1,023 | 10/17/2021 |
1.0.2 | 1,006 | 10/15/2021 |
1.0.1 | 932 | 10/11/2021 |
1.0.0 | 1,081 | 9/30/2021 |
0.9.5 | 1,046 | 9/1/2021 |
0.9.4 | 951 | 8/29/2021 |
0.9.3 | 937 | 8/24/2021 |
0.9.2 | 944 | 8/19/2021 |
0.9.1 | 993 | 8/16/2021 |
0.8.1 | 994 | 8/13/2021 |
0.7.4 | 984 | 8/10/2021 |
0.7.3 | 936 | 8/9/2021 |
0.7.1 | 1,054 | 8/8/2021 |