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

// 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,
}
}