Browse Source

minor improvements

master
Nicolas Massé 6 years ago
parent
commit
28023979c6
  1. 92
      bot.go
  2. 8
      main.go

92
bot.go

@ -6,6 +6,8 @@ import (
"log" "log"
"net/http" "net/http"
"net/url" "net/url"
"sort"
"strings"
"time" "time"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
@ -37,6 +39,7 @@ type TelegramCommands struct {
NewAlbum string NewAlbum string
Info string Info string
Share string Share string
Browse string
} }
type TelegramMessages struct { type TelegramMessages struct {
@ -94,6 +97,10 @@ func (bot *PhotoBot) ProcessUpdate(update tgbotapi.Update) {
return return
} }
if update.Message.Chat == nil || update.Message.Chat.Type != "private" {
return
}
text := update.Message.Text text := update.Message.Text
username := update.Message.From.UserName username := update.Message.From.UserName
@ -112,6 +119,21 @@ func (bot *PhotoBot) ProcessUpdate(update tgbotapi.Update) {
log.Printf("[%s] cannot update chat db: %s", username, err) log.Printf("[%s] cannot update chat db: %s", username, err)
} }
if update.Message.ReplyToMessage != nil {
// Only deal with forced replies (reply to bot's messages)
if update.Message.ReplyToMessage.From == nil || update.Message.ReplyToMessage.From.UserName != bot.Telegram.API.Self.UserName {
return
}
if update.Message.ReplyToMessage.Text != "" {
if update.Message.ReplyToMessage.Text == bot.Telegram.Messages.MissingAlbumName {
log.Printf("[%s] reply to previous command /%s: %s", username, bot.Telegram.Commands.NewAlbum, text)
bot.handleNewAlbumCommandReply(update.Message)
return
}
}
}
if text != "" { if text != "" {
if update.Message.IsCommand() { if update.Message.IsCommand() {
log.Printf("[%s] command: %s", username, text) log.Printf("[%s] command: %s", username, text)
@ -120,6 +142,8 @@ func (bot *PhotoBot) ProcessUpdate(update tgbotapi.Update) {
bot.handleHelpCommand(update.Message) bot.handleHelpCommand(update.Message)
case bot.Telegram.Commands.Share: case bot.Telegram.Commands.Share:
bot.handleShareCommand(update.Message) bot.handleShareCommand(update.Message)
case bot.Telegram.Commands.Browse:
bot.handleBrowseCommand(update.Message)
case bot.Telegram.Commands.NewAlbum: case bot.Telegram.Commands.NewAlbum:
bot.handleNewAlbumCommand(update.Message) bot.handleNewAlbumCommand(update.Message)
case bot.Telegram.Commands.Info: case bot.Telegram.Commands.Info:
@ -276,27 +300,48 @@ func (bot *PhotoBot) handleHelpCommand(message *tgbotapi.Message) {
} }
func (bot *PhotoBot) handleShareCommand(message *tgbotapi.Message) { func (bot *PhotoBot) handleShareCommand(message *tgbotapi.Message) {
albumList, err := bot.MediaStore.ListAlbums()
if err != nil {
log.Printf("[%s] cannot get album list: %s", message.From.UserName, err)
bot.Telegram.replyToCommandWithMessage(message, bot.Telegram.Messages.ServerError)
return
}
var text strings.Builder
text.WriteString(fmt.Sprintf(bot.Telegram.Messages.SharedAlbum, bot.Telegram.PerAlbumTokenValidity))
text.WriteString("\n")
sort.Sort(sort.Reverse(albumList))
var tokenData TokenData = TokenData{
Timestamp: time.Now(),
Username: message.From.UserName,
}
for _, album := range albumList {
title := album.Title // TODO escape me
id := album.ID
if id == "" {
id = "latest"
title = title + " 🔥"
}
tokenData.Entitlement = id
token := bot.Telegram.TokenGenerator.NewToken(tokenData)
url := fmt.Sprintf("%s/s/%s/%s/album/%s/", bot.Telegram.WebPublicURL, url.PathEscape(message.From.UserName), url.PathEscape(token), url.PathEscape(id))
text.WriteString(fmt.Sprintf("- [%s %s](%s)\n", album.Date.Format("2006-01"), title, url))
}
bot.Telegram.replyWithMarkdownMessage(message, text.String())
}
func (bot *PhotoBot) handleBrowseCommand(message *tgbotapi.Message) {
var tokenData TokenData = TokenData{ var tokenData TokenData = TokenData{
Timestamp: time.Now(), Timestamp: time.Now(),
Username: message.From.UserName, Username: message.From.UserName,
} }
if len(message.Text) < len(bot.Telegram.Commands.Share)+3 {
// Global share // Global share
tokenData.Entitlement = ""
token := bot.Telegram.TokenGenerator.NewToken(tokenData) token := bot.Telegram.TokenGenerator.NewToken(tokenData)
url := fmt.Sprintf("%s/s/%s/%s/album/", bot.Telegram.WebPublicURL, url.PathEscape(message.From.UserName), url.PathEscape(token)) url := fmt.Sprintf("%s/s/%s/%s/album/", bot.Telegram.WebPublicURL, url.PathEscape(message.From.UserName), url.PathEscape(token))
bot.Telegram.replyWithMessage(message, fmt.Sprintf(bot.Telegram.Messages.SharedGlobal, bot.Telegram.GlobalTokenValidity)) bot.Telegram.replyWithMessage(message, fmt.Sprintf(bot.Telegram.Messages.SharedGlobal, bot.Telegram.GlobalTokenValidity))
bot.Telegram.replyWithMessage(message, url) bot.Telegram.replyWithMessage(message, url)
} else {
// Album share
albumName := message.CommandArguments()
tokenData.Entitlement = albumName
token := bot.Telegram.TokenGenerator.NewToken(tokenData)
url := fmt.Sprintf("%s/s/%s/%s/album/%s/", bot.Telegram.WebPublicURL, url.PathEscape(message.From.UserName), url.PathEscape(token), url.PathEscape(albumName))
bot.Telegram.replyWithMessage(message, fmt.Sprintf(bot.Telegram.Messages.SharedAlbum, albumName, bot.Telegram.PerAlbumTokenValidity))
bot.Telegram.replyWithMessage(message, url)
}
} }
func (bot *PhotoBot) handleInfoCommand(message *tgbotapi.Message) { func (bot *PhotoBot) handleInfoCommand(message *tgbotapi.Message) {
@ -315,11 +360,11 @@ func (bot *PhotoBot) handleInfoCommand(message *tgbotapi.Message) {
} }
func (bot *PhotoBot) handleNewAlbumCommand(message *tgbotapi.Message) { func (bot *PhotoBot) handleNewAlbumCommand(message *tgbotapi.Message) {
if len(message.Text) < len(bot.Telegram.Commands.NewAlbum)+3 { bot.Telegram.replyWithForcedReply(message, bot.Telegram.Messages.MissingAlbumName)
bot.Telegram.replyToCommandWithMessage(message, bot.Telegram.Messages.MissingAlbumName)
return
} }
albumName := message.CommandArguments()
func (bot *PhotoBot) handleNewAlbumCommandReply(message *tgbotapi.Message) {
albumName := message.Text
err := bot.MediaStore.NewAlbum(albumName) err := bot.MediaStore.NewAlbum(albumName)
if err != nil { if err != nil {
@ -343,3 +388,20 @@ func (telegram *TelegramBackend) replyWithMessage(message *tgbotapi.Message, tex
_, err := telegram.API.Send(msg) _, err := telegram.API.Send(msg)
return err return err
} }
func (telegram *TelegramBackend) replyWithMarkdownMessage(message *tgbotapi.Message, text string) error {
msg := tgbotapi.NewMessage(message.Chat.ID, text)
msg.ParseMode = tgbotapi.ModeMarkdown
_, err := telegram.API.Send(msg)
return err
}
func (telegram *TelegramBackend) replyWithForcedReply(message *tgbotapi.Message, text string) error {
msg := tgbotapi.NewMessage(message.Chat.ID, text)
msg.ReplyMarkup = tgbotapi.ForceReply{
ForceReply: true,
Selective: true,
}
_, err := telegram.API.Send(msg)
return err
}

8
main.go

@ -26,14 +26,14 @@ func initConfig() {
You can send me your photos and videos. You can send me your photos and videos.
To start an album, use "/newAlbum album name". To start an album, use "/newAlbum".
To get the current album name, use "/info". To get the current album name, use "/info".
To share an album, use "/share album". To share an album, use "/share album".
To share all albums, use "/share". To share all albums, use "/share".
If you are lost, you can get this message again with "/help". If you are lost, you can get this message again with "/help".
Have a nice day!`) Have a nice day!`)
viper.SetDefault("Telegram.Messages.MissingAlbumName", "The album name is missing") viper.SetDefault("Telegram.Messages.MissingAlbumName", "Which title should I give to the new album?")
viper.SetDefault("Telegram.Messages.ServerError", "Server Internal Error") viper.SetDefault("Telegram.Messages.ServerError", "Server Internal Error")
viper.SetDefault("Telegram.Messages.AlbumCreated", "Album created") viper.SetDefault("Telegram.Messages.AlbumCreated", "Album created")
viper.SetDefault("Telegram.Messages.DoNotUnderstand", "Sorry, I did not understand your request.") viper.SetDefault("Telegram.Messages.DoNotUnderstand", "Sorry, I did not understand your request.")
@ -41,7 +41,7 @@ func initConfig() {
viper.SetDefault("Telegram.Messages.InfoNoAlbum", "There is no album started, yet.") viper.SetDefault("Telegram.Messages.InfoNoAlbum", "There is no album started, yet.")
viper.SetDefault("Telegram.Messages.NoUsername", "You need to set your Telegram username first!") viper.SetDefault("Telegram.Messages.NoUsername", "You need to set your Telegram username first!")
viper.SetDefault("Telegram.Messages.ThankYouMedia", "Got it, thanks!") viper.SetDefault("Telegram.Messages.ThankYouMedia", "Got it, thanks!")
viper.SetDefault("Telegram.Messages.SharedAlbum", "The album %s can be reached with the following link. Link is valid for %d days.") viper.SetDefault("Telegram.Messages.SharedAlbum", "Here are the albums and their sharing links. Links are valid for %d days.")
viper.SetDefault("Telegram.Messages.SharedGlobal", "All albums can be reached with the following link. Link is valid for %d days.") viper.SetDefault("Telegram.Messages.SharedGlobal", "All albums can be reached with the following link. Link is valid for %d days.")
// Telegram Commands // Telegram Commands
@ -49,6 +49,7 @@ func initConfig() {
viper.SetDefault("Telegram.Commands.Info", "info") viper.SetDefault("Telegram.Commands.Info", "info")
viper.SetDefault("Telegram.Commands.NewAlbum", "newAlbum") viper.SetDefault("Telegram.Commands.NewAlbum", "newAlbum")
viper.SetDefault("Telegram.Commands.Share", "share") viper.SetDefault("Telegram.Commands.Share", "share")
viper.SetDefault("Telegram.Commands.Browse", "browse")
// Web Interface // Web Interface
viper.SetDefault("WebInterface.SiteName", "My photo album") viper.SetDefault("WebInterface.SiteName", "My photo album")
@ -152,6 +153,7 @@ func getCommandsFromConfig() TelegramCommands {
NewAlbum: viper.GetString("Telegram.Commands.NewAlbum"), NewAlbum: viper.GetString("Telegram.Commands.NewAlbum"),
Info: viper.GetString("Telegram.Commands.Info"), Info: viper.GetString("Telegram.Commands.Info"),
Share: viper.GetString("Telegram.Commands.Share"), Share: viper.GetString("Telegram.Commands.Share"),
Browse: viper.GetString("Telegram.Commands.Browse"),
} }
} }

Loading…
Cancel
Save