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