You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.5 KiB
78 lines
1.5 KiB
3 years ago
|
// Package uploader contains uploading files helpers.
|
||
|
package uploader
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
"sync"
|
||
|
|
||
|
"go.uber.org/atomic"
|
||
|
)
|
||
|
|
||
|
// NewUpload creates new Upload struct using given
|
||
|
// name and reader.
|
||
|
func NewUpload(name string, from io.Reader, total int64) *Upload {
|
||
|
return &Upload{
|
||
|
name: name,
|
||
|
totalBytes: total,
|
||
|
from: from,
|
||
|
partSize: -1,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Upload represents Telegram file upload.
|
||
|
type Upload struct {
|
||
|
// Fields which will be set by Uploader.
|
||
|
// File ID for Telegram.
|
||
|
id int64
|
||
|
// Sent parts (in partSize).
|
||
|
sentParts atomic.Int64
|
||
|
|
||
|
// Confirmed uploaded parts.
|
||
|
confirmedParts int
|
||
|
// Confirmed uploaded bytes.
|
||
|
confirmedBytes int64
|
||
|
confirmedMux sync.Mutex
|
||
|
|
||
|
// Total parts.
|
||
|
totalParts int
|
||
|
// Part size of uploader.
|
||
|
partSize int
|
||
|
// Flag to determine class of size of file.
|
||
|
big bool
|
||
|
|
||
|
// Total size (in bytes) of upload.
|
||
|
totalBytes int64 // immutable
|
||
|
// Name of file.
|
||
|
name string // immutable
|
||
|
// Reader of data.
|
||
|
from io.Reader // immutable
|
||
|
}
|
||
|
|
||
|
func (u *Upload) confirmSmall(bytes int) ProgressState {
|
||
|
u.confirmedMux.Lock()
|
||
|
defer u.confirmedMux.Unlock()
|
||
|
|
||
|
u.confirmedParts++
|
||
|
return u.confirmLocked(u.confirmedParts, bytes)
|
||
|
}
|
||
|
|
||
|
func (u *Upload) confirm(part, bytes int) ProgressState {
|
||
|
u.confirmedMux.Lock()
|
||
|
defer u.confirmedMux.Unlock()
|
||
|
|
||
|
return u.confirmLocked(part, bytes)
|
||
|
}
|
||
|
|
||
|
func (u *Upload) confirmLocked(part, bytes int) ProgressState {
|
||
|
u.confirmedBytes += int64(bytes)
|
||
|
|
||
|
return ProgressState{
|
||
|
ID: u.id,
|
||
|
Name: u.name,
|
||
|
Part: part,
|
||
|
PartSize: u.partSize,
|
||
|
Uploaded: u.confirmedBytes,
|
||
|
Total: u.totalBytes,
|
||
|
}
|
||
|
}
|