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  }