feat: add memberinfo command

This commit is contained in:
2025-08-05 10:00:37 +08:00
parent 111379fbed
commit 9cf9d0fbc8
4 changed files with 142 additions and 0 deletions

View File

@@ -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
View 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
}
}

View File

@@ -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
}

View File

@@ -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"`