Skip to content
This repository has been archived by the owner on Jul 27, 2024. It is now read-only.

Commit

Permalink
Merge pull request #16 from opq-osc/beta
Browse files Browse the repository at this point in the history
合并到主分支
  • Loading branch information
mcoo authored Mar 15, 2022
2 parents e16f6e1 + f0e0457 commit 2fb0817
Show file tree
Hide file tree
Showing 4 changed files with 208 additions and 33 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ go.sum

# Dependency directories (remove the comment below to include it)
# vendor/
.vscode/*
53 changes: 38 additions & 15 deletions example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ package main
import (
"encoding/base64"
"fmt"
"github.com/mcoo/OPQBot"
"github.com/mcoo/requests"
"io/ioutil"
"log"
"os"
"strconv"
"strings"
"time"

"github.com/mcoo/OPQBot"
"github.com/mcoo/requests"
)

var ZanNote = map[int64]int{}
Expand Down Expand Up @@ -52,7 +53,8 @@ func main() {
//log.Println(infoReg.FindStringSubmatch(lists.Data.Data[0]["html"].(string))[1])

//log.Println(ck.PSkey.Qzone)
err = opqBot.AddEvent(OPQBot.EventNameOnGroupMessage, VerifyBlackList, func(botQQ int64, packet *OPQBot.GroupMsgPack) {
var cancel func()
cancel, err = opqBot.AddEvent(OPQBot.EventNameOnGroupMessage, VerifyBlackList, func(botQQ int64, packet *OPQBot.GroupMsgPack) {
if packet.FromUserID != opqBot.QQ {
s := opqBot.Session.SessionStart(packet.FromUserID)
//last, _ := s.GetString("last")
Expand All @@ -68,6 +70,9 @@ func main() {
//b,_ := ioutil.ReadFile("./1.mp3")base64.StdEncoding.EncodeToString(b)
log.Println(opqBot.UploadFileWithBase64("1.mp3", "MTIzMTIzMTIzMjEz", packet.FromGroupID, true))
}
if packet.Content == "取消事件监听" {
cancel()
}
if packet.Content == "#silk" {
b, err := OPQBot.VoiceMp3ToSilk("./secret base ~君がくれたもの~ (10 years after Ver.).mp3")
if err != nil {
Expand Down Expand Up @@ -105,6 +110,24 @@ func main() {
_ = opqBot.ReCallMsg(record.FromGroupID, record.MsgRandom, record.MsgSeq)
},
})
opqBot.Send(OPQBot.SendMsgPack{
SendToType: OPQBot.SendToTypeGroup,
ToUserUid: packet.FromGroupID,
Content: OPQBot.SendTypeTextMsgContent{Content: OPQBot.MacroAt([]int64{packet.FromUserID}) + "20s撤回测试!\n" + OPQBot.MacroId()},
CallbackFunc: func(Code int, Info string, record OPQBot.MyRecord) {
time.Sleep(20 * time.Second)
_ = opqBot.ReCallMsg(record.FromGroupID, record.MsgRandom, record.MsgSeq)
},
})
opqBot.Send(OPQBot.SendMsgPack{
SendToType: OPQBot.SendToTypeGroup,
ToUserUid: packet.FromGroupID,
Content: OPQBot.SendTypeTextMsgContent{Content: OPQBot.MacroAt([]int64{packet.FromUserID}) + "20s撤回测试!\n" + OPQBot.MacroId()},
CallbackFunc: func(Code int, Info string, record OPQBot.MyRecord) {
time.Sleep(20 * time.Second)
_ = opqBot.ReCallMsg(record.FromGroupID, record.MsgRandom, record.MsgSeq)
},
})
}
if packet.Content == "#赞我" {
i, ok := ZanNote[packet.FromUserID]
Expand Down Expand Up @@ -189,7 +212,7 @@ func main() {
if err != nil {
log.Println(err.Error())
}
err = opqBot.AddEvent(OPQBot.EventNameOnFriendMessage, func(botQQ int64, packet *OPQBot.FriendMsgPack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnFriendMessage, func(botQQ int64, packet *OPQBot.FriendMsgPack) {
if packet.Content == "赞我" {
i, ok := ZanNote[packet.FromUin]
if ok {
Expand Down Expand Up @@ -259,46 +282,46 @@ func main() {
if err != nil {
log.Println(err.Error())
}
err = opqBot.AddEvent(OPQBot.EventNameOnGroupShut, func(botQQ int64, packet *OPQBot.GroupShutPack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnGroupShut, func(botQQ int64, packet *OPQBot.GroupShutPack) {
log.Println(botQQ, packet)
})
if err != nil {
log.Println(err.Error())
}
err = opqBot.AddEvent(OPQBot.EventNameOnConnected, func() {
_, err = opqBot.AddEvent(OPQBot.EventNameOnConnected, func() {
log.Println("连接成功!!!")
})
if err != nil {
log.Println(err.Error())
}
err = opqBot.AddEvent(OPQBot.EventNameOnDisconnected, func() {
_, err = opqBot.AddEvent(OPQBot.EventNameOnDisconnected, func() {
log.Println("连接断开!!")
})
if err != nil {
log.Println(err.Error())
}
err = opqBot.AddEvent(OPQBot.EventNameOnOther, func(botQQ int64, e interface{}) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnOther, func(botQQ int64, e interface{}) {
log.Println(e)
})
err = opqBot.AddEvent(OPQBot.EventNameOnGroupSystemNotify, func(botQQ int64, e *OPQBot.GroupSystemNotifyPack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnGroupSystemNotify, func(botQQ int64, e *OPQBot.GroupSystemNotifyPack) {
log.Println(e)
})
err = opqBot.AddEvent(OPQBot.EventNameOnGroupRevoke, func(botQQ int64, e *OPQBot.GroupRevokePack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnGroupRevoke, func(botQQ int64, e *OPQBot.GroupRevokePack) {
log.Println(e)
})
err = opqBot.AddEvent(OPQBot.EventNameOnGroupJoin, func(botQQ int64, e *OPQBot.GroupJoinPack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnGroupJoin, func(botQQ int64, e *OPQBot.GroupJoinPack) {
log.Println(e)
})
err = opqBot.AddEvent(OPQBot.EventNameOnGroupAdmin, func(botQQ int64, e *OPQBot.GroupAdminPack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnGroupAdmin, func(botQQ int64, e *OPQBot.GroupAdminPack) {
log.Println(e)
})
err = opqBot.AddEvent(OPQBot.EventNameOnGroupExit, func(botQQ int64, e *OPQBot.GroupExitPack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnGroupExit, func(botQQ int64, e *OPQBot.GroupExitPack) {
log.Println(e)
})
err = opqBot.AddEvent(OPQBot.EventNameOnGroupExitSuccess, func(botQQ int64, e *OPQBot.GroupExitSuccessPack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnGroupExitSuccess, func(botQQ int64, e *OPQBot.GroupExitSuccessPack) {
log.Println(e)
})
err = opqBot.AddEvent(OPQBot.EventNameOnGroupAdminSysNotify, func(botQQ int64, e *OPQBot.GroupAdminSysNotifyPack) {
_, err = opqBot.AddEvent(OPQBot.EventNameOnGroupAdminSysNotify, func(botQQ int64, e *OPQBot.GroupAdminSysNotifyPack) {
log.Println(e)
})
if err != nil {
Expand Down
114 changes: 101 additions & 13 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import (
"bytes"
"crypto/rand"
"encoding/base64"
"encoding/json"
"errors"
"github.com/sirupsen/logrus"
"io/ioutil"
"math/big"
"os"
Expand All @@ -18,6 +18,8 @@ import (
"sync"
"time"

"github.com/sirupsen/logrus"

nested "github.com/antonfisher/nested-logrus-formatter"
"github.com/goinggo/mapstructure"
gosocketio "github.com/mcoo/OPQBot/golang-socketio-edit"
Expand Down Expand Up @@ -56,6 +58,67 @@ func (b *BotManager) SetMaxRetryCount(maxRetryCount int) {

var interrupt chan os.Signal

func ParserGroupAtMsg(pack GroupMsgPack) (a AtMsg, e error) {
if pack.MsgType != "AtMsg" {
e = errors.New("Not AtMsg. ")
return
}
e = json.Unmarshal([]byte(pack.Content), &a)
if e != nil {
return
}
return
}
func (a AtMsg) Clean() AtMsg {
for _, v := range a.UserExt {
a.Content = strings.TrimSpace(strings.ReplaceAll(a.Content, "@"+v.QQNick, ""))
}
return a
}
func ParserGroupReplyMsg(pack GroupMsgPack) (a Reply, e error) {
if pack.MsgType != "AtMsg" {
e = errors.New("Not ReplyMsg. ")
return
}
e = json.Unmarshal([]byte(pack.Content), &a)
if e != nil {
return
}
return
}
func ParserGroupPicMsg(pack GroupMsgPack) (a PicMsg, e error) {
if pack.MsgType != "PicMsg" {
e = errors.New("Not PicMsg. ")
return
}
e = json.Unmarshal([]byte(pack.Content), &a)
if e != nil {
return
}
return
}
func ParserGroupFileMsg(pack GroupMsgPack) (a GroupFileMsg, e error) {
if pack.MsgType != "GroupFileMsg" {
e = errors.New("Not GroupFileMsg. ")
return
}
e = json.Unmarshal([]byte(pack.Content), &a)
if e != nil {
return
}
return
}
func ParserVideoMsg(pack GroupMsgPack) (a VideoMsg, e error) {
if pack.MsgType != "VideoMsg" {
e = errors.New("Not VideoMsg. ")
return
}
e = json.Unmarshal([]byte(pack.Content), &a)
if e != nil {
return
}
return
}
func (b *BotManager) Wait() {
home:
b.wg.Wait()
Expand Down Expand Up @@ -162,14 +225,14 @@ func init() {
func SetLog(l *logrus.Entry) {
log = l
}
func NewBotManager(QQ int64, OPQUrl string) BotManager {
func NewBotManager(QQ int64, OPQUrl string) *BotManager {

s, err := session.NewManager("qq", 3600)
if err != nil {
panic(err)
}
go s.GC()
b := BotManager{restart: make(chan int, 1), Session: s, Done: make(chan int, 10), MaxRetryCount: 10, wg: sync.WaitGroup{}, QQ: QQ, OPQUrl: OPQUrl, SendChan: make(chan SendMsgPack, 1024), onEvent: make(map[string][][]reflect.Value), myRecord: map[string]MyRecord{}, myRecordLocker: sync.RWMutex{}, locker: sync.RWMutex{}, delayed: 1000}
b := &BotManager{restart: make(chan int, 1), Session: s, Done: make(chan int, 10), MaxRetryCount: 10, wg: sync.WaitGroup{}, QQ: QQ, OPQUrl: OPQUrl, SendChan: make(chan SendMsgPack, 1024), onEvent: make(map[string][][]reflect.Value), myRecord: map[string]MyRecord{}, myRecordLocker: sync.RWMutex{}, locker: sync.RWMutex{}, delayed: 1000}
go func() {
for {
select {
Expand Down Expand Up @@ -952,12 +1015,15 @@ func MacroAtAll() string {
return "[ATALL()]"
}

func (b *BotManager) AddEvent(EventName string, f ...interface{}) error {
func (b *BotManager) AddEvent(EventName string, f ...interface{}) (func(), error) {
var events []reflect.Value
if len(f) == 0 {
return nil, errors.New("调用错误")
}
for _, v := range f {
fVal := reflect.ValueOf(v)
if fVal.Kind() != reflect.Func {
return errors.New("NotFuncError")
return nil, errors.New("NotFuncError")
}
var okStruck string
switch EventName {
Expand Down Expand Up @@ -988,23 +1054,35 @@ func (b *BotManager) AddEvent(EventName string, f ...interface{}) error {
case EventNameOnOther:
okStruck = "interface {}"
default:
return errors.New("Unknown EventName ")
return nil, errors.New("Unknown EventName ")
}

if fVal.Type().NumIn() == 0 && okStruck == "ok" {
events = append(events, fVal)
continue
}
if fVal.Type().NumIn() != 2 || fVal.Type().In(1).String() != okStruck {
return errors.New(EventName + ": FuncError, Your Function Should Have " + okStruck + " Your Struct is " + fVal.Type().In(1).String())
return nil, errors.New(EventName + ": FuncError, Your Function Should Have " + okStruck + " Your Struct is " + fVal.Type().In(1).String())
}

events = append(events, fVal)
}
b.locker.Lock()
defer b.locker.Unlock()
b.onEvent[EventName] = append(b.onEvent[EventName], events)
return nil
return func() {
b.locker.Lock()
defer b.locker.Unlock()
for i, v := range b.onEvent[EventName] {
if len(v) > 0 && v[0] == reflect.ValueOf(f[0]) {
if len(b.onEvent[EventName]) == 1 {
delete(b.onEvent, EventName)
break
}
b.onEvent[EventName] = append(b.onEvent[EventName][:i], b.onEvent[EventName][i+1:]...)
}
}
}, nil

}

Expand All @@ -1029,8 +1107,12 @@ func (b *BotManager) RegSendMiddleware(priority int, f func(m map[string]interfa
b.middleware = append(b.middleware, middle)
return nil
}
func (b *BotManager) CallFunc(FuncName string, funcstruct interface{}) {

func (b *BotManager) CallFunc(FuncName string, funcStruct string) ([]byte, error) {
res, err := requests.PostJson(b.OPQUrl+"/v1/LuaApiCaller?funcname="+FuncName+"&qq="+strconv.FormatInt(b.QQ, 10), funcStruct)
if err != nil {
return nil, err
}
return res.Content(), nil
}
func (b *BotManager) receiveSendPack() {
log.Info("QQ发送信息通道开启")
Expand Down Expand Up @@ -1160,20 +1242,26 @@ OuterLoop:
sendJsonPack["SendToType"] = sendMsgPack.SendToType
sendJsonPack["ForwordBuf"] = content.ForwordBuf
sendJsonPack["ForwordField"] = content.ForwordField
sendJsonPack["Content"] = content.Content
record.MsgType = "ForwordMsg"
case SendTypeForwordContentPrivateChat:
sendJsonPack["SendMsgType"] = "ForwordMsg"
sendJsonPack["SendToType"] = sendMsgPack.SendToType
sendJsonPack["ForwordBuf"] = content.ForwordBuf
sendJsonPack["ForwordField"] = content.ForwordField
sendJsonPack["GroupID"] = content.Group
sendJsonPack["Content"] = content.Content
record.MsgType = "ForwordMsg"

case SendTypeRelayContent:
case SendTypeReplyContent:
sendJsonPack["SendMsgType"] = "ReplayMsg"
sendJsonPack["ReplayInfo"] = content.ReplayInfo
sendJsonPack["SendToType"] = sendMsgPack.SendToType
sendJsonPack["Content"] = content.Content
record.MsgType = "ReplayMsg"
case SendTypeRelayContentPrivateChat:
case SendTypeReplyContentPrivateChat:
sendJsonPack["SendMsgType"] = "ReplayMsg"
sendJsonPack["Content"] = content.Content
sendJsonPack["SendToType"] = sendMsgPack.SendToType
sendJsonPack["ReplayInfo"] = content.ReplayInfo
sendJsonPack["GroupID"] = content.Group
Expand Down Expand Up @@ -1266,7 +1354,7 @@ OuterLoop:
sendMsgPack.CallbackFunc(result.Ret, result.Msg, myRecordPack)
stop <- true

case <-time.After(2 * time.Second):
case <-time.After(10 * time.Second):
sendMsgPack.CallbackFunc(result.Ret, result.Msg, MyRecord{})
stop <- true
}
Expand Down
Loading

0 comments on commit 2fb0817

Please sign in to comment.