support uploading all other telegram filetypes
This commit is contained in:
parent
d984e3df4c
commit
dd99e2e572
78
NTFServer.go
78
NTFServer.go
@ -139,6 +139,9 @@ func NewNTFServer(configFile string, verbose bool) (*NTFServer, error) {
|
|||||||
log.Fatalf("Couldn't reconnect upstream for '%s': %s", hubNick, err.Error()) // fatal - inconsistent DB is the only possible cause
|
log.Fatalf("Couldn't reconnect upstream for '%s': %s", hubNick, err.Error()) // fatal - inconsistent DB is the only possible cause
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Slight stagger
|
||||||
|
time.Sleep(50 * time.Millisecond)
|
||||||
|
|
||||||
launchedAny = true
|
launchedAny = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,9 +443,80 @@ func (this *NTFServer) HandleGroupMessage(update telegram.Update) error {
|
|||||||
|
|
||||||
userID := int64(update.Message.From.ID)
|
userID := int64(update.Message.From.ID)
|
||||||
|
|
||||||
if update.Message.Sticker != nil && this.contentedMaxBytes > 0 {
|
if this.contentedMaxBytes > 0 {
|
||||||
|
// File upload types
|
||||||
|
|
||||||
|
// Audio
|
||||||
|
if update.Message.Audio != nil {
|
||||||
|
go func() {
|
||||||
|
conUrl, err := this.ContentedUploadSync(update.Message.Audio.FileID, int64(update.Message.Audio.FileSize)) // no thumbnail fallback available
|
||||||
|
this.uploadAsyncComplete(userID, "audio", conUrl, err,
|
||||||
|
fmt.Sprintf("Audio '%s' duration %ds: %s", update.Message.Audio.Title, update.Message.Audio.Duration, update.Message.Caption))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Document
|
||||||
|
if update.Message.Document != nil {
|
||||||
|
go func() {
|
||||||
|
conUrl, err := this.ContentedUploadFallbackSync(update.Message.Document.FileID, int64(update.Message.Document.FileSize), update.Message.Document.Thumbnail)
|
||||||
|
this.uploadAsyncComplete(userID, "document", conUrl, err, update.Message.Caption)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Photo
|
||||||
|
if update.Message.Photo != nil {
|
||||||
|
go func() {
|
||||||
|
conUrl, err := this.ContentedUploadBestSync(*update.Message.Photo)
|
||||||
|
this.uploadAsyncComplete(userID, "photo", conUrl, err, "")
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
// Sticker
|
// Sticker
|
||||||
go this.uploadStickerWorker(userID, update.Message.Sticker)
|
if update.Message.Sticker != nil {
|
||||||
|
go func() {
|
||||||
|
conUrl, err := this.ContentedUploadFallbackSync(update.Message.Sticker.FileID, int64(update.Message.Sticker.FileSize), update.Message.Sticker.Thumbnail)
|
||||||
|
this.uploadAsyncComplete(userID, "sticker", conUrl, err, update.Message.Sticker.Emoji+" "+update.Message.Caption)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Video
|
||||||
|
if update.Message.Video != nil {
|
||||||
|
go func() {
|
||||||
|
conUrl, err := this.ContentedUploadFallbackSync(update.Message.Video.FileID, int64(update.Message.Video.FileSize), update.Message.Video.Thumbnail)
|
||||||
|
this.uploadAsyncComplete(userID, "video", conUrl, err, update.Message.Caption)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
// VideoNote
|
||||||
|
if update.Message.VideoNote != nil {
|
||||||
|
go func() {
|
||||||
|
conUrl, err := this.ContentedUploadFallbackSync(update.Message.VideoNote.FileID, int64(update.Message.VideoNote.FileSize), update.Message.VideoNote.Thumbnail)
|
||||||
|
this.uploadAsyncComplete(userID, "videonote", conUrl, err, update.Message.Caption)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Voice
|
||||||
|
if update.Message.Voice != nil {
|
||||||
|
go func() {
|
||||||
|
conUrl, err := this.ContentedUploadSync(update.Message.Voice.FileID, int64(update.Message.Voice.FileSize)) // no thumbnail fallback available
|
||||||
|
this.uploadAsyncComplete(userID, "voiceclip", conUrl, err, fmt.Sprintf("Voice clip (duration %ds): ", update.Message.Voice.Duration))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if update.Message.Location != nil {
|
||||||
|
return this.HubSay(userID, fmt.Sprintf(
|
||||||
|
"Latitude %f Longitude %f %s",
|
||||||
|
update.Message.Location.Latitude, update.Message.Location.Longitude, update.Message.Caption))
|
||||||
|
}
|
||||||
|
|
||||||
|
if update.Message.Venue != nil {
|
||||||
|
return this.HubSay(userID, fmt.Sprintf(
|
||||||
|
"Venue %s - Address %s (Lat %f Long %f) %s",
|
||||||
|
update.Message.Venue.Title, update.Message.Venue.Address,
|
||||||
|
update.Message.Venue.Location.Latitude, update.Message.Venue.Location.Longitude,
|
||||||
|
update.Message.Caption))
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(update.Message.Text) > 0 {
|
if len(update.Message.Text) > 0 {
|
||||||
|
49
contented.go
49
contented.go
@ -5,12 +5,14 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"html"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"mime"
|
"mime"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
telegram "github.com/go-telegram-bot-api/telegram-bot-api"
|
telegram "github.com/go-telegram-bot-api/telegram-bot-api"
|
||||||
@ -21,24 +23,45 @@ func (this *NTFServer) ContentedEnabled() bool {
|
|||||||
return this.contentedMaxBytes > 0
|
return this.contentedMaxBytes > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *NTFServer) ContentedUploadFromSync(main *telegram.File, thumbs *[]telegram.PhotoSize) (string, error) {
|
func (this *NTFServer) uploadAsyncComplete(userID int64, typeName string, conUrl string, err error, textPrefix string) {
|
||||||
|
if err != nil {
|
||||||
// If file fits under size limit, take it
|
log.Printf("Upload failed for %s: %s", typeName, err.Error())
|
||||||
if int64(main.FileSize) < this.contentedMaxBytes {
|
this.callOnMainThread <- func() {
|
||||||
return this.ContentedUploadSync(main.FileID, int64(main.FileSize))
|
this.GroupChatSayHTML("<i>Can't upload " + typeName + " for native users: " + html.EscapeString(err.Error()) + "</i>")
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, we'll settle for the highest-res thumbnail we can take
|
// Upload success
|
||||||
|
if len(textPrefix) > 0 {
|
||||||
if thumbs == nil || len(*thumbs) == 0 {
|
textPrefix = strings.Trim(textPrefix, ` `) + " "
|
||||||
return "", errors.New("The file was too large for the image host server (and no smaller thumbnail is available)")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
this.callOnMainThread <- func() {
|
||||||
|
// n.b. this will fail if the user has disconnected by the time the upload completed
|
||||||
|
this.HubSay(userID, textPrefix+conUrl)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NTFServer) ContentedUploadFallbackSync(FileID string, FileSize int64, thumb *telegram.PhotoSize) (string, error) {
|
||||||
|
if FileSize < this.contentedMaxBytes {
|
||||||
|
return this.ContentedUploadSync(FileID, FileSize)
|
||||||
|
|
||||||
|
} else if thumb != nil && int64(thumb.FileSize) < this.contentedMaxBytes {
|
||||||
|
return this.ContentedUploadSync(thumb.FileID, int64(thumb.FileSize))
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return "", errors.New("File too big and/or bad thumbnail")
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NTFServer) ContentedUploadBestSync(thumbs []telegram.PhotoSize) (string, error) {
|
||||||
|
|
||||||
bestKnownIdx := -1
|
bestKnownIdx := -1
|
||||||
bestKnownMpx := int64(-1)
|
bestKnownMpx := int64(-1)
|
||||||
for idx, img := range *thumbs {
|
for idx, img := range thumbs {
|
||||||
if int64(img.FileSize) > this.contentedMaxBytes {
|
if int64(img.FileSize) > this.contentedMaxBytes {
|
||||||
continue // no good
|
continue // no good
|
||||||
}
|
}
|
||||||
@ -52,10 +75,10 @@ func (this *NTFServer) ContentedUploadFromSync(main *telegram.File, thumbs *[]te
|
|||||||
}
|
}
|
||||||
|
|
||||||
if bestKnownIdx == -1 {
|
if bestKnownIdx == -1 {
|
||||||
return "", errors.New("The file was too large for the image host server (and no smaller thumbnail is available)")
|
return "", errors.New("The file was too large for the image host server")
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.ContentedUploadSync((*thumbs)[bestKnownIdx].FileID, int64((*thumbs)[bestKnownIdx].FileSize))
|
return this.ContentedUploadSync(thumbs[bestKnownIdx].FileID, int64(thumbs[bestKnownIdx].FileSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *NTFServer) ContentedUploadSync(fileId string, expectSizeBytes int64) (string, error) {
|
func (this *NTFServer) ContentedUploadSync(fileId string, expectSizeBytes int64) (string, error) {
|
||||||
|
43
upload.go
43
upload.go
@ -1,43 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"html"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
telegram "github.com/go-telegram-bot-api/telegram-bot-api"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (this *NTFServer) uploadStickerWorker(userID int64, s *telegram.Sticker) {
|
|
||||||
var conUrl string
|
|
||||||
var err error
|
|
||||||
|
|
||||||
if int64(s.FileSize) < this.contentedMaxBytes {
|
|
||||||
conUrl, err = this.ContentedUploadSync(s.FileID, int64(s.FileSize))
|
|
||||||
|
|
||||||
} else if s.Thumbnail != nil && int64(s.Thumbnail.FileSize) < this.contentedMaxBytes {
|
|
||||||
conUrl, err = this.ContentedUploadSync(s.Thumbnail.FileID, int64(s.Thumbnail.FileSize))
|
|
||||||
|
|
||||||
} else {
|
|
||||||
err = errors.New("File too big and/or bad thumbnail")
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Sticker upload failed: %s", err.Error())
|
|
||||||
this.callOnMainThread <- func() {
|
|
||||||
this.GroupChatSayHTML("<i>Can't upload sticker for native users: " + html.EscapeString(err.Error()) + "</i>")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sticker upload success
|
|
||||||
this.callOnMainThread <- func() {
|
|
||||||
// n.b. this will fail if the user has disconnected by the time the upload completed
|
|
||||||
|
|
||||||
this.HubSay(userID, s.Emoji+" "+conUrl)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user