TLsharp

Shytov

Client
Регистрация
11.09.2018
Сообщения
175
Благодарностей
39
Баллы
28
Доброго времени суток ув. Кто работал с библиотекой TLsharp + ZP: подскажите пожалуйста, что делаю не так?
1. Через Visual Studio компилирую скачанные исходник из GitHub в dll. На выходе получаю библиотеки:
  • BigMath.dll
  • Ionic.ZLib.dll
  • TeleSharp.TL.dll
  • TLSharp.Core.dll
2. Добавляю либы в GAC проекта ZP и прописываю их в USING'ах.
2.1 Добавляю либу System.Runtime.dll что бы избежать ошибки "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
3. В кубик C# добавляю код входа в телегу НО без использования async await как описано в этом посте.
Код:
int apiId = Int32.Parse("888888"); // ваш apiID , в примере бредовый
var apiHash = "8888888888888888"; // ваш apiHash , в примере бредовый
var client = new TelegramClient(apiId, apiHash);
var connect = client.ConnectAsync();
// if (connect)
//    project.SendInfoToLog("Успешно подключились!");
var hash = client.SendCodeRequestAsync("+888888888"); // ваш телефон для подтверждения
var code = string.Empty; // код, который приходит в телеграмм чат, он у меня не менялся (в пределах часа по крайней мере)
//-------------------------------------------------------------------------
    // ввод кода от телеги в вызванную форму
    System.Windows.Forms.Form F = new System.Windows.Forms.Form();
    F.Text = "Код от Телеги";
    //создаем текстбокс
    System.Windows.Forms.TextBox textb = new System.Windows.Forms.TextBox();
    //указываем местоположение
    textb.Location = new System.Drawing.Point(50,50);
    // добавляем его на форму
    F.Controls.Add(textb);
    //-------------------------------
    //создаем кнопку
    System.Windows.Forms.Button button = new System.Windows.Forms.Button();
    //задаем имя чекбоксам
    button.Text = "Ввести код";
    //положение в окне
    button.Location = new System.Drawing.Point(25,80);
    //размер кнопочки
    button.Size=new System.Drawing.Size(75, 75);
    //кидаем на форму
    F.Controls.Add(button);
    //описываем событие для клика по кнопке
    button.Click+= delegate(object sender, System.EventArgs e)
    {
        //говорим в какую переменную положить
        code = textb.Text;
            F.Dispose();
    };
    //запускаем форму
    F.ShowDialog();
//-------------------------------------------------------------------------
var user = client.MakeAuthAsync("+88888", hash.ToString(), code);
var result = client.GetContactsAsync();
//find recipient in contacts
user = result.Users
      .Where(x => x.GetType() == typeof (TLUser))
      .Cast<TLUser>()
      .FirstOrDefault(x => x.Phone == "+88888888");
 
//send message
client.SendMessageAsync(new TLInputPeerUser() {UserId = user.Id}, "OUR_MESSAGE");
4. На выходе ловлю ошибки:
Код:
Компиляция кода  Ошибка в действии "CS1061" ""System.Threading.Tasks.Task<TeleSharp.TL.Contacts.TLContacts>" не содержит определение для "Users". Не удалось найти метод  расширения "Users", принимающий первый аргумент типа "System.Threading.Tasks.Task<TeleSharp.TL.Contacts.TLContacts>"  (пропущена директива using или ссылка на сборку?)". [Строка: 42; Cтолбец: 16]
На всякий случай подключал еще либу System.Threading.Tasks.dll - но не помогло.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
В логе же пишет в чем ошибка.
Если ни о чем не говорит, тогда тяжко будет с кодом. Если копипастить, хотя бы без базового понимания что и как, то будет ошибка на ошибке.

НО без использования async await
Т.е. это лишние запчасти, которые можно просто выкинуть?:-)

Начнем по шагам.
"System.Threading.Tasks.Task<TeleSharp.TL.Contacts.TLContacts>" не содержит определение для "Users"
Что это значит? Это значит что метод client.GetContactsAsync() возвращает объект типа Task<TLContacts>. Ключевой момент что возвращается Task. Если интересно что такое идет дальше в угловых скобках, то читать про generic или обобщения по другому.
В ошибке пишет что Task не содержит определение Users. Нет у Task свойства Users. Что есть внутри Task можно посмотреть тут.

Идем дальше.
Не удалось найти метод расширения "Users", принимающий первый аргумент типа "System.Threading.Tasks.Task<TeleSharp.TL.Contacts.TLContacts>"
Что это значит? Это значит что не найден метод расширения с именем Users в который бы можно было пихнуть Task<TLContacts>. Что такое методы расширения.

Если в глубь не залазить, и по простому.
Task после выполнения возвращает результат, который находится в свойстве Result это и есть нужный объект - TLContacts.
await как бы "разворачивает" task и на выходе получаем результат.
Если делать без await, то из task надо вытащить результат, и уже с ним что то делать.
user = result.Users .Where(x => x.GetType() == typeof (TLUser)) .Cast<TLUser>() .FirstOrDefault(x => x.Phone == "+88888888");
C#:
user = result.Result.Users
      .Where(x => x.GetType() == typeof (TLUser))
      .Cast<TLUser>()
      .FirstOrDefault(x => x.Phone == "+88888888");
 
  • Спасибо
Реакции: molotok, pym933 и vrska

vrska

Client
Регистрация
07.02.2010
Сообщения
589
Благодарностей
408
Баллы
63
Приятно, когда кто-то вот так подробно может все объяснить
И обидно, когда все равно ничего не понимаешь
 
  • Спасибо
Реакции: xuroo

Shytov

Client
Регистрация
11.09.2018
Сообщения
175
Благодарностей
39
Баллы
28
Спасибо за пояснения! Вечером буду разбирать.
Понимание есть того что происходит, но нет понимания как это решать. Весь Гугл перерыл.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)