Skip to content

Commit

Permalink
1.增加SendxxxMessageWithCtx系列方法
Browse files Browse the repository at this point in the history
2.支持通过InitDingTalk设置发送消息的超时时间
  • Loading branch information
suhang committed Jan 25, 2024
1 parent 796332a commit eed4f32
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 22 deletions.
36 changes: 36 additions & 0 deletions base.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dingtalk

import "time"

type msgTypeType string

const (
Expand All @@ -10,10 +12,44 @@ const (
FEED_CARD msgTypeType = "feedCard"
)

type initModel struct {
InitSendTimeout time.Duration
}

func (i initModel) GetSendTimeout() time.Duration {
if i.InitSendTimeout > 0 {
return i.InitSendTimeout
}
return time.Second * 2
}

type initOption interface {
applyInit(model *initModel)
}

type funcInitOption struct {
f func(model *initModel)
}

func (fdo *funcInitOption) applyInit(do *initModel) {
fdo.f(do)
}

func newFuncInitOption(f func(model *initModel)) *funcInitOption {
return &funcInitOption{f: f}
}

func WithInitSendTimeout(v time.Duration) initOption {
return newFuncInitOption(func(o *initModel) {
o.InitSendTimeout = v
})
}

type DingTalk struct {
robotToken []string
secret string
keyWord string
InitModel initModel
}

type textModel struct {
Expand Down
24 changes: 23 additions & 1 deletion dingtalk_test.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package dingtalk

import (
"context"
"net/http"
"testing"
"time"
)

var dingToken = []string{"b9230b8c762cb3a6f5dd977ad975c687e23fdefc6c762fe94a0f36bca73fb654"}

//var dingToken = []string{"0471c091acf1d9dfc553e57525f57139859858b905836b8f45b228e6d6e3a289"} // onlyOne

var dingTalkCli = InitDingTalk(dingToken, ".")
Expand All @@ -19,6 +22,14 @@ func init() {
dingTalkCli = InitDingTalk(dingToken, ".")
}

func TestDingTalkInitWithTimeout(t *testing.T) {
dingTalkCliWithOpt := InitDingTalk(dingToken, ".", WithInitSendTimeout(time.Second*3))
err := dingTalkCliWithOpt.SendTextMessage("增加sendTimeout,自定义超时时间", WithAtMobiles([]string{testPhone}))
if err != nil {
t.Errorf("TestTextMsgWithSecret expected be nil, but %v got", err)
}
}

func TestTextMsgWithSecret(t *testing.T) {
err := dingTalkCliWithSecret.SendTextMessage("加签测试", WithAtMobiles([]string{testPhone}))
if err != nil {
Expand All @@ -33,6 +44,17 @@ func TestTextMsg(t *testing.T) {
}
}

func TestTextMsgWithCtx(t *testing.T) {
err := dingTalkCli.SendTextMessage("Text No Context 兼容测试", WithAtMobiles([]string{testPhone}))
if err != nil {
t.Errorf("TestTextMsg SendTextMessage expected be nil, but %v got", err)
}
err = dingTalkCli.SendTextMessageWithCtx(context.Background(), "Text With Context 测试", WithAtMobiles([]string{testPhone}))
if err != nil {
t.Errorf("TestTextMsg SendTextMessageWithCtx expected be nil, but %v got", err)
}
}

func TestLinkMsg(t *testing.T) {
err := dingTalkCli.SendLinkMessage("Link title", "Link test.", testImg, testUrl)
if err != nil {
Expand Down Expand Up @@ -159,4 +181,4 @@ func TestOutGoing(t *testing.T) {
RegisterCommand("hello", outgoingFunc, 1, true)
http.Handle("/outgoing", &OutGoingHandler{})
_ = http.ListenAndServe(":8000", nil)
}
}
51 changes: 30 additions & 21 deletions webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,37 +14,46 @@ import (
"time"
)

func InitDingTalk(tokens []string, key string) *DingTalk {
func InitDingTalk(tokens []string, key string, opts ...initOption) *DingTalk {
if len(tokens) == 0 {
panic("no token")
}
return &DingTalk{
dt := &DingTalk{
robotToken: tokens,
keyWord: key,
}
for _, opt := range opts {
opt.applyInit(&dt.InitModel)
}
return dt
}

func InitDingTalkWithSecret(tokens string, secret string) *DingTalk {
func InitDingTalkWithSecret(tokens string, secret string, opts ...initOption) *DingTalk {
if len(tokens) == 0 || secret == "" {
panic("no token")
}
return &DingTalk{
dt := &DingTalk{
robotToken: []string{tokens},
secret: secret,
}
for _, opt := range opts {
opt.applyInit(&dt.InitModel)
}
return dt
}

func (d *DingTalk) sendMessage(msg iDingMsg) error {
var (
ctx context.Context
cancel context.CancelFunc
uri string
resp *http.Response
err error
)
ctx, cancel = context.WithTimeout(context.Background(), time.Second*2)
func (d *DingTalk) sendMessageNoCtx(msg iDingMsg) error {
ctx, cancel := context.WithTimeout(context.Background(), d.InitModel.GetSendTimeout())
defer cancel()
return d.sendMessage(ctx, msg)
}

func (d *DingTalk) sendMessage(ctx context.Context, msg iDingMsg) error {
var (
uri string
resp *http.Response
err error
)
value := url.Values{}
value.Set("access_token", d.robotToken[rand.Intn(len(d.robotToken))])
if d.secret != "" {
Expand Down Expand Up @@ -96,18 +105,18 @@ func (d *DingTalk) OutGoing(r io.Reader) (outGoingMsg outGoingModel, err error)

func (d *DingTalk) SendTextMessage(content string, opt ...atOption) error {
content = content + d.keyWord
return d.sendMessage(NewTextMsg(content, opt...))
return d.sendMessageNoCtx(NewTextMsg(content, opt...))
}

func (d *DingTalk) SendMarkDownMessage(title, text string, opts ...atOption) error {
title = title + d.keyWord
return d.sendMessage(NewMarkDownMsg(title, text, opts...))
return d.sendMessageNoCtx(NewMarkDownMsg(title, text, opts...))
}

// SendDTMDMessage 利用dtmd发送点击消息
func (d *DingTalk) SendDTMDMessage(title string, dtmdMap *dingMap, opt ...atOption) error {
title = title + d.keyWord
return d.sendMessage(NewDTMDMsg(title, dtmdMap, opt...))
return d.sendMessageNoCtx(NewDTMDMsg(title, dtmdMap, opt...))
}

func (d *DingTalk) SendMarkDownMessageBySlice(title string, textList []string, opts ...atOption) error {
Expand All @@ -116,17 +125,17 @@ func (d *DingTalk) SendMarkDownMessageBySlice(title string, textList []string, o
for _, t := range textList {
text = text + "\n" + t
}
return d.sendMessage(NewMarkDownMsg(title, text, opts...))
return d.sendMessageNoCtx(NewMarkDownMsg(title, text, opts...))
}

func (d *DingTalk) SendLinkMessage(title, text, picUrl, msgUrl string) error {
title = title + d.keyWord
return d.sendMessage(NewLinkMsg(title, text, picUrl, msgUrl))
return d.sendMessageNoCtx(NewLinkMsg(title, text, picUrl, msgUrl))
}

func (d *DingTalk) SendActionCardMessage(title, text string, opts ...actionCardOption) error {
title = title + d.keyWord
return d.sendMessage(NewActionCardMsg(title, text, opts...))
return d.sendMessageNoCtx(NewActionCardMsg(title, text, opts...))
}

func (d *DingTalk) SendActionCardMessageBySlice(title string, textList []string, opts ...actionCardOption) error {
Expand All @@ -135,12 +144,12 @@ func (d *DingTalk) SendActionCardMessageBySlice(title string, textList []string,
for _, t := range textList {
text = text + "\n" + t
}
return d.sendMessage(NewActionCardMsg(title, text, opts...))
return d.sendMessageNoCtx(NewActionCardMsg(title, text, opts...))
}

func (d *DingTalk) SendFeedCardMessage(feedCard []FeedCardLinkModel) error {
if len(feedCard) > 0 {
feedCard[0].Title = feedCard[0].Title + d.keyWord
}
return d.sendMessage(NewFeedCardMsg(feedCard))
return d.sendMessageNoCtx(NewFeedCardMsg(feedCard))
}
54 changes: 54 additions & 0 deletions webhook_withctx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package dingtalk

import "context"

func (d *DingTalk) SendTextMessageWithCtx(ctx context.Context, content string, opt ...atOption) error {
content = content + d.keyWord
return d.sendMessage(ctx, NewTextMsg(content, opt...))
}

func (d *DingTalk) SendMarkDownMessageWithCtx(ctx context.Context, title, text string, opts ...atOption) error {
title = title + d.keyWord
return d.sendMessage(ctx, NewMarkDownMsg(title, text, opts...))
}

// SendDTMDMessageWithCtx 利用dtmd发送点击消息
func (d *DingTalk) SendDTMDMessageWithCtx(ctx context.Context, title string, dtmdMap *dingMap, opt ...atOption) error {
title = title + d.keyWord
return d.sendMessage(ctx, NewDTMDMsg(title, dtmdMap, opt...))
}

func (d *DingTalk) SendMarkDownMessageBySliceWithCtx(ctx context.Context, title string, textList []string, opts ...atOption) error {
title = title + d.keyWord
text := ""
for _, t := range textList {
text = text + "\n" + t
}
return d.sendMessage(ctx, NewMarkDownMsg(title, text, opts...))
}

func (d *DingTalk) SendLinkMessageWithCtx(ctx context.Context, title, text, picUrl, msgUrl string) error {
title = title + d.keyWord
return d.sendMessage(ctx, NewLinkMsg(title, text, picUrl, msgUrl))
}

func (d *DingTalk) SendActionCardMessageWithCtx(ctx context.Context, title, text string, opts ...actionCardOption) error {
title = title + d.keyWord
return d.sendMessage(ctx, NewActionCardMsg(title, text, opts...))
}

func (d *DingTalk) SendActionCardMessageBySliceWithCtx(ctx context.Context, title string, textList []string, opts ...actionCardOption) error {
title = title + d.keyWord
text := ""
for _, t := range textList {
text = text + "\n" + t
}
return d.sendMessage(ctx, NewActionCardMsg(title, text, opts...))
}

func (d *DingTalk) SendFeedCardMessageWithCtx(ctx context.Context, feedCard []FeedCardLinkModel) error {
if len(feedCard) > 0 {
feedCard[0].Title = feedCard[0].Title + d.keyWord
}
return d.sendMessage(ctx, NewFeedCardMsg(feedCard))
}

0 comments on commit eed4f32

Please sign in to comment.