An outgoing webhook slackbot written in go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

111 lines
2.6 KiB

package sqwiggle
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"github.com/brettlangdon/slackbot/slack"
)
type SqwiggleResponse struct {
Snapshot string `json:"snapshot"`
Status string `json:"status"`
Name string `json:"name"`
EMail string `json:"email"`
TimeZone string `json:"time_zone"`
Avatar string `json:"avatar"`
Message string `json:"message"`
SnapshotInterval int `json:"snapshot_interval"`
}
type Sqwiggle struct {
name string
}
func NewSqwiggle() Sqwiggle {
return Sqwiggle{
name: "sqwiggle",
}
}
func (this Sqwiggle) GetName() string {
return this.name
}
func (this Sqwiggle) SetName(name string) {
this.name = name
}
func (this Sqwiggle) callSqwiggle(token string) (response []SqwiggleResponse, err error) {
client := &http.Client{}
request, err := http.NewRequest("GET", "https://api.sqwiggle.com/users", nil)
if err != nil {
return response, err
}
request.SetBasicAuth(token, "slackbot")
sqwiggleResponse, err := client.Do(request)
if err != nil || sqwiggleResponse.StatusCode != 200 {
err = errors.New(fmt.Sprintf("API call to sqwiggle with token %s failed", token))
return response, err
}
defer sqwiggleResponse.Body.Close()
contents, err := ioutil.ReadAll(sqwiggleResponse.Body)
if err != nil {
err = errors.New("Could not read sqwiggle api response")
return response, err
}
err = json.Unmarshal(contents, &response)
if err != nil {
err = errors.New(fmt.Sprintf("Could not parse sqwiggle api response: %s", string(contents)))
return response, err
}
return response, nil
}
func (this Sqwiggle) HandleRequest(request slack.APIRequest, args []string) (response slack.APIResponse, err error) {
if request.Text != "#sqwiggle" {
err := errors.New(fmt.Sprintf("Incorrect trigger text: %s", request.Text))
return response, err
}
if len(args) <= 1 {
err := errors.New("Missing sqwiggle token argument")
return response, err
}
users, err := this.callSqwiggle(args[1])
if err != nil {
return response, err
}
response.Text = "Sqwiggle Time"
for _, user := range users {
attachment := slack.Attachment{}
switch user.Status {
case "offline":
attachment.Color = "#000000"
case "available":
attachment.Color = "#00CC33"
case "busy":
attachment.Color = "#FF3333"
}
attachment.Title = user.Name
attachment.TitleLink = user.Snapshot
attachment.ImageUrl = user.Snapshot
attachment.Fallback = user.Snapshot + "#.jpg"
response.Attachments = append(response.Attachments, attachment)
}
return response, err
}