1

If i run this code on console application:

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})");
}

It will prompt interactively for App api_id and api_hash. How can i Authorize user on winforms application?. So that i can input the api_id and api_hash through textbox

Yemight
  • 21
  • 2

1 Answers1

0

Edit: (Oct 2022) Latest version of the library has a simplified config system that makes it more easy to use in WinForms apps.
Please take a look at the example WinForms app provided in the repository that demonstrate how to proceed.

The original answer below is still valid but maybe more complex
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

First, you should read WTelegramClient FAQ #3:

3. How to use the library in a WinForms or WPF application

The library should work without a problem in a GUI application. The difficulty might be in your Config callback when the user must enter the verification code or password, as you can't use Console.ReadLine here.

An easy solution is to call Interaction.InputBox("Enter verification code") instead.
This might require adding a reference (and using) to the Microsoft.VisualBasic assembly.

A more complex solution requires the use of a ManualResetEventSlim that you will wait for in Config callback, and when the user has provided the verification_code through your GUI, you "set" the event to release your Config callback so it can return the code.

Here is an example solution for your Form class with a ManualResetEventSlim and textboxes:

using Microsoft.VisualBasic;
using TL;


        private readonly ManualResetEventSlim _codeReady = new ManualResetEventSlim();
        private WTelegram.Client _client;
        private User _user;

        string Config(string what)
        {
            switch (what)
            {
                case "api_id": return textBoxApiID.Text;
                case "api_hash": return textBoxApiHash.Text;
                case "phone_number": return textBoxPhone.Text;
                case "verification_code":
                    _codeReady.Reset();
                    _codeReady.Wait();
                    return textBoxCode.Text;
                case "password": return Interaction.InputBox("Enter 2FA password");
                default: return null;
            };
        }

        private void textBoxCode_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r') // pressing Return in the textboxCode
            {
                _codeReady.Set();
                e.Handled = true;
            }
        }

        private async void buttonLogin_Click(object sender, EventArgs e)
        {
            buttonLogin.Enabled = false;
            _client = new WTelegram.Client(Config);
            _user = await _client.LoginUserIfNeeded();
            MessageBox.Show("We are now connected as " + _user);
        }

        private async void buttonGetChats_Click(object sender, EventArgs e)
        {
            if (_user == null) { MessageBox.Show("You must complete the login first."); return; }
            var chats = await _client.Messages_GetAllChats(null);
            MessageBox.Show(string.Join("\n", chats.chats.Values.Where(c => c.IsActive)));
        }

Wizou
  • 1,336
  • 13
  • 24