From 94e6d91e0633ec3dcb1003b344b08359881c25eb Mon Sep 17 00:00:00 2001 From: Yun Date: Mon, 12 Aug 2019 14:31:12 +0900 Subject: [PATCH] append success webhook --- cmd/config.go | 7 +++-- utils/app.go | 7 +++-- utils/websocket.go | 59 ++++++++++++++++++++++++++++++----------- utils/websocket_test.go | 39 +++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 19 deletions(-) diff --git a/cmd/config.go b/cmd/config.go index 1713a36..ea1d2e3 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -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) { diff --git a/utils/app.go b/utils/app.go index 3494244..9505756 100644 --- a/utils/app.go +++ b/utils/app.go @@ -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"` diff --git a/utils/websocket.go b/utils/websocket.go index 7ef6057..83a6a15 100644 --- a/utils/websocket.go +++ b/utils/websocket.go @@ -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"` diff --git a/utils/websocket_test.go b/utils/websocket_test.go index c22c61a..bfe8de5 100644 --- a/utils/websocket_test.go +++ b/utils/websocket_test.go @@ -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) +} \ No newline at end of file