2021-10-17 03:22:49 +02:00
## Example programs using WTelegramClient
2022-02-14 15:17:15 +01:00
For these examples to work as a fully-functional Program.cs, be sure to start with these lines:
2021-10-17 03:22:49 +02:00
```csharp
using System;
using System.Linq;
using TL;
2022-02-14 15:17:15 +01:00
using var client = new WTelegram.Client(Environment.GetEnvironmentVariable);
var myself = await client.LoginUserIfNeeded();
2021-10-17 03:22:49 +02:00
```
2022-02-14 15:17:15 +01:00
In this case, environment variables are used for configuration so make sure to
2021-12-01 15:50:35 +01:00
go to your **Project Properties > Debug > Environment variables**
and add at least these variables with adequate value: **api_id, api_hash, phone_number**
2021-10-17 03:22:49 +02:00
2021-12-01 15:50:35 +01:00
Remember that these are just simple example codes that you should adjust to your needs.
In real production code, you might want to properly test the success of each operation or handle exceptions.
2021-10-17 03:22:49 +02:00
2022-04-01 21:48:28 +02:00
ℹ ️ WTelegramClient covers 100% of Telegram Client API, much more than the examples below: check the [full API methods list ](https://corefork.telegram.org/methods )!
2022-02-11 02:43:48 +01:00
More examples can also be found in answers to [StackOverflow questions ](https://stackoverflow.com/questions/tagged/wtelegramclient ).
2021-12-07 02:32:19 +01:00
< a name = "msg-by-name" > < / a >
2021-10-17 03:22:49 +02:00
### Send a message to someone by @username
```csharp
2022-04-13 15:53:06 +02:00
var resolved = await client.Contacts_ResolveUsername("MyEch0_Bot"); // username without the @
await client.SendMessageAsync(resolved, "/start");
2021-10-17 03:22:49 +02:00
```
2021-12-07 02:32:19 +01:00
*Note: This also works if the @username points to a channel/group, but you must already have joined that channel before posting there.
If the username is invalid/unused, the API call raises an exception.*
2021-10-31 02:40:10 +01:00
2021-12-07 02:32:19 +01:00
< a name = "msg-by-phone" > < / a >
2021-10-17 03:22:49 +02:00
### Send a message to someone by phone number
```csharp
2021-10-22 15:26:46 +02:00
var contacts = await client.Contacts_ImportContacts(new[] { new InputPhoneContact { phone = "+PHONENUMBER" } });
2021-10-22 19:33:17 +02:00
if (contacts.imported.Length > 0)
await client.SendMessageAsync(contacts.users[contacts.imported[0].user_id], "Hello!");
2021-10-17 03:22:49 +02:00
```
2021-10-20 19:12:50 +02:00
*Note: To prevent spam, Telegram may restrict your ability to add new phone numbers.*
2021-12-07 02:32:19 +01:00
< a name = "markdown" > < / a >
2022-01-12 02:54:59 +01:00
< a name = "html" > < / a >
2022-03-30 15:17:28 +02:00
### Send an HTML/Markdown formatted message to ourself (Saved Messages)
2021-10-31 02:40:10 +01:00
```csharp
2022-01-12 02:54:59 +01:00
// HTML-formatted text:
2022-03-30 15:17:28 +02:00
var text = $"Hello < u > dear < b > {HtmlText.Escape(myself.first_name)}</ b ></ u > \n" +
2022-01-12 02:54:59 +01:00
"Enjoy this < code > userbot</ code > written with < a href = \"https://github.com/wiz0u/WTelegramClient \"> WTelegramClient</ a > ";
2022-03-30 15:17:28 +02:00
var entities = client.HtmlToEntities(ref text);
var sent = await client.SendMessageAsync(InputPeer.Self, text, entities: entities);
// if you need to convert a Message to HTML: (for easier storage)
text = client.EntitiesToHtml(sent.message, sent.entities);
// Markdown-style text:
var text2 = $"Hello __dear *{Markdown.Escape(myself.first_name)}*__ \n" +
"Enjoy this `userbot` written with [WTelegramClient ](https://github.com/wiz0u/WTelegramClient )";
var entities2 = client.MarkdownToEntities(ref text2);
var sent2 = await client.SendMessageAsync(InputPeer.Self, text2, entities: entities2);
// if you need to convert a Message to Markdown: (for easier storage)
text2 = client.EntitiesToMarkdown(sent2.message, sent2.entities);
2021-10-31 02:40:10 +01:00
```
2022-01-12 02:54:59 +01:00
See [MarkdownV2 formatting style ](https://core.telegram.org/bots/api/#markdownv2-style ) and [HTML formatting style ](https://core.telegram.org/bots/api/#html-style ) for details.
2021-12-07 02:32:19 +01:00
*Note: For the `tg://user?id=` notation to work, that user's access hash must have been collected first ([see below](#collect-access-hash))*
2021-10-31 02:40:10 +01:00
2021-12-23 01:38:59 +01:00
< a name = "fun" > < / a >
2021-12-25 03:20:22 +01:00
### Fun with stickers, GIFs, dice, and animated emojies
2021-11-14 15:35:41 +01:00
```csharp
2021-12-23 01:38:59 +01:00
// • List all stickerSets the user has added to his account
2022-02-13 02:50:10 +01:00
var allStickers = await client.Messages_GetAllStickers();
2021-12-23 01:38:59 +01:00
foreach (var stickerSet in allStickers.sets)
Console.WriteLine($"Pack {stickerSet.short_name} contains {stickerSet.count} stickers");
2022-02-13 02:50:10 +01:00
//if you need details on each: var sticketSetDetails = await client.Messages_GetStickerSet(stickerSet);
2021-12-23 01:38:59 +01:00
// • Send a random sticker from the user's favorites stickers
2022-02-13 02:50:10 +01:00
var favedStickers = await client.Messages_GetFavedStickers();
2022-02-14 15:17:15 +01:00
var stickerDoc = favedStickers.stickers[new Random().Next(favedStickers.stickers.Length)];
2021-12-23 01:38:59 +01:00
await client.SendMessageAsync(InputPeer.Self, null, new InputMediaDocument { id = stickerDoc });
// • Send a specific sticker given the stickerset shortname and emoticon
2022-02-13 02:50:10 +01:00
var friendlyPanda = await client.Messages_GetStickerSet(new InputStickerSetShortName { short_name = "Friendly_Panda" });
2021-12-23 01:38:59 +01:00
var laughId = friendlyPanda.packs.First(p => p.emoticon == "😂").documents[0];
var laughDoc = friendlyPanda.documents.First(d => d.ID == laughId);
await client.SendMessageAsync(InputPeer.Self, null, new InputMediaDocument { id = laughDoc });
2021-12-25 03:20:22 +01:00
// • Send a GIF from an internet URL
await client.SendMessageAsync(InputPeer.Self, null, new InputMediaDocumentExternal
{ url = "https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif" });
// • Send a GIF stored on the computer (you can save inputFile for later reuse)
var inputFile = await client.UploadFileAsync(@"C:\Pictures\Rotating_earth_(large).gif");
await client.SendMediaAsync(InputPeer.Self, null, inputFile);
// • Send a random dice/game-of-chance effect from the list of available "dices", see https://core.telegram.org/api/dice
var appConfig = await client.Help_GetAppConfig();
var emojies_send_dice = appConfig["emojies_send_dice"] as string[];
2022-02-14 15:17:15 +01:00
var dice_emoji = emojies_send_dice[new Random().Next(emojies_send_dice.Length)];
2021-12-25 03:20:22 +01:00
var diceMsg = await client.SendMessageAsync(InputPeer.Self, null, new InputMediaDice { emoticon = dice_emoji });
Console.WriteLine("Dice result:" + ((MessageMediaDice)diceMsg.media).value);
2021-12-23 01:38:59 +01:00
// • Send an animated emoji with full-screen animation, see https://core.telegram.org/api/animated-emojis#emoji-reactions
// Please note that on Telegram Desktop, you won't view the effect from the sender user's point of view
// You can view the effect if you're on Telegram Android, or if you're the receiving user (instead of Self)
var msg = await client.SendMessageAsync(InputPeer.Self, "🎉");
await Task.Delay(5000); // wait for classic animation to finish
await client.SendMessageAsync(InputPeer.Self, "and now, full-screen animation on the above emoji");
// trigger the full-screen animation,
var typing = await client.Messages_SetTyping(InputPeer.Self, new SendMessageEmojiInteraction {
emoticon = "🎉", msg_id = msg.id,
interaction = new DataJSON { data = @"{""v"":1,""a"":[{""t"":0.0,""i"":1}]}" }
});
await Task.Delay(5000);
2021-11-14 15:35:41 +01:00
```
2021-12-07 02:32:19 +01:00
< a name = "list-chats" > < / a >
2021-10-20 00:24:50 +02:00
### List all chats (groups/channels) the user is in and send a message to one
2021-10-20 13:08:10 +02:00
```csharp
2022-02-13 02:50:10 +01:00
var chats = await client.Messages_GetAllChats();
2021-10-20 19:12:50 +02:00
foreach (var (id, chat) in chats.chats)
2021-10-22 15:26:46 +02:00
if (chat.IsActive)
Console.WriteLine($"{id} : {chat}");
2021-10-20 13:08:10 +02:00
Console.Write("Choose a chat ID to send a message to: ");
2021-10-20 19:12:50 +02:00
long chatId = long.Parse(Console.ReadLine());
await client.SendMessageAsync(chats.chats[chatId], "Hello, World");
2021-10-20 13:08:10 +02:00
```
2021-12-26 18:28:10 +01:00
Notes:
2022-02-27 22:06:13 +01:00
- This list does not include discussions with other users. For this, you need to use [Messages_GetAllDialogs ](#list-dialogs ).
2021-12-26 18:28:10 +01:00
- The list returned by Messages_GetAllChats contains the `access_hash` for those chats. Read [FAQ #4 ](FAQ.MD#access-hash ) about this.
- If a small private chat group has been migrated to a supergroup, you may find both the old `Chat` and a `Channel` with different IDs in the `chats.chats` result,
but the old `Chat` will be marked with flag [deactivated] and should not be used anymore. See [Terminology in ReadMe ](README.md#terminology ).
- You can find a longer version of this method call in [Examples/Program_GetAllChats.cs ](Examples/Program_GetAllChats.cs )
2021-10-17 03:22:49 +02:00
2021-12-07 02:32:19 +01:00
< a name = "schedule-msg" > < / a >
2021-10-17 03:22:49 +02:00
### Schedule a message to be sent to a chat
```csharp
2022-02-13 02:50:10 +01:00
var chats = await client.Messages_GetAllChats();
2021-10-20 19:12:50 +02:00
InputPeer peer = chats.chats[1234567890]; // the chat we want
2021-10-17 03:22:49 +02:00
DateTime when = DateTime.UtcNow.AddMinutes(3);
await client.SendMessageAsync(peer, "This will be posted in 3 minutes", schedule_date: when);
```
2021-12-07 02:32:19 +01:00
< a name = "upload" > < / a >
2021-10-17 03:22:49 +02:00
### Upload a media file and post it with caption to a chat
```csharp
2021-12-26 18:28:10 +01:00
const int ChatId = 1234567890; // the chat we want
2021-10-17 03:22:49 +02:00
const string Filepath = @"C:\...\photo.jpg";
2022-02-13 02:50:10 +01:00
var chats = await client.Messages_GetAllChats();
2021-12-26 18:28:10 +01:00
InputPeer peer = chats.chats[ChatId];
2021-10-17 03:22:49 +02:00
var inputFile = await client.UploadFileAsync(Filepath);
await client.SendMediaAsync(peer, "Here is the photo", inputFile);
```
2021-12-07 02:32:19 +01:00
2022-01-24 22:52:18 +01:00
< a name = "album" > < / a >
### Send a grouped media album using photos from various sources
```csharp
// Photo 1 already on Telegram: latest photo found in the user's Saved Messages
2022-02-13 02:50:10 +01:00
var history = await client.Messages_GetHistory(InputPeer.Self);
2022-01-24 22:52:18 +01:00
PhotoBase photoFromTelegram = history.Messages.OfType< Message > ().Select(m => m.media).OfType< MessageMediaPhoto > ().First().photo;
// Photo 2 uploaded now from our computer:
var uploadedFile = await client.UploadFileAsync(@"C:\Pictures\flower.jpg");
// Photo 3 specified by external url:
const string photoUrl = "https://picsum.photos/310/200.jpg";
var inputMedias = new InputMedia[]
{
photoFromTelegram, // PhotoBase has implicit conversion to InputMediaPhoto
new InputMediaUploadedPhoto { file = uploadedFile },
new InputMediaPhotoExternal() { url = photoUrl },
};
await client.SendAlbumAsync(InputPeer.Self, inputMedias, "My first album");
```
*Note: Don't mix Photos and file Documents in your album, it doesn't work well*
2021-12-26 18:28:10 +01:00
< a name = "list-dialogs" > < / a >
2021-10-17 03:22:49 +02:00
### List all dialogs (chats/groups/channels/user chat) the user is in
```csharp
2022-02-27 22:06:13 +01:00
var dialogs = await client.Messages_GetAllDialogs();
foreach (var dialog in dialogs.dialogs)
switch (dialogs.UserOrChat(dialog))
{
case User user when user.IsActive: Console.WriteLine("User " + user); break;
case ChatBase chat when chat.IsActive: Console.WriteLine(chat); break;
}
2021-10-17 03:22:49 +02:00
```
2022-02-27 22:06:13 +01:00
*Note: the lists returned by Messages_GetAllDialogs contains the `access_hash` for those chats and users.*
2021-10-17 03:22:49 +02:00
See also the `Main` method in [Examples/Program_ListenUpdates.cs ](Examples/Program_ListenUpdates.cs ).
2021-12-07 02:32:19 +01:00
< a name = "list-members" > < / a >
2021-10-17 03:22:49 +02:00
### Get all members from a chat
2022-02-14 15:17:15 +01:00
For a simple Chat: *(see Terminology in [ReadMe](README.md#terminology))*
2021-10-17 03:22:49 +02:00
```csharp
var chatFull = await client.Messages_GetFullChat(1234567890); // the chat we want
2021-10-22 19:33:17 +02:00
foreach (var (id, user) in chatFull.users)
2021-10-17 03:22:49 +02:00
Console.WriteLine(user);
```
For a Channel/Group:
```csharp
2022-02-13 02:50:10 +01:00
var chats = await client.Messages_GetAllChats();
2021-10-20 19:12:50 +02:00
var channel = (Channel)chats.chats[1234567890]; // the channel we want
2021-10-17 03:22:49 +02:00
for (int offset = 0; ;)
{
2022-02-13 02:50:10 +01:00
var participants = await client.Channels_GetParticipants(channel, null, offset);
2021-10-22 19:33:17 +02:00
foreach (var (id, user) in participants.users)
2021-10-17 03:22:49 +02:00
Console.WriteLine(user);
offset += participants.participants.Length;
if (offset >= participants.count) break;
}
```
2021-12-07 02:32:19 +01:00
For big Channel/Group, Telegram servers might limit the number of members you can obtain with the normal above method.
In this case, you can use this helper method, but it can take several minutes to complete:
```csharp
2022-02-13 02:50:10 +01:00
var chats = await client.Messages_GetAllChats();
2021-12-07 02:32:19 +01:00
var channel = (Channel)chats.chats[1234567890]; // the channel we want
var participants = await client.Channels_GetAllParticipants(channel);
```
2022-01-11 04:14:23 +01:00
< a name = "join-channel" > < / a >
### Join a channel/group by @channelname
```csharp
var resolved = await client.Contacts_ResolveUsername("channelname"); // without the @
if (resolved.Chat is Channel channel)
await client.Channels_JoinChannel(channel);
```
2021-12-22 04:46:34 +01:00
< a name = "add-members" > < / a >
### Add/Invite/Remove someone in a chat
```csharp
2022-02-13 02:50:10 +01:00
var chats = await client.Messages_GetAllChats();
2022-01-07 23:10:18 +01:00
var chat = chats.chats[1234567890]; // the target chat
2021-12-22 04:46:34 +01:00
```
2021-12-24 07:21:02 +01:00
After the above code, once you [have obtained ](https://github.com/wiz0u/WTelegramClient/blob/master/FAQ.md#access-hash ) an `InputUser` or `User` , you can:
2021-12-22 04:46:34 +01:00
```csharp
2021-12-31 08:38:41 +01:00
// • Directly add the user to a Chat/Channel/group:
await client.AddChatUser(chat, user);
2021-12-22 04:46:34 +01:00
// You may get exception USER_PRIVACY_RESTRICTED if the user has denied the right to be added to a chat
// or exception USER_NOT_MUTUAL_CONTACT if the user left the chat previously and you want to add him again
2021-12-30 17:38:07 +01:00
// • Obtain the main invite link for the chat, and send it to the user:
var mcf = await client.GetFullChat(chat);
2021-12-22 04:46:34 +01:00
var invite = (ChatInviteExported)mcf.full_chat.ExportedInvite;
2021-12-24 07:21:02 +01:00
await client.SendMessageAsync(user, "Join our group with this link: " + invite.link);
2021-12-22 04:46:34 +01:00
// • Create a new invite link for the chat/channel, and send it to the user
var invite = (ChatInviteExported)await client.Messages_ExportChatInvite(chat, title: "MyLink");
2021-12-24 07:21:02 +01:00
await client.SendMessageAsync(user, "Join our group with this link: " + invite.link);
2021-12-22 04:46:34 +01:00
// • Revoke then delete that invite link (when you no longer need it)
await client.Messages_EditExportedChatInvite(chat, invite.link, revoked: true);
await client.Messages_DeleteExportedChatInvite(chat, invite.link);
2021-12-31 08:38:41 +01:00
// • Remove the user from a Chat/Channel/Group:
2022-01-07 23:10:18 +01:00
await client.DeleteChatUser(chat, user);
2021-12-22 04:46:34 +01:00
```
2021-12-07 02:32:19 +01:00
< a name = "history" > < / a >
2021-10-17 03:22:49 +02:00
### Get all messages (history) from a chat
```csharp
2022-02-13 02:50:10 +01:00
var chats = await client.Messages_GetAllChats();
2021-10-20 19:12:50 +02:00
InputPeer peer = chats.chats[1234567890]; // the chat we want
2022-02-13 02:50:10 +01:00
for (int offset_id = 0; ;)
2021-10-17 03:22:49 +02:00
{
2022-02-13 02:50:10 +01:00
var messages = await client.Messages_GetHistory(peer, offset_id);
if (messages.Messages.Length == 0) break;
2021-11-09 01:43:27 +01:00
foreach (var msgBase in messages.Messages)
2021-10-17 03:22:49 +02:00
if (msgBase is Message msg)
2021-10-28 04:59:41 +02:00
Console.WriteLine(msg.message);
2022-02-13 02:50:10 +01:00
offset_id = messages.Messages[^1].ID;
2021-10-17 03:22:49 +02:00
}
```
2021-12-07 02:32:19 +01:00
2021-12-16 14:41:43 +01:00
< a name = "contacts" > < / a >
### Retrieve the current user's contacts list
There are two different methods. Here is the simpler one:
```csharp
2022-02-13 02:50:10 +01:00
var contacts = await client.Contacts_GetContacts();
2021-12-16 14:41:43 +01:00
foreach (User contact in contacts.users.Values)
Console.WriteLine($"{contact} {contact.phone}");
```
< a name = "takeout" > < / a >
The second method uses the more complex GDPR export, **takeout session** system.
Here is an example on how to implement it:
```csharp
2021-12-16 14:51:47 +01:00
using TL.Methods; // methods as structures, for Invoke* calls
2021-12-16 14:41:43 +01:00
var takeout = await client.Account_InitTakeoutSession(contacts: true);
var finishTakeout = new Account_FinishTakeoutSession();
try
{
var savedContacts = await client.InvokeWithTakeout(takeout.id, new Contacts_GetSaved());
foreach (SavedPhoneContact contact in savedContacts)
Console.WriteLine($"{contact.first_name} {contact.last_name} {contact.phone}, added on {contact.date}");
finishTakeout.flags = Account_FinishTakeoutSession.Flags.success;
}
finally
{
await client.InvokeWithTakeout(takeout.id, finishTakeout);
}
```
2021-12-07 02:32:19 +01:00
< a name = "updates" > < / a >
2021-10-17 03:22:49 +02:00
### Monitor all Telegram events happening for the user
This is done through the `client.Update` callback event.
2021-12-01 15:50:35 +01:00
2021-10-17 03:22:49 +02:00
See [Examples/Program_ListenUpdates.cs ](Examples/Program_ListenUpdates.cs ).
2021-12-07 02:32:19 +01:00
< a name = "monitor-msg" > < / a >
2021-10-17 03:22:49 +02:00
### Monitor new messages being posted in chats
2021-12-01 15:50:35 +01:00
You have to handle `client.Update` events containing an `UpdateNewMessage` .
2021-10-17 03:22:49 +02:00
See the `DisplayMessage` method in [Examples/Program_ListenUpdates.cs ](Examples/Program_ListenUpdates.cs ).
You can filter specific chats the message are posted in, by looking at the `Message.peer_id` field.
2021-12-07 02:32:19 +01:00
< a name = "download" > < / a >
2022-02-14 15:17:15 +01:00
### Downloading photos, medias, files
2021-10-17 03:22:49 +02:00
2021-12-01 15:50:35 +01:00
This is done using the helper method `client.DownloadFileAsync(file, outputStream)`
2022-02-14 15:17:15 +01:00
that simplify the download of a photo/document/file once you get a reference to its location *(through updates or API calls)* .
2021-12-01 15:50:35 +01:00
2022-02-14 15:17:15 +01:00
See [Examples/Program_DownloadSavedMedia.cs ](Examples/Program_DownloadSavedMedia.cs ) that download all media files you forward to yourself (Saved Messages)
2021-10-17 03:22:49 +02:00
2021-12-07 02:32:19 +01:00
< a name = "collect-access-hash" > < / a >
2021-10-17 03:22:49 +02:00
### Collect Access Hash and save them for later use
2021-12-01 15:50:35 +01:00
You can automate the collection of `access_hash` for the various resources obtained in response to API calls or Update events,
so that you don't have to remember them by yourself or ask the API about them each time.
2021-10-17 03:22:49 +02:00
2021-12-01 15:50:35 +01:00
This is done by activating the experimental `client.CollectAccessHash` system.
2021-10-17 03:22:49 +02:00
See [Examples/Program_CollectAccessHash.cs ](Examples/Program_CollectAccessHash.cs ) for how to enable it, and save/restore them for later use.
2021-10-25 02:40:15 +02:00
2021-12-07 02:32:19 +01:00
< a name = "proxy" > < / a >
2021-10-25 02:40:15 +02:00
### Use a proxy to connect to Telegram
2022-01-03 18:50:16 +01:00
SOCKS/HTTP proxies can be used through the `client.TcpHandler` delegate and a proxy library like [StarkSoftProxy ](https://www.nuget.org/packages/StarkSoftProxy/ ):
2021-10-25 02:40:15 +02:00
```csharp
using var client = new WTelegram.Client(Environment.GetEnvironmentVariable);
client.TcpHandler = async (address, port) =>
{
var proxy = new Socks5ProxyClient(ProxyHost, ProxyPort, ProxyUsername, ProxyPassword);
return proxy.CreateConnection(address, port);
};
2022-02-14 15:17:15 +01:00
var myself = await client.LoginUserIfNeeded();
2021-10-25 02:40:15 +02:00
```
2021-12-07 17:15:25 +01:00
or with [xNetStandard ](https://www.nuget.org/packages/xNetStandard/ ):
```csharp
client.TcpHandler = async (address, port) =>
{
var proxy = xNet.Socks5ProxyClient.Parse("host:port:username:password");
return proxy.CreateConnection(address, port);
};
```
2022-01-03 18:50:16 +01:00
< a name = "mtproxy" > < / a >
2022-04-18 22:07:04 +02:00
MTProxy (MTProto proxy) can be used to prevent ISP blocking Telegram servers, through the `client.MTProxyUrl` property:
2022-01-03 18:50:16 +01:00
```csharp
using var client = new WTelegram.Client(Environment.GetEnvironmentVariable);
client.MTProxyUrl = "http://t.me/proxy?server=...&port=...&secret=...";
2022-02-14 15:17:15 +01:00
var myself = await client.LoginUserIfNeeded();
2022-01-03 18:50:16 +01:00
```
2022-04-18 22:07:04 +02:00
You can find a list of working MTProxies in channels like [@ProxyMTProto ](https://t.me/ProxyMTProto ) or [@MTProxyT ](https://t.me/MTProxyT ) *(right-click the "Connect" buttons)*
If your Telegram client is already connected to such MTPROTO proxy, you can also export its URL by clicking on the shield button  and then ** ⋮** > **Share**
2022-01-03 18:50:16 +01:00
*Note: WTelegramClient always uses transport obfuscation when connecting to Telegram servers, even without MTProxy*
2021-12-07 02:32:19 +01:00
< a name = "logging" > < / a >
2021-11-06 05:22:33 +01:00
### Change logging settings
2021-12-26 18:28:10 +01:00
By default, WTelegramClient logs are displayed on the Console screen.
If you are not in a Console app or don't want the logs on screen, you can redirect them as you prefer:
2021-11-02 01:47:14 +01:00
```csharp
2022-03-20 13:09:25 +01:00
// • Log to VS Output debugging pane in addition (+=) to default Console screen logging:
2021-11-02 01:47:14 +01:00
WTelegram.Helpers.Log += (lvl, str) => System.Diagnostics.Debug.WriteLine(str);
2021-12-30 23:43:00 +01:00
2022-02-24 16:44:27 +01:00
// • Log to file in replacement of default Console screen logging, using this static variable:
2021-11-02 01:47:14 +01:00
static StreamWriter WTelegramLogs = new StreamWriter("WTelegram.log", true, Encoding.UTF8) { AutoFlush = true };
...
WTelegram.Helpers.Log = (lvl, str) => WTelegramLogs.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} [{"TDIWE!"[lvl]}] {str}");
2021-12-30 23:43:00 +01:00
2022-03-20 13:09:25 +01:00
// • In an ASP.NET service, you will typically send logs to an ILogger:
2021-12-26 18:28:10 +01:00
WTelegram.Helpers.Log = (lvl, str) => _logger.Log((LogLevel)lvl, str);
```
2021-12-30 17:38:07 +01:00
< a name = "2FA" > < / a >
### Change 2FA password
```csharp
2022-01-21 19:04:33 +01:00
const string old_password = "password"; // current password if any (unused otherwise)
2021-12-30 17:38:07 +01:00
const string new_password = "new_password"; // or null to disable 2FA
var accountPassword = await client.Account_GetPassword();
var password = accountPassword.current_algo == null ? null : await WTelegram.Client.InputCheckPassword(accountPassword, old_password);
accountPassword.current_algo = null; // makes InputCheckPassword generate a new password
var new_password_hash = new_password == null ? null : await WTelegram.Client.InputCheckPassword(accountPassword, new_password);
await client.Account_UpdatePasswordSettings(password, new Account_PasswordInputSettings
{
flags = Account_PasswordInputSettings.Flags.has_new_algo,
new_password_hash = new_password_hash?.A,
new_algo = accountPassword.new_algo,
2022-02-14 15:17:15 +01:00
hint = "new password hint",
2022-01-21 19:04:33 +01:00
});
2021-12-30 17:38:07 +01:00
```
< a name = "reaction" > < / a >
< a name = "pinned" > < / a >
### Send a message reaction on pinned messages
This code fetches the available reactions in a given chat, and sends the first reaction emoji (usually 👍) on the last 2 pinned messages:
```csharp
2022-02-13 02:50:10 +01:00
var chats = await client.Messages_GetAllChats();
2021-12-30 17:38:07 +01:00
var chat = chats.chats[1234567890]; // the chat we want
var full = await client.GetFullChat(chat);
var reaction = full.full_chat.AvailableReactions[0]; // choose the first available reaction emoji
2022-02-13 02:50:10 +01:00
var messages = await client.Messages_Search< InputMessagesFilterPinned > (chat, limit: 2);
2021-12-30 17:38:07 +01:00
foreach (var msg in messages.Messages)
await client.Messages_SendReaction(chat, msg.ID, reaction);
```
2022-03-28 13:24:37 +02:00
< a name = "database" > < / a > < a name = "sessionStore" > < / a > < a name = "customStore" > < / a >
### Store session data to database or elsewhere, instead of files
If you don't want to store session data into files *(for example if your VPS Hosting doesn't allow that)* , or just for easier management,
you can choose to store the session data somewhere else, like in a database.
2022-03-30 15:17:28 +02:00
The WTelegram.Client constructor takes an optional `sessionStore` parameter to allow storing sessions in an alternate manner.
2022-03-28 13:24:37 +02:00
Use it to pass a custom Stream-derived class that will **read** (first initial call to Length & Read) and **store** (subsequent Writes) session data to database.
You can find an example for such custom session store in [Examples/Program_Heroku.cs ](https://github.com/wiz0u/WTelegramClient/blob/master/Examples/Program_Heroku.cs#L61 )