mirror of
https://github.com/awfufu/go-hurobot.git
synced 2026-03-01 05:29:43 +08:00
feat: add memberinfo command
This commit is contained in:
@@ -40,6 +40,7 @@ func init() {
|
||||
"sh": cmd_sh,
|
||||
"rps": cmd_rps,
|
||||
"dice": cmd_dice,
|
||||
"memberinfo": cmd_memberinfo,
|
||||
}
|
||||
|
||||
for key := range cmdMap {
|
||||
|
||||
105
cmds/memberinfo.go
Normal file
105
cmds/memberinfo.go
Normal file
@@ -0,0 +1,105 @@
|
||||
package cmds
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-hurobot/qbot"
|
||||
"time"
|
||||
)
|
||||
|
||||
func cmd_memberinfo(c *qbot.Client, msg *qbot.Message, args *ArgsList) {
|
||||
// 只能在群聊中使用
|
||||
if msg.GroupID == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
var targetUserID uint64
|
||||
|
||||
if args.Size >= 2 && args.Types[1] == qbot.At {
|
||||
targetUserID = str2uin64(args.Contents[1])
|
||||
} else {
|
||||
targetUserID = msg.UserID
|
||||
}
|
||||
|
||||
if targetUserID == 0 {
|
||||
c.SendReplyMsg(msg, "Invalid user ID")
|
||||
return
|
||||
}
|
||||
|
||||
// 获取群成员信息
|
||||
memberInfo, err := c.GetGroupMemberInfo(msg.GroupID, targetUserID, false)
|
||||
if err != nil {
|
||||
c.SendReplyMsg(msg, fmt.Sprintf("Failed to get member info: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
response := fmt.Sprintf(
|
||||
"QQ号: %d\n"+
|
||||
"昵称: %s\n"+
|
||||
"名片: %s\n"+
|
||||
"性别: %s\n"+
|
||||
"权限: %s\n"+
|
||||
"等级: Lv %s",
|
||||
memberInfo.UserID,
|
||||
memberInfo.Nickname,
|
||||
getCardOrNickname(memberInfo.Card, memberInfo.Nickname),
|
||||
getSexString(memberInfo.Sex),
|
||||
getRoleString(memberInfo.Role),
|
||||
memberInfo.Level)
|
||||
|
||||
if memberInfo.Age > 0 {
|
||||
response += fmt.Sprintf("\n年龄: %d", memberInfo.Age)
|
||||
}
|
||||
|
||||
if memberInfo.Area != "" {
|
||||
response += fmt.Sprintf("\n地区: %s", memberInfo.Area)
|
||||
}
|
||||
|
||||
if memberInfo.Title != "" {
|
||||
response += fmt.Sprintf("\n头衔: %s", memberInfo.Title)
|
||||
}
|
||||
|
||||
if memberInfo.ShutUpTimestamp > 0 {
|
||||
shutUpTime := time.Unix(memberInfo.ShutUpTimestamp, 0)
|
||||
if shutUpTime.After(time.Now()) {
|
||||
response += fmt.Sprintf("\n禁言到期: %s", shutUpTime.Format("2006-01-02 15:04:05"))
|
||||
}
|
||||
}
|
||||
|
||||
if memberInfo.JoinTime > 0 {
|
||||
joinTime := time.Unix(int64(memberInfo.JoinTime), 0)
|
||||
response += fmt.Sprintf("\n加群时间: %s", joinTime.Format("2006-01-02 15:04:05"))
|
||||
}
|
||||
|
||||
c.SendReplyMsg(msg, response)
|
||||
}
|
||||
|
||||
func getCardOrNickname(card, nickname string) string {
|
||||
if card != "" {
|
||||
return card
|
||||
}
|
||||
return nickname
|
||||
}
|
||||
|
||||
func getSexString(sex string) string {
|
||||
switch sex {
|
||||
case "male":
|
||||
return "♂"
|
||||
case "female":
|
||||
return "♀"
|
||||
default:
|
||||
return "?"
|
||||
}
|
||||
}
|
||||
|
||||
func getRoleString(role string) string {
|
||||
switch role {
|
||||
case "owner":
|
||||
return "👑群主"
|
||||
case "admin":
|
||||
return "管理员"
|
||||
case "member":
|
||||
return "🐱成员"
|
||||
default:
|
||||
return role
|
||||
}
|
||||
}
|
||||
16
qbot/api.go
16
qbot/api.go
@@ -142,3 +142,19 @@ func (c *Client) SendMsg(msg *Message, message string) {
|
||||
func (c *Client) SendImage(msg *Message, url string) {
|
||||
c.SendMsg(msg, CQImage(url))
|
||||
}
|
||||
|
||||
func (c *Client) GetGroupMemberInfo(groupID uint64, userID uint64, noCache bool) (*GroupMemberInfo, error) {
|
||||
req := cqRequest{
|
||||
Action: "get_group_member_info",
|
||||
Params: map[string]any{
|
||||
"group_id": groupID,
|
||||
"user_id": userID,
|
||||
"no_cache": noCache,
|
||||
},
|
||||
}
|
||||
resp, err := c.sendJsonWithEcho(&req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &resp.Data.GroupMemberInfo, nil
|
||||
}
|
||||
|
||||
@@ -89,11 +89,31 @@ type cqRequest struct {
|
||||
Echo string `json:"echo,omitempty"`
|
||||
}
|
||||
|
||||
type GroupMemberInfo struct {
|
||||
GroupID uint64 `json:"group_id"`
|
||||
UserID uint64 `json:"user_id"`
|
||||
Nickname string `json:"nickname"`
|
||||
Card string `json:"card"`
|
||||
Sex string `json:"sex"`
|
||||
Age int32 `json:"age"`
|
||||
Area string `json:"area"`
|
||||
JoinTime int32 `json:"join_time"`
|
||||
LastSentTime int32 `json:"last_sent_time"`
|
||||
Level string `json:"level"`
|
||||
Role string `json:"role"`
|
||||
Unfriendly bool `json:"unfriendly"`
|
||||
Title string `json:"title"`
|
||||
TitleExpireTime int64 `json:"title_expire_time"`
|
||||
CardChangeable bool `json:"card_changeable"`
|
||||
ShutUpTimestamp int64 `json:"shut_up_timestamp"`
|
||||
}
|
||||
|
||||
type cqResponse struct {
|
||||
Status string `json:"status"`
|
||||
Retcode int `json:"retcode"`
|
||||
Data struct {
|
||||
MessageId uint64 `json:"message_id"`
|
||||
GroupMemberInfo
|
||||
}
|
||||
Message string `json:"message"`
|
||||
Wording string `json:"wording"`
|
||||
|
||||
Reference in New Issue
Block a user