142 lines
2.4 KiB
Go
142 lines
2.4 KiB
Go
package linemsg
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
|
|
"git.trj.tw/golang/mtfosbot/model"
|
|
"git.trj.tw/golang/mtfosbot/module/apis/line"
|
|
"git.trj.tw/golang/mtfosbot/module/config"
|
|
lineobj "git.trj.tw/golang/mtfosbot/module/line-message/line-object"
|
|
msgcmd "git.trj.tw/golang/mtfosbot/module/message-command"
|
|
)
|
|
|
|
func messageType(e *lineobj.EventObject) {
|
|
msg := e.Message
|
|
mtype, ok := msg["type"]
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
if t, ok := mtype.(string); ok {
|
|
switch t {
|
|
case "text":
|
|
textMsg(e)
|
|
break
|
|
case "image":
|
|
imageMsg(e)
|
|
break
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func textMsg(e *lineobj.EventObject) {
|
|
msg := e.Message
|
|
mtxt, ok := msg["text"]
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
// group action
|
|
if e.Source.Type == "group" {
|
|
if txt, ok := mtxt.(string); ok {
|
|
msgcmd.ParseLineMsg(txt, e.ReplyToken, e.Source)
|
|
saveTextMsgToLog(txt, e.Source)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func imageMsg(e *lineobj.EventObject) {
|
|
msg := e.Message
|
|
imgID, ok := msg["id"]
|
|
if !ok {
|
|
return
|
|
}
|
|
// group action
|
|
if e.Source.Type == "group" {
|
|
if id, ok := imgID.(string); ok {
|
|
saveImageMsgToLog(id, e.Source)
|
|
}
|
|
}
|
|
}
|
|
|
|
func getSourceUser(uid, gid string) (u *model.LineUser, err error) {
|
|
userData, err := model.GetLineUserByID(uid)
|
|
if err != nil {
|
|
return
|
|
}
|
|
if userData == nil {
|
|
tmpu, err := line.GetUserInfo(uid, gid)
|
|
if err != nil || tmpu == nil {
|
|
return nil, err
|
|
}
|
|
userData = &model.LineUser{}
|
|
userData.ID = tmpu.UserID
|
|
userData.Name = tmpu.DisplayName
|
|
err = userData.Add()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return userData, nil
|
|
}
|
|
|
|
func saveTextMsgToLog(txt string, s *lineobj.SourceObject) {
|
|
u, err := getSourceUser(s.UserID, s.GroupID)
|
|
if err != nil || u == nil {
|
|
return
|
|
}
|
|
|
|
model.AddLineMessageLog(s.GroupID, s.UserID, txt, "text")
|
|
}
|
|
|
|
func saveImageMsgToLog(id string, s *lineobj.SourceObject) {
|
|
u, err := getSourceUser(s.UserID, s.GroupID)
|
|
if err != nil || u == nil {
|
|
return
|
|
}
|
|
|
|
mime, err := line.GetContentHead(id)
|
|
if err != nil || len(mime) == 0 {
|
|
return
|
|
}
|
|
|
|
ext := ""
|
|
switch mime {
|
|
case "image/jpeg":
|
|
ext = ".jpg"
|
|
break
|
|
case "image/jpg":
|
|
ext = ".jpg"
|
|
break
|
|
case "image/png":
|
|
ext = ".png"
|
|
break
|
|
default:
|
|
return
|
|
}
|
|
|
|
conf := config.GetConf()
|
|
|
|
fname := fmt.Sprintf("log_%s%s", id, ext)
|
|
|
|
fullPath := path.Join(conf.LogImageRoot, fname)
|
|
|
|
w, err := os.Create(fullPath)
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer w.Close()
|
|
|
|
err = line.DownloadContent(id, w)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
model.AddLineMessageLog(s.GroupID, s.UserID, fname, "image")
|
|
}
|