-
Notifications
You must be signed in to change notification settings - Fork 4
/
handler.go
117 lines (108 loc) · 3.47 KB
/
handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package client
import (
"context"
"fmt"
"log"
"strings"
"time"
"github.com/slack-go/slack"
"github.com/slack-go/slack/slackevents"
"github.com/slack-go/slack/socketmode"
)
func newMessageTokenizeHandlerFunc(ctx context.Context, botID string) socketmode.SocketmodeHandlerFunc {
return func(event *socketmode.Event, client *socketmode.Client) {
eventPayload, ok := event.Data.(slackevents.EventsAPIEvent)
if !ok {
client.Debugf("skipped Envelope: %v", event)
return
}
client.Ack(*event.Request)
p, ok := eventPayload.InnerEvent.Data.(*slackevents.MessageEvent)
if !ok {
client.Debugf("skipped Payload Event: %v", event)
return
}
if !strings.HasPrefix(p.Text, botID) {
client.Debugf("skipped message")
return
}
s := strings.TrimSpace(p.Text[len(botID):])
if s == "" {
ack(ctx, client, p.Channel)
return
}
postTokenizeResult(ctx, client, s, p.Channel, ipaDict)
}
}
func getDictType(cmd string) dictKind {
dictType := ipaDict
if strings.HasSuffix(cmd, string(neologdDict)) {
dictType = neologdDict
} else if strings.HasSuffix(cmd, string(uniDict)) {
dictType = uniDict
}
return dictType
}
func newSlashCommandTokenizeHandlerFunc(ctx context.Context) socketmode.SocketmodeHandlerFunc {
return func(event *socketmode.Event, client *socketmode.Client) {
ev, ok := event.Data.(slack.SlashCommand)
if !ok {
client.Debugf("skipped command: %v", event)
}
client.Ack(*event.Request)
dict := getDictType(ev.Command)
cmd := fmt.Sprintf("%v %v", ev.Command, ev.Text)
if _, _, err := client.PostMessage(ev.ChannelID, slack.MsgOptionText(cmd, false)); err != nil {
client.Debugf("failed to post message: %v", err)
return
}
if ev.Text == "" {
ack(ctx, client, ev.ChannelID)
return
}
postTokenizeResult(ctx, client, ev.Text, ev.ChannelID, dict)
}
}
func defaultHandler(event *socketmode.Event, client *socketmode.Client) {
// fmt.Fprintf(os.Stderr, "Unexpected event type received: %s\n", evt.Type)
client.Debugf("skip event: %v", event.Type)
}
func ack(ctx context.Context, client *socketmode.Client, channel string) {
bver := BotVersionFromContext(ctx)
tver := TokenizerVersionFromContext(ctx)
msg := fmt.Sprintf("呼んだ? (bot: %s/ kagome: %s)", bver, tver)
if _, _, err := client.PostMessage(channel, slack.MsgOptionText(msg, false)); err != nil {
log.Printf("ack failed: %v", err)
}
}
func postTokenizeResult(ctx context.Context, client *socketmode.Client, txt string, channel string, dict dictKind) {
resp, err := tokenize(ctx, txt, dict)
if err != nil {
log.Printf("create lattice image error, %v", err)
msg := fmt.Sprintf("形態素解析に失敗しちゃいました.%q です", err)
if _, _, err := client.PostMessage(channel, slack.MsgOptionText(msg, false)); err != nil {
log.Printf("post message failed, msg: %+v, %v", txt, err)
}
return
}
_, tt, err := client.PostMessage(channel, slack.MsgOptionText(resp.comment, false))
if err != nil {
log.Printf("post message failed, msg: %s, %v", txt, err)
return
}
if _, err = client.UploadFileV2Context(ctx, slack.UploadFileV2Parameters{
FileSize: resp.image.Len(),
Reader: resp.image,
Filename: imageFileName(),
Title: resp.title,
Channel: channel,
ThreadTimestamp: tt,
AltTxt: txt,
}); err != nil {
log.Printf("upload lattice image error, %v", err)
}
}
func imageFileName() string {
t := time.Now().Format("20060102150405")
return UploadImageFileNamePrefix + "_" + t + "." + UploadFileType
}