append success webhook

This commit is contained in:
Yun 2019-08-12 14:31:12 +09:00
parent da30e9987f
commit 94e6d91e06
4 changed files with 93 additions and 19 deletions

View File

@ -28,8 +28,11 @@ var configCmd = &cobra.Command{
TriggerInterval: "5",
FeeAmount: "1000000uluna",
WebHookURL: "",
WebHookDataKey: "text",
FailWebHookURL: "",
FailWebHookDataKey: "text",
SuccessWebHookURL: "",
SuccessWebHookDataKey: "text",
}
if _, err := os.Stat(g.KeyDir); os.IsNotExist(err) {

View File

@ -39,8 +39,11 @@ type SantaApp struct {
TriggerInterval string `json:"trigger_interval" yaml:"trigger_interval"`
FeeAmount string `json:"fee_amount" yaml:"fee_amount"`
WebHookURL string `json:"webhook_url" yaml:"webhook_url"`
WebHookDataKey string `json:"webhook_data_key" yaml:"webhook_data_key"`
SuccessWebHookURL string `json:"success_webhook_url" yaml:"success_webhook_url"`
SuccessWebHookDataKey string `json:"success_webhook_data_key" yaml:"success_webhook_data_key"`
FailWebHookURL string `json:"fail_webhook_url" yaml:"fail_webhook_url"`
FailWebHookDataKey string `json:"fail_webhook_data_key" yaml:"fail_webhook_data_key"`
Version string `yaml:"version,omitempty"`
Commit string `yaml:"commit,omitempty"`

View File

@ -16,6 +16,8 @@ import (
ctypes "github.com/tendermint/tendermint/rpc/core/types"
rpc "github.com/tendermint/tendermint/rpc/lib/types"
abci "github.com/tendermint/tendermint/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
var aminoCdc = amino.NewCodec()
@ -83,24 +85,12 @@ func (app SantaApp) ListenNewBLock(isTest bool) {
txHash, err := app.SendTx(blockEvent.Block.ChainID)
if err != nil {
log.Printf("[Fail] to send tx: %s", err.Error())
if app.WebHookURL != "" && app.WebHookDataKey != "" {
notiBody, err := json.Marshal(map[string]string{
app.WebHookDataKey: fmt.Sprintf("[Fail] sending tx: %s", err.Error()),
})
if err != nil {
continue
}
// send notification to slack
http.Post(app.WebHookURL, "application/json", bytes.NewBuffer(notiBody))
continue
}
app.sendFailMessage(err.Error())
continue
}
log.Printf("[Success] Height: %d,\tTxHash: %s\n", blockEvent.Block.Height, txHash)
app.sendSuccessMessage(blockEvent.Block.Height)
}
if isTest {
@ -109,6 +99,45 @@ func (app SantaApp) ListenNewBLock(isTest bool) {
}
}
func (app SantaApp) sendFailMessage(msg string) (err error) {
if app.FailWebHookURL != "" && app.FailWebHookDataKey != "" {
notiBody, _ := json.Marshal(map[string]string{
app.FailWebHookDataKey: fmt.Sprintf("[Fail] sending tx: %s", msg),
})
// send notification to slack
_, err = http.Post(app.FailWebHookURL, "application/json", bytes.NewBuffer(notiBody))
if err != nil {
return err
}
}
return nil
}
func (app SantaApp) sendSuccessMessage(height int64) (err error) {
if app.SuccessWebHookURL != "" && app.SuccessWebHookDataKey != "" {
feeCoin, err := sdk.ParseCoin(app.FeeAmount)
if err != nil {
return err
}
amount := sdk.NewDecFromIntWithPrec(feeCoin.Amount, 6).String()
denom := strings.ToUpper(strings.TrimLeft(feeCoin.Denom, "u"))
notiBody, _ := json.Marshal(map[string]string{
app.SuccessWebHookDataKey: fmt.Sprintf("Hohoho! Santa just gave out %s %s to stakeholders in presents in block %d", amount, denom, height),
})
// send notification to slack
_, err = http.Post(app.SuccessWebHookURL, "application/json", bytes.NewBuffer(notiBody))
if err != nil {
return err
}
}
return nil
}
// no-lint
type Query struct {
Query string `json:"query"`

View File

@ -28,3 +28,42 @@ func TestWebsocketListen(t *testing.T) {
result := logBuf.String()
require.True(t, strings.Contains(result, "[Success]"))
}
func TestSendSuccess(t *testing.T) {
app := setupWithPlentyBalanceAccount(t)
err := app.sendSuccessMessage(10)
require.NoError(t, err)
app.SuccessWebHookURL = "https://google.co.kr"
app.SuccessWebHookDataKey = "text"
err = app.sendSuccessMessage(10)
require.NoError(t, err)
// invalid fee coin
app.FeeAmount = "u1lu1n1a"
err = app.sendSuccessMessage(10)
require.Error(t, err)
// invalid url
app.FeeAmount = "1uluna"
app.SuccessWebHookURL = "http://nonon"
err = app.sendSuccessMessage(10)
require.Error(t, err)
}
func TestSendFail(t *testing.T) {
app := setupWithPlentyBalanceAccount(t)
err := app.sendFailMessage("msg")
require.NoError(t, err)
app.FailWebHookURL = "https://google.co.kr"
app.FailWebHookDataKey = "text"
err = app.sendFailMessage("msg")
require.NoError(t, err)
// invalid url
app.FeeAmount = "1uluna"
app.FailWebHookURL = "http://nonon"
err = app.sendFailMessage("msg")
require.Error(t, err)
}