public async Task <IInputFile> UploadFile(string name, StreamReader reader)
        {
            const long TenMb           = 10 * 1024 * 1024;
            var        isBigFileUpload = reader.BaseStream.Length >= TenMb;

            var file = await GetFile(reader).ConfigureAwait(false);

            var fileParts = GetFileParts(file);

            var partNumber = 0;
            var partsCount = fileParts.Count;
            var fileId     = BitConverter.ToInt64(TlHelpers.GenerateRandomBytes(8), 0);

            while (fileParts.Count != 0)
            {
                var part = fileParts.Dequeue();

                if (isBigFileUpload)
                {
                    await SenderService.SendRequestAsync(
                        new RequestSaveBigFilePart
                    {
                        FileId         = fileId,
                        FilePart       = partNumber,
                        Bytes          = part,
                        FileTotalParts = partsCount
                    }).ConfigureAwait(false);
                }
                else
                {
                    await SenderService.SendRequestAsync(
                        new RequestSaveFilePart
                    {
                        FileId   = fileId,
                        FilePart = partNumber,
                        Bytes    = part
                    }).ConfigureAwait(false);
                }

                partNumber++;
            }

            if (isBigFileUpload)
            {
                return(new TInputFileBig
                {
                    Id = fileId,
                    Name = name,
                    Parts = partsCount
                });
            }

            return(new TInputFile
            {
                Id = fileId,
                Name = name,
                Parts = partsCount,
                Md5Checksum = GetFileHash(file)
            });
        }
        public async Task <IFile> GetFile(IInputFileLocation location, int offset = 0)
        {
            int filePartSize;

            if (location is TInputDocumentFileLocation)
            {
                filePartSize = DownloadDocumentPartSize;
            }
            else
            {
                filePartSize = DownloadPhotoPartSize;
            }

            try
            {
                return(await SenderService.SendRequestAsync(
                           new RequestGetFile
                {
                    Location = location,
                    Limit = filePartSize,
                    Offset = offset
                }).ConfigureAwait(false));
            }
            catch (FileMigrationException ex)
            {
                var exportedAuth = (TExportedAuthorization)await SenderService.SendRequestAsync(
                    new RequestExportAuthorization
                {
                    DcId = ex.Dc
                }).ConfigureAwait(false);

                var authKey       = ClientSettings.Session.AuthKey;
                var timeOffset    = ClientSettings.Session.TimeOffset;
                var serverAddress = ClientSettings.Session.ServerAddress;
                var serverPort    = ClientSettings.Session.Port;

                await ConnectApiService.ReconnectToDcAsync(ex.Dc).ConfigureAwait(false);

                await SenderService.SendRequestAsync(
                    new RequestImportAuthorization
                {
                    Bytes = exportedAuth.Bytes,
                    Id    = exportedAuth.Id
                }).ConfigureAwait(false);

                var result = await GetFile(location, offset).ConfigureAwait(false);

                ClientSettings.Session.AuthKey       = authKey;
                ClientSettings.Session.TimeOffset    = timeOffset;
                ClientSettings.Session.ServerAddress = serverAddress;
                ClientSettings.Session.Port          = serverPort;
                await ConnectApiService.ConnectAsync().ConfigureAwait(false);

                return(result);
            }
        }
Esempio n. 3
0
        public async Task <ICheckedPhone> IsPhoneRegisteredAsync(string phoneNumber)
        {
            Guard.That(phoneNumber, nameof(phoneNumber)).IsNotNullOrWhiteSpace();

            var authCheckPhoneRequest = new RequestCheckPhone
            {
                PhoneNumber = phoneNumber
            };

            return(await SenderService.SendRequestAsync(authCheckPhoneRequest).ConfigureAwait(false));
        }
Esempio n. 4
0
        public async Task <ISentCode> SendCodeRequestAsync(string phoneNumber)
        {
            Guard.That(phoneNumber, nameof(phoneNumber)).IsNotNullOrWhiteSpace();

            var request = new RequestSendCode
            {
                PhoneNumber = phoneNumber,
                ApiId       = ClientSettings.AppId,
                ApiHash     = ClientSettings.AppHash
            };

            return(await SenderService.SendRequestAsync(request).ConfigureAwait(false));
        }
Esempio n. 5
0
        public async Task <TUser> SignUpAsync(string phoneNumber, string phoneCodeHash, string code, string firstName, string lastName)
        {
            var request = new RequestSignUp
            {
                PhoneNumber   = phoneNumber,
                PhoneCode     = code,
                PhoneCodeHash = phoneCodeHash,
                FirstName     = firstName,
                LastName      = lastName
            };
            var result = (TAuthorization)await SenderService.SendRequestAsync(request).ConfigureAwait(false);

            var user = result.User.Cast <TUser>();

            OnUserAuthenticated(user);
            return(user);
        }
Esempio n. 6
0
        public async Task <TUser> MakeAuthAsync(string phoneNumber, string phoneCodeHash, string code)
        {
            Guard.That(phoneNumber, nameof(phoneNumber)).IsNotNullOrWhiteSpace();
            Guard.That(phoneCodeHash, nameof(phoneCodeHash)).IsNotNullOrWhiteSpace();
            Guard.That(code, nameof(code)).IsNotNullOrWhiteSpace();

            var request = new RequestSignIn
            {
                PhoneNumber   = phoneNumber,
                PhoneCodeHash = phoneCodeHash,
                PhoneCode     = code
            };

            var result = (TAuthorization)await SenderService.SendRequestAsync(request).ConfigureAwait(false);

            var user = result.User.Cast <TUser>();

            await OnUserAuthenticated(user).ConfigureAwait(false);

            return(user);
        }
Esempio n. 7
0
        public async Task <ICheckedPhone> IsPhoneRegisteredAsync(string phoneNumber)
        {
            Guard.That(phoneNumber, nameof(phoneNumber)).IsNotNullOrWhiteSpace();

            var authCheckPhoneRequest = new RequestCheckPhone
            {
                PhoneNumber = phoneNumber
            };

            while (true)
            {
                try
                {
                    return(await SenderService.SendRequestAsync(authCheckPhoneRequest).ConfigureAwait(false));
                }
                catch (PhoneMigrationException e)
                {
                    await ConnectApiService.ReconnectToDcAsync(e.Dc).ConfigureAwait(false);
                }
            }
        }
Esempio n. 8
0
        public async Task <TUser> MakeAuthWithPasswordAsync(TPassword password, string passwordStr)
        {
            var passwordBytes = Encoding.UTF8.GetBytes(passwordStr);
            var rv            = password.CurrentSalt.Concat(passwordBytes).Concat(password.CurrentSalt);

            byte[] passwordHash;
            using (var sha = SHA256.Create())
            {
                passwordHash = sha.ComputeHash(rv.ToArray());
            }

            var request = new RequestCheckPassword
            {
                PasswordHash = passwordHash
            };
            var result = (TAuthorization)await SenderService.SendRequestAsync(request).ConfigureAwait(false);

            var user = result.User.As <TUser>();

            await OnUserAuthenticated(user).ConfigureAwait(false);

            return(user);
        }
Esempio n. 9
0
        public async Task <ISentCode> SendCodeRequestAsync(string phoneNumber)
        {
            Guard.That(phoneNumber, nameof(phoneNumber)).IsNotNullOrWhiteSpace();

            var request = new RequestSendCode
            {
                PhoneNumber = phoneNumber,
                ApiId       = ClientSettings.AppId,
                ApiHash     = ClientSettings.AppHash
            };

            while (true)
            {
                try
                {
                    return(await SenderService.SendRequestAsync(request).ConfigureAwait(false));
                }
                catch (PhoneMigrationException ex)
                {
                    await ConnectApiService.ReconnectToDcAsync(ex.Dc).ConfigureAwait(false);
                }
            }
        }
Esempio n. 10
0
 public async Task <IPassword> GetPasswordSetting()
 {
     return(await SenderService.SendRequestAsync(new RequestGetPassword()).ConfigureAwait(false));
 }
Esempio n. 11
0
 public async Task <IPassword> GetPasswordSetting(CancellationToken cancellationToken = default(CancellationToken))
 {
     return(await SenderService.SendRequestAsync(new RequestGetPassword(), cancellationToken).ConfigureAwait(false));
 }