TLsharp

  • Автор темы Автор темы Shytov
  • Дата начала Дата начала

Shytov

Client
Регистрация
11.09.2018
Сообщения
172
Реакции
40
Баллы
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 - но не помогло.
 
В логе же пишет в чем ошибка.
Если ни о чем не говорит, тогда тяжко будет с кодом. Если копипастить, хотя бы без базового понимания что и как, то будет ошибка на ошибке.

НО без использования 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
Приятно, когда кто-то вот так подробно может все объяснить
И обидно, когда все равно ничего не понимаешь
 
  • Спасибо
Реакции: xuroo
Спасибо за пояснения! Вечером буду разбирать.
Понимание есть того что происходит, но нет понимания как это решать. Весь Гугл перерыл.
 

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