update
This commit is contained in:
parent
7823fb86ab
commit
a83ff3a0df
6
main.go
6
main.go
@ -8,6 +8,7 @@ import (
|
|||||||
"git.trj.tw/golang/mtfosbot/model"
|
"git.trj.tw/golang/mtfosbot/model"
|
||||||
"git.trj.tw/golang/mtfosbot/module/background"
|
"git.trj.tw/golang/mtfosbot/module/background"
|
||||||
"git.trj.tw/golang/mtfosbot/module/config"
|
"git.trj.tw/golang/mtfosbot/module/config"
|
||||||
|
twitchirc "git.trj.tw/golang/mtfosbot/module/twitch-irc"
|
||||||
"git.trj.tw/golang/mtfosbot/router/routes"
|
"git.trj.tw/golang/mtfosbot/router/routes"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
@ -33,5 +34,10 @@ func main() {
|
|||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
|
err = twitchirc.InitIRC()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
server.Run(strings.Join([]string{":", strconv.Itoa(config.GetConf().Port)}, ""))
|
server.Run(strings.Join([]string{":", strconv.Itoa(config.GetConf().Port)}, ""))
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
// Commands - struct
|
// Commands - struct
|
||||||
type Commands struct {
|
type Commands struct {
|
||||||
@ -10,3 +14,36 @@ type Commands struct {
|
|||||||
Ctime time.Time `db:"ctime" cc:"ctime"`
|
Ctime time.Time `db:"ctime" cc:"ctime"`
|
||||||
Mtime time.Time `db:"mtime" cc:"ctime"`
|
Mtime time.Time `db:"mtime" cc:"ctime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAllCommands -
|
||||||
|
func GetAllCommands() (cmds []*Commands, err error) {
|
||||||
|
err = x.Select(&cmds, `select * from "public"."commands"`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGroupCommand -
|
||||||
|
func GetGroupCommand(c, g string) (cmd *Commands, err error) {
|
||||||
|
if len(c) == 0 {
|
||||||
|
return nil, errors.New("command is empty")
|
||||||
|
}
|
||||||
|
tmpCmd := struct {
|
||||||
|
Commands
|
||||||
|
Message2 sql.NullString `db:"message2"`
|
||||||
|
}{}
|
||||||
|
query := `select c.*, c2.message as message2 from "public"."commands" c
|
||||||
|
left join "public"."commands" c2
|
||||||
|
on c2.cmd = c.cmd and c2."group" = $2
|
||||||
|
where c."cmd" = $1
|
||||||
|
and c."group" = ''`
|
||||||
|
err = x.Get(&tmpCmd, query, c, g)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = &tmpCmd.Commands
|
||||||
|
if tmpCmd.Message2.Valid {
|
||||||
|
cmd.Message = tmpCmd.Message2.String
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
// KeyCommands - struct
|
// KeyCommands - struct
|
||||||
type KeyCommands struct {
|
type KeyCommands struct {
|
||||||
@ -10,3 +14,30 @@ type KeyCommands struct {
|
|||||||
Ctime time.Time `db:"ctime" cc:"ctime"`
|
Ctime time.Time `db:"ctime" cc:"ctime"`
|
||||||
Mtime time.Time `db:"mtime" cc:"ctime"`
|
Mtime time.Time `db:"mtime" cc:"ctime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetKeyCommand -
|
||||||
|
func GetKeyCommand(c, g string) (cmd *KeyCommands, err error) {
|
||||||
|
if len(c) == 0 {
|
||||||
|
return nil, errors.New("command is empty")
|
||||||
|
}
|
||||||
|
tmpCmd := struct {
|
||||||
|
KeyCommands
|
||||||
|
Message2 sql.NullString `db:"message2"`
|
||||||
|
}{}
|
||||||
|
query := `select c.*, c2.message as message2 from "public"."key_commands" c
|
||||||
|
left join "public"."key_commands" c2
|
||||||
|
on c2.key = c.key and c2."group" = $2
|
||||||
|
where c."key" = $1
|
||||||
|
and c."group" = ''`
|
||||||
|
err = x.Get(&tmpCmd, query, c, g)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = &tmpCmd.KeyCommands
|
||||||
|
if tmpCmd.Message2.Valid {
|
||||||
|
cmd.Message = tmpCmd.Message2.String
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@ -11,3 +11,16 @@ type LineGroup struct {
|
|||||||
Ctime time.Time `db:"ctime" cc:"ctime"`
|
Ctime time.Time `db:"ctime" cc:"ctime"`
|
||||||
Mtime time.Time `db:"mtime" cc:"ctime"`
|
Mtime time.Time `db:"mtime" cc:"ctime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CheckGroup -
|
||||||
|
func CheckGroup(g string) (exists bool, err error) {
|
||||||
|
ss := struct {
|
||||||
|
C int `db:"c"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
err = x.Get(&ss, `select count(*) as c from "public"."line_group" where "id" = $1`, g)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return ss.C > 0, nil
|
||||||
|
}
|
||||||
|
@ -26,6 +26,12 @@ func GetAllTwitchChannel() (channels []*TwitchChannel, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetJoinChatChannel -
|
||||||
|
func GetJoinChatChannel() (channels []*TwitchChannel, err error) {
|
||||||
|
err = x.Select(&channels, `select * from "public"."twitch_channel" where "join" = true`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// UpdateStream -
|
// UpdateStream -
|
||||||
func (p *TwitchChannel) UpdateStream(streamID string) (err error) {
|
func (p *TwitchChannel) UpdateStream(streamID string) (err error) {
|
||||||
query := `update "public"."twitch_channel" set "laststream" = $1 where "id" = $2`
|
query := `update "public"."twitch_channel" set "laststream" = $1 where "id" = $2`
|
||||||
|
17
module/line-message/line-object/line-object.go
Normal file
17
module/line-message/line-object/line-object.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package lineobj
|
||||||
|
|
||||||
|
// EventObject -
|
||||||
|
type EventObject struct {
|
||||||
|
Source *SourceObject `json:"source" cc:"source"`
|
||||||
|
Type string `json:"type" cc:"type"`
|
||||||
|
Timestamp int32 `json:"timestamp" cc:"timestamp"`
|
||||||
|
ReplyToken string `json:"replyToken" cc:"replyToken"`
|
||||||
|
Message map[string]interface{} `json:"message" cc:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SourceObject -
|
||||||
|
type SourceObject struct {
|
||||||
|
Type string `json:"type" cc:"type"`
|
||||||
|
UserID string `json:"userId" cc:"userId"`
|
||||||
|
GroupID string `json:"groupId" cc:"groupId"`
|
||||||
|
}
|
19
module/line-message/message-event.go
Normal file
19
module/line-message/message-event.go
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package linemsg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
lineobj "git.trj.tw/golang/mtfosbot/module/line-message/line-object"
|
||||||
|
"git.trj.tw/golang/mtfosbot/module/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MessageEvent -
|
||||||
|
func MessageEvent(e *lineobj.EventObject) {
|
||||||
|
fmt.Println(utils.ToMap(e))
|
||||||
|
|
||||||
|
switch e.Type {
|
||||||
|
case "message":
|
||||||
|
messageType(e)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
39
module/line-message/message-type.go
Normal file
39
module/line-message/message-type.go
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package linemsg
|
||||||
|
|
||||||
|
import (
|
||||||
|
lineobj "git.trj.tw/golang/mtfosbot/module/line-message/line-object"
|
||||||
|
)
|
||||||
|
|
||||||
|
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":
|
||||||
|
break
|
||||||
|
case "image":
|
||||||
|
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 _, ok := mtxt.(string); ok {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
@ -36,6 +36,26 @@ func InitIRC() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SendMessage -
|
||||||
|
func SendMessage(ch, msg string) {
|
||||||
|
if len(ch) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if indexOf(channels, ch) == -1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
m := &MsgObj{
|
||||||
|
Command: "PRIVMSG",
|
||||||
|
Params: []string{
|
||||||
|
fmt.Sprintf("#%s", ch),
|
||||||
|
fmt.Sprintf(":%s", msg),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
queue.Add(m)
|
||||||
|
}
|
||||||
|
|
||||||
// JoinChannel -
|
// JoinChannel -
|
||||||
func JoinChannel(ch string) {
|
func JoinChannel(ch string) {
|
||||||
if len(ch) == 0 {
|
if len(ch) == 0 {
|
||||||
@ -88,21 +108,29 @@ func runQueue() {
|
|||||||
msg := &irc.Message{}
|
msg := &irc.Message{}
|
||||||
msg.Command = m.Command
|
msg.Command = m.Command
|
||||||
msg.Params = m.Params
|
msg.Params = m.Params
|
||||||
err := client.WriteMessage(msg)
|
|
||||||
if err == nil {
|
|
||||||
if m.Command == "JOIN" {
|
if m.Command == "JOIN" {
|
||||||
|
if indexOf(channels, m.Params[0][1:]) != -1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
channels = append(channels, m.Params[0][1:])
|
||||||
} else if m.Command == "PART" {
|
} else if m.Command == "PART" {
|
||||||
|
if indexOf(channels, m.Params[0][1:]) == -1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
idx := indexOf(channels, m.Params[0][1:])
|
||||||
|
channels = append(channels[:idx], channels[idx+1:]...)
|
||||||
|
}
|
||||||
|
fmt.Println("< ", msg.String())
|
||||||
|
client.WriteMessage(msg)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
time.Sleep(time.Microsecond * 1500)
|
time.Sleep(time.Microsecond * 1500)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ircHandle(c *irc.Client, m *irc.Message) {
|
func ircHandle(c *irc.Client, m *irc.Message) {
|
||||||
|
fmt.Println("> ", m.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func indexOf(c []string, data string) int {
|
func indexOf(c []string, data string) int {
|
||||||
|
@ -1,8 +1,93 @@
|
|||||||
package line
|
package line
|
||||||
|
|
||||||
import "context"
|
import (
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
|
||||||
|
"git.trj.tw/golang/mtfosbot/module/config"
|
||||||
|
"git.trj.tw/golang/mtfosbot/module/context"
|
||||||
|
"git.trj.tw/golang/mtfosbot/module/line-message"
|
||||||
|
lineobj "git.trj.tw/golang/mtfosbot/module/line-message/line-object"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetRawBody - line webhook body get
|
||||||
|
func GetRawBody(c *context.Context) {
|
||||||
|
byteBody, err := ioutil.ReadAll(c.Request.Body)
|
||||||
|
if err != nil {
|
||||||
|
c.DataFormat("body read fail")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Set("rawbody", byteBody)
|
||||||
|
c.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyLine - middleware
|
||||||
|
func VerifyLine(c *context.Context) {
|
||||||
|
rawbody, ok := c.Get("rawbody")
|
||||||
|
if !ok {
|
||||||
|
c.DataFormat("body read fail")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var raw []byte
|
||||||
|
if raw, ok = rawbody.([]byte); !ok {
|
||||||
|
c.DataFormat("body type error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sign := c.GetHeader("X-Line-Signature")
|
||||||
|
if len(sign) == 0 {
|
||||||
|
c.Next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
conf := config.GetConf()
|
||||||
|
|
||||||
|
hash := hmac.New(sha256.New, []byte(conf.Line.Secret))
|
||||||
|
_, err := hash.Write(raw)
|
||||||
|
if err != nil {
|
||||||
|
c.ServerError(nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
hashSign := base64.StdEncoding.EncodeToString(hash.Sum(nil))
|
||||||
|
if hashSign != sign {
|
||||||
|
c.CustomRes(403, map[string]string{
|
||||||
|
"message": "sign verify fail",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Next()
|
||||||
|
}
|
||||||
|
|
||||||
// GetLineMessage -
|
// GetLineMessage -
|
||||||
func GetLineMessage(c *context.Context) {
|
func GetLineMessage(c *context.Context) {
|
||||||
|
rawbody, ok := c.Get("rawbody")
|
||||||
|
if !ok {
|
||||||
|
c.DataFormat("body read fail")
|
||||||
|
}
|
||||||
|
var raw []byte
|
||||||
|
if raw, ok = rawbody.([]byte); !ok {
|
||||||
|
c.DataFormat("body type error")
|
||||||
|
}
|
||||||
|
|
||||||
|
events := struct {
|
||||||
|
Events []*lineobj.EventObject `json:"events"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
err := json.Unmarshal(raw, &events)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("parse line message error ::: ", err)
|
||||||
|
c.ServerError(nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(events.Events) > 0 {
|
||||||
|
for _, v := range events.Events {
|
||||||
|
go linemsg.MessageEvent(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Success(nil)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user