add line message command , not fin

This commit is contained in:
Jay
2018-09-15 00:01:36 +08:00
parent a83ff3a0df
commit e954afe80b
9 changed files with 333 additions and 11 deletions
+148
View File
@@ -0,0 +1,148 @@
package msgcmd
import (
"strconv"
"strings"
"git.trj.tw/golang/mtfosbot/module/apis/twitch"
"git.trj.tw/golang/mtfosbot/model"
lineobj "git.trj.tw/golang/mtfosbot/module/line-message/line-object"
)
func selectAct(cmd, sub, txt string, s *lineobj.SourceObject) (res string) {
switch cmd {
case "addgroup":
return addLineGroup(sub, txt, s)
case "addpage":
return addFacebookPage(sub, txt, s)
case "addtwitch":
return addTwitchChannel(sub, txt, s)
}
return
}
func addLineGroup(sub, txt string, s *lineobj.SourceObject) (res string) {
// args = groupName notify
exists, err := model.CheckGroup(s.GroupID)
if err != nil {
return "run check group error"
}
if exists {
return "group exists"
}
args := strings.Split(strings.Trim(txt, " "), " ")
if len(args) < 2 {
return "command args not match"
}
i, err := strconv.ParseInt(args[1], 10, 8)
if err != nil || i < 0 || i > 1 {
return "notify plases input 1 or 0"
}
_, err = model.AddLineGroup(args[0], s.UserID, i == 1)
if err != nil {
return "add group fail"
}
return "Success"
}
func addFacebookPage(sub, txt string, s *lineobj.SourceObject) (res string) {
// args = pageid tmpl
exists, err := model.CheckGroup(s.GroupID)
if err != nil {
return "run check group error"
}
if !exists {
return "group not exists"
}
ok, err := model.CheckGroupOwner(s.UserID, s.GroupID)
if err != nil {
return "run check group owner fail"
}
if !ok {
return "not owner"
}
args := strings.Split(strings.Trim(txt, " "), " ")
if len(args) < 2 {
return "command args not match"
}
page, err := model.GetFacebookPage(args[0])
if err != nil {
return "check facebook page fail"
}
if page == nil {
page = &model.FacebookPage{
ID: args[0],
}
err = page.AddPage()
if err != nil {
return "add facebook page fail"
}
}
rt := &model.LineFacebookRT{
Line: s.GroupID,
Facebook: args[0],
Tmpl: strings.Join(args[1:], " "),
}
err = rt.AddRT()
if err != nil {
return "add facebook page fail"
}
return "Success"
}
func addTwitchChannel(sub, txt string, s *lineobj.SourceObject) (res string) {
// args = twitchLogin type tmpl
exists, err := model.CheckGroup(s.GroupID)
if err != nil {
return "run check group error"
}
if !exists {
return "group not exists"
}
ok, err := model.CheckGroupOwner(s.UserID, s.GroupID)
if err != nil {
return "run check group owner fail"
}
if !ok {
return "not owner"
}
args := strings.Split(strings.Trim(txt, " "), " ")
if len(args) < 3 {
return "command args not match"
}
info := twitch.GetUserDataByName(args[0])
if info == nil {
return "get twitch user id fail"
}
ch := &model.TwitchChannel{
ID: info.ID,
Name: info.DisplayName,
}
err = ch.Add()
if err != nil {
return "add twitch channel fail"
}
rt := &model.LineTwitchRT{
Line: s.GroupID,
Twitch: info.ID,
Tmpl: strings.Join(args[2:], " "),
}
err = rt.AddRT()
if err != nil {
return "add rt data fail"
}
return "Success"
}
+102
View File
@@ -0,0 +1,102 @@
package msgcmd
import (
"regexp"
"strings"
"git.trj.tw/golang/mtfosbot/model"
"git.trj.tw/golang/mtfosbot/module/apis/line"
lineobj "git.trj.tw/golang/mtfosbot/module/line-message/line-object"
)
func parseCMD(in string) (c [][]string) {
re, err := regexp.Compile("{{(.+?)}}")
if err != nil {
return
}
c = re.FindAllStringSubmatch(in, -1)
return
}
// ParseLineMsg -
func ParseLineMsg(txt, replyToken string, source *lineobj.SourceObject) {
if source.Type != "group" {
return
}
strs := strings.Split(strings.Trim(txt, " "), " ")
// skip empty string
if len(strs[0]) == 0 {
return
}
if strings.HasPrefix(strs[0], "!") || strings.HasPrefix(strs[0], "") {
// nor cmd
cmd := strs[0][1:]
if len(cmd) == 0 {
return
}
c, err := model.GetGroupCommand(cmd, source.GroupID)
if err != nil || c == nil {
return
}
str := runCMD(strings.Join(strs[1:], " "), c.Message, source)
m := parseResult(str)
line.ReplyMessage(replyToken, m)
} else {
// key cmd
c, err := model.GetGroupKeyCommand(strs[0], source.GroupID)
if err != nil || c == nil {
return
}
str := runCMD(strings.Join(strs[1:], " "), c.Message, source)
m := parseResult(str)
line.ReplyMessage(replyToken, m)
}
}
func parseResult(str string) interface{} {
var m interface{}
if strings.HasPrefix(str, "$image$") {
str = strings.Replace(str, "$image$", "", 1)
strs := strings.Split(str, ";")
m = &line.ImageMessage{
OriginalContentURL: strs[0],
PreviewImageURL: strs[1],
}
} else {
m = &line.TextMessage{
Text: str,
}
}
return m
}
func runCMD(txt, c string, s *lineobj.SourceObject) (res string) {
cmdAct := parseCMD(c)
if len(cmdAct) == 0 {
return c
}
res = c
for _, v := range cmdAct {
if len(v) > 1 {
// run cmd
m := strings.Split(v[1], "=")
sub := ""
if len(m) > 1 {
sub = strings.Join(m[1:], " ")
}
cmdRes := selectAct(m[0], sub, txt, s)
res = strings.Replace(res, v[1], cmdRes, 1)
}
}
return
}