|
|
@ -1,21 +1,21 @@ |
|
|
package main |
|
|
package main |
|
|
|
|
|
|
|
|
import ( |
|
|
import ( |
|
|
"log" |
|
|
|
|
|
"os" |
|
|
|
|
|
"io" |
|
|
|
|
|
"net/http" |
|
|
|
|
|
"fmt" |
|
|
"fmt" |
|
|
"strings" |
|
|
|
|
|
"time" |
|
|
|
|
|
"io/ioutil" |
|
|
|
|
|
"regexp" |
|
|
|
|
|
"github.com/go-telegram-bot-api/telegram-bot-api" |
|
|
"github.com/go-telegram-bot-api/telegram-bot-api" |
|
|
"github.com/spf13/viper" |
|
|
"github.com/spf13/viper" |
|
|
"unicode" |
|
|
"golang.org/x/text/transform" |
|
|
"golang.org/x/text/transform" |
|
|
|
|
|
"golang.org/x/text/unicode/norm" |
|
|
"golang.org/x/text/unicode/norm" |
|
|
"gopkg.in/yaml.v2" |
|
|
"gopkg.in/yaml.v2" |
|
|
|
|
|
"io" |
|
|
|
|
|
"io/ioutil" |
|
|
|
|
|
"log" |
|
|
|
|
|
"net/http" |
|
|
|
|
|
"os" |
|
|
|
|
|
"regexp" |
|
|
|
|
|
"strings" |
|
|
|
|
|
"time" |
|
|
|
|
|
"unicode" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
var chatDB map[string]int64 = make(map[string]int64) |
|
|
var chatDB map[string]int64 = make(map[string]int64) |
|
|
@ -55,7 +55,7 @@ func main() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
target_dir := viper.GetString("TargetDir") |
|
|
target_dir := viper.GetString("TargetDir") |
|
|
if (target_dir == "") { |
|
|
if target_dir == "" { |
|
|
panic("No target directory provided!") |
|
|
panic("No target directory provided!") |
|
|
} |
|
|
} |
|
|
_, err = os.Stat(target_dir) |
|
|
_, err = os.Stat(target_dir) |
|
|
@ -69,11 +69,11 @@ func main() { |
|
|
} |
|
|
} |
|
|
authorized_users := map[string]bool{} |
|
|
authorized_users := map[string]bool{} |
|
|
for _, item := range authorized_users_list { |
|
|
for _, item := range authorized_users_list { |
|
|
authorized_users[item] = true |
|
|
authorized_users[item] = true |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
token := viper.GetString("TelegramToken") |
|
|
token := viper.GetString("TelegramToken") |
|
|
if (token == "") { |
|
|
if token == "" { |
|
|
panic("No Telegram Bot Token provided!") |
|
|
panic("No Telegram Bot Token provided!") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -99,11 +99,11 @@ func main() { |
|
|
text := update.Message.Text |
|
|
text := update.Message.Text |
|
|
username := update.Message.From.UserName |
|
|
username := update.Message.From.UserName |
|
|
|
|
|
|
|
|
if (username == "") { |
|
|
if username == "" { |
|
|
replyToCommandWithMessage(bot, update.Message, viper.GetString("MsgNoUsername")) |
|
|
replyToCommandWithMessage(bot, update.Message, viper.GetString("MsgNoUsername")) |
|
|
continue |
|
|
continue |
|
|
} |
|
|
} |
|
|
if (! authorized_users[username]) { |
|
|
if !authorized_users[username] { |
|
|
log.Printf("[%s] unauthorized user", username) |
|
|
log.Printf("[%s] unauthorized user", username) |
|
|
replyToCommandWithMessage(bot, update.Message, viper.GetString("MsgForbidden")) |
|
|
replyToCommandWithMessage(bot, update.Message, viper.GetString("MsgForbidden")) |
|
|
continue |
|
|
continue |
|
|
@ -239,8 +239,8 @@ func updateChatDB(message *tgbotapi.Message) error { |
|
|
return err |
|
|
return err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
os.MkdirAll(target_dir + "/db/", os.ModePerm) |
|
|
os.MkdirAll(target_dir+"/db/", os.ModePerm) |
|
|
err = ioutil.WriteFile(target_dir + "/db/chatdb.yaml", yamlData, 0644) |
|
|
err = ioutil.WriteFile(target_dir+"/db/chatdb.yaml", yamlData, 0644) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return err |
|
|
return err |
|
|
} |
|
|
} |
|
|
@ -284,7 +284,7 @@ func dispatchMessage(bot *tgbotapi.BotAPI, message *tgbotapi.Message) { |
|
|
func handlePhoto(bot *tgbotapi.BotAPI, message *tgbotapi.Message) error { |
|
|
func handlePhoto(bot *tgbotapi.BotAPI, message *tgbotapi.Message) error { |
|
|
fileId := "" |
|
|
fileId := "" |
|
|
maxWidth := 0 |
|
|
maxWidth := 0 |
|
|
for _, photo := range (*message.Photo) { |
|
|
for _, photo := range *message.Photo { |
|
|
if photo.Width > maxWidth { |
|
|
if photo.Width > maxWidth { |
|
|
fileId = photo.FileID |
|
|
fileId = photo.FileID |
|
|
maxWidth = photo.Width |
|
|
maxWidth = photo.Width |
|
|
@ -299,12 +299,12 @@ func handlePhoto(bot *tgbotapi.BotAPI, message *tgbotapi.Message) error { |
|
|
// parse the message timestamp
|
|
|
// parse the message timestamp
|
|
|
t := time.Unix(int64(message.Date), 0) |
|
|
t := time.Unix(int64(message.Date), 0) |
|
|
chat := [1]map[string]string{{ |
|
|
chat := [1]map[string]string{{ |
|
|
"type": "photo", |
|
|
"type": "photo", |
|
|
"date": t.Format("2006-01-02T15:04:05-0700"), |
|
|
"date": t.Format("2006-01-02T15:04:05-0700"), |
|
|
"username": message.From.UserName, |
|
|
"username": message.From.UserName, |
|
|
"firstname": message.From.FirstName, |
|
|
"firstname": message.From.FirstName, |
|
|
"lastname": message.From.LastName, |
|
|
"lastname": message.From.LastName, |
|
|
"filename": photoFileName, |
|
|
"filename": photoFileName, |
|
|
}} |
|
|
}} |
|
|
|
|
|
|
|
|
yamlData, err := yaml.Marshal(chat) |
|
|
yamlData, err := yaml.Marshal(chat) |
|
|
@ -313,7 +313,7 @@ func handlePhoto(bot *tgbotapi.BotAPI, message *tgbotapi.Message) error { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
target_dir := viper.GetString("TargetDir") |
|
|
target_dir := viper.GetString("TargetDir") |
|
|
return appendToFile(target_dir + "/data/.current/chat.yaml", yamlData) |
|
|
return appendToFile(target_dir+"/data/.current/chat.yaml", yamlData) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func handleVideo(bot *tgbotapi.BotAPI, message *tgbotapi.Message) error { |
|
|
func handleVideo(bot *tgbotapi.BotAPI, message *tgbotapi.Message) error { |
|
|
@ -330,12 +330,12 @@ func handleVideo(bot *tgbotapi.BotAPI, message *tgbotapi.Message) error { |
|
|
// parse the message timestamp
|
|
|
// parse the message timestamp
|
|
|
t := time.Unix(int64(message.Date), 0) |
|
|
t := time.Unix(int64(message.Date), 0) |
|
|
chat := [1]map[string]string{{ |
|
|
chat := [1]map[string]string{{ |
|
|
"type": "video", |
|
|
"type": "video", |
|
|
"date": t.Format("2006-01-02T15:04:05-0700"), |
|
|
"date": t.Format("2006-01-02T15:04:05-0700"), |
|
|
"username": message.From.UserName, |
|
|
"username": message.From.UserName, |
|
|
"firstname": message.From.FirstName, |
|
|
"firstname": message.From.FirstName, |
|
|
"lastname": message.From.LastName, |
|
|
"lastname": message.From.LastName, |
|
|
"filename": videoFileName, |
|
|
"filename": videoFileName, |
|
|
"thumb_filename": thumbFileName, |
|
|
"thumb_filename": thumbFileName, |
|
|
}} |
|
|
}} |
|
|
|
|
|
|
|
|
@ -345,7 +345,7 @@ func handleVideo(bot *tgbotapi.BotAPI, message *tgbotapi.Message) error { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
target_dir := viper.GetString("TargetDir") |
|
|
target_dir := viper.GetString("TargetDir") |
|
|
return appendToFile(target_dir + "/data/.current/chat.yaml", yamlData) |
|
|
return appendToFile(target_dir+"/data/.current/chat.yaml", yamlData) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func getFile(bot *tgbotapi.BotAPI, message *tgbotapi.Message, fileId string) (string, error) { |
|
|
func getFile(bot *tgbotapi.BotAPI, message *tgbotapi.Message, fileId string) (string, error) { |
|
|
@ -356,7 +356,7 @@ func getFile(bot *tgbotapi.BotAPI, message *tgbotapi.Message, fileId string) (st |
|
|
|
|
|
|
|
|
resp, err := http.Get(url) |
|
|
resp, err := http.Get(url) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return "", err |
|
|
return "", err |
|
|
} |
|
|
} |
|
|
defer resp.Body.Close() |
|
|
defer resp.Body.Close() |
|
|
|
|
|
|
|
|
@ -384,7 +384,7 @@ func getFile(bot *tgbotapi.BotAPI, message *tgbotapi.Message, fileId string) (st |
|
|
filename := target_dir + "/data/.current/" + fileId + extension |
|
|
filename := target_dir + "/data/.current/" + fileId + extension |
|
|
out, err := os.Create(filename) |
|
|
out, err := os.Create(filename) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return "", err |
|
|
return "", err |
|
|
} |
|
|
} |
|
|
defer out.Close() |
|
|
defer out.Close() |
|
|
|
|
|
|
|
|
@ -422,7 +422,7 @@ func closeAlbum() error { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
folderName := date.Format("2006-01-02") + "-" + sanitizeAlbumName(metadata["title"]) |
|
|
folderName := date.Format("2006-01-02") + "-" + sanitizeAlbumName(metadata["title"]) |
|
|
err = os.Rename(target_dir + "/data/.current/", target_dir + "/data/" + folderName) |
|
|
err = os.Rename(target_dir+"/data/.current/", target_dir+"/data/"+folderName) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return err |
|
|
return err |
|
|
} |
|
|
} |
|
|
@ -454,14 +454,14 @@ func albumAlreadyOpen() bool { |
|
|
|
|
|
|
|
|
func newAlbum(message *tgbotapi.Message, albumName string) error { |
|
|
func newAlbum(message *tgbotapi.Message, albumName string) error { |
|
|
target_dir := viper.GetString("TargetDir") |
|
|
target_dir := viper.GetString("TargetDir") |
|
|
os.MkdirAll(target_dir + "/data/.current", os.ModePerm) |
|
|
os.MkdirAll(target_dir+"/data/.current", os.ModePerm) |
|
|
|
|
|
|
|
|
metadata := map[string]string{ |
|
|
metadata := map[string]string{ |
|
|
"title": albumName, |
|
|
"title": albumName, |
|
|
"username": message.From.UserName, |
|
|
"username": message.From.UserName, |
|
|
"firstname": message.From.FirstName, |
|
|
"firstname": message.From.FirstName, |
|
|
"lastname": message.From.LastName, |
|
|
"lastname": message.From.LastName, |
|
|
"date": time.Now().Format("2006-01-02T15:04:05-0700"), |
|
|
"date": time.Now().Format("2006-01-02T15:04:05-0700"), |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
yamlData, err := yaml.Marshal(metadata) |
|
|
yamlData, err := yaml.Marshal(metadata) |
|
|
@ -469,7 +469,7 @@ func newAlbum(message *tgbotapi.Message, albumName string) error { |
|
|
return err |
|
|
return err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
err = ioutil.WriteFile(target_dir + "/data/.current/meta.yaml", yamlData, 0644) |
|
|
err = ioutil.WriteFile(target_dir+"/data/.current/meta.yaml", yamlData, 0644) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return err |
|
|
return err |
|
|
} |
|
|
} |
|
|
@ -483,12 +483,12 @@ func addMessageToAlbum(message *tgbotapi.Message) error { |
|
|
// parse the message timestamp
|
|
|
// parse the message timestamp
|
|
|
t := time.Unix(int64(message.Date), 0) |
|
|
t := time.Unix(int64(message.Date), 0) |
|
|
chat := [1]map[string]string{{ |
|
|
chat := [1]map[string]string{{ |
|
|
"type": "text", |
|
|
"type": "text", |
|
|
"date": t.Format("2006-01-02T15:04:05-0700"), |
|
|
"date": t.Format("2006-01-02T15:04:05-0700"), |
|
|
"username": message.From.UserName, |
|
|
"username": message.From.UserName, |
|
|
"firstname": message.From.FirstName, |
|
|
"firstname": message.From.FirstName, |
|
|
"lastname": message.From.LastName, |
|
|
"lastname": message.From.LastName, |
|
|
"message": message.Text, |
|
|
"message": message.Text, |
|
|
}} |
|
|
}} |
|
|
|
|
|
|
|
|
yamlData, err := yaml.Marshal(chat) |
|
|
yamlData, err := yaml.Marshal(chat) |
|
|
@ -496,7 +496,7 @@ func addMessageToAlbum(message *tgbotapi.Message) error { |
|
|
return err |
|
|
return err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return appendToFile(target_dir + "/data/.current/chat.yaml", yamlData) |
|
|
return appendToFile(target_dir+"/data/.current/chat.yaml", yamlData) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func appendToFile(filename string, data []byte) error { |
|
|
func appendToFile(filename string, data []byte) error { |
|
|
@ -513,7 +513,7 @@ func appendToFile(filename string, data []byte) error { |
|
|
|
|
|
|
|
|
func sanitizeAlbumName(albumName string) string { |
|
|
func sanitizeAlbumName(albumName string) string { |
|
|
albumName = strings.ToLower(albumName) |
|
|
albumName = strings.ToLower(albumName) |
|
|
t := transform.Chain(norm.NFD, transform.RemoveFunc(func(r rune) bool { |
|
|
t := transform.Chain(norm.NFD, transform.RemoveFunc(func(r rune) bool { |
|
|
return unicode.Is(unicode.Mn, r) |
|
|
return unicode.Is(unicode.Mn, r) |
|
|
}), norm.NFC) |
|
|
}), norm.NFC) |
|
|
albumName, _, _ = transform.String(t, albumName) |
|
|
albumName, _, _ = transform.String(t, albumName) |
|
|
|