-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaliaser.go
97 lines (77 loc) · 1.84 KB
/
aliaser.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
package botmeans
import (
"encoding/json"
"io"
"io/ioutil"
// "log"
"os"
"path"
// "strconv"
"strings"
)
//AliaserFromTemplates creates aliaser from given set of templates
func AliaserFromTemplates(sourceList []io.Reader) CommandAliaser {
ret := make(map[string]retStruct)
for _, reader := range sourceList {
if c, err := ioutil.ReadAll(reader); err == nil {
c = []byte(strings.Replace(string(c), "\n", "", -1))
template := MessageTemplate{}
err := json.Unmarshal(c, &template)
if err != nil {
continue
}
handleTemplate(template, &ret)
}
}
return func(text string) (cmd string, args Args, ook bool) {
if r, ok := ret[text]; ok {
cmd = r.Cmd
args = r.Args
ook = true
}
return
}
}
//AliaserFromTemplateDir reads the given dir and calls AliaserFromTemplates
func AliaserFromTemplateDir(p string) CommandAliaser {
files, _ := ioutil.ReadDir(p)
readers := []io.Reader{}
for _, file := range files {
if file.IsDir() {
continue
}
if f, err := os.Open(path.Join(p, file.Name())); err == nil {
readers = append(readers, f)
}
}
return AliaserFromTemplates(readers)
}
type retStruct struct {
Cmd string
Args Args
}
func handleRow(row []MessageButton, ret *map[string]retStruct) {
for _, button := range row {
cmd := button.Command
text := button.Args
arguments := []arg{}
splitted := []string{}
for _, a := range strings.Split(text, " ") {
trimmed := strings.TrimSpace(a)
if len(trimmed) > 0 {
splitted = append(splitted, trimmed)
}
}
for _, str := range splitted {
arguments = append(arguments, arg{str})
}
(*ret)[button.Text] = retStruct{cmd, args{arguments, text}}
}
}
func handleTemplate(template MessageTemplate, ret *map[string]retStruct) {
for _, keyboard := range template.ReplyKeyboard {
for _, row := range keyboard {
handleRow(row, ret)
}
}
}