mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-05 03:23:49 +08:00
clear code.
This commit is contained in:
parent
d76bcfb1f0
commit
3468c38fbc
@ -490,7 +490,7 @@ func (bot *CQBot) CQDeleteMessage(messageId int32) MSG {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if msg["sender"].(message.Sender).Uin != bot.Client.Uin {
|
if msg["sender"].(message.Sender).Uin != bot.Client.Uin {
|
||||||
log.Warnf("撤回 %v 失败: 好友会话无法撤回对方消息.")
|
log.Warnf("撤回 %v 失败: 好友会话无法撤回对方消息.", messageId)
|
||||||
return Failed(100, "CANNOT_RECALL_FRIEND_MSG", "无法撤回对方消息")
|
return Failed(100, "CANNOT_RECALL_FRIEND_MSG", "无法撤回对方消息")
|
||||||
}
|
}
|
||||||
if err := bot.Client.RecallPrivateMessage(msg["target"].(int64), int64(msg["time"].(int32)), msg["message-id"].(int32), msg["internal-id"].(int32)); err != nil {
|
if err := bot.Client.RecallPrivateMessage(msg["target"].(int64), int64(msg["time"].(int32)), msg["message-id"].(int32), msg["internal-id"].(int32)); err != nil {
|
||||||
|
183
coolq/cqcode.go
183
coolq/cqcode.go
@ -1,6 +1,7 @@
|
|||||||
package coolq
|
package coolq
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
@ -9,9 +10,9 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"math"
|
||||||
"net/url"
|
"net/url"
|
||||||
"path"
|
"path"
|
||||||
"regexp"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -23,9 +24,11 @@ import (
|
|||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
var matchReg = regexp.MustCompile(`\[CQ:\w+?.*?]`)
|
var matchReg = regexp.MustCompile(`\[CQ:\w+?.*?]`)
|
||||||
var typeReg = regexp.MustCompile(`\[CQ:(\w+)`)
|
var typeReg = regexp.MustCompile(`\[CQ:(\w+)`)
|
||||||
var paramReg = regexp.MustCompile(`,([\w\-.]+?)=([^,\]]+)`)
|
var paramReg = regexp.MustCompile(`,([\w\-.]+?)=([^,\]]+)`)
|
||||||
|
*/
|
||||||
|
|
||||||
var IgnoreInvalidCQCode = false
|
var IgnoreInvalidCQCode = false
|
||||||
|
|
||||||
@ -315,70 +318,130 @@ func ToStringMessage(e []message.IMessageElement, code int64, raw ...bool) (r st
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessageElement) {
|
func (bot *CQBot) ConvertStringMessage(msg string, group bool) (r []message.IMessageElement) {
|
||||||
c := newCQCodeConverter(m, bot, group)
|
index := 0
|
||||||
return c.convert()
|
stat := 0
|
||||||
/*
|
rMsg := []rune(msg)
|
||||||
i := matchReg.FindAllStringSubmatchIndex(m, -1)
|
var tempText, cqCode []rune
|
||||||
si := 0
|
hasNext := func() bool {
|
||||||
for _, idx := range i {
|
return index < len(rMsg)
|
||||||
if idx[0] > si {
|
}
|
||||||
text := m[si:idx[0]]
|
next := func() rune {
|
||||||
r = append(r, message.NewText(CQCodeUnescapeText(text)))
|
r := rMsg[index]
|
||||||
|
index++
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
move := func(steps int) {
|
||||||
|
index += steps
|
||||||
|
}
|
||||||
|
peekN := func(count int) string {
|
||||||
|
lastIdx := int(math.Min(float64(index+count), float64(len(rMsg))))
|
||||||
|
return string(rMsg[index:lastIdx])
|
||||||
|
}
|
||||||
|
isCQCodeBegin := func(r rune) bool {
|
||||||
|
return r == '[' && peekN(3) == "CQ:"
|
||||||
|
}
|
||||||
|
saveTempText := func() {
|
||||||
|
if len(tempText) != 0 {
|
||||||
|
r = append(r, message.NewText(CQCodeUnescapeValue(string(tempText))))
|
||||||
|
}
|
||||||
|
tempText = []rune{}
|
||||||
|
cqCode = []rune{}
|
||||||
|
}
|
||||||
|
saveCQCode := func() {
|
||||||
|
defer func() {
|
||||||
|
cqCode = []rune{}
|
||||||
|
tempText = []rune{}
|
||||||
|
}()
|
||||||
|
reader := strings.NewReader(string(cqCode))
|
||||||
|
buf := bufio.NewReader(reader)
|
||||||
|
t, _ := buf.ReadString(',')
|
||||||
|
t = t[0 : len(t)-1]
|
||||||
|
params := make(map[string]string)
|
||||||
|
for buf.Buffered() > 0 {
|
||||||
|
p, _ := buf.ReadString(',')
|
||||||
|
if strings.HasSuffix(p, ",") {
|
||||||
|
p = p[0 : len(p)-1]
|
||||||
}
|
}
|
||||||
code := m[idx[0]:idx[1]]
|
p = strings.TrimSpace(p)
|
||||||
si = idx[1]
|
if p == "" {
|
||||||
t := typeReg.FindAllStringSubmatch(code, -1)[0][1]
|
|
||||||
ps := paramReg.FindAllStringSubmatch(code, -1)
|
|
||||||
d := make(map[string]string)
|
|
||||||
for _, p := range ps {
|
|
||||||
d[p[1]] = CQCodeUnescapeValue(p[2])
|
|
||||||
}
|
|
||||||
if t == "reply" {
|
|
||||||
if len(r) > 0 {
|
|
||||||
if _, ok := r[0].(*message.ReplyElement); ok {
|
|
||||||
log.Warnf("警告: 一条信息只能包含一个 Reply 元素.")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mid, err := strconv.Atoi(d["id"])
|
|
||||||
if err == nil {
|
|
||||||
org := bot.GetMessage(int32(mid))
|
|
||||||
if org != nil {
|
|
||||||
r = append([]message.IMessageElement{
|
|
||||||
&message.ReplyElement{
|
|
||||||
ReplySeq: org["message-id"].(int32),
|
|
||||||
Sender: org["sender"].(message.Sender).Uin,
|
|
||||||
Time: org["time"].(int32),
|
|
||||||
Elements: bot.ConvertStringMessage(org["message"].(string), group),
|
|
||||||
},
|
|
||||||
}, r...)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elem, err := bot.ToElement(t, d, group)
|
|
||||||
if err != nil {
|
|
||||||
if !IgnoreInvalidCQCode {
|
|
||||||
log.Warnf("转换CQ码 %v 到MiraiGo Element时出现错误: %v 将原样发送.", code, err)
|
|
||||||
r = append(r, message.NewText(code))
|
|
||||||
} else {
|
|
||||||
log.Warnf("转换CQ码 %v 到MiraiGo Element时出现错误: %v 将忽略.", code, err)
|
|
||||||
}
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
switch i := elem.(type) {
|
data := strings.SplitN(p, "=", 2)
|
||||||
case message.IMessageElement:
|
if len(data) == 2 {
|
||||||
r = append(r, i)
|
params[data[0]] = data[1]
|
||||||
case []message.IMessageElement:
|
} else {
|
||||||
r = append(r, i...)
|
params[p] = ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if si != len(m) {
|
if t == "reply" { // reply 特殊处理
|
||||||
r = append(r, message.NewText(CQCodeUnescapeText(m[si:])))
|
if len(r) > 0 {
|
||||||
|
if _, ok := r[0].(*message.ReplyElement); ok {
|
||||||
|
log.Warnf("警告: 一条信息只能包含一个 Reply 元素.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mid, err := strconv.Atoi(params["id"])
|
||||||
|
if err == nil {
|
||||||
|
org := bot.GetMessage(int32(mid))
|
||||||
|
if org != nil {
|
||||||
|
r = append([]message.IMessageElement{
|
||||||
|
&message.ReplyElement{
|
||||||
|
ReplySeq: org["message-id"].(int32),
|
||||||
|
Sender: org["sender"].(message.Sender).Uin,
|
||||||
|
Time: org["time"].(int32),
|
||||||
|
Elements: bot.ConvertStringMessage(org["message"].(string), group),
|
||||||
|
},
|
||||||
|
}, r...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
elem, err := bot.ToElement(t, params, group)
|
||||||
*/
|
if err != nil {
|
||||||
|
org := "[" + string(cqCode) + "]"
|
||||||
|
if !IgnoreInvalidCQCode {
|
||||||
|
log.Warnf("转换CQ码 %v 时出现错误: %v 将原样发送.", org, err)
|
||||||
|
r = append(r, message.NewText(org))
|
||||||
|
} else {
|
||||||
|
log.Warnf("转换CQ码 %v 时出现错误: %v 将忽略.", org, err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch i := elem.(type) {
|
||||||
|
case message.IMessageElement:
|
||||||
|
r = append(r, i)
|
||||||
|
case []message.IMessageElement:
|
||||||
|
r = append(r, i...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for hasNext() {
|
||||||
|
ch := next()
|
||||||
|
switch stat {
|
||||||
|
case 0:
|
||||||
|
if isCQCodeBegin(ch) {
|
||||||
|
saveTempText()
|
||||||
|
tempText = append(tempText, []rune("[CQ:")...)
|
||||||
|
move(3)
|
||||||
|
stat = 1
|
||||||
|
} else {
|
||||||
|
tempText = append(tempText, ch)
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
if isCQCodeBegin(ch) {
|
||||||
|
move(-1)
|
||||||
|
stat = 0
|
||||||
|
} else if ch == ']' {
|
||||||
|
saveCQCode()
|
||||||
|
stat = 0
|
||||||
|
} else {
|
||||||
|
cqCode = append(cqCode, ch)
|
||||||
|
tempText = append(tempText, ch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
saveTempText()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.IMessageElement) {
|
func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.IMessageElement) {
|
||||||
@ -634,14 +697,12 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (m interf
|
|||||||
case "xml":
|
case "xml":
|
||||||
resId := d["resid"]
|
resId := d["resid"]
|
||||||
template := CQCodeEscapeValue(d["data"])
|
template := CQCodeEscapeValue(d["data"])
|
||||||
//println(template)
|
|
||||||
i, _ := strconv.ParseInt(resId, 10, 64)
|
i, _ := strconv.ParseInt(resId, 10, 64)
|
||||||
msg := message.NewRichXml(template, i)
|
msg := message.NewRichXml(template, i)
|
||||||
return msg, nil
|
return msg, nil
|
||||||
case "json":
|
case "json":
|
||||||
resId := d["resid"]
|
resId := d["resid"]
|
||||||
i, _ := strconv.ParseInt(resId, 10, 64)
|
i, _ := strconv.ParseInt(resId, 10, 64)
|
||||||
log.Warnf("json msg=%s", d["data"])
|
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
//默认情况下走小程序通道
|
//默认情况下走小程序通道
|
||||||
msg := message.NewLightApp(CQCodeUnescapeValue(d["data"]))
|
msg := message.NewLightApp(CQCodeUnescapeValue(d["data"]))
|
||||||
|
@ -1,166 +0,0 @@
|
|||||||
package coolq
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"github.com/Mrs4s/MiraiGo/message"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
"math"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CQCodeConverter struct {
|
|
||||||
message []rune
|
|
||||||
bot *CQBot
|
|
||||||
group bool
|
|
||||||
|
|
||||||
index int
|
|
||||||
stat state
|
|
||||||
elements []message.IMessageElement
|
|
||||||
tempText []rune
|
|
||||||
cqCode []rune
|
|
||||||
}
|
|
||||||
|
|
||||||
type state uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
S0 state = iota
|
|
||||||
S1
|
|
||||||
)
|
|
||||||
|
|
||||||
func newCQCodeConverter(message string, bot *CQBot, group bool) *CQCodeConverter {
|
|
||||||
return &CQCodeConverter{message: []rune(message), bot: bot, group: group, stat: S0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) hasNext() bool {
|
|
||||||
return c.index < len(c.message)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) next() rune {
|
|
||||||
r := c.message[c.index]
|
|
||||||
c.index++
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) move(steps int) {
|
|
||||||
c.index += steps
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) peek(idx int) rune {
|
|
||||||
return c.message[idx]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) peekN(count int) string {
|
|
||||||
lastIdx := int(math.Min(float64(c.index+count), float64(len(c.message)-1)))
|
|
||||||
return string(c.message[c.index:lastIdx])
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) isCQCodeBegin(r rune) bool {
|
|
||||||
return r == '[' && c.peekN(3) == "CQ:"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) saveTempText() {
|
|
||||||
if len(c.tempText) != 0 {
|
|
||||||
c.elements = append(c.elements, message.NewText(CQCodeUnescapeValue(string(c.tempText))))
|
|
||||||
}
|
|
||||||
c.tempText = []rune{}
|
|
||||||
c.cqCode = []rune{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) saveCQCode() {
|
|
||||||
defer func() {
|
|
||||||
c.cqCode = []rune{}
|
|
||||||
c.tempText = []rune{}
|
|
||||||
}()
|
|
||||||
reader := strings.NewReader(string(c.cqCode))
|
|
||||||
buf := bufio.NewReader(reader)
|
|
||||||
t, _ := buf.ReadString(',')
|
|
||||||
t = t[0 : len(t)-1]
|
|
||||||
params := make(map[string]string)
|
|
||||||
for buf.Buffered() > 0 {
|
|
||||||
p, _ := buf.ReadString(',')
|
|
||||||
if strings.HasSuffix(p, ",") {
|
|
||||||
p = p[0 : len(p)-1]
|
|
||||||
}
|
|
||||||
p = strings.TrimSpace(p)
|
|
||||||
if p == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
data := strings.SplitN(p, "=", 2)
|
|
||||||
if len(data) == 2 {
|
|
||||||
params[data[0]] = data[1]
|
|
||||||
} else {
|
|
||||||
params[p] = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if t == "reply" { // reply 特殊处理
|
|
||||||
if len(c.elements) > 0 {
|
|
||||||
if _, ok := c.elements[0].(*message.ReplyElement); ok {
|
|
||||||
log.Warnf("警告: 一条信息只能包含一个 Reply 元素.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mid, err := strconv.Atoi(params["id"])
|
|
||||||
if err == nil {
|
|
||||||
org := c.bot.GetMessage(int32(mid))
|
|
||||||
if org != nil {
|
|
||||||
c.elements = append([]message.IMessageElement{
|
|
||||||
&message.ReplyElement{
|
|
||||||
ReplySeq: org["message-id"].(int32),
|
|
||||||
Sender: org["sender"].(message.Sender).Uin,
|
|
||||||
Time: org["time"].(int32),
|
|
||||||
Elements: c.bot.ConvertStringMessage(org["message"].(string), c.group),
|
|
||||||
},
|
|
||||||
}, c.elements...)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elem, err := c.bot.ToElement(t, params, c.group)
|
|
||||||
if err != nil {
|
|
||||||
org := "[" + string(c.cqCode) + "]"
|
|
||||||
if !IgnoreInvalidCQCode {
|
|
||||||
log.Warnf("转换CQ码 %v 时出现错误: %v 将原样发送.", org, err)
|
|
||||||
c.elements = append(c.elements, message.NewText(org))
|
|
||||||
} else {
|
|
||||||
log.Warnf("转换CQ码 %v 时出现错误: %v 将忽略.", org, err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
switch i := elem.(type) {
|
|
||||||
case message.IMessageElement:
|
|
||||||
c.elements = append(c.elements, i)
|
|
||||||
case []message.IMessageElement:
|
|
||||||
c.elements = append(c.elements, i...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CQCodeConverter) convert() []message.IMessageElement {
|
|
||||||
for c.hasNext() {
|
|
||||||
ch := c.next()
|
|
||||||
switch c.stat {
|
|
||||||
case S0:
|
|
||||||
if c.isCQCodeBegin(ch) {
|
|
||||||
c.saveTempText()
|
|
||||||
c.tempText = append(c.tempText, []rune("[CQ:")...)
|
|
||||||
c.move(3)
|
|
||||||
c.stat = S1
|
|
||||||
} else {
|
|
||||||
c.tempText = append(c.tempText, ch)
|
|
||||||
}
|
|
||||||
case S1:
|
|
||||||
if c.isCQCodeBegin(ch) {
|
|
||||||
c.move(-1)
|
|
||||||
c.stat = S0
|
|
||||||
} else if ch == ']' {
|
|
||||||
c.saveCQCode()
|
|
||||||
c.stat = S0
|
|
||||||
} else {
|
|
||||||
c.cqCode = append(c.cqCode, ch)
|
|
||||||
c.tempText = append(c.tempText, ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
c.saveTempText()
|
|
||||||
return c.elements
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user