|
1 | 1 | package main
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "fmt" |
5 | 4 | "log"
|
6 | 5 | "os"
|
7 |
| - "regexp" |
8 | 6 |
|
9 | 7 | "github.com/schaermu/go-github-judge-bot/config"
|
10 |
| - "github.com/schaermu/go-github-judge-bot/helpers" |
11 |
| - "github.com/schaermu/go-github-judge-bot/scoring" |
12 |
| - |
13 |
| - "github.com/slack-go/slack" |
14 |
| - "github.com/slack-go/slack/slackevents" |
15 |
| - "github.com/slack-go/slack/socketmode" |
| 8 | + "github.com/schaermu/go-github-judge-bot/reporters" |
16 | 9 | )
|
17 | 10 |
|
18 | 11 | func main() {
|
19 | 12 | f, err := os.Open("config.yaml")
|
20 | 13 | if err != nil {
|
21 |
| - panic(err) |
| 14 | + log.Panic(err) |
22 | 15 | }
|
23 | 16 | defer f.Close()
|
24 | 17 |
|
25 | 18 | cfg, err := config.New(f)
|
26 | 19 | if err != nil {
|
27 |
| - fmt.Println("Failed to load config, aborting...") |
| 20 | + log.Fatalf("Failed to parse config: %v", err) |
28 | 21 | return
|
29 | 22 | }
|
30 | 23 |
|
31 |
| - api := slack.New( |
32 |
| - cfg.Slack.BotToken, |
33 |
| - slack.OptionDebug(cfg.Slack.Debug), |
34 |
| - slack.OptionLog(log.New(os.Stdout, "api: ", log.Lshortfile|log.LstdFlags)), |
35 |
| - slack.OptionAppLevelToken(cfg.Slack.AppToken), |
36 |
| - ) |
37 |
| - |
38 |
| - client := socketmode.New( |
39 |
| - api, |
40 |
| - socketmode.OptionDebug(cfg.Slack.Debug), |
41 |
| - socketmode.OptionLog(log.New(os.Stdout, "socketmode: ", log.Lshortfile|log.LstdFlags)), |
42 |
| - ) |
43 |
| - |
44 |
| - messageMatcher, _ := regexp.Compile("github.com/([^/]+)/([^/<>]+)") |
45 |
| - go func() { |
46 |
| - for evt := range client.Events { |
47 |
| - switch evt.Type { |
48 |
| - case socketmode.EventTypeConnecting: |
49 |
| - fmt.Println("Connecting to Slack with Socket Mode...") |
50 |
| - case socketmode.EventTypeConnectionError: |
51 |
| - fmt.Println("Connection failed. Retrying later...") |
52 |
| - case socketmode.EventTypeConnected: |
53 |
| - fmt.Println("Connected to Slack with Socket Mode.") |
54 |
| - case socketmode.EventTypeEventsAPI: |
55 |
| - eventsAPIEvent, ok := evt.Data.(slackevents.EventsAPIEvent) |
56 |
| - if !ok { |
57 |
| - fmt.Printf("Ignored %+v\n", evt) |
58 |
| - continue |
59 |
| - } |
60 |
| - |
61 |
| - fmt.Printf("Event received: %+v\n", eventsAPIEvent) |
62 |
| - |
63 |
| - client.Ack(*evt.Request) |
| 24 | + if cfg.Slack.AppToken != "" { |
| 25 | + // start handling events coming in from slack |
| 26 | + slackReporter := reporters.NewSlackReporter(&cfg) |
| 27 | + go slackReporter.HandleMessage("") |
| 28 | + slackReporter.Run() |
| 29 | + } else { |
| 30 | + // assume stdin as source for url, use terminal reporter |
64 | 31 |
|
65 |
| - switch eventsAPIEvent.Type { |
66 |
| - case slackevents.CallbackEvent: |
67 |
| - innerEvent := eventsAPIEvent.InnerEvent |
68 |
| - switch ev := innerEvent.Data.(type) { |
69 |
| - case *slackevents.AppMentionEvent: |
70 |
| - match := messageMatcher.Match([]byte(ev.Text)) |
71 |
| - if match { |
72 |
| - gh := helpers.GithubHelper{ |
73 |
| - Config: cfg.Github, |
74 |
| - } |
75 |
| - info, err := gh.GetRepositoryData(ev.Text) |
76 |
| - |
77 |
| - if err != nil { |
78 |
| - fmt.Printf("Error while fetching github info: %e", err) |
79 |
| - } |
80 |
| - |
81 |
| - score, maxScore, penalties := scoring.GetTotalScore(info, cfg.Scorers) |
82 |
| - msgBlocks := helpers.BuildSlackResponse(info.OrgName, info.RepositoryName, score, maxScore, penalties) |
83 |
| - api.PostMessage(ev.Channel, msgBlocks...) |
84 |
| - } |
85 |
| - } |
86 |
| - default: |
87 |
| - client.Debugf("unsupported Events API event received") |
88 |
| - } |
89 |
| - default: |
90 |
| - fmt.Fprintf(os.Stderr, "Unexpected event type received: %s\n", evt.Type) |
91 |
| - } |
92 |
| - } |
93 |
| - }() |
94 |
| - |
95 |
| - client.Run() |
| 32 | + } |
96 | 33 | }
|
0 commit comments