Add support for auxiliary message file (#81)
* Add support for external message loaded from the file specified in Config.MessageFile * Enable the message file option in command line/env vars * Update docs * Add a testcase * Fix YAML tag in DOCS.md from 'messageFile' to 'message_file', as is commonly used in Drone * Remove unintended blank line * Move .test.message file to tests/ folder
This commit is contained in:
parent
75ffa6ef7b
commit
f8f311ba1f
13
DOCS.md
13
DOCS.md
@ -149,6 +149,16 @@ Example configuration with a custom message template:
|
||||
+ {{/success}}
|
||||
```
|
||||
|
||||
Example configuration with a custom message template loaded from file:
|
||||
|
||||
```diff
|
||||
image: appleboy/drone-telegram
|
||||
settings:
|
||||
token: xxxxxxxxxx
|
||||
to: telegram_user_id
|
||||
+ message_file: message_file.tpl
|
||||
```
|
||||
|
||||
## Parameter Reference
|
||||
|
||||
token
|
||||
@ -160,6 +170,9 @@ to
|
||||
message
|
||||
: overwrite the default message template
|
||||
|
||||
message_file
|
||||
: overwrite the default message template with the contents of the specified file
|
||||
|
||||
photo
|
||||
: local file path
|
||||
|
||||
|
@ -69,6 +69,7 @@ docker run --rm \
|
||||
-e PLUGIN_TOKEN=xxxxxxx \
|
||||
-e PLUGIN_TO=xxxxxxx \
|
||||
-e PLUGIN_MESSAGE=test \
|
||||
-e PLUGIN_MESSAGE_FILE=testmessage.md \
|
||||
-e PLUGIN_PHOTO=tests/github.png \
|
||||
-e PLUGIN_DOCUMENT=tests/gophercolor.png \
|
||||
-e PLUGIN_STICKER=tests/github-logo.png \
|
||||
|
38
main.go
38
main.go
@ -36,6 +36,11 @@ func main() {
|
||||
Usage: "send telegram message",
|
||||
EnvVar: "PLUGIN_MESSAGE,TELEGRAM_MESSAGE,INPUT_MESSAGE",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "message.file",
|
||||
Usage: "send telegram message from file",
|
||||
EnvVar: "PLUGIN_MESSAGE_FILE,TELEGRAM_MESSAGE_FILE,INPUT_MESSAGE_FILE",
|
||||
},
|
||||
cli.StringSliceFlag{
|
||||
Name: "photo",
|
||||
Usage: "send photo message",
|
||||
@ -282,22 +287,23 @@ func run(c *cli.Context) error {
|
||||
DeployTo: c.String("deploy.to"),
|
||||
},
|
||||
Config: Config{
|
||||
Token: c.String("token"),
|
||||
Debug: c.Bool("debug"),
|
||||
MatchEmail: c.Bool("match.email"),
|
||||
WebPreview: c.Bool("webpage.preview"),
|
||||
To: c.StringSlice("to"),
|
||||
Message: c.StringSlice("message"),
|
||||
Photo: c.StringSlice("photo"),
|
||||
Document: c.StringSlice("document"),
|
||||
Sticker: c.StringSlice("sticker"),
|
||||
Audio: c.StringSlice("audio"),
|
||||
Voice: c.StringSlice("voice"),
|
||||
Location: c.StringSlice("location"),
|
||||
Video: c.StringSlice("video"),
|
||||
Venue: c.StringSlice("venue"),
|
||||
Format: c.String("format"),
|
||||
GitHub: c.Bool("github"),
|
||||
Token: c.String("token"),
|
||||
Debug: c.Bool("debug"),
|
||||
MatchEmail: c.Bool("match.email"),
|
||||
WebPreview: c.Bool("webpage.preview"),
|
||||
To: c.StringSlice("to"),
|
||||
Message: c.StringSlice("message"),
|
||||
MessageFile: c.String("message.file"),
|
||||
Photo: c.StringSlice("photo"),
|
||||
Document: c.StringSlice("document"),
|
||||
Sticker: c.StringSlice("sticker"),
|
||||
Audio: c.StringSlice("audio"),
|
||||
Voice: c.StringSlice("voice"),
|
||||
Location: c.StringSlice("location"),
|
||||
Video: c.StringSlice("video"),
|
||||
Venue: c.StringSlice("venue"),
|
||||
Format: c.String("format"),
|
||||
GitHub: c.Bool("github"),
|
||||
},
|
||||
}
|
||||
|
||||
|
68
plugin.go
68
plugin.go
@ -1,9 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
@ -56,22 +59,23 @@ type (
|
||||
|
||||
// Config for the plugin.
|
||||
Config struct {
|
||||
Token string
|
||||
Debug bool
|
||||
MatchEmail bool
|
||||
WebPreview bool
|
||||
To []string
|
||||
Message []string
|
||||
Photo []string
|
||||
Document []string
|
||||
Sticker []string
|
||||
Audio []string
|
||||
Voice []string
|
||||
Location []string
|
||||
Video []string
|
||||
Venue []string
|
||||
Format string
|
||||
GitHub bool
|
||||
Token string
|
||||
Debug bool
|
||||
MatchEmail bool
|
||||
WebPreview bool
|
||||
To []string
|
||||
Message []string
|
||||
MessageFile string
|
||||
Photo []string
|
||||
Document []string
|
||||
Sticker []string
|
||||
Audio []string
|
||||
Voice []string
|
||||
Location []string
|
||||
Video []string
|
||||
Venue []string
|
||||
Format string
|
||||
GitHub bool
|
||||
}
|
||||
|
||||
// Plugin values.
|
||||
@ -184,6 +188,20 @@ func convertLocation(value string) (Location, bool) {
|
||||
}, false
|
||||
}
|
||||
|
||||
func loadTextFromFile(filename string) ([]string, error) {
|
||||
f, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
r := bufio.NewReader(f)
|
||||
content, err := ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return []string{string(content)}, nil
|
||||
}
|
||||
|
||||
func parseTo(to []string, authorEmail string, matchEmail bool) []int64 {
|
||||
var emails []int64
|
||||
var ids []int64
|
||||
@ -222,22 +240,26 @@ func parseTo(to []string, authorEmail string, matchEmail bool) []int64 {
|
||||
}
|
||||
|
||||
// Exec executes the plugin.
|
||||
func (p Plugin) Exec() error {
|
||||
|
||||
func (p Plugin) Exec() (err error) {
|
||||
if len(p.Config.Token) == 0 || len(p.Config.To) == 0 {
|
||||
return errors.New("missing telegram token or user list")
|
||||
}
|
||||
|
||||
var message []string
|
||||
if len(p.Config.Message) > 0 {
|
||||
switch {
|
||||
case len(p.Config.MessageFile) > 0:
|
||||
message, err = loadTextFromFile(p.Config.MessageFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error loading message file '%s': %v", p.Config.MessageFile, err)
|
||||
}
|
||||
case len(p.Config.Message) > 0:
|
||||
message = p.Config.Message
|
||||
} else {
|
||||
default:
|
||||
message = p.Message()
|
||||
}
|
||||
|
||||
bot, err := tgbotapi.NewBotAPI(p.Config.Token)
|
||||
|
||||
if err != nil {
|
||||
var bot *tgbotapi.BotAPI
|
||||
if bot, err = tgbotapi.NewBotAPI(p.Config.Token); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -325,3 +325,32 @@ func TestHTMLMessage(t *testing.T) {
|
||||
err := plugin.Exec()
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func TestMessageFile(t *testing.T) {
|
||||
plugin := Plugin{
|
||||
Repo: Repo{
|
||||
Name: "go-hello",
|
||||
Namespace: "appleboy",
|
||||
},
|
||||
Commit: Commit{
|
||||
Sha: "e7c4f0a63ceeb42a39ac7806f7b51f3f0d204fd2",
|
||||
Author: "Bo-Yi Wu",
|
||||
Branch: "master",
|
||||
Message: "Freakin' macOS isn't fully case-sensitive..",
|
||||
},
|
||||
Build: Build{
|
||||
Number: 101,
|
||||
Status: "success",
|
||||
Link: "https://github.com/appleboy/go-hello",
|
||||
},
|
||||
|
||||
Config: Config{
|
||||
Token: os.Getenv("TELEGRAM_TOKEN"),
|
||||
To: []string{os.Getenv("TELEGRAM_TO")},
|
||||
MessageFile: "tests/.test.message",
|
||||
},
|
||||
}
|
||||
|
||||
err := plugin.Exec()
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
4
tests/.test.message
Normal file
4
tests/.test.message
Normal file
@ -0,0 +1,4 @@
|
||||
Sample message loaded from file.
|
||||
|
||||
Commit msg: {{commit.message}}
|
||||
|
Loading…
Reference in New Issue
Block a user