Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
G
go-cqhttp
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
go-cqhttp
Commits
fa6263e7
Commit
fa6263e7
authored
Nov 03, 2020
by
nanahira
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of github.com:Mrs4s/go-cqhttp
parents
75e2e368
3d81777e
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
530 additions
and
202 deletions
+530
-202
.github/workflows/ci.yml
.github/workflows/ci.yml
+4
-2
.github/workflows/release.yml
.github/workflows/release.yml
+3
-0
README.md
README.md
+4
-0
coolq/api.go
coolq/api.go
+59
-26
coolq/bot.go
coolq/bot.go
+139
-38
coolq/cqcode.go
coolq/cqcode.go
+105
-40
coolq/event.go
coolq/event.go
+34
-8
docs/QA.md
docs/QA.md
+0
-8
docs/cqhttp.md
docs/cqhttp.md
+113
-4
global/net.go
global/net.go
+6
-1
go.mod
go.mod
+3
-16
go.sum
go.sum
+26
-41
server/apiAdmin.go
server/apiAdmin.go
+17
-12
server/http.go
server/http.go
+12
-4
server/websocket.go
server/websocket.go
+5
-2
No files found.
.github/workflows/ci.yml
View file @
fa6263e7
...
@@ -14,12 +14,14 @@ jobs:
...
@@ -14,12 +14,14 @@ jobs:
runs-on
:
ubuntu-latest
runs-on
:
ubuntu-latest
strategy
:
strategy
:
matrix
:
matrix
:
# build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/
386, darwin/amd64
# build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/
amd64
goos
:
[
linux
,
windows
,
darwin
]
goos
:
[
linux
,
windows
,
darwin
]
goarch
:
[
"
386"
,
amd64
,
arm
]
goarch
:
[
"
386"
,
amd64
,
arm
]
exclude
:
exclude
:
-
goos
:
darwin
-
goos
:
darwin
goarch
:
arm
goarch
:
arm
-
goos
:
darwin
goarch
:
"
386"
fail-fast
:
true
fail-fast
:
true
steps
:
steps
:
...
@@ -28,7 +30,7 @@ jobs:
...
@@ -28,7 +30,7 @@ jobs:
-
name
:
Setup Go environment
-
name
:
Setup Go environment
uses
:
actions/setup-go@v2.1.1
uses
:
actions/setup-go@v2.1.1
with
:
with
:
go-version
:
1.1
4
go-version
:
1.1
5
-
name
:
Build binary file
-
name
:
Build binary file
env
:
env
:
...
...
.github/workflows/release.yml
View file @
fa6263e7
...
@@ -14,6 +14,8 @@ jobs:
...
@@ -14,6 +14,8 @@ jobs:
exclude
:
exclude
:
-
goos
:
darwin
-
goos
:
darwin
goarch
:
arm
goarch
:
arm
-
goos
:
darwin
goarch
:
"
386"
steps
:
steps
:
-
uses
:
actions/checkout@v2
-
uses
:
actions/checkout@v2
...
@@ -26,5 +28,6 @@ jobs:
...
@@ -26,5 +28,6 @@ jobs:
github_token
:
${{ secrets.GITHUB_TOKEN }}
github_token
:
${{ secrets.GITHUB_TOKEN }}
goos
:
${{ matrix.goos }}
goos
:
${{ matrix.goos }}
goarch
:
${{ matrix.goarch }}
goarch
:
${{ matrix.goarch }}
goversion
:
"
https://golang.org/dl/go1.15.3.linux-amd64.tar.gz"
ldflags
:
-w -s -X "github.com/Mrs4s/go-cqhttp/coolq.Version=${{ env.RELEASE_VERSION }}"
ldflags
:
-w -s -X "github.com/Mrs4s/go-cqhttp/coolq.Version=${{ env.RELEASE_VERSION }}"
\ No newline at end of file
README.md
View file @
fa6263e7
...
@@ -35,6 +35,10 @@
...
@@ -35,6 +35,10 @@
-
[CQ:reply]
-
[CQ:reply]
-
[CQ:forward]
-
[CQ:forward]
-
[CQ:node]
-
[CQ:node]
-
[CQ:gift]
-
[CQ:redbag]
-
[CQ:tts]
-
[CQ:music]
</details>
</details>
...
...
coolq/api.go
View file @
fa6263e7
...
@@ -189,7 +189,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG {
...
@@ -189,7 +189,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG {
ts
.
Add
(
time
.
Second
)
ts
.
Add
(
time
.
Second
)
if
e
.
Get
(
"data.id"
)
.
Exists
()
{
if
e
.
Get
(
"data.id"
)
.
Exists
()
{
i
,
_
:=
strconv
.
Atoi
(
e
.
Get
(
"data.id"
)
.
Str
)
i
,
_
:=
strconv
.
Atoi
(
e
.
Get
(
"data.id"
)
.
Str
)
m
:=
bot
.
Get
Group
Message
(
int32
(
i
))
m
:=
bot
.
GetMessage
(
int32
(
i
))
if
m
!=
nil
{
if
m
!=
nil
{
sender
:=
m
[
"sender"
]
.
(
message
.
Sender
)
sender
:=
m
[
"sender"
]
.
(
message
.
Sender
)
nodes
=
append
(
nodes
,
&
message
.
ForwardNode
{
nodes
=
append
(
nodes
,
&
message
.
ForwardNode
{
...
@@ -384,39 +384,61 @@ func (bot *CQBot) CQProcessFriendRequest(flag string, approve bool) MSG {
...
@@ -384,39 +384,61 @@ func (bot *CQBot) CQProcessFriendRequest(flag string, approve bool) MSG {
// https://cqhttp.cc/docs/4.15/#/API?id=set_group_add_request-%E5%A4%84%E7%90%86%E5%8A%A0%E7%BE%A4%E8%AF%B7%E6%B1%82%EF%BC%8F%E9%82%80%E8%AF%B7
// https://cqhttp.cc/docs/4.15/#/API?id=set_group_add_request-%E5%A4%84%E7%90%86%E5%8A%A0%E7%BE%A4%E8%AF%B7%E6%B1%82%EF%BC%8F%E9%82%80%E8%AF%B7
func
(
bot
*
CQBot
)
CQProcessGroupRequest
(
flag
,
subType
,
reason
string
,
approve
bool
)
MSG
{
func
(
bot
*
CQBot
)
CQProcessGroupRequest
(
flag
,
subType
,
reason
string
,
approve
bool
)
MSG
{
msgs
,
err
:=
bot
.
Client
.
GetGroupSystemMessages
()
if
err
!=
nil
{
log
.
Errorf
(
"获取群系统消息失败: %v"
,
err
)
return
Failed
(
100
)
}
if
subType
==
"add"
{
if
subType
==
"add"
{
req
,
ok
:=
bot
.
joinReqCache
.
Load
(
flag
)
for
_
,
req
:=
range
msgs
.
JoinRequests
{
if
!
ok
{
if
strconv
.
FormatInt
(
req
.
RequestId
,
10
)
==
flag
{
return
Failed
(
100
)
if
req
.
Checked
{
}
log
.
Errorf
(
"处理群系统消息失败: 无法操作已处理的消息."
)
bot
.
joinReqCache
.
Delete
(
flag
)
return
Failed
(
100
)
if
approve
{
}
req
.
(
*
client
.
UserJoinGroupRequest
)
.
Accept
()
if
approve
{
}
else
{
req
.
Accept
()
req
.
(
*
client
.
UserJoinGroupRequest
)
.
Reject
(
false
,
reason
)
}
else
{
req
.
Reject
(
false
,
reason
)
}
return
OK
(
nil
)
}
}
}
return
OK
(
nil
)
}
else
{
}
for
_
,
req
:=
range
msgs
.
InvitedRequests
{
req
,
ok
:=
bot
.
invitedReqCache
.
Load
(
flag
)
if
strconv
.
FormatInt
(
req
.
RequestId
,
10
)
==
flag
{
if
ok
{
if
req
.
Checked
{
bot
.
invitedReqCache
.
Delete
(
flag
)
log
.
Errorf
(
"处理群系统消息失败: 无法操作已处理的消息."
)
if
approve
{
return
Failed
(
100
)
req
.
(
*
client
.
GroupInvitedRequest
)
.
Accept
()
}
}
else
{
if
approve
{
req
.
(
*
client
.
GroupInvitedRequest
)
.
Reject
(
false
,
reason
)
req
.
Accept
()
}
else
{
req
.
Reject
(
false
,
reason
)
}
return
OK
(
nil
)
}
}
}
return
OK
(
nil
)
}
}
log
.
Errorf
(
"处理群系统消息失败: 消息 %v 不存在."
,
flag
)
return
Failed
(
100
)
return
Failed
(
100
)
}
}
// https://cqhttp.cc/docs/4.15/#/API?id=delete_msg-%E6%92%A4%E5%9B%9E%E6%B6%88%E6%81%AF
// https://cqhttp.cc/docs/4.15/#/API?id=delete_msg-%E6%92%A4%E5%9B%9E%E6%B6%88%E6%81%AF
func
(
bot
*
CQBot
)
CQDeleteMessage
(
messageId
int32
)
MSG
{
func
(
bot
*
CQBot
)
CQDeleteMessage
(
messageId
int32
)
MSG
{
msg
:=
bot
.
Get
Group
Message
(
messageId
)
msg
:=
bot
.
GetMessage
(
messageId
)
if
msg
==
nil
{
if
msg
==
nil
{
return
Failed
(
100
)
return
Failed
(
100
)
}
}
bot
.
Client
.
RecallGroupMessage
(
msg
[
"group"
]
.
(
int64
),
msg
[
"message-id"
]
.
(
int32
),
msg
[
"internal-id"
]
.
(
int32
))
if
_
,
ok
:=
msg
[
"group"
];
ok
{
bot
.
Client
.
RecallGroupMessage
(
msg
[
"group"
]
.
(
int64
),
msg
[
"message-id"
]
.
(
int32
),
msg
[
"internal-id"
]
.
(
int32
))
}
else
{
if
msg
[
"sender"
]
.
(
message
.
Sender
)
.
Uin
!=
bot
.
Client
.
Uin
{
log
.
Warnf
(
"撤回 %v 失败: 好友会话无法撤回对方消息."
)
return
Failed
(
100
)
}
bot
.
Client
.
RecallPrivateMessage
(
msg
[
"target"
]
.
(
int64
),
int64
(
msg
[
"time"
]
.
(
int32
)),
msg
[
"message-id"
]
.
(
int32
),
msg
[
"internal-id"
]
.
(
int32
))
}
return
OK
(
nil
)
return
OK
(
nil
)
}
}
...
@@ -638,24 +660,35 @@ func (bot *CQBot) CQGetForwardMessage(resId string) MSG {
...
@@ -638,24 +660,35 @@ func (bot *CQBot) CQGetForwardMessage(resId string) MSG {
})
})
}
}
func
(
bot
*
CQBot
)
CQGet
Group
Message
(
messageId
int32
)
MSG
{
func
(
bot
*
CQBot
)
CQGetMessage
(
messageId
int32
)
MSG
{
msg
:=
bot
.
Get
Group
Message
(
messageId
)
msg
:=
bot
.
GetMessage
(
messageId
)
if
msg
==
nil
{
if
msg
==
nil
{
return
Failed
(
100
)
return
Failed
(
100
)
}
}
sender
:=
msg
[
"sender"
]
.
(
message
.
Sender
)
sender
:=
msg
[
"sender"
]
.
(
message
.
Sender
)
_
,
group
:=
msg
[
"group"
]
return
OK
(
MSG
{
return
OK
(
MSG
{
"message_id"
:
messageId
,
"message_id"
:
messageId
,
"real_id"
:
msg
[
"message-id"
],
"real_id"
:
msg
[
"message-id"
],
"group"
:
group
,
"sender"
:
MSG
{
"sender"
:
MSG
{
"user_id"
:
sender
.
Uin
,
"user_id"
:
sender
.
Uin
,
"nickname"
:
sender
.
Nickname
,
"nickname"
:
sender
.
Nickname
,
},
},
"time"
:
msg
[
"time"
],
"time"
:
msg
[
"time"
],
"
content
"
:
msg
[
"message"
],
"
message
"
:
msg
[
"message"
],
})
})
}
}
func
(
bot
*
CQBot
)
CQGetGroupSystemMessages
()
MSG
{
msg
,
err
:=
bot
.
Client
.
GetGroupSystemMessages
()
if
err
!=
nil
{
log
.
Warnf
(
"获取群系统消息失败: %v"
,
err
)
return
Failed
(
100
)
}
return
OK
(
msg
)
}
func
(
bot
*
CQBot
)
CQCanSendImage
()
MSG
{
func
(
bot
*
CQBot
)
CQCanSendImage
()
MSG
{
return
OK
(
MSG
{
"yes"
:
true
})
return
OK
(
MSG
{
"yes"
:
true
})
}
}
...
@@ -665,7 +698,7 @@ func (bot *CQBot) CQCanSendRecord() MSG {
...
@@ -665,7 +698,7 @@ func (bot *CQBot) CQCanSendRecord() MSG {
}
}
func
(
bot
*
CQBot
)
CQOcrImage
(
imageId
string
)
MSG
{
func
(
bot
*
CQBot
)
CQOcrImage
(
imageId
string
)
MSG
{
img
,
err
:=
bot
.
makeImageElem
(
"image"
,
map
[
string
]
string
{
"file"
:
imageId
},
true
)
img
,
err
:=
bot
.
makeImageElem
(
map
[
string
]
string
{
"file"
:
imageId
},
true
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Warnf
(
"load image error: %v"
,
err
)
log
.
Warnf
(
"load image error: %v"
,
err
)
return
Failed
(
100
)
return
Failed
(
100
)
...
...
coolq/bot.go
View file @
fa6263e7
...
@@ -5,6 +5,7 @@ import (
...
@@ -5,6 +5,7 @@ import (
"encoding/gob"
"encoding/gob"
"encoding/json"
"encoding/json"
"fmt"
"fmt"
"github.com/syndtr/goleveldb/leveldb"
"hash/crc32"
"hash/crc32"
"path"
"path"
"sync"
"sync"
...
@@ -17,19 +18,16 @@ import (
...
@@ -17,19 +18,16 @@ import (
log
"github.com/sirupsen/logrus"
log
"github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
"github.com/tidwall/gjson"
"github.com/xujiajun/nutsdb"
)
)
type
CQBot
struct
{
type
CQBot
struct
{
Client
*
client
.
QQClient
Client
*
client
.
QQClient
events
[]
func
(
MSG
)
events
[]
func
(
MSG
)
db
*
nutsdb
.
DB
db
*
leveldb
.
DB
friendReqCache
sync
.
Map
friendReqCache
sync
.
Map
invitedReqCache
sync
.
Map
tempMsgCache
sync
.
Map
joinReqCache
sync
.
Map
oneWayMsgCache
sync
.
Map
tempMsgCache
sync
.
Map
oneWayMsgCache
sync
.
Map
}
}
type
MSG
map
[
string
]
interface
{}
type
MSG
map
[
string
]
interface
{}
...
@@ -41,10 +39,8 @@ func NewQQBot(cli *client.QQClient, conf *global.JsonConfig) *CQBot {
...
@@ -41,10 +39,8 @@ func NewQQBot(cli *client.QQClient, conf *global.JsonConfig) *CQBot {
Client
:
cli
,
Client
:
cli
,
}
}
if
conf
.
EnableDB
{
if
conf
.
EnableDB
{
opt
:=
nutsdb
.
DefaultOptions
p
:=
path
.
Join
(
"data"
,
"leveldb"
)
opt
.
Dir
=
path
.
Join
(
"data"
,
"db"
)
db
,
err
:=
leveldb
.
OpenFile
(
p
,
nil
)
opt
.
EntryIdxMode
=
nutsdb
.
HintBPTSparseIdxMode
db
,
err
:=
nutsdb
.
Open
(
opt
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Fatalf
(
"打开数据库失败, 如果频繁遇到此问题请清理 data/db 文件夹或关闭数据库功能。"
)
log
.
Fatalf
(
"打开数据库失败, 如果频繁遇到此问题请清理 data/db 文件夹或关闭数据库功能。"
)
}
}
...
@@ -61,6 +57,7 @@ func NewQQBot(cli *client.QQClient, conf *global.JsonConfig) *CQBot {
...
@@ -61,6 +57,7 @@ func NewQQBot(cli *client.QQClient, conf *global.JsonConfig) *CQBot {
bot
.
Client
.
OnGroupMessageRecalled
(
bot
.
groupRecallEvent
)
bot
.
Client
.
OnGroupMessageRecalled
(
bot
.
groupRecallEvent
)
bot
.
Client
.
OnGroupNotify
(
bot
.
groupNotifyEvent
)
bot
.
Client
.
OnGroupNotify
(
bot
.
groupNotifyEvent
)
bot
.
Client
.
OnFriendMessageRecalled
(
bot
.
friendRecallEvent
)
bot
.
Client
.
OnFriendMessageRecalled
(
bot
.
friendRecallEvent
)
bot
.
Client
.
OnReceivedOfflineFile
(
bot
.
offlineFileEvent
)
bot
.
Client
.
OnJoinGroup
(
bot
.
joinGroupEvent
)
bot
.
Client
.
OnJoinGroup
(
bot
.
joinGroupEvent
)
bot
.
Client
.
OnLeaveGroup
(
bot
.
leaveGroupEvent
)
bot
.
Client
.
OnLeaveGroup
(
bot
.
leaveGroupEvent
)
bot
.
Client
.
OnGroupMemberJoined
(
bot
.
memberJoinEvent
)
bot
.
Client
.
OnGroupMemberJoined
(
bot
.
memberJoinEvent
)
...
@@ -99,20 +96,17 @@ func (bot *CQBot) OnEventPush(f func(m MSG)) {
...
@@ -99,20 +96,17 @@ func (bot *CQBot) OnEventPush(f func(m MSG)) {
bot
.
events
=
append
(
bot
.
events
,
f
)
bot
.
events
=
append
(
bot
.
events
,
f
)
}
}
func
(
bot
*
CQBot
)
Get
Group
Message
(
mid
int32
)
MSG
{
func
(
bot
*
CQBot
)
GetMessage
(
mid
int32
)
MSG
{
if
bot
.
db
!=
nil
{
if
bot
.
db
!=
nil
{
m
:=
MSG
{}
m
:=
MSG
{}
err
:=
bot
.
db
.
View
(
func
(
tx
*
nutsdb
.
Tx
)
error
{
data
,
err
:=
bot
.
db
.
Get
(
binary
.
ToBytes
(
mid
),
nil
)
e
,
err
:=
tx
.
Get
(
"group-messages"
,
binary
.
ToBytes
(
mid
))
if
err
!=
nil
{
return
err
}
buff
:=
new
(
bytes
.
Buffer
)
buff
.
Write
(
binary
.
GZipUncompress
(
e
.
Value
))
return
gob
.
NewDecoder
(
buff
)
.
Decode
(
&
m
)
})
if
err
==
nil
{
if
err
==
nil
{
return
m
buff
:=
new
(
bytes
.
Buffer
)
buff
.
Write
(
binary
.
GZipUncompress
(
data
))
err
=
gob
.
NewDecoder
(
buff
)
.
Decode
(
&
m
)
if
err
==
nil
{
return
m
}
}
}
log
.
Warnf
(
"获取信息时出现错误: %v id: %v"
,
err
,
mid
)
log
.
Warnf
(
"获取信息时出现错误: %v id: %v"
,
err
,
mid
)
}
}
...
@@ -153,7 +147,11 @@ func (bot *CQBot) SendGroupMessage(groupId int64, m *message.SendingMessage) int
...
@@ -153,7 +147,11 @@ func (bot *CQBot) SendGroupMessage(groupId int64, m *message.SendingMessage) int
return
0
return
0
}
}
if
i
,
ok
:=
elem
.
(
*
QQMusicElement
);
ok
{
if
i
,
ok
:=
elem
.
(
*
QQMusicElement
);
ok
{
ret
,
err
:=
bot
.
Client
.
SendGroupRichMessage
(
groupId
,
100497308
,
1
,
4
,
client
.
RichClientInfo
{
var
msgStyle
uint32
=
4
if
i
.
MusicUrl
==
""
{
msgStyle
=
0
// fix vip song
}
ret
,
err
:=
bot
.
Client
.
SendGroupRichMessage
(
groupId
,
100497308
,
1
,
msgStyle
,
client
.
RichClientInfo
{
Platform
:
1
,
Platform
:
1
,
SdkVersion
:
"0.0.0"
,
SdkVersion
:
"0.0.0"
,
PackageName
:
"com.tencent.qqmusic"
,
PackageName
:
"com.tencent.qqmusic"
,
...
@@ -190,8 +188,31 @@ func (bot *CQBot) SendGroupMessage(groupId int64, m *message.SendingMessage) int
...
@@ -190,8 +188,31 @@ func (bot *CQBot) SendGroupMessage(groupId int64, m *message.SendingMessage) int
}
}
return
bot
.
InsertGroupMessage
(
ret
)
return
bot
.
InsertGroupMessage
(
ret
)
}
}
if
i
,
ok
:=
elem
.
(
*
MiguMusicElement
);
ok
{
ret
,
err
:=
bot
.
Client
.
SendGroupRichMessage
(
groupId
,
1101053067
,
1
,
4
,
client
.
RichClientInfo
{
Platform
:
1
,
SdkVersion
:
"0.0.0"
,
PackageName
:
"cmccwm.mobilemusic"
,
Signature
:
"6cdc72a439cef99a3418d2a78aa28c73"
,
},
&
message
.
RichMessage
{
Title
:
i
.
Title
,
Summary
:
i
.
Summary
,
Url
:
i
.
Url
,
PictureUrl
:
i
.
PictureUrl
,
MusicUrl
:
i
.
MusicUrl
,
})
if
err
!=
nil
{
log
.
Warnf
(
"警告: 群 %v 富文本消息发送失败: %v"
,
groupId
,
err
)
return
-
1
}
return
bot
.
InsertGroupMessage
(
ret
)
}
newElem
=
append
(
newElem
,
elem
)
newElem
=
append
(
newElem
,
elem
)
}
}
if
len
(
newElem
)
==
0
{
log
.
Warnf
(
"群消息发送失败: 消息为空."
)
return
-
1
}
m
.
Elements
=
newElem
m
.
Elements
=
newElem
ret
:=
bot
.
Client
.
SendGroupMessage
(
groupId
,
m
,
ForceFragmented
)
ret
:=
bot
.
Client
.
SendGroupMessage
(
groupId
,
m
,
ForceFragmented
)
if
ret
==
nil
||
ret
.
Id
==
-
1
{
if
ret
==
nil
||
ret
.
Id
==
-
1
{
...
@@ -213,30 +234,88 @@ func (bot *CQBot) SendPrivateMessage(target int64, m *message.SendingMessage) in
...
@@ -213,30 +234,88 @@ func (bot *CQBot) SendPrivateMessage(target int64, m *message.SendingMessage) in
newElem
=
append
(
newElem
,
fm
)
newElem
=
append
(
newElem
,
fm
)
continue
continue
}
}
if
i
,
ok
:=
elem
.
(
*
message
.
VoiceElement
);
ok
{
fv
,
err
:=
bot
.
Client
.
UploadPrivatePtt
(
target
,
i
.
Data
)
if
err
!=
nil
{
log
.
Warnf
(
"警告: 好友 %v 消息语音上传失败: %v"
,
target
,
err
)
continue
}
newElem
=
append
(
newElem
,
fv
)
continue
}
if
i
,
ok
:=
elem
.
(
*
QQMusicElement
);
ok
{
var
msgStyle
uint32
=
4
if
i
.
MusicUrl
==
""
{
msgStyle
=
0
// fix vip song
}
bot
.
Client
.
SendFriendRichMessage
(
target
,
100497308
,
1
,
msgStyle
,
client
.
RichClientInfo
{
Platform
:
1
,
SdkVersion
:
"0.0.0"
,
PackageName
:
"com.tencent.qqmusic"
,
Signature
:
"cbd27cd7c861227d013a25b2d10f0799"
,
},
&
message
.
RichMessage
{
Title
:
i
.
Title
,
Summary
:
i
.
Summary
,
Url
:
i
.
Url
,
PictureUrl
:
i
.
PictureUrl
,
MusicUrl
:
i
.
MusicUrl
,
})
return
0
}
if
i
,
ok
:=
elem
.
(
*
CloudMusicElement
);
ok
{
bot
.
Client
.
SendFriendRichMessage
(
target
,
100495085
,
1
,
4
,
client
.
RichClientInfo
{
Platform
:
1
,
SdkVersion
:
"0.0.0"
,
PackageName
:
"com.netease.cloudmusic"
,
Signature
:
"da6b069da1e2982db3e386233f68d76d"
,
},
&
message
.
RichMessage
{
Title
:
i
.
Title
,
Summary
:
i
.
Summary
,
Url
:
i
.
Url
,
PictureUrl
:
i
.
PictureUrl
,
MusicUrl
:
i
.
MusicUrl
,
})
return
0
}
if
i
,
ok
:=
elem
.
(
*
MiguMusicElement
);
ok
{
bot
.
Client
.
SendFriendRichMessage
(
target
,
1101053067
,
1
,
4
,
client
.
RichClientInfo
{
Platform
:
1
,
SdkVersion
:
"0.0.0"
,
PackageName
:
"cmccwm.mobilemusic"
,
Signature
:
"6cdc72a439cef99a3418d2a78aa28c73"
,
},
&
message
.
RichMessage
{
Title
:
i
.
Title
,
Summary
:
i
.
Summary
,
Url
:
i
.
Url
,
PictureUrl
:
i
.
PictureUrl
,
MusicUrl
:
i
.
MusicUrl
,
})
return
0
}
newElem
=
append
(
newElem
,
elem
)
newElem
=
append
(
newElem
,
elem
)
}
}
m
.
Elements
=
newElem
m
.
Elements
=
newElem
var
id
int32
=
-
1
var
id
int32
=
-
1
if
bot
.
Client
.
FindFriend
(
target
)
!=
nil
{
if
bot
.
Client
.
FindFriend
(
target
)
!=
nil
{
// 双向好友
msg
:=
bot
.
Client
.
SendPrivateMessage
(
target
,
m
)
msg
:=
bot
.
Client
.
SendPrivateMessage
(
target
,
m
)
if
msg
!=
nil
{
if
msg
!=
nil
{
id
=
msg
.
Id
id
=
bot
.
InsertPrivateMessage
(
msg
)
}
}
}
else
if
code
,
ok
:=
bot
.
tempMsgCache
.
Load
(
target
);
ok
{
}
else
if
code
,
ok
:=
bot
.
tempMsgCache
.
Load
(
target
);
ok
{
// 临时会话
msg
:=
bot
.
Client
.
SendTempMessage
(
code
.
(
int64
),
target
,
m
)
msg
:=
bot
.
Client
.
SendTempMessage
(
code
.
(
int64
),
target
,
m
)
if
msg
!=
nil
{
if
msg
!=
nil
{
id
=
msg
.
Id
id
=
msg
.
Id
}
}
}
else
if
_
,
ok
:=
bot
.
oneWayMsgCache
.
Load
(
target
);
ok
{
}
else
if
_
,
ok
:=
bot
.
oneWayMsgCache
.
Load
(
target
);
ok
{
// 单向好友
msg
:=
bot
.
Client
.
SendPrivateMessage
(
target
,
m
)
msg
:=
bot
.
Client
.
SendPrivateMessage
(
target
,
m
)
if
msg
!=
nil
{
if
msg
!=
nil
{
id
=
msg
.
Id
id
=
bot
.
InsertPrivateMessage
(
msg
)
}
}
}
}
if
id
==
-
1
{
if
id
==
-
1
{
return
-
1
return
-
1
}
}
return
ToGlobalId
(
target
,
id
)
return
id
}
}
func
(
bot
*
CQBot
)
InsertGroupMessage
(
m
*
message
.
GroupMessage
)
int32
{
func
(
bot
*
CQBot
)
InsertGroupMessage
(
m
*
message
.
GroupMessage
)
int32
{
...
@@ -251,14 +330,36 @@ func (bot *CQBot) InsertGroupMessage(m *message.GroupMessage) int32 {
...
@@ -251,14 +330,36 @@ func (bot *CQBot) InsertGroupMessage(m *message.GroupMessage) int32 {
}
}
id
:=
ToGlobalId
(
m
.
GroupCode
,
m
.
Id
)
id
:=
ToGlobalId
(
m
.
GroupCode
,
m
.
Id
)
if
bot
.
db
!=
nil
{
if
bot
.
db
!=
nil
{
err
:=
bot
.
db
.
Update
(
func
(
tx
*
nutsdb
.
Tx
)
error
{
buf
:=
new
(
bytes
.
Buffer
)
buf
:=
new
(
bytes
.
Buffer
)
if
err
:=
gob
.
NewEncoder
(
buf
)
.
Encode
(
val
);
err
!=
nil
{
if
err
:=
gob
.
NewEncoder
(
buf
)
.
Encode
(
val
);
err
!=
nil
{
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
return
err
return
-
1
}
}
return
tx
.
Put
(
"group-messages"
,
binary
.
ToBytes
(
id
),
binary
.
GZipCompress
(
buf
.
Bytes
()),
0
)
if
err
:=
bot
.
db
.
Put
(
binary
.
ToBytes
(
id
),
binary
.
GZipCompress
(
buf
.
Bytes
()),
nil
);
err
!=
nil
{
})
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
if
err
!=
nil
{
return
-
1
}
}
return
id
}
func
(
bot
*
CQBot
)
InsertPrivateMessage
(
m
*
message
.
PrivateMessage
)
int32
{
val
:=
MSG
{
"message-id"
:
m
.
Id
,
"internal-id"
:
m
.
InternalId
,
"target"
:
m
.
Target
,
"sender"
:
m
.
Sender
,
"time"
:
m
.
Time
,
"message"
:
ToStringMessage
(
m
.
Elements
,
m
.
Sender
.
Uin
,
true
),
}
id
:=
ToGlobalId
(
m
.
Sender
.
Uin
,
m
.
Id
)
if
bot
.
db
!=
nil
{
buf
:=
new
(
bytes
.
Buffer
)
if
err
:=
gob
.
NewEncoder
(
buf
)
.
Encode
(
val
);
err
!=
nil
{
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
return
-
1
}
if
err
:=
bot
.
db
.
Put
(
binary
.
ToBytes
(
id
),
binary
.
GZipCompress
(
buf
.
Bytes
()),
nil
);
err
!=
nil
{
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
return
-
1
return
-
1
}
}
...
...
coolq/cqcode.go
View file @
fa6263e7
...
@@ -51,6 +51,10 @@ type CloudMusicElement struct {
...
@@ -51,6 +51,10 @@ type CloudMusicElement struct {
MusicElement
MusicElement
}
}
type
MiguMusicElement
struct
{
MusicElement
}
func
(
e
*
GiftElement
)
Type
()
message
.
ElementType
{
func
(
e
*
GiftElement
)
Type
()
message
.
ElementType
{
return
message
.
At
return
message
.
At
}
}
...
@@ -269,7 +273,7 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessa
...
@@ -269,7 +273,7 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessa
for
_
,
p
:=
range
ps
{
for
_
,
p
:=
range
ps
{
d
[
p
[
1
]]
=
CQCodeUnescapeValue
(
p
[
2
])
d
[
p
[
1
]]
=
CQCodeUnescapeValue
(
p
[
2
])
}
}
if
t
==
"reply"
&&
group
{
if
t
==
"reply"
{
if
len
(
r
)
>
0
{
if
len
(
r
)
>
0
{
if
_
,
ok
:=
r
[
0
]
.
(
*
message
.
ReplyElement
);
ok
{
if
_
,
ok
:=
r
[
0
]
.
(
*
message
.
ReplyElement
);
ok
{
log
.
Warnf
(
"警告: 一条信息只能包含一个 Reply 元素."
)
log
.
Warnf
(
"警告: 一条信息只能包含一个 Reply 元素."
)
...
@@ -278,7 +282,7 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessa
...
@@ -278,7 +282,7 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessa
}
}
mid
,
err
:=
strconv
.
Atoi
(
d
[
"id"
])
mid
,
err
:=
strconv
.
Atoi
(
d
[
"id"
])
if
err
==
nil
{
if
err
==
nil
{
org
:=
bot
.
Get
Group
Message
(
int32
(
mid
))
org
:=
bot
.
GetMessage
(
int32
(
mid
))
if
org
!=
nil
{
if
org
!=
nil
{
r
=
append
([]
message
.
IMessageElement
{
r
=
append
([]
message
.
IMessageElement
{
&
message
.
ReplyElement
{
&
message
.
ReplyElement
{
...
@@ -320,9 +324,9 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.
...
@@ -320,9 +324,9 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.
return
return
}
}
}
}
mid
,
err
:=
strconv
.
Atoi
(
e
.
Get
(
"data"
)
.
Get
(
"id"
)
.
Str
)
mid
,
err
:=
strconv
.
Atoi
(
e
.
Get
(
"data"
)
.
Get
(
"id"
)
.
Str
ing
()
)
if
err
==
nil
{
if
err
==
nil
{
org
:=
bot
.
Get
Group
Message
(
int32
(
mid
))
org
:=
bot
.
GetMessage
(
int32
(
mid
))
if
org
!=
nil
{
if
org
!=
nil
{
r
=
append
([]
message
.
IMessageElement
{
r
=
append
([]
message
.
IMessageElement
{
&
message
.
ReplyElement
{
&
message
.
ReplyElement
{
...
@@ -338,7 +342,7 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.
...
@@ -338,7 +342,7 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.
}
}
d
:=
make
(
map
[
string
]
string
)
d
:=
make
(
map
[
string
]
string
)
e
.
Get
(
"data"
)
.
ForEach
(
func
(
key
,
value
gjson
.
Result
)
bool
{
e
.
Get
(
"data"
)
.
ForEach
(
func
(
key
,
value
gjson
.
Result
)
bool
{
d
[
key
.
Str
]
=
value
.
Str
d
[
key
.
Str
]
=
value
.
Str
ing
()
return
true
return
true
})
})
elem
,
err
:=
bot
.
ToElement
(
t
,
d
,
group
)
elem
,
err
:=
bot
.
ToElement
(
t
,
d
,
group
)
...
@@ -362,12 +366,48 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.
...
@@ -362,12 +366,48 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.
return
return
}
}
func
(
bot
*
CQBot
)
ToElement
(
t
string
,
d
map
[
string
]
string
,
group
bool
)
(
m
essage
.
IMessageElement
,
error
)
{
func
(
bot
*
CQBot
)
ToElement
(
t
string
,
d
map
[
string
]
string
,
group
bool
)
(
m
message
.
IMessageElement
,
err
error
)
{
switch
t
{
switch
t
{
case
"text"
:
case
"text"
:
return
message
.
NewText
(
d
[
"text"
]),
nil
return
message
.
NewText
(
d
[
"text"
]),
nil
case
"image"
:
case
"image"
:
return
bot
.
makeImageElem
(
t
,
d
,
group
)
img
,
err
:=
bot
.
makeImageElem
(
d
,
group
)
if
err
!=
nil
{
return
nil
,
err
}
tp
:=
d
[
"type"
]
if
tp
!=
"show"
&&
tp
!=
"flash"
{
return
img
,
nil
}
if
i
,
ok
:=
img
.
(
*
message
.
ImageElement
);
ok
{
// 秀图,闪照什么的就直接传了吧
if
group
{
img
,
err
=
bot
.
Client
.
UploadGroupImage
(
1
,
i
.
Data
)
}
else
{
img
,
err
=
bot
.
Client
.
UploadPrivateImage
(
1
,
i
.
Data
)
}
if
err
!=
nil
{
return
nil
,
err
}
}
switch
tp
{
case
"flash"
:
if
i
,
ok
:=
img
.
(
*
message
.
GroupImageElement
);
ok
{
return
&
message
.
GroupFlashPicElement
{
GroupImageElement
:
*
i
},
nil
}
if
i
,
ok
:=
img
.
(
*
message
.
FriendImageElement
);
ok
{
return
&
message
.
FriendFlashPicElement
{
FriendImageElement
:
*
i
},
nil
}
case
"show"
:
id
,
_
:=
strconv
.
ParseInt
(
d
[
"id"
],
10
,
64
)
if
id
<
40000
||
id
>=
40006
{
id
=
40000
}
if
i
,
ok
:=
img
.
(
*
message
.
GroupImageElement
);
ok
{
return
&
message
.
GroupShowPicElement
{
GroupImageElement
:
*
i
,
EffectId
:
int32
(
id
)},
nil
}
return
img
,
nil
// 私聊还没做
}
case
"poke"
:
case
"poke"
:
if
!
group
{
if
!
group
{
return
nil
,
errors
.
New
(
"todo"
)
// TODO: private poke
return
nil
,
errors
.
New
(
"todo"
)
// TODO: private poke
...
@@ -385,9 +425,12 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
...
@@ -385,9 +425,12 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
}
}
return
&
GiftElement
{
Target
:
t
,
GiftId
:
GiftId
[
id
]},
nil
return
&
GiftElement
{
Target
:
t
,
GiftId
:
GiftId
[
id
]},
nil
case
"tts"
:
case
"tts"
:
if
!
group
{
defer
func
()
{
return
nil
,
errors
.
New
(
"private voice unsupported now"
)
if
r
:=
recover
();
r
!=
nil
{
}
m
=
nil
err
=
errors
.
New
(
"tts 转换失败"
)
}
}()
data
,
err
:=
bot
.
Client
.
GetTts
(
d
[
"text"
])
data
,
err
:=
bot
.
Client
.
GetTts
(
d
[
"text"
])
ioutil
.
WriteFile
(
"tts.silk"
,
data
,
777
)
ioutil
.
WriteFile
(
"tts.silk"
,
data
,
777
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -395,9 +438,6 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
...
@@ -395,9 +438,6 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
}
}
return
&
message
.
VoiceElement
{
Data
:
data
},
nil
return
&
message
.
VoiceElement
{
Data
:
data
},
nil
case
"record"
:
case
"record"
:
if
!
group
{
return
nil
,
errors
.
New
(
"private voice unsupported now"
)
}
f
:=
d
[
"file"
]
f
:=
d
[
"file"
]
data
,
err
:=
global
.
FindFile
(
f
,
d
[
"cache"
],
global
.
VOICE_PATH
)
data
,
err
:=
global
.
FindFile
(
f
,
d
[
"cache"
],
global
.
VOICE_PATH
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -449,9 +489,6 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
...
@@ -449,9 +489,6 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
if
d
[
"content"
]
!=
""
{
if
d
[
"content"
]
!=
""
{
content
=
d
[
"content"
]
content
=
d
[
"content"
]
}
}
if
purl
==
""
{
purl
=
"https://www.baidu.com"
// fix vip song
}
return
&
QQMusicElement
{
MusicElement
:
MusicElement
{
return
&
QQMusicElement
{
MusicElement
:
MusicElement
{
Title
:
name
,
Title
:
name
,
Summary
:
content
,
Summary
:
content
,
...
@@ -485,6 +522,33 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
...
@@ -485,6 +522,33 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
}},
nil
}},
nil
}
}
if
d
[
"type"
]
==
"custom"
{
if
d
[
"type"
]
==
"custom"
{
if
d
[
"subtype"
]
==
"qq"
{
return
&
QQMusicElement
{
MusicElement
{
Title
:
d
[
"title"
],
Summary
:
d
[
"content"
],
Url
:
d
[
"url"
],
PictureUrl
:
d
[
"image"
],
MusicUrl
:
d
[
"purl"
],
}},
nil
}
if
d
[
"subtype"
]
==
"163"
{
return
&
CloudMusicElement
{
MusicElement
{
Title
:
d
[
"title"
],
Summary
:
d
[
"content"
],
Url
:
d
[
"url"
],
PictureUrl
:
d
[
"image"
],
MusicUrl
:
d
[
"purl"
],
}},
nil
}
if
d
[
"subtype"
]
==
"migu"
{
return
&
MiguMusicElement
{
MusicElement
{
Title
:
d
[
"title"
],
Summary
:
d
[
"content"
],
Url
:
d
[
"url"
],
PictureUrl
:
d
[
"image"
],
MusicUrl
:
d
[
"purl"
],
}},
nil
}
xml
:=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="[分享] %s" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="2"><audio cover="%s" src="%s"/><title>%s</title><summary>%s</summary></item><source name="音乐" icon="https://i.gtimg.cn/open/app_icon/01/07/98/56/1101079856_100_m.png" url="http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856" action="app" a_actionData="com.tencent.qqmusic" i_actionData="tencent1101079856://" appid="1101079856" /></msg>`
,
xml
:=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="[分享] %s" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="2"><audio cover="%s" src="%s"/><title>%s</title><summary>%s</summary></item><source name="音乐" icon="https://i.gtimg.cn/open/app_icon/01/07/98/56/1101079856_100_m.png" url="http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856" action="app" a_actionData="com.tencent.qqmusic" i_actionData="tencent1101079856://" appid="1101079856" /></msg>`
,
d
[
"title"
],
d
[
"url"
],
d
[
"image"
],
d
[
"audio"
],
d
[
"title"
],
d
[
"content"
])
d
[
"title"
],
d
[
"url"
],
d
[
"image"
],
d
[
"audio"
],
d
[
"title"
],
d
[
"content"
])
return
&
message
.
ServiceElement
{
return
&
message
.
ServiceElement
{
...
@@ -516,30 +580,31 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
...
@@ -516,30 +580,31 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
case
"cardimage"
:
case
"cardimage"
:
source
:=
d
[
"source"
]
source
:=
d
[
"source"
]
icon
:=
d
[
"icon"
]
icon
:=
d
[
"icon"
]
min
w
idth
,
_
:=
strconv
.
ParseInt
(
d
[
"minwidth"
],
10
,
64
)
min
W
idth
,
_
:=
strconv
.
ParseInt
(
d
[
"minwidth"
],
10
,
64
)
if
min
w
idth
==
0
{
if
min
W
idth
==
0
{
min
w
idth
=
200
min
W
idth
=
200
}
}
min
h
eight
,
_
:=
strconv
.
ParseInt
(
d
[
"minheight"
],
10
,
64
)
min
H
eight
,
_
:=
strconv
.
ParseInt
(
d
[
"minheight"
],
10
,
64
)
if
min
h
eight
==
0
{
if
min
H
eight
==
0
{
min
h
eight
=
200
min
H
eight
=
200
}
}
max
w
idth
,
_
:=
strconv
.
ParseInt
(
d
[
"maxwidth"
],
10
,
64
)
max
W
idth
,
_
:=
strconv
.
ParseInt
(
d
[
"maxwidth"
],
10
,
64
)
if
max
w
idth
==
0
{
if
max
W
idth
==
0
{
max
w
idth
=
500
max
W
idth
=
500
}
}
max
h
eight
,
_
:=
strconv
.
ParseInt
(
d
[
"maxheight"
],
10
,
64
)
max
H
eight
,
_
:=
strconv
.
ParseInt
(
d
[
"maxheight"
],
10
,
64
)
if
max
h
eight
==
0
{
if
max
H
eight
==
0
{
max
h
eight
=
1000
max
H
eight
=
1000
}
}
img
,
err
:=
bot
.
makeImageElem
(
t
,
d
,
group
)
img
,
err
:=
bot
.
makeImageElem
(
d
,
group
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
New
(
"send cardimage faild"
)
return
nil
,
errors
.
New
(
"send cardimage faild"
)
}
}
return
bot
.
SendNewPic
(
img
,
source
,
icon
,
min
width
,
minheight
,
maxwidth
,
maxh
eight
,
group
)
return
bot
.
SendNewPic
(
img
,
source
,
icon
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
group
)
default
:
default
:
return
nil
,
errors
.
New
(
"unsupported cq code: "
+
t
)
return
nil
,
errors
.
New
(
"unsupported cq code: "
+
t
)
}
}
return
nil
,
nil
}
}
func
CQCodeEscapeText
(
raw
string
)
string
{
func
CQCodeEscapeText
(
raw
string
)
string
{
...
@@ -571,7 +636,7 @@ func CQCodeUnescapeValue(content string) string {
...
@@ -571,7 +636,7 @@ func CQCodeUnescapeValue(content string) string {
}
}
// 图片 elem 生成器,单独拎出来,用于公用
// 图片 elem 生成器,单独拎出来,用于公用
func
(
bot
*
CQBot
)
makeImageElem
(
t
string
,
d
map
[
string
]
string
,
group
bool
)
(
message
.
IMessageElement
,
error
)
{
func
(
bot
*
CQBot
)
makeImageElem
(
d
map
[
string
]
string
,
group
bool
)
(
message
.
IMessageElement
,
error
)
{
f
:=
d
[
"file"
]
f
:=
d
[
"file"
]
if
strings
.
HasPrefix
(
f
,
"http"
)
||
strings
.
HasPrefix
(
f
,
"https"
)
{
if
strings
.
HasPrefix
(
f
,
"http"
)
||
strings
.
HasPrefix
(
f
,
"https"
)
{
cache
:=
d
[
"cache"
]
cache
:=
d
[
"cache"
]
...
@@ -619,7 +684,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
...
@@ -619,7 +684,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
rawPath
+=
".cqimg"
rawPath
+=
".cqimg"
}
}
if
!
global
.
PathExists
(
rawPath
)
&&
d
[
"url"
]
!=
""
{
if
!
global
.
PathExists
(
rawPath
)
&&
d
[
"url"
]
!=
""
{
return
bot
.
ToElement
(
t
,
map
[
string
]
string
{
"file"
:
d
[
"url"
]},
group
)
return
bot
.
makeImageElem
(
map
[
string
]
string
{
"file"
:
d
[
"url"
]},
group
)
}
}
if
global
.
PathExists
(
rawPath
)
{
if
global
.
PathExists
(
rawPath
)
{
b
,
err
:=
ioutil
.
ReadFile
(
rawPath
)
b
,
err
:=
ioutil
.
ReadFile
(
rawPath
)
...
@@ -655,7 +720,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
...
@@ -655,7 +720,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
}
}
if
size
==
0
{
if
size
==
0
{
if
url
!=
""
{
if
url
!=
""
{
return
bot
.
ToElement
(
t
,
map
[
string
]
string
{
"file"
:
url
},
group
)
return
bot
.
makeImageElem
(
map
[
string
]
string
{
"file"
:
url
},
group
)
}
}
return
nil
,
errors
.
New
(
"img size is 0"
)
return
nil
,
errors
.
New
(
"img size is 0"
)
}
}
...
@@ -666,7 +731,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
...
@@ -666,7 +731,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
rsp
,
err
:=
bot
.
Client
.
QueryGroupImage
(
1
,
hash
,
size
)
rsp
,
err
:=
bot
.
Client
.
QueryGroupImage
(
1
,
hash
,
size
)
if
err
!=
nil
{
if
err
!=
nil
{
if
url
!=
""
{
if
url
!=
""
{
return
bot
.
ToElement
(
t
,
map
[
string
]
string
{
"file"
:
url
},
group
)
return
bot
.
makeImageElem
(
map
[
string
]
string
{
"file"
:
url
},
group
)
}
}
return
nil
,
err
return
nil
,
err
}
}
...
@@ -675,7 +740,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
...
@@ -675,7 +740,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
rsp
,
err
:=
bot
.
Client
.
QueryFriendImage
(
1
,
hash
,
size
)
rsp
,
err
:=
bot
.
Client
.
QueryFriendImage
(
1
,
hash
,
size
)
if
err
!=
nil
{
if
err
!=
nil
{
if
url
!=
""
{
if
url
!=
""
{
return
bot
.
ToElement
(
t
,
map
[
string
]
string
{
"file"
:
url
},
group
)
return
bot
.
makeImageElem
(
map
[
string
]
string
{
"file"
:
url
},
group
)
}
}
return
nil
,
err
return
nil
,
err
}
}
...
@@ -685,7 +750,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
...
@@ -685,7 +750,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (mess
}
}
//SendNewPic 一种xml 方式发送的群消息图片
//SendNewPic 一种xml 方式发送的群消息图片
func
(
bot
*
CQBot
)
SendNewPic
(
elem
message
.
IMessageElement
,
source
string
,
icon
string
,
min
width
int64
,
minheigt
int64
,
maxwidth
int64
,
maxh
eight
int64
,
group
bool
)
(
*
message
.
ServiceElement
,
error
)
{
func
(
bot
*
CQBot
)
SendNewPic
(
elem
message
.
IMessageElement
,
source
string
,
icon
string
,
min
Width
int64
,
minHeight
int64
,
maxWidth
int64
,
maxH
eight
int64
,
group
bool
)
(
*
message
.
ServiceElement
,
error
)
{
var
xml
string
var
xml
string
xml
=
""
xml
=
""
if
i
,
ok
:=
elem
.
(
*
message
.
ImageElement
);
ok
{
if
i
,
ok
:=
elem
.
(
*
message
.
ImageElement
);
ok
{
...
@@ -695,7 +760,7 @@ func (bot *CQBot) SendNewPic(elem message.IMessageElement, source string, icon s
...
@@ -695,7 +760,7 @@ func (bot *CQBot) SendNewPic(elem message.IMessageElement, source string, icon s
log
.
Warnf
(
"警告: 好友消息 %v 消息图片上传失败: %v"
,
1
,
err
)
log
.
Warnf
(
"警告: 好友消息 %v 消息图片上传失败: %v"
,
1
,
err
)
return
nil
,
err
return
nil
,
err
}
}
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
gm
.
Md5
,
gm
.
Md5
,
len
(
i
.
Data
),
""
,
min
width
,
minheigt
,
maxwidth
,
maxh
eight
,
source
,
icon
)
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
gm
.
Md5
,
gm
.
Md5
,
len
(
i
.
Data
),
""
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
source
,
icon
)
}
else
{
}
else
{
gm
,
err
:=
bot
.
Client
.
UploadGroupImage
(
1
,
i
.
Data
)
gm
,
err
:=
bot
.
Client
.
UploadGroupImage
(
1
,
i
.
Data
)
...
@@ -703,14 +768,14 @@ func (bot *CQBot) SendNewPic(elem message.IMessageElement, source string, icon s
...
@@ -703,14 +768,14 @@ func (bot *CQBot) SendNewPic(elem message.IMessageElement, source string, icon s
log
.
Warnf
(
"警告: 群 %v 消息图片上传失败: %v"
,
1
,
err
)
log
.
Warnf
(
"警告: 群 %v 消息图片上传失败: %v"
,
1
,
err
)
return
nil
,
err
return
nil
,
err
}
}
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
gm
.
Md5
,
gm
.
Md5
,
len
(
i
.
Data
),
""
,
min
width
,
minheigt
,
maxwidth
,
maxh
eight
,
source
,
icon
)
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
gm
.
Md5
,
gm
.
Md5
,
len
(
i
.
Data
),
""
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
source
,
icon
)
}
}
}
}
if
i
,
ok
:=
elem
.
(
*
message
.
GroupImageElement
);
ok
{
if
i
,
ok
:=
elem
.
(
*
message
.
GroupImageElement
);
ok
{
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
i
.
Md5
,
i
.
Md5
,
0
,
""
,
min
width
,
minheigt
,
maxwidth
,
maxh
eight
,
source
,
icon
)
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
i
.
Md5
,
i
.
Md5
,
0
,
""
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
source
,
icon
)
}
}
if
i
,
ok
:=
elem
.
(
*
message
.
FriendImageElement
);
ok
{
if
i
,
ok
:=
elem
.
(
*
message
.
FriendImageElement
);
ok
{
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
i
.
Md5
,
i
.
Md5
,
0
,
""
,
min
width
,
minheigt
,
maxwidth
,
maxh
eight
,
source
,
icon
)
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
i
.
Md5
,
i
.
Md5
,
0
,
""
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
source
,
icon
)
}
}
if
xml
!=
""
{
if
xml
!=
""
{
log
.
Warn
(
xml
)
log
.
Warn
(
xml
)
...
...
coolq/event.go
View file @
fa6263e7
...
@@ -31,18 +31,22 @@ func ToFormattedMessage(e []message.IMessageElement, code int64, raw ...bool) (r
...
@@ -31,18 +31,22 @@ func ToFormattedMessage(e []message.IMessageElement, code int64, raw ...bool) (r
func
(
bot
*
CQBot
)
privateMessageEvent
(
c
*
client
.
QQClient
,
m
*
message
.
PrivateMessage
)
{
func
(
bot
*
CQBot
)
privateMessageEvent
(
c
*
client
.
QQClient
,
m
*
message
.
PrivateMessage
)
{
bot
.
checkMedia
(
m
.
Elements
)
bot
.
checkMedia
(
m
.
Elements
)
cqm
:=
ToStringMessage
(
m
.
Elements
,
0
,
true
)
cqm
:=
ToStringMessage
(
m
.
Elements
,
m
.
Sender
.
Uin
,
true
)
if
!
m
.
Sender
.
IsFriend
{
if
!
m
.
Sender
.
IsFriend
{
bot
.
oneWayMsgCache
.
Store
(
m
.
Sender
.
Uin
,
""
)
bot
.
oneWayMsgCache
.
Store
(
m
.
Sender
.
Uin
,
""
)
}
}
log
.
Infof
(
"收到好友 %v(%v) 的消息: %v"
,
m
.
Sender
.
DisplayName
(),
m
.
Sender
.
Uin
,
cqm
)
id
:=
m
.
Id
if
bot
.
db
!=
nil
{
id
=
bot
.
InsertPrivateMessage
(
m
)
}
log
.
Infof
(
"收到好友 %v(%v) 的消息: %v (%v)"
,
m
.
Sender
.
DisplayName
(),
m
.
Sender
.
Uin
,
cqm
,
id
)
fm
:=
MSG
{
fm
:=
MSG
{
"post_type"
:
"message"
,
"post_type"
:
"message"
,
"message_type"
:
"private"
,
"message_type"
:
"private"
,
"sub_type"
:
"friend"
,
"sub_type"
:
"friend"
,
"message_id"
:
ToGlobalId
(
m
.
Sender
.
Uin
,
m
.
Id
)
,
"message_id"
:
id
,
"user_id"
:
m
.
Sender
.
Uin
,
"user_id"
:
m
.
Sender
.
Uin
,
"message"
:
ToFormattedMessage
(
m
.
Elements
,
0
,
false
),
"message"
:
ToFormattedMessage
(
m
.
Elements
,
m
.
Sender
.
Uin
,
false
),
"raw_message"
:
cqm
,
"raw_message"
:
cqm
,
"font"
:
0
,
"font"
:
0
,
"self_id"
:
c
.
Uin
,
"self_id"
:
c
.
Uin
,
...
@@ -267,17 +271,41 @@ func (bot *CQBot) groupNotifyEvent(c *client.QQClient, e client.IGroupNotifyEven
...
@@ -267,17 +271,41 @@ func (bot *CQBot) groupNotifyEvent(c *client.QQClient, e client.IGroupNotifyEven
func
(
bot
*
CQBot
)
friendRecallEvent
(
c
*
client
.
QQClient
,
e
*
client
.
FriendMessageRecalledEvent
)
{
func
(
bot
*
CQBot
)
friendRecallEvent
(
c
*
client
.
QQClient
,
e
*
client
.
FriendMessageRecalledEvent
)
{
f
:=
c
.
FindFriend
(
e
.
FriendUin
)
f
:=
c
.
FindFriend
(
e
.
FriendUin
)
gid
:=
ToGlobalId
(
e
.
FriendUin
,
e
.
MessageId
)
gid
:=
ToGlobalId
(
e
.
FriendUin
,
e
.
MessageId
)
log
.
Infof
(
"好友 %v(%v) 撤回了消息: %v"
,
f
.
Nickname
,
f
.
Uin
,
gid
)
if
f
!=
nil
{
log
.
Infof
(
"好友 %v(%v) 撤回了消息: %v"
,
f
.
Nickname
,
f
.
Uin
,
gid
)
}
else
{
log
.
Infof
(
"好友 %v 撤回了消息: %v"
,
e
.
FriendUin
,
gid
)
}
bot
.
dispatchEventMessage
(
MSG
{
bot
.
dispatchEventMessage
(
MSG
{
"post_type"
:
"notice"
,
"post_type"
:
"notice"
,
"notice_type"
:
"friend_recall"
,
"notice_type"
:
"friend_recall"
,
"self_id"
:
c
.
Uin
,
"self_id"
:
c
.
Uin
,
"user_id"
:
f
.
Uin
,
"user_id"
:
e
.
Friend
Uin
,
"time"
:
e
.
Time
,
"time"
:
e
.
Time
,
"message_id"
:
gid
,
"message_id"
:
gid
,
})
})
}
}
func
(
bot
*
CQBot
)
offlineFileEvent
(
c
*
client
.
QQClient
,
e
*
client
.
OfflineFileEvent
)
{
f
:=
c
.
FindFriend
(
e
.
Sender
)
if
f
==
nil
{
return
}
log
.
Infof
(
"好友 %v(%v) 发送了离线文件 %v"
,
f
.
Nickname
,
f
.
Uin
,
e
.
FileName
)
bot
.
dispatchEventMessage
(
MSG
{
"post_type"
:
"notice"
,
"notice_type"
:
"offline_file"
,
"user_id"
:
e
.
Sender
,
"file"
:
MSG
{
"name"
:
e
.
FileName
,
"size"
:
e
.
FileSize
,
"url"
:
e
.
DownloadUrl
,
},
"self_id"
:
c
.
Uin
,
"time"
:
time
.
Now
()
.
Unix
(),
})
}
func
(
bot
*
CQBot
)
joinGroupEvent
(
c
*
client
.
QQClient
,
group
*
client
.
GroupInfo
)
{
func
(
bot
*
CQBot
)
joinGroupEvent
(
c
*
client
.
QQClient
,
group
*
client
.
GroupInfo
)
{
log
.
Infof
(
"Bot进入了群 %v."
,
formatGroupName
(
group
))
log
.
Infof
(
"Bot进入了群 %v."
,
formatGroupName
(
group
))
bot
.
dispatchEventMessage
(
bot
.
groupIncrease
(
group
.
Code
,
0
,
c
.
Uin
))
bot
.
dispatchEventMessage
(
bot
.
groupIncrease
(
group
.
Code
,
0
,
c
.
Uin
))
...
@@ -368,7 +396,6 @@ func (bot *CQBot) friendAddedEvent(c *client.QQClient, e *client.NewFriendEvent)
...
@@ -368,7 +396,6 @@ func (bot *CQBot) friendAddedEvent(c *client.QQClient, e *client.NewFriendEvent)
func
(
bot
*
CQBot
)
groupInvitedEvent
(
c
*
client
.
QQClient
,
e
*
client
.
GroupInvitedRequest
)
{
func
(
bot
*
CQBot
)
groupInvitedEvent
(
c
*
client
.
QQClient
,
e
*
client
.
GroupInvitedRequest
)
{
log
.
Infof
(
"收到来自群 %v(%v) 内用户 %v(%v) 的加群邀请."
,
e
.
GroupName
,
e
.
GroupCode
,
e
.
InvitorNick
,
e
.
InvitorUin
)
log
.
Infof
(
"收到来自群 %v(%v) 内用户 %v(%v) 的加群邀请."
,
e
.
GroupName
,
e
.
GroupCode
,
e
.
InvitorNick
,
e
.
InvitorUin
)
flag
:=
strconv
.
FormatInt
(
e
.
RequestId
,
10
)
flag
:=
strconv
.
FormatInt
(
e
.
RequestId
,
10
)
bot
.
invitedReqCache
.
Store
(
flag
,
e
)
bot
.
dispatchEventMessage
(
MSG
{
bot
.
dispatchEventMessage
(
MSG
{
"post_type"
:
"request"
,
"post_type"
:
"request"
,
"request_type"
:
"group"
,
"request_type"
:
"group"
,
...
@@ -385,7 +412,6 @@ func (bot *CQBot) groupInvitedEvent(c *client.QQClient, e *client.GroupInvitedRe
...
@@ -385,7 +412,6 @@ func (bot *CQBot) groupInvitedEvent(c *client.QQClient, e *client.GroupInvitedRe
func
(
bot
*
CQBot
)
groupJoinReqEvent
(
c
*
client
.
QQClient
,
e
*
client
.
UserJoinGroupRequest
)
{
func
(
bot
*
CQBot
)
groupJoinReqEvent
(
c
*
client
.
QQClient
,
e
*
client
.
UserJoinGroupRequest
)
{
log
.
Infof
(
"群 %v(%v) 收到来自用户 %v(%v) 的加群请求."
,
e
.
GroupName
,
e
.
GroupCode
,
e
.
RequesterNick
,
e
.
RequesterUin
)
log
.
Infof
(
"群 %v(%v) 收到来自用户 %v(%v) 的加群请求."
,
e
.
GroupName
,
e
.
GroupCode
,
e
.
RequesterNick
,
e
.
RequesterUin
)
flag
:=
strconv
.
FormatInt
(
e
.
RequestId
,
10
)
flag
:=
strconv
.
FormatInt
(
e
.
RequestId
,
10
)
bot
.
joinReqCache
.
Store
(
flag
,
e
)
bot
.
dispatchEventMessage
(
MSG
{
bot
.
dispatchEventMessage
(
MSG
{
"post_type"
:
"request"
,
"post_type"
:
"request"
,
"request_type"
:
"group"
,
"request_type"
:
"group"
,
...
...
docs/QA.md
View file @
fa6263e7
# 常见问题
# 常见问题
### Q: 为什么登录的时候出现 `客户端版本过低 请升级客户端`?
### A: 此问题是因为密码输入错误导致的, 信息为服务器返回, 很可能是TX相关的错误, 请检查密码
### Q: 为什么登录的时候出现 `为了您的帐号安全,请使用QQ一键登录`?
### A: 因为目前手机协议不支持图片验证码,切换成平板协议登录成功后,再切换回手机协议即可
### Q: 为什么挂一段时间后就会出现 `消息发送失败,账号可能被风控`?
### Q: 为什么挂一段时间后就会出现 `消息发送失败,账号可能被风控`?
### A: 如果你刚开始使用 go-cqhttp 建议挂机3-7天,即可解除风控
### A: 如果你刚开始使用 go-cqhttp 建议挂机3-7天,即可解除风控
docs/cqhttp.md
View file @
fa6263e7
...
@@ -4,6 +4,28 @@
...
@@ -4,6 +4,28 @@
## CQCode
## CQCode
### 图片
| 参数名 | 可能的值 | 说明 |
| --- | --- | --- |
|
`file`
| - | 图片文件名 |
|
`type`
|
`flash`
,
`show`
| 图片类型,
`flash`
表示闪照,
`show`
表示秀图,默认普通图片 |
|
`url`
| - | 图片 URL |
|
`cache`
|
`0`
`1`
| 只在通过网络 URL 发送时有效,表示是否使用已缓存的文件,默认
`1`
|
|
`id`
| - | 发送秀图时的特效id,默认为40000 |
可用的特效ID:
| id |类型 |
| --- |-------|
| 40000 | 普通 |
| 40001 | 幻影 |
| 40002 | 抖动 |
| 40003 | 生日 |
| 40004 | 爱你 |
| 40005 | 征友 |
### 回复
### 回复
Type :
`reply`
Type :
`reply`
...
@@ -358,9 +380,9 @@ Type: `tts`
...
@@ -358,9 +380,9 @@ Type: `tts`
|
`filename`
| string | 图片文件原名 |
|
`filename`
| string | 图片文件原名 |
|
`url`
| string | 图片下载地址 |
|
`url`
| string | 图片下载地址 |
### 获取
群
消息
### 获取消息
终结点:
`/get_
group_
msg`
终结点:
`/get_msg`
参数
参数
...
@@ -376,7 +398,7 @@ Type: `tts`
...
@@ -376,7 +398,7 @@ Type: `tts`
|
`real_id`
| int32 | 消息真实id |
|
`real_id`
| int32 | 消息真实id |
|
`sender`
| object | 发送者 |
|
`sender`
| object | 发送者 |
|
`time`
| int32 | 发送时间 |
|
`time`
| int32 | 发送时间 |
|
`
content
`
| message | 消息内容 |
|
`
message
`
| message | 消息内容 |
### 获取合并转发内容
### 获取合并转发内容
...
@@ -450,6 +472,74 @@ Type: `tts`
...
@@ -450,6 +472,74 @@ Type: `tts`
| ---------- | ----------------- | -------- |
| ---------- | ----------------- | -------- |
|
`slices`
| string[] | 词组 |
|
`slices`
| string[] | 词组 |
### 图片OCR
> 注意: 目前图片OCR接口仅支持接受的图片
终结点:
`/.ocr_image`
**参数**
| 字段 | 类型 | 说明 |
| ------------ | ------ | ------ |
|
`image`
| string | 图片ID |
**响应数据**
| 字段 | 类型 | 说明 |
| ---------- | ----------------- | -------- |
|
`texts`
| TextDetection[] | OCR结果 |
|
`language`
| string | 语言 |
**TextDetection**
| 字段 | 类型 | 说明 |
| ---------- | ----------------- | -------- |
|
`text`
| string | 文本 |
|
`confidence`
| int32 | 置信度 |
|
`coordinates`
| vector2 | 坐标 |
### 获取群系统消息
终结点:
`/get_group_system_msg`
**响应数据**
| 字段 | 类型 | 说明 |
| ---------- | ----------------- | -------- |
|
`invited_requests`
| InvitedRequest[] | 邀请消息列表 |
|
`join_requests`
| JoinRequest[] | 进群消息列表 |
> 注意: 如果列表不存在任何消息, 将返回 `null`
**InvitedRequest**
| 字段 | 类型 | 说明 |
| ---------- | ----------------- | -------- |
|
`request_id`
| int64 | 请求ID |
|
`invitor_uin`
| int64 | 邀请者 |
|
`invitor_nick`
| string | 邀请者昵称 |
|
`group_id`
| int64 | 群号 |
|
`group_name`
| string | 群名 |
|
`checked`
| bool | 是否已被处理|
|
`actor`
| int64 | 处理者, 未处理为0 |
**JoinRequest**
| 字段 | 类型 | 说明 |
| ---------- | ----------------- | -------- |
|
`request_id`
| int64 | 请求ID |
|
`requester_uin`
| int64 | 请求者ID |
|
`requester_nick`
| string | 请求者昵称 |
|
`message`
| string | 验证消息 |
|
`group_id`
| int64 | 群号 |
|
`group_name`
| string | 群名 |
|
`checked`
| bool | 是否已被处理|
|
`actor`
| int64 | 处理者, 未处理为0 |
## 事件
## 事件
#### 群消息撤回
#### 群消息撤回
...
@@ -536,4 +626,23 @@ Type: `tts`
...
@@ -536,4 +626,23 @@ Type: `tts`
|
`card_new`
| int64 | | 新名片 |
|
`card_new`
| int64 | | 新名片 |
|
`card_old`
| int64 | | 旧名片 |
|
`card_old`
| int64 | | 旧名片 |
> PS: 当名片为空时 `card_xx` 字段为空字符串, 并不是昵称
> PS: 当名片为空时 `card_xx` 字段为空字符串, 并不是昵称
\ No newline at end of file
#### 接收到离线文件
**上报数据**
| 字段 | 类型 | 可能的值 | 说明 |
| ------------- | ------ | -------------- | -------------- |
|
`post_type`
| string |
`notice`
| 上报类型 |
|
`notice_type`
| string |
`offline_file`
| 消息类型 |
|
`user_id`
| int64 | | 发送者id |
|
`file`
| object | | 文件数据 |
**file object**
| 字段 | 类型 | 可能的值 | 说明 |
| ------------- | ------ | -------------- | -------------- |
|
`name`
| string | | 文件名 |
|
`size`
| int64 | | 文件大小 |
|
`url`
| string | | 下载链接 |
\ No newline at end of file
global/net.go
View file @
fa6263e7
...
@@ -8,15 +8,20 @@ import (
...
@@ -8,15 +8,20 @@ import (
"io/ioutil"
"io/ioutil"
"net/http"
"net/http"
"strings"
"strings"
"time"
)
)
var
client
=
&
http
.
Client
{
Timeout
:
time
.
Second
*
15
,
}
func
GetBytes
(
url
string
)
([]
byte
,
error
)
{
func
GetBytes
(
url
string
)
([]
byte
,
error
)
{
req
,
err
:=
http
.
NewRequest
(
"GET"
,
url
,
nil
)
req
,
err
:=
http
.
NewRequest
(
"GET"
,
url
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
req
.
Header
[
"User-Agent"
]
=
[]
string
{
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.61"
}
req
.
Header
[
"User-Agent"
]
=
[]
string
{
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.61"
}
resp
,
err
:=
http
.
DefaultC
lient
.
Do
(
req
)
resp
,
err
:=
c
lient
.
Do
(
req
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
...
go.mod
View file @
fa6263e7
...
@@ -3,32 +3,19 @@ module github.com/Mrs4s/go-cqhttp
...
@@ -3,32 +3,19 @@ module github.com/Mrs4s/go-cqhttp
go 1.14
go 1.14
require (
require (
github.com/Mrs4s/MiraiGo v0.0.0-20201008134448-b53aaceaa1b4
github.com/Mrs4s/MiraiGo v0.0.0-20201027102621-5fa25a7f7434
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/gin-gonic/gin v1.6.3
github.com/gin-gonic/gin v1.6.3
github.com/go-playground/validator/v10 v10.4.0 // indirect
github.com/gorilla/websocket v1.4.2
github.com/gorilla/websocket v1.4.2
github.com/guonaihong/gout v0.1.2
github.com/guonaihong/gout v0.1.3
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect
github.com/jonboulle/clockwork v0.2.0 // indirect
github.com/json-iterator/go v1.1.10 // indirect
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/lestrrat-go/strftime v1.0.3 // indirect
github.com/lestrrat-go/strftime v1.0.3 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/sirupsen/logrus v1.7.0
github.com/sirupsen/logrus v1.7.0
github.com/syndtr/goleveldb v1.0.0
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
github.com/tebeka/strftime v0.1.5 // indirect
github.com/tidwall/gjson v1.6.1
github.com/tidwall/gjson v1.6.1
github.com/ugorji/go v1.1.10 // indirect
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6
github.com/xujiajun/nutsdb v0.5.0
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 // indirect
golang.org/x/net v0.0.0-20201002202402-0a1ea396d57c // indirect
golang.org/x/sys v0.0.0-20201005172224-997123666555 // indirect
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
gopkg.in/yaml.v2 v2.3.0 // indirect
)
)
go.sum
View file @
fa6263e7
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Mrs4s/MiraiGo v0.0.0-202010
08134448-b53aaceaa1b4 h1:vNDY7JAh+e7ac0Dft3GF+s4WZU55SZkwaAI7UmXfwHc
=
github.com/Mrs4s/MiraiGo v0.0.0-202010
25234014-8ece3a9dd803 h1:tRXLslHbNt4bd2wV+MIU2sqQME6UJfMYolYufhSRdg0
=
github.com/Mrs4s/MiraiGo v0.0.0-202010
08134448-b53aaceaa1b4
/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/Mrs4s/MiraiGo v0.0.0-202010
25234014-8ece3a9dd803
/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/
bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0
=
github.com/
Mrs4s/MiraiGo v0.0.0-20201027102621-5fa25a7f7434 h1:wb5EoWBj/ulZ30fBQA2KJ0IwVXcesu9aynCFdpRwS8M
=
github.com/
bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE
=
github.com/
Mrs4s/MiraiGo v0.0.0-20201027102621-5fa25a7f7434/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo
=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/f
astly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw
=
github.com/f
snotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo
=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
...
@@ -23,9 +23,8 @@ github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTM
...
@@ -23,9 +23,8 @@ github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTM
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.4.0 h1:72qIR/m8ybvL8L5TIyfgrigqkrw7kVYAvjEvpT85l70=
github.com/go-playground/validator/v10 v10.4.0/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
...
@@ -39,6 +38,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
...
@@ -39,6 +38,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
...
@@ -48,13 +49,11 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
...
@@ -48,13 +49,11 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/guonaihong/gout v0.1.2 h1:TR2XCRopGgJdj231IayEoeavgbznFXzzzcZVdT/hG10=
github.com/guonaihong/gout v0.1.3 h1:BIiV6nnsA+R6dIB1P33uhCM8+TVAG3zHrXGZad7hDc8=
github.com/guonaihong/gout v0.1.2/go.mod h1:vXvv5Kxr70eM5wrp4F0+t9lnLWmq+YPW2GByll2f/EA=
github.com/guonaihong/gout v0.1.3/go.mod h1:vXvv5Kxr70eM5wrp4F0+t9lnLWmq+YPW2GByll2f/EA=
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
...
@@ -68,11 +67,12 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y
...
@@ -68,11 +67,12 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
...
@@ -88,65 +88,48 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
...
@@ -88,65 +88,48 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 h1:J6v8awz+me+xeb/cUTotKgceAYouhIB3pjzgRd6IlGk=
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 h1:J6v8awz+me+xeb/cUTotKgceAYouhIB3pjzgRd6IlGk=
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816/go.mod h1:tzym/CEb5jnFI+Q0k4Qq3+LvRF4gO3E2pxS8fHP8jcA=
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816/go.mod h1:tzym/CEb5jnFI+Q0k4Qq3+LvRF4gO3E2pxS8fHP8jcA=
github.com/tebeka/strftime v0.1.5/go.mod h1:29/OidkoWHdEKZqzyDLUyC+LmgDgdHo4WAFCDT7D/Ig=
github.com/tidwall/gjson v1.6.1 h1:LRbvNuNuvAiISWg6gxLEFuCe72UKy5hDqhxW/8183ws=
github.com/tidwall/gjson v1.6.1 h1:LRbvNuNuvAiISWg6gxLEFuCe72UKy5hDqhxW/8183ws=
github.com/tidwall/gjson v1.6.1/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0=
github.com/tidwall/gjson v1.6.1/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0=
github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=
github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=
github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU=
github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU=
github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go v1.1.10 h1:Mh7W3N/hGJJ8fRQNHIgomNTa0CgZc0aKDFvbgHl+U7A=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go v1.1.10/go.mod h1:/tC+H0R6N4Lcv4DoSdphIa9y/RAs4QFHDtN9W2oQcHw=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/ugorji/go/codec v1.1.10 h1:otofY/FAoRTMVqlVeDv/Kpm04D13lfJdrDqPbc3axg4=
github.com/ugorji/go/codec v1.1.10/go.mod h1:jdPQoxvTq1mb8XV6RmofOz5UgNKV2czR6xvxXGwy1Bo=
github.com/wdvxdr1123/go-silk v0.0.0-20201006020916-0398076200ea h1:OqkIV1VL5xm88jhXLaPHRJroeRknxN3EApcAVlNIIOw=
github.com/wdvxdr1123/go-silk v0.0.0-20201006020916-0398076200ea/go.mod h1:5q9LFlBr+yX/J8Jd/9wHdXwkkjFkNyQIS7kX2Lgx/Zs=
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6 h1:lX18MCdNzT2zIi7K02x4C5cPkDXpL+wCb1YTAMXjLWQ=
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6 h1:lX18MCdNzT2zIi7K02x4C5cPkDXpL+wCb1YTAMXjLWQ=
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6/go.mod h1:5q9LFlBr+yX/J8Jd/9wHdXwkkjFkNyQIS7kX2Lgx/Zs=
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6/go.mod h1:5q9LFlBr+yX/J8Jd/9wHdXwkkjFkNyQIS7kX2Lgx/Zs=
github.com/xujiajun/gorouter v1.2.0/go.mod h1:yJrIta+bTNpBM/2UT8hLOaEAFckO+m/qmR3luMIQygM=
github.com/xujiajun/mmap-go v1.0.1 h1:7Se7ss1fLPPRW+ePgqGpCkfGIZzJV6JPq9Wq9iv/WHc=
github.com/xujiajun/mmap-go v1.0.1/go.mod h1:CNN6Sw4SL69Sui00p0zEzcZKbt+5HtEnYUsc6BKKRMg=
github.com/xujiajun/nutsdb v0.5.0 h1:j/jM3Zw7Chg8WK7bAcKR0Xr7Mal47U1oJAMgySfDn9E=
github.com/xujiajun/nutsdb v0.5.0/go.mod h1:owdwN0tW084RxEodABLbO7h4Z2s9WiAjZGZFhRh0/1Q=
github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b h1:jKG9OiL4T4xQN3IUrhUpc1tG+HfDXppkgVcrAiiaI/0=
github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b/go.mod h1:AZd87GYJlUzl82Yab2kTjx1EyXSQCAfZDhpTo1SQC4k=
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189 h1:4UJw9if55Fu3HOwbfcaQlJ27p3oeJU2JZqoeT3ITJQk=
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189 h1:4UJw9if55Fu3HOwbfcaQlJ27p3oeJU2JZqoeT3ITJQk=
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189/go.mod h1:rIrm5geMiBhPQkdfUm8gDFi/WiHneOp1i9KjmJqc+9I=
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189/go.mod h1:rIrm5geMiBhPQkdfUm8gDFi/WiHneOp1i9KjmJqc+9I=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20
190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg
=
golang.org/x/net v0.0.0-20
200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA
=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201002202402-0a1ea396d57c h1:dk0ukUIHmGHqASjP0iue2261isepFCC6XRCSd1nHgDw=
golang.org/x/net v0.0.0-20201002202402-0a1ea396d57c/go.mod h1:iQL9McJNjoIa5mjH6nYTCTZXUN6RP+XW3eib7Ya3XcI=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-2018
1221143128-b4a75ba826a6
/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-2018
0909124046-d0be0721c37e
/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201005172224-997123666555 h1:fihtqzYxy4E31W1yUlyRGveTZT1JIP0bmKaDZ2ceKAw=
golang.org/x/sys v0.0.0-20201005172224-997123666555/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
...
@@ -176,11 +159,13 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
...
@@ -176,11 +159,13 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
server/apiAdmin.go
View file @
fa6263e7
...
@@ -77,7 +77,9 @@ func (s *webServer) Run(addr string, cli *client.QQClient) *coolq.CQBot {
...
@@ -77,7 +77,9 @@ func (s *webServer) Run(addr string, cli *client.QQClient) *coolq.CQBot {
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
err
)
log
.
Error
(
err
)
log
.
Infof
(
"请检查端口是否被占用."
)
log
.
Infof
(
"请检查端口是否被占用."
)
time
.
Sleep
(
time
.
Second
*
5
)
c
:=
make
(
chan
os
.
Signal
,
1
)
signal
.
Notify
(
c
,
os
.
Interrupt
,
os
.
Kill
)
<-
c
os
.
Exit
(
1
)
os
.
Exit
(
1
)
}
}
}
else
{
}
else
{
...
@@ -96,6 +98,10 @@ func (s *webServer) Run(addr string, cli *client.QQClient) *coolq.CQBot {
...
@@ -96,6 +98,10 @@ func (s *webServer) Run(addr string, cli *client.QQClient) *coolq.CQBot {
func
(
s
*
webServer
)
Dologin
()
{
func
(
s
*
webServer
)
Dologin
()
{
s
.
Console
=
bufio
.
NewReader
(
os
.
Stdin
)
s
.
Console
=
bufio
.
NewReader
(
os
.
Stdin
)
readLine
:=
func
()
(
str
string
)
{
str
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
return
}
conf
:=
GetConf
()
conf
:=
GetConf
()
cli
:=
s
.
Cli
cli
:=
s
.
Cli
cli
.
AllowSlider
=
true
cli
.
AllowSlider
=
true
...
@@ -109,7 +115,7 @@ func (s *webServer) Dologin() {
...
@@ -109,7 +115,7 @@ func (s *webServer) Dologin() {
if
client
.
SystemDeviceInfo
.
Protocol
==
client
.
AndroidPhone
{
if
client
.
SystemDeviceInfo
.
Protocol
==
client
.
AndroidPhone
{
log
.
Warnf
(
"警告: Android Phone 强制要求暂不支持的滑条验证码, 请开启设备锁或切换到Watch协议验证通过后再使用."
)
log
.
Warnf
(
"警告: Android Phone 强制要求暂不支持的滑条验证码, 请开启设备锁或切换到Watch协议验证通过后再使用."
)
log
.
Infof
(
"按 Enter 继续...."
)
log
.
Infof
(
"按 Enter 继续...."
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
os
.
Exit
(
0
)
os
.
Exit
(
0
)
}
}
cli
.
AllowSlider
=
false
cli
.
AllowSlider
=
false
...
@@ -125,21 +131,21 @@ func (s *webServer) Dologin() {
...
@@ -125,21 +131,21 @@ func (s *webServer) Dologin() {
text
=
<-
WebInput
text
=
<-
WebInput
}
else
{
}
else
{
log
.
Warn
(
"请输入验证码 (captcha.jpg): (Enter 提交)"
)
log
.
Warn
(
"请输入验证码 (captcha.jpg): (Enter 提交)"
)
text
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
text
=
readLine
(
)
}
}
rsp
,
err
=
cli
.
SubmitCaptcha
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
rsp
.
CaptchaSign
)
rsp
,
err
=
cli
.
SubmitCaptcha
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
rsp
.
CaptchaSign
)
global
.
DelFile
(
"captcha.jpg"
)
global
.
DelFile
(
"captcha.jpg"
)
continue
continue
case
client
.
SMSNeededError
:
case
client
.
SMSNeededError
:
log
.
Warnf
(
"账号已开启设备锁, 按下 Enter 向手机 %v 发送短信验证码."
,
rsp
.
SMSPhone
)
log
.
Warnf
(
"账号已开启设备锁, 按下 Enter 向手机 %v 发送短信验证码."
,
rsp
.
SMSPhone
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
if
!
cli
.
RequestSMS
()
{
if
!
cli
.
RequestSMS
()
{
log
.
Warnf
(
"发送验证码失败,可能是请求过于频繁."
)
log
.
Warnf
(
"发送验证码失败,可能是请求过于频繁."
)
time
.
Sleep
(
time
.
Second
*
5
)
time
.
Sleep
(
time
.
Second
*
5
)
os
.
Exit
(
0
)
os
.
Exit
(
0
)
}
}
log
.
Warn
(
"请输入短信验证码: (Enter 提交)"
)
log
.
Warn
(
"请输入短信验证码: (Enter 提交)"
)
text
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
text
=
readLine
(
)
rsp
,
err
=
cli
.
SubmitSMS
(
strings
.
ReplaceAll
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
"
\r
"
,
""
))
rsp
,
err
=
cli
.
SubmitSMS
(
strings
.
ReplaceAll
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
"
\r
"
,
""
))
continue
continue
case
client
.
SMSOrVerifyNeededError
:
case
client
.
SMSOrVerifyNeededError
:
...
@@ -147,7 +153,7 @@ func (s *webServer) Dologin() {
...
@@ -147,7 +153,7 @@ func (s *webServer) Dologin() {
log
.
Warnf
(
"1. 向手机 %v 发送短信验证码"
,
rsp
.
SMSPhone
)
log
.
Warnf
(
"1. 向手机 %v 发送短信验证码"
,
rsp
.
SMSPhone
)
log
.
Warnf
(
"2. 使用手机QQ扫码验证."
)
log
.
Warnf
(
"2. 使用手机QQ扫码验证."
)
log
.
Warn
(
"请输入(1 - 2): "
)
log
.
Warn
(
"请输入(1 - 2): "
)
text
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
text
=
readLine
(
)
if
strings
.
Contains
(
text
,
"1"
)
{
if
strings
.
Contains
(
text
,
"1"
)
{
if
!
cli
.
RequestSMS
()
{
if
!
cli
.
RequestSMS
()
{
log
.
Warnf
(
"发送验证码失败,可能是请求过于频繁."
)
log
.
Warnf
(
"发送验证码失败,可能是请求过于频繁."
)
...
@@ -155,13 +161,13 @@ func (s *webServer) Dologin() {
...
@@ -155,13 +161,13 @@ func (s *webServer) Dologin() {
os
.
Exit
(
0
)
os
.
Exit
(
0
)
}
}
log
.
Warn
(
"请输入短信验证码: (Enter 提交)"
)
log
.
Warn
(
"请输入短信验证码: (Enter 提交)"
)
text
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
text
=
readLine
(
)
rsp
,
err
=
cli
.
SubmitSMS
(
strings
.
ReplaceAll
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
"
\r
"
,
""
))
rsp
,
err
=
cli
.
SubmitSMS
(
strings
.
ReplaceAll
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
"
\r
"
,
""
))
continue
continue
}
}
log
.
Warnf
(
"请前往 -> %v <- 验证并重启Bot."
,
rsp
.
VerifyUrl
)
log
.
Warnf
(
"请前往 -> %v <- 验证并重启Bot."
,
rsp
.
VerifyUrl
)
log
.
Infof
(
"按 Enter 继续...."
)
log
.
Infof
(
"按 Enter 继续...."
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
os
.
Exit
(
0
)
os
.
Exit
(
0
)
return
return
case
client
.
UnsafeDeviceError
:
case
client
.
UnsafeDeviceError
:
...
@@ -171,7 +177,7 @@ func (s *webServer) Dologin() {
...
@@ -171,7 +177,7 @@ func (s *webServer) Dologin() {
text
=
<-
WebInput
text
=
<-
WebInput
}
else
{
}
else
{
log
.
Infof
(
"按 Enter 继续...."
)
log
.
Infof
(
"按 Enter 继续...."
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
}
}
log
.
Info
(
text
)
log
.
Info
(
text
)
os
.
Exit
(
0
)
os
.
Exit
(
0
)
...
@@ -179,7 +185,7 @@ func (s *webServer) Dologin() {
...
@@ -179,7 +185,7 @@ func (s *webServer) Dologin() {
case
client
.
OtherLoginError
,
client
.
UnknownLoginError
:
case
client
.
OtherLoginError
,
client
.
UnknownLoginError
:
log
.
Warnf
(
"登录失败: %v"
,
rsp
.
ErrorMessage
)
log
.
Warnf
(
"登录失败: %v"
,
rsp
.
ErrorMessage
)
log
.
Infof
(
"按 Enter 继续...."
)
log
.
Infof
(
"按 Enter 继续...."
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
os
.
Exit
(
0
)
os
.
Exit
(
0
)
return
return
}
}
...
@@ -219,8 +225,7 @@ func (s *webServer) Dologin() {
...
@@ -219,8 +225,7 @@ func (s *webServer) Dologin() {
log
.
Warn
(
"Bot已登录"
)
log
.
Warn
(
"Bot已登录"
)
return
return
}
}
if
conf
.
ReLogin
.
MaxReloginTimes
==
0
{
if
times
>
conf
.
ReLogin
.
MaxReloginTimes
&&
conf
.
ReLogin
.
MaxReloginTimes
!=
0
{
}
else
if
times
>
conf
.
ReLogin
.
MaxReloginTimes
{
break
break
}
}
log
.
Warnf
(
"Bot已离线 (%v),将在 %v 秒后尝试重连. 重连次数:%v"
,
log
.
Warnf
(
"Bot已离线 (%v),将在 %v 秒后尝试重连. 重连次数:%v"
,
...
...
server/http.go
View file @
fa6263e7
...
@@ -137,6 +137,7 @@ func (c *httpClient) onBotPushEvent(m coolq.MSG) {
...
@@ -137,6 +137,7 @@ func (c *httpClient) onBotPushEvent(m coolq.MSG) {
log
.
Warnf
(
"上报Event数据 %v 到 %v 失败: %v"
,
m
.
ToJson
(),
c
.
addr
,
err
)
log
.
Warnf
(
"上报Event数据 %v 到 %v 失败: %v"
,
m
.
ToJson
(),
c
.
addr
,
err
)
return
return
}
}
log
.
Debugf
(
"上报Event数据 %v 到 %v"
,
m
.
ToJson
(),
c
.
addr
)
if
gjson
.
Valid
(
res
)
{
if
gjson
.
Valid
(
res
)
{
c
.
bot
.
CQHandleQuickOperation
(
gjson
.
Parse
(
m
.
ToJson
()),
gjson
.
Parse
(
res
))
c
.
bot
.
CQHandleQuickOperation
(
gjson
.
Parse
(
m
.
ToJson
()),
gjson
.
Parse
(
res
))
}
}
...
@@ -234,9 +235,9 @@ func (s *httpServer) GetImage(c *gin.Context) {
...
@@ -234,9 +235,9 @@ func (s *httpServer) GetImage(c *gin.Context) {
c
.
JSON
(
200
,
s
.
bot
.
CQGetImage
(
file
))
c
.
JSON
(
200
,
s
.
bot
.
CQGetImage
(
file
))
}
}
func
(
s
*
httpServer
)
Get
Group
Message
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
GetMessage
(
c
*
gin
.
Context
)
{
mid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"message_id"
),
10
,
32
)
mid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"message_id"
),
10
,
32
)
c
.
JSON
(
200
,
s
.
bot
.
CQGet
Group
Message
(
int32
(
mid
)))
c
.
JSON
(
200
,
s
.
bot
.
CQGetMessage
(
int32
(
mid
)))
}
}
func
(
s
*
httpServer
)
GetGroupHonorInfo
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
GetGroupHonorInfo
(
c
*
gin
.
Context
)
{
...
@@ -317,6 +318,10 @@ func (s *httpServer) GetForwardMessage(c *gin.Context) {
...
@@ -317,6 +318,10 @@ func (s *httpServer) GetForwardMessage(c *gin.Context) {
c
.
JSON
(
200
,
s
.
bot
.
CQGetForwardMessage
(
resId
))
c
.
JSON
(
200
,
s
.
bot
.
CQGetForwardMessage
(
resId
))
}
}
func
(
s
*
httpServer
)
GetGroupSystemMessage
(
c
*
gin
.
Context
)
{
c
.
JSON
(
200
,
s
.
bot
.
CQGetGroupSystemMessages
())
}
func
(
s
*
httpServer
)
DeleteMessage
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
DeleteMessage
(
c
*
gin
.
Context
)
{
mid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"message_id"
),
10
,
32
)
mid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"message_id"
),
10
,
32
)
c
.
JSON
(
200
,
s
.
bot
.
CQDeleteMessage
(
int32
(
mid
)))
c
.
JSON
(
200
,
s
.
bot
.
CQDeleteMessage
(
int32
(
mid
)))
...
@@ -501,8 +506,11 @@ var httpApi = map[string]func(s *httpServer, c *gin.Context){
...
@@ -501,8 +506,11 @@ var httpApi = map[string]func(s *httpServer, c *gin.Context){
"get_forward_msg"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
"get_forward_msg"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
s
.
GetForwardMessage
(
c
)
s
.
GetForwardMessage
(
c
)
},
},
"get_group_msg"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
"get_msg"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
s
.
GetGroupMessage
(
c
)
s
.
GetMessage
(
c
)
},
"get_group_system_msg"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
s
.
GetGroupSystemMessage
(
c
)
},
},
"get_group_honor_info"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
"get_group_honor_info"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
s
.
GetGroupHonorInfo
(
c
)
s
.
GetGroupHonorInfo
(
c
)
...
...
server/websocket.go
View file @
fa6263e7
...
@@ -474,8 +474,8 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
...
@@ -474,8 +474,8 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
"get_forward_msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"get_forward_msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetForwardMessage
(
p
.
Get
(
"message_id"
)
.
Str
)
return
bot
.
CQGetForwardMessage
(
p
.
Get
(
"message_id"
)
.
Str
)
},
},
"get_
group_
msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"get_msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGet
Group
Message
(
int32
(
p
.
Get
(
"message_id"
)
.
Int
()))
return
bot
.
CQGetMessage
(
int32
(
p
.
Get
(
"message_id"
)
.
Int
()))
},
},
"get_group_honor_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"get_group_honor_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetGroupHonorInfo
(
p
.
Get
(
"group_id"
)
.
Int
(),
p
.
Get
(
"type"
)
.
Str
)
return
bot
.
CQGetGroupHonorInfo
(
p
.
Get
(
"group_id"
)
.
Int
(),
p
.
Get
(
"type"
)
.
Str
)
...
@@ -495,6 +495,9 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
...
@@ -495,6 +495,9 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
"get_version_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"get_version_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetVersionInfo
()
return
bot
.
CQGetVersionInfo
()
},
},
"get_group_system_msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetGroupSystemMessages
()
},
"_get_vip_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"_get_vip_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetVipInfo
(
p
.
Get
(
"user_id"
)
.
Int
())
return
bot
.
CQGetVipInfo
(
p
.
Get
(
"user_id"
)
.
Int
())
},
},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment