generated from knative-extensions/sample-source
/
bot.go
110 lines (89 loc) · 2.2 KB
/
bot.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package slackbot
import (
"context"
"fmt"
"github.com/n3wscott/gateway/pkg/rawslack"
"log"
"sync"
cloudevents "github.com/cloudevents/sdk-go"
"github.com/cloudevents/sdk-go/pkg/cloudevents/client"
"github.com/cloudevents/sdk-go/pkg/cloudevents/transport/http"
"github.com/kelseyhightower/envconfig"
"github.com/nlopes/slack"
)
type Bot struct {
// Sink is the consumer of cloud events from the bot.
Sink string `envconfig:"SINK_URI" required:"true"`
// Port is server port to be listened.
Port int `envconfig:"PORT" default:"8080"`
Admin string
Bot string
Channel string
Err chan error
client *slack.Client
rtm *rawslack.RTM
ce client.Client
domain string
slackOnce sync.Once
}
const (
channelKey = "channel"
adminKey = "admin"
botKey = "bot"
)
func NewBot(ctx context.Context) (*Bot, error) {
var bot Bot
var err error
if err := envconfig.Process("", &bot); err != nil {
return nil, err
}
bot.Err = make(chan error, 1)
if bot.Admin, err = ReadKey(adminKey); err != nil {
return nil, err
}
if bot.Bot, err = ReadKey(botKey); err != nil {
return nil, err
}
if bot.Channel, err = ReadKey(channelKey); err != nil {
return nil, err
}
if bot.client, err = New(ctx); err != nil {
return nil, err
}
t, err := cloudevents.NewHTTPTransport(
http.WithTarget(bot.Sink),
http.WithBinaryEncoding(),
http.WithPort(bot.Port),
)
if err != nil {
return nil, err
}
if bot.ce, err = cloudevents.NewClient(t,
client.WithTimeNow(),
client.WithUUIDs(),
); err != nil {
log.Fatalf("failed to create client: %s", err.Error())
}
// Use RTM:
bot.rtm = rawslack.NewRTM(bot.client)
go bot.rtm.ManageConnection()
go bot.manageRTM(ctx)
//ch, err := bot.client.GetChannelInfo(bot.Channel)
//if err != nil {
// return nil, err
//}
user, err := bot.client.GetUserInfo(bot.Admin)
if err != nil {
fmt.Printf("%s\n", err)
return nil, err
}
fmt.Printf("ADMIN --> ID: %s, Fullname: %s, Email: %s\n", user.ID, user.Profile.RealName, user.Profile.Email)
return &bot, nil
}
// Start is a blocking call.
func (b *Bot) Start(ctx context.Context) error {
if err := b.ce.StartReceiver(context.TODO(), b.cloudEventReceiver); err != nil {
return err
}
return nil
}