208 lines
4.2 KiB
Go
Raw Normal View History

2016-09-25 22:34:02 +02:00
package service
import (
"fmt"
"log"
2016-09-27 22:05:44 +02:00
"strconv"
"time"
2016-09-25 22:34:02 +02:00
"github.com/nlopes/slack"
)
type SlackService struct {
2016-09-29 21:19:09 +02:00
Client *slack.Client
RTM *slack.RTM
Channels []slack.Channel
UserCache map[string]string
2016-09-25 22:34:02 +02:00
}
type Channel struct {
ID string
Name string
}
func NewSlackService(token string) *SlackService {
2016-09-29 21:19:09 +02:00
svc := &SlackService{
Client: slack.New(token),
UserCache: make(map[string]string),
}
2016-09-25 22:34:02 +02:00
svc.RTM = svc.Client.NewRTM()
go svc.RTM.ManageConnection()
2016-09-30 11:22:40 +02:00
users, _ := svc.Client.GetUsers()
for _, user := range users {
svc.UserCache[user.ID] = user.Name
}
2016-09-25 22:34:02 +02:00
return svc
}
func (s *SlackService) GetChannels() []Channel {
var chans []Channel
slackChans, err := s.Client.GetChannels(true)
if err != nil {
chans = append(chans, Channel{})
}
s.Channels = slackChans
for _, slackChan := range slackChans {
chans = append(chans, Channel{slackChan.ID, slackChan.Name})
}
return chans
}
2016-09-29 19:40:09 +02:00
func (s *SlackService) SendMessage(channel string, message string) {
2016-09-27 22:05:44 +02:00
// https://godoc.org/github.com/nlopes/slack#PostMessageParameters
2016-09-28 22:10:04 +02:00
postParams := slack.PostMessageParameters{
2016-09-29 19:40:09 +02:00
AsUser: true,
2016-09-28 22:10:04 +02:00
}
2016-09-27 22:05:44 +02:00
// https://godoc.org/github.com/nlopes/slack#Client.PostMessage
s.Client.PostMessage(channel, message, postParams)
}
2016-09-25 22:34:02 +02:00
func (s *SlackService) GetMessages(channel string, count int) []string {
2016-09-25 22:34:02 +02:00
// https://api.slack.com/methods/channels.history
historyParams := slack.HistoryParameters{
Count: count,
2016-09-25 22:34:02 +02:00
Inclusive: false,
Unreads: false,
}
// https://godoc.org/github.com/nlopes/slack#History
history, err := s.Client.GetChannelHistory(channel, historyParams)
if err != nil {
log.Fatal(err)
return []string{""}
}
2016-09-29 21:19:09 +02:00
// Construct the messages
2016-09-25 22:34:02 +02:00
var messages []string
for _, message := range history.Messages {
2016-09-29 21:19:09 +02:00
msg := s.CreateMessage(message)
2016-09-25 22:34:02 +02:00
messages = append(messages, msg)
}
// Reverse the order of the messages, we want the newest in
// the last place
var messagesReversed []string
for i := len(messages) - 1; i >= 0; i-- {
messagesReversed = append(messagesReversed, messages[i])
}
return messagesReversed
2016-09-25 22:34:02 +02:00
}
2016-09-29 21:19:09 +02:00
// CreateMessage will create a string formatted message that can be rendered
// in the Chat pane.
//
// [23:59] <erroneousboat> Hello world!
//
func (s *SlackService) CreateMessage(message slack.Message) string {
var name string
// Get username from cache
name, ok := s.UserCache[message.User]
// Name not in cache
if !ok {
2016-09-30 11:22:40 +02:00
if message.BotID != "" {
2016-09-29 21:19:09 +02:00
// Name not found, perhaps a bot, use Username
2016-09-30 11:22:40 +02:00
name, ok = s.UserCache[message.BotID]
if !ok {
// Not found in cache, add it
name = message.Username
s.UserCache[message.BotID] = message.Username
}
} else {
// Not a bot, not in cache, get user info
user, err := s.Client.GetUserInfo(message.User)
if err != nil {
name = "unknown"
s.UserCache[message.User] = name
} else {
name = user.Name
s.UserCache[message.User] = user.Name
2016-09-29 21:19:09 +02:00
}
}
}
if name == "" {
name = "unknown"
}
// Parse time
floatTime, err := strconv.ParseFloat(message.Timestamp, 64)
if err != nil {
floatTime = 0.0
}
intTime := int64(floatTime)
// Format message
msg := fmt.Sprintf(
"[%s] <%s> %s",
time.Unix(intTime, 0).Format("15:04"),
name,
message.Text,
)
return msg
}
func (s *SlackService) CreateMessageFromMessageEvent(message *slack.MessageEvent) string {
var name string
// Get username from cache
name, ok := s.UserCache[message.User]
// Name not in cache
if !ok {
2016-09-30 11:22:40 +02:00
if message.BotID != "" {
2016-09-29 21:19:09 +02:00
// Name not found, perhaps a bot, use Username
2016-09-30 11:22:40 +02:00
name, ok = s.UserCache[message.BotID]
if !ok {
// Not found in cache, add it
name = message.Username
s.UserCache[message.BotID] = message.Username
}
} else {
// Not a bot, not in cache, get user info
user, err := s.Client.GetUserInfo(message.User)
if err != nil {
name = "unknown"
s.UserCache[message.User] = name
} else {
name = user.Name
s.UserCache[message.User] = user.Name
2016-09-29 21:19:09 +02:00
}
}
}
if name == "" {
name = "unknown"
}
// Parse time
floatTime, err := strconv.ParseFloat(message.Timestamp, 64)
if err != nil {
floatTime = 0.0
}
intTime := int64(floatTime)
// Format message
msg := fmt.Sprintf(
"[%s] <%s> %s",
time.Unix(intTime, 0).Format("15:04"),
name,
message.Text,
)
return msg
}