I need better hobbies for the weekends
This commit is contained in:
3
.github/workflows/deploy.yml
vendored
3
.github/workflows/deploy.yml
vendored
@@ -33,8 +33,7 @@ jobs:
|
|||||||
source_dir: src
|
source_dir: src
|
||||||
env_vars: >-
|
env_vars: >-
|
||||||
PROJECT_ID=rising-city-366608,
|
PROJECT_ID=rising-city-366608,
|
||||||
MATTERMOST_TOKEN=${{ secrets.MATTERMOST_TOKEN }},
|
COMMA_SEPARATED_TOKEN_WHITELIST=${{ secrets.COMMA_SEPARATED_TOKEN_WHITELIST }},
|
||||||
TEST_TOKEN=${{ secrets.TEST_TOKEN }},
|
|
||||||
GITHUB_URL=${{github.server_url}}/${{github.repository}}
|
GITHUB_URL=${{github.server_url}}/${{github.repository}}
|
||||||
secret_environment_variables: >-
|
secret_environment_variables: >-
|
||||||
EGROUPS_USERNAME=projects/74365131111/secrets/EGROUPS_USERNAME,
|
EGROUPS_USERNAME=projects/74365131111/secrets/EGROUPS_USERNAME,
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ import (
|
|||||||
"github.com/hooklift/gowsdl/soap"
|
"github.com/hooklift/gowsdl/soap"
|
||||||
)
|
)
|
||||||
|
|
||||||
type reply struct {
|
type mattermostReply struct {
|
||||||
Response_type string `json:"response_type"`
|
Response_type string `json:"response_type"`
|
||||||
Text string `json:"text"`
|
Text string `json:"text"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type message struct {
|
type mattermostMessage struct {
|
||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
Channel_id string `json:"channel_id"`
|
Channel_id string `json:"channel_id"`
|
||||||
Channel_name string `json:"channel_name"`
|
Channel_name string `json:"channel_name"`
|
||||||
@@ -42,7 +42,20 @@ func contains(haystack []string, needle string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCoffeeDrinkers(logger *log.Logger) []string {
|
func omitEmptyStrings(s []string) []string {
|
||||||
|
var r []string
|
||||||
|
for _, str := range s {
|
||||||
|
if str != "" {
|
||||||
|
r = append(r, str)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
var debug *log.Logger
|
||||||
|
var warning *log.Logger
|
||||||
|
|
||||||
|
func getCoffeeDrinkers() []string {
|
||||||
username := os.Getenv("EGROUPS_USERNAME")
|
username := os.Getenv("EGROUPS_USERNAME")
|
||||||
password := os.Getenv("EGROUPS_PASSWORD")
|
password := os.Getenv("EGROUPS_PASSWORD")
|
||||||
egroups_url := "https://foundservices.cern.ch:443/ws/egroups/v1/EgroupsWebService/"
|
egroups_url := "https://foundservices.cern.ch:443/ws/egroups/v1/EgroupsWebService/"
|
||||||
@@ -54,84 +67,79 @@ func getCoffeeDrinkers(logger *log.Logger) []string {
|
|||||||
reply, err := egroupsClient.FindEgroupById(&request)
|
reply, err := egroupsClient.FindEgroupById(&request)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Println("Could not get egroup members:", err)
|
warning.Println("Could not get egroup members:", err)
|
||||||
return []string{"@omorud"}
|
return []string{"@omorud"}
|
||||||
}
|
}
|
||||||
|
|
||||||
drinkers := make([]string, 0)
|
drinkers := make([]string, 0)
|
||||||
|
|
||||||
for _, member := range reply.Result.Members {
|
for _, member := range reply.Result.Members {
|
||||||
logger.Println(member)
|
|
||||||
drinkers = append(drinkers, "@"+strings.ToLower(member.PrimaryAccount))
|
drinkers = append(drinkers, "@"+strings.ToLower(member.PrimaryAccount))
|
||||||
}
|
}
|
||||||
|
|
||||||
return drinkers
|
return drinkers
|
||||||
}
|
}
|
||||||
|
|
||||||
// Coffee replies to mattermost webhooks containing valid token values
|
// Entrypoint of google cloud function:
|
||||||
|
//
|
||||||
|
// Upon receiving a webhook from mattermost, respond to the webhook by tagging
|
||||||
|
// everyone in e-group 10542497
|
||||||
func Coffee(writer http.ResponseWriter, request *http.Request) {
|
func Coffee(writer http.ResponseWriter, request *http.Request) {
|
||||||
// Create cloud logging client or default to stderr
|
// Create cloud logging client, default to stderr on failure
|
||||||
project_id := os.Getenv("PROJECT_ID")
|
project_id := os.Getenv("PROJECT_ID")
|
||||||
ctx := context.Background()
|
client, err := logging.NewClient(context.Background(), project_id)
|
||||||
client, err := logging.NewClient(ctx, project_id)
|
|
||||||
var stdlog *log.Logger
|
|
||||||
var warning *log.Logger
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Failed to create logging client: %v", err)
|
log.Printf("Failed to create logging client: %v", err)
|
||||||
stdlog = log.New(os.Stderr, "", log.LstdFlags)
|
debug = log.New(os.Stderr, "", log.LstdFlags)
|
||||||
warning = log.New(os.Stderr, "", log.LstdFlags)
|
warning = log.New(os.Stderr, "", log.LstdFlags)
|
||||||
} else {
|
} else {
|
||||||
defer client.Close()
|
defer client.Close()
|
||||||
logger := client.Logger("Coffee-log")
|
logger := client.Logger("Coffee-log")
|
||||||
stdlog = logger.StandardLogger(logging.Debug)
|
debug = logger.StandardLogger(logging.Debug)
|
||||||
warning = logger.StandardLogger(logging.Warning)
|
warning = logger.StandardLogger(logging.Warning)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load valid mattermost tokens to reply to from env
|
// Unmarshal incoming message
|
||||||
tokens := make([]string, 0)
|
incomingMsg := mattermostMessage{}
|
||||||
|
err = json.NewDecoder(request.Body).Decode(&incomingMsg)
|
||||||
for _, envvar := range []string{"MATTERMOST_TOKEN", "TEST_TOKEN"} {
|
|
||||||
token := os.Getenv(envvar)
|
|
||||||
if token != "" {
|
|
||||||
tokens = append(tokens, token)
|
|
||||||
} else {
|
|
||||||
stdlog.Printf("Environment variable %v is not found/empty\n", envvar)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal incoming message and reply
|
|
||||||
incoming := message{}
|
|
||||||
err = json.NewDecoder(request.Body).Decode(&incoming)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
warning.Printf("Failed to decode message: %v\n", err)
|
warning.Printf("Failed to decode message: %v\n%+v\n", err, request.Body)
|
||||||
http.Error(writer, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
http.Error(writer, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !contains(tokens, incoming.Token) {
|
unsafeWhitelist := strings.Split(os.Getenv("COMMA_SEPARATED_TOKEN_WHITELIST"), ",")
|
||||||
warning.Printf("Invalid request received with token %+v\n", incoming.Token)
|
whitelist := omitEmptyStrings(unsafeWhitelist)
|
||||||
|
|
||||||
|
if !contains(whitelist, incomingMsg.Token) {
|
||||||
|
warning.Printf("Invalid request received with token %+v\n", incomingMsg.Token)
|
||||||
http.Error(writer, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
http.Error(writer, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
text := ""
|
// Respond to incoming message
|
||||||
|
reply := mattermostReply{
|
||||||
for _, name := range getCoffeeDrinkers(stdlog) {
|
Response_type: "comment",
|
||||||
text += name + " "
|
Text: "",
|
||||||
}
|
}
|
||||||
|
|
||||||
//url, ok := os.LookupEnv("GITHUB_URL")
|
for _, name := range getCoffeeDrinkers() {
|
||||||
//if ok {
|
reply.Text += name + " "
|
||||||
// text += " (now open source: " + url + ")"
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
err = json.NewEncoder(writer).Encode(&reply{Response_type: "comment", Text: text})
|
reply.Text += "| [get tagged by bot](https://e-groups.cern.ch/e-groups/Egroup.do?egroupId=10542497)"
|
||||||
|
|
||||||
|
url, ok := os.LookupEnv("GITHUB_URL")
|
||||||
|
if ok {
|
||||||
|
reply.Text += " | [view source](" + url + ")"
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.NewEncoder(writer).Encode(reply)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
warning.Printf("Failed to encode response: %v\n", err)
|
warning.Printf("Failed to encode response: %v\n", err)
|
||||||
}
|
}
|
||||||
|
debug.Printf("Successfully responded to message: %+v\n", incomingMsg)
|
||||||
stdlog.Printf("Successfully responded to message: %+v\n", incoming)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user