doesn't build yet
This commit is contained in:
commit
8aaae1aa9c
23
Dockerfile
Normal file
23
Dockerfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
FROM golang:1.15
|
||||||
|
|
||||||
|
WORKDIR /go/src/app
|
||||||
|
copy . .
|
||||||
|
|
||||||
|
RUN go get -d -v ./...
|
||||||
|
RUN go install -v ./...
|
||||||
|
|
||||||
|
CMD ["sco"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FROM golang:1.15 as builder
|
||||||
|
RUN mkdir /build
|
||||||
|
ADD . /build/
|
||||||
|
WORKDIR /build
|
||||||
|
RUN make
|
||||||
|
|
||||||
|
FROM scratch
|
||||||
|
COPY --from=builder /build/main /app/
|
||||||
|
WORKDIR /app
|
||||||
|
CMD ["./main"]
|
32
Makefile
Normal file
32
Makefile
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
VERSION := $(shell git rev-parse --short HEAD)
|
||||||
|
BUILDTIME := $(shell date -u '+%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
BUILDTIMEFILENAME := $(shell date -u '+%Y%m%d-%H%M%SZ')
|
||||||
|
BUILDTIMETAG := $(shell date -u '+%Y%m%d%H%M%S')
|
||||||
|
BUILDUSER := $(shell whoami)
|
||||||
|
BUILDHOST := $(shell hostname -s)
|
||||||
|
BUILDARCH := $(shell uname -m)
|
||||||
|
|
||||||
|
FN := sco
|
||||||
|
IMAGENAME := sneak/$(FN)
|
||||||
|
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
|
||||||
|
GOLDFLAGS += -X main.Version=$(VERSION)
|
||||||
|
GOLDFLAGS += -X main.Buildarch=$(BUILDARCH)
|
||||||
|
|
||||||
|
# osx can't statically link apparently?!
|
||||||
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
GOFLAGS := -ldflags "$(GOLDFLAGS)"
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(UNAME_S),Darwin)
|
||||||
|
GOFLAGS = -ldflags "-linkmode external -extldflags -static $(GOLDFLAGS)"
|
||||||
|
endif
|
||||||
|
|
||||||
|
default: ./$(FN)
|
||||||
|
|
||||||
|
go-get:
|
||||||
|
cd cmd/$(FN) && go get -v
|
||||||
|
|
||||||
|
./$(FN): */*.go cmd/*/*.go go-get
|
||||||
|
cd cmd/$(FN) && go build -o ../../$(FN) $(GOFLAGS) .
|
247
cmd/bot/main.go
Normal file
247
cmd/bot/main.go
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
|
||||||
|
// See License.txt for license information.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/mattermost/mattermost-server/v5/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
SAMPLE_NAME = "Mattermost Bot Sample"
|
||||||
|
|
||||||
|
USER_EMAIL = "bot@example.com"
|
||||||
|
USER_PASSWORD = "password1"
|
||||||
|
USER_NAME = "samplebot"
|
||||||
|
USER_FIRST = "Sample"
|
||||||
|
USER_LAST = "Bot"
|
||||||
|
|
||||||
|
TEAM_NAME = "botsample"
|
||||||
|
CHANNEL_LOG_NAME = "debugging-for-sample-bot"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client *model.Client4
|
||||||
|
var webSocketClient *model.WebSocketClient
|
||||||
|
|
||||||
|
var botUser *model.User
|
||||||
|
var botTeam *model.Team
|
||||||
|
var debuggingChannel *model.Channel
|
||||||
|
|
||||||
|
// Documentation for the Go driver can be found
|
||||||
|
// at https://godoc.org/github.com/mattermost/platform/model#Client
|
||||||
|
func main() {
|
||||||
|
println(SAMPLE_NAME)
|
||||||
|
|
||||||
|
SetupGracefulShutdown()
|
||||||
|
|
||||||
|
client = model.NewAPIv4Client("http://localhost:8065")
|
||||||
|
|
||||||
|
// Lets test to see if the mattermost server is up and running
|
||||||
|
MakeSureServerIsRunning()
|
||||||
|
|
||||||
|
// lets attempt to login to the Mattermost server as the bot user
|
||||||
|
// This will set the token required for all future calls
|
||||||
|
// You can get this token with client.AuthToken
|
||||||
|
LoginAsTheBotUser()
|
||||||
|
|
||||||
|
// If the bot user doesn't have the correct information lets update his profile
|
||||||
|
UpdateTheBotUserIfNeeded()
|
||||||
|
|
||||||
|
// Lets find our bot team
|
||||||
|
FindBotTeam()
|
||||||
|
|
||||||
|
// This is an important step. Lets make sure we use the botTeam
|
||||||
|
// for all future web service requests that require a team.
|
||||||
|
//client.SetTeamId(botTeam.Id)
|
||||||
|
|
||||||
|
// Lets create a bot channel for logging debug messages into
|
||||||
|
CreateBotDebuggingChannelIfNeeded()
|
||||||
|
SendMsgToDebuggingChannel("_"+SAMPLE_NAME+" has **started** running_", "")
|
||||||
|
|
||||||
|
// Lets start listening to some channels via the websocket!
|
||||||
|
webSocketClient, err := model.NewWebSocketClient4("ws://localhost:8065", client.AuthToken)
|
||||||
|
if err != nil {
|
||||||
|
println("We failed to connect to the web socket")
|
||||||
|
PrintError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
webSocketClient.Listen()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case resp := <-webSocketClient.EventChannel:
|
||||||
|
HandleWebSocketResponse(resp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// You can block forever with
|
||||||
|
select {}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeSureServerIsRunning() {
|
||||||
|
if props, resp := client.GetOldClientConfig(""); resp.Error != nil {
|
||||||
|
println("There was a problem pinging the Mattermost server. Are you sure it's running?")
|
||||||
|
PrintError(resp.Error)
|
||||||
|
os.Exit(1)
|
||||||
|
} else {
|
||||||
|
println("Server detected and is running version " + props["Version"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoginAsTheBotUser() {
|
||||||
|
if user, resp := client.Login(USER_EMAIL, USER_PASSWORD); resp.Error != nil {
|
||||||
|
println("There was a problem logging into the Mattermost server. Are you sure ran the setup steps from the README.md?")
|
||||||
|
PrintError(resp.Error)
|
||||||
|
os.Exit(1)
|
||||||
|
} else {
|
||||||
|
botUser = user
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateTheBotUserIfNeeded() {
|
||||||
|
if botUser.FirstName != USER_FIRST || botUser.LastName != USER_LAST || botUser.Username != USER_NAME {
|
||||||
|
botUser.FirstName = USER_FIRST
|
||||||
|
botUser.LastName = USER_LAST
|
||||||
|
botUser.Username = USER_NAME
|
||||||
|
|
||||||
|
if user, resp := client.UpdateUser(botUser); resp.Error != nil {
|
||||||
|
println("We failed to update the Sample Bot user")
|
||||||
|
PrintError(resp.Error)
|
||||||
|
os.Exit(1)
|
||||||
|
} else {
|
||||||
|
botUser = user
|
||||||
|
println("Looks like this might be the first run so we've updated the bots account settings")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindBotTeam() {
|
||||||
|
if team, resp := client.GetTeamByName(TEAM_NAME, ""); resp.Error != nil {
|
||||||
|
println("We failed to get the initial load")
|
||||||
|
println("or we do not appear to be a member of the team '" + TEAM_NAME + "'")
|
||||||
|
PrintError(resp.Error)
|
||||||
|
os.Exit(1)
|
||||||
|
} else {
|
||||||
|
botTeam = team
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateBotDebuggingChannelIfNeeded() {
|
||||||
|
if rchannel, resp := client.GetChannelByName(CHANNEL_LOG_NAME, botTeam.Id, ""); resp.Error != nil {
|
||||||
|
println("We failed to get the channels")
|
||||||
|
PrintError(resp.Error)
|
||||||
|
} else {
|
||||||
|
debuggingChannel = rchannel
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Looks like we need to create the logging channel
|
||||||
|
channel := &model.Channel{}
|
||||||
|
channel.Name = CHANNEL_LOG_NAME
|
||||||
|
channel.DisplayName = "Debugging For Sample Bot"
|
||||||
|
channel.Purpose = "This is used as a test channel for logging bot debug messages"
|
||||||
|
channel.Type = model.CHANNEL_OPEN
|
||||||
|
channel.TeamId = botTeam.Id
|
||||||
|
if rchannel, resp := client.CreateChannel(channel); resp.Error != nil {
|
||||||
|
println("We failed to create the channel " + CHANNEL_LOG_NAME)
|
||||||
|
PrintError(resp.Error)
|
||||||
|
} else {
|
||||||
|
debuggingChannel = rchannel
|
||||||
|
println("Looks like this might be the first run so we've created the channel " + CHANNEL_LOG_NAME)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendMsgToDebuggingChannel(msg string, replyToId string) {
|
||||||
|
post := &model.Post{}
|
||||||
|
post.ChannelId = debuggingChannel.Id
|
||||||
|
post.Message = msg
|
||||||
|
|
||||||
|
post.RootId = replyToId
|
||||||
|
|
||||||
|
if _, resp := client.CreatePost(post); resp.Error != nil {
|
||||||
|
println("We failed to send a message to the logging channel")
|
||||||
|
PrintError(resp.Error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandleWebSocketResponse(event *model.WebSocketEvent) {
|
||||||
|
HandleMsgFromDebuggingChannel(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandleMsgFromDebuggingChannel(event *model.WebSocketEvent) {
|
||||||
|
// If this isn't the debugging channel then lets ingore it
|
||||||
|
if event.Broadcast.ChannelId != debuggingChannel.Id {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lets only reponded to messaged posted events
|
||||||
|
if event.Event != model.WEBSOCKET_EVENT_POSTED {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
println("responding to debugging channel msg")
|
||||||
|
|
||||||
|
post := model.PostFromJson(strings.NewReader(event.Data["post"].(string)))
|
||||||
|
if post != nil {
|
||||||
|
|
||||||
|
// ignore my events
|
||||||
|
if post.UserId == botUser.Id {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// if you see any word matching 'alive' then respond
|
||||||
|
if matched, _ := regexp.MatchString(`(?:^|\W)alive(?:$|\W)`, post.Message); matched {
|
||||||
|
SendMsgToDebuggingChannel("Yes I'm running", post.Id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// if you see any word matching 'up' then respond
|
||||||
|
if matched, _ := regexp.MatchString(`(?:^|\W)up(?:$|\W)`, post.Message); matched {
|
||||||
|
SendMsgToDebuggingChannel("Yes I'm running", post.Id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// if you see any word matching 'running' then respond
|
||||||
|
if matched, _ := regexp.MatchString(`(?:^|\W)running(?:$|\W)`, post.Message); matched {
|
||||||
|
SendMsgToDebuggingChannel("Yes I'm running", post.Id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// if you see any word matching 'hello' then respond
|
||||||
|
if matched, _ := regexp.MatchString(`(?:^|\W)hello(?:$|\W)`, post.Message); matched {
|
||||||
|
SendMsgToDebuggingChannel("Yes I'm running", post.Id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SendMsgToDebuggingChannel("I did not understand you!", post.Id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PrintError(err *model.AppError) {
|
||||||
|
println("\tError Details:")
|
||||||
|
println("\t\t" + err.Message)
|
||||||
|
println("\t\t" + err.Id)
|
||||||
|
println("\t\t" + err.DetailedError)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupGracefulShutdown() {
|
||||||
|
c := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(c, os.Interrupt)
|
||||||
|
go func() {
|
||||||
|
for _ = range c {
|
||||||
|
if webSocketClient != nil {
|
||||||
|
webSocketClient.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
SendMsgToDebuggingChannel("_"+SAMPLE_NAME+" has **stopped** running_", "")
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user