gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/agent/input/slack/slack.go (about) 1 package slack 2 3 import ( 4 "errors" 5 "sync" 6 7 "github.com/micro/cli" 8 "gitee.com/liuxuezhan/go-micro-v1.18.0/agent/input" 9 "github.com/nlopes/slack" 10 ) 11 12 type slackInput struct { 13 debug bool 14 token string 15 16 sync.Mutex 17 running bool 18 exit chan bool 19 20 api *slack.Client 21 } 22 23 func init() { 24 input.Inputs["slack"] = NewInput() 25 } 26 27 func (p *slackInput) Flags() []cli.Flag { 28 return []cli.Flag{ 29 cli.BoolFlag{ 30 Name: "slack_debug", 31 Usage: "Slack debug output", 32 EnvVar: "MICRO_SLACK_DEBUG", 33 }, 34 cli.StringFlag{ 35 Name: "slack_token", 36 Usage: "Slack token", 37 EnvVar: "MICRO_SLACK_TOKEN", 38 }, 39 } 40 } 41 42 func (p *slackInput) Init(ctx *cli.Context) error { 43 debug := ctx.Bool("slack_debug") 44 token := ctx.String("slack_token") 45 46 if len(token) == 0 { 47 return errors.New("missing slack token") 48 } 49 50 p.debug = debug 51 p.token = token 52 53 return nil 54 } 55 56 func (p *slackInput) Stream() (input.Conn, error) { 57 p.Lock() 58 defer p.Unlock() 59 60 if !p.running { 61 return nil, errors.New("not running") 62 } 63 64 // test auth 65 auth, err := p.api.AuthTest() 66 if err != nil { 67 return nil, err 68 } 69 70 rtm := p.api.NewRTM() 71 exit := make(chan bool) 72 73 go rtm.ManageConnection() 74 75 go func() { 76 select { 77 case <-p.exit: 78 select { 79 case <-exit: 80 return 81 default: 82 close(exit) 83 } 84 case <-exit: 85 } 86 87 rtm.Disconnect() 88 }() 89 90 conn := &slackConn{ 91 auth: auth, 92 rtm: rtm, 93 exit: exit, 94 names: make(map[string]string), 95 } 96 97 go conn.run() 98 99 return conn, nil 100 } 101 102 func (p *slackInput) Start() error { 103 if len(p.token) == 0 { 104 return errors.New("missing slack token") 105 } 106 107 p.Lock() 108 defer p.Unlock() 109 110 if p.running { 111 return nil 112 } 113 114 api := slack.New(p.token, slack.OptionDebug(p.debug)) 115 116 // test auth 117 _, err := api.AuthTest() 118 if err != nil { 119 return err 120 } 121 122 p.api = api 123 p.exit = make(chan bool) 124 p.running = true 125 return nil 126 } 127 128 func (p *slackInput) Stop() error { 129 p.Lock() 130 defer p.Unlock() 131 132 if !p.running { 133 return nil 134 } 135 136 close(p.exit) 137 p.running = false 138 return nil 139 } 140 141 func (p *slackInput) String() string { 142 return "slack" 143 } 144 145 func NewInput() input.Input { 146 return &slackInput{} 147 }