public static async Task <TlFile> GetFile(this ITelegramClient client, TlAbsInputFileLocation location, int filePartSize, int offset = 0) { try { return(await client.SendRequestAsync <TlFile>(new TlRequestGetFile { Location = location, Limit = filePartSize, Offset = offset })); } catch (FileMigrationException ex) { var exportedAuth = await client.SendRequestAsync <TlExportedAuthorization>(new TlRequestExportAuthorization { DcId = ex.Dc }); var clientSettings = client.GetSettings(); Guard.That(clientSettings).IsNotNull(); Guard.That(clientSettings.Session).IsNotNull(); var authKey = clientSettings.Session.AuthKey; var timeOffset = clientSettings.Session.TimeOffset; var serverAddress = clientSettings.Session.ServerAddress; var serverPort = clientSettings.Session.Port; await client.ReconnectToDcAsync(ex.Dc); await client.SendRequestAsync <TlAuthorization>(new TlRequestImportAuthorization { Bytes = exportedAuth.Bytes, Id = exportedAuth.Id }); var result = await client.GetFile(location, filePartSize, offset); clientSettings.Session.AuthKey = authKey; clientSettings.Session.TimeOffset = timeOffset; clientSettings.Session.ServerAddress = serverAddress; clientSettings.Session.Port = serverPort; await client.ConnectAsync(); return(result); } }
private async void Updates_RecieveUpdates(TlAbsUpdates update) { int id = -1; string text = String.Empty; DateTime time = DateTime.Now; switch (update) { case TlUpdateShort _: break; case TlUpdates updates: foreach (var item in updates.Updates.Lists) { switch (item) { case TlUpdateDeleteMessages _: OnUpdateDialogs?.Invoke(); break; case TlUpdateContactLink _: OnUpdateDialogs?.Invoke(); OnUpdateContacts?.Invoke(); break; case TlUpdateNewChannelMessage updateNewChannelMessage: update.MessageInfo(out id, out text, out time); AddNewMessageToUnread(id, text, time); break; case TlUpdateNewMessage updateNewMessage: update.MessageInfo(out id, out text, out time); AddNewMessageToUnread(id, text, time); Directory.CreateDirectory($"{Directory.GetCurrentDirectory()}\\Downloads"); switch ((updateNewMessage.Message as TlMessage).Media) { case TlMessageMediaDocument document: var file = document.Document as TlDocument; var fileName = file.Attributes.Lists.OfType <TlDocumentAttributeFilename>().FirstOrDefault().FileName; int blockNumber = file.Size % 1048576 == 0 ? file.Size / 1048576 : file.Size / 1048576 + 1; List <byte> bytes = new List <byte>(); for (int i = 0; i < blockNumber; i++) { var resFile = await _client.GetFile(new TlInputDocumentFileLocation { Id = file.Id, AccessHash = file.AccessHash, Version = file.Version }, file.Size, i * 1048576); bytes.AddRange(resFile.Bytes); } ConsoleTelegramUI.WriteToFile(bytes.ToArray(), fileName); break; case TlMessageMediaPhoto photo: var filePhoto = photo.Photo as TlPhoto; var photoInfo = filePhoto.Sizes.Lists.OfType <TlPhotoSize>().Last(); var tf = (TlFileLocation)photoInfo.Location; var resFilePhoto = await _client.GetFile(new TlInputFileLocation { LocalId = tf.LocalId, Secret = tf.Secret, VolumeId = tf.VolumeId }, 0); var date = (updateNewMessage.Message as TlMessage).TimeUnixToWindows(true).ToString(); date = date.Replace(':', '-'); string photoName = $"ConsoleTelegram_{date}.png"; ConsoleTelegramUI.WriteToFile(resFilePhoto.Bytes, photoName); break; } break; } } break; case TlUpdateShortMessage _: update.MessageInfo(out id, out text, out time); AddNewMessageToUnread(id, text, time); break; } }