diff --git a/Processor/ProcessC2CMessage.go b/Processor/ProcessC2CMessage.go index d325089f..11a97016 100644 --- a/Processor/ProcessC2CMessage.go +++ b/Processor/ProcessC2CMessage.go @@ -174,6 +174,12 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { Sender: Sender{ Nickname: "", UserID: userid64, + TinyID: "", + Card: "", + Sex: "0", + Age: 0, + Area: "", + Level: "0", }, SubType: "normal", Time: time.Now().Unix(), diff --git a/Processor/ProcessChannelDirectMessage.go b/Processor/ProcessChannelDirectMessage.go index 7369c650..bec374ba 100644 --- a/Processor/ProcessChannelDirectMessage.go +++ b/Processor/ProcessChannelDirectMessage.go @@ -183,6 +183,11 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) Nickname: data.Member.Nick, TinyID: "", UserID: userid64, + Card: data.Member.Nick, + Sex: "0", + Age: 0, + Area: "", + Level: "0", }, SubType: "channel", Time: t.Unix(), @@ -310,6 +315,12 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) Sender: Sender{ Nickname: data.Member.Nick, UserID: userid64, + TinyID: "", + Card: data.Member.Nick, + Sex: "0", + Age: 0, + Area: "", + Level: "0", }, SubType: "normal", Time: time.Now().Unix(), diff --git a/Processor/ProcessGroupMessage.go b/Processor/ProcessGroupMessage.go index a1346dd0..2734af49 100644 --- a/Processor/ProcessGroupMessage.go +++ b/Processor/ProcessGroupMessage.go @@ -95,6 +95,11 @@ func (p *Processors) ProcessGroupMessage(data *dto.WSGroupATMessageData) error { Sender: Sender{ Nickname: "", UserID: userid64, + Card: "", + Sex: "0", + Age: 0, + Area: "", + Level: "0", }, SubType: "normal", Time: time.Now().Unix(), diff --git a/Processor/ProcessGuildATMessage.go b/Processor/ProcessGuildATMessage.go index 52436c09..4b4f8276 100644 --- a/Processor/ProcessGuildATMessage.go +++ b/Processor/ProcessGuildATMessage.go @@ -65,6 +65,11 @@ func (p *Processors) ProcessGuildATMessage(data *dto.WSATMessageData) error { Nickname: data.Member.Nick, TinyID: "", UserID: userid64, + Card: data.Member.Nick, + Sex: "0", + Age: 0, + Area: "", + Level: "0", }, SubType: "channel", Time: t.Unix(), @@ -181,6 +186,11 @@ func (p *Processors) ProcessGuildATMessage(data *dto.WSATMessageData) error { Sender: Sender{ Nickname: data.Member.Nick, UserID: userid64, + Card: data.Member.Nick, + Sex: "0", + Age: 0, + Area: "", + Level: "0", }, SubType: "normal", Time: time.Now().Unix(), diff --git a/Processor/ProcessGuildNormalMessage.go b/Processor/ProcessGuildNormalMessage.go index 9cb174e6..2653e66a 100644 --- a/Processor/ProcessGuildNormalMessage.go +++ b/Processor/ProcessGuildNormalMessage.go @@ -64,6 +64,11 @@ func (p *Processors) ProcessGuildNormalMessage(data *dto.WSMessageData) error { Nickname: data.Member.Nick, TinyID: "", UserID: userid64, + Card: data.Member.Nick, + Sex: "0", + Age: 0, + Area: "", + Level: "0", }, SubType: "channel", Time: t.Unix(), @@ -185,6 +190,11 @@ func (p *Processors) ProcessGuildNormalMessage(data *dto.WSMessageData) error { Sender: Sender{ Nickname: data.Member.Nick, UserID: userid64, + Card: data.Member.Nick, + Sex: "0", + Age: 0, + Area: "", + Level: "0", }, SubType: "normal", Time: time.Now().Unix(), diff --git a/Processor/Processor.go b/Processor/Processor.go index d8dd07cb..2a6a9f8d 100644 --- a/Processor/Processor.go +++ b/Processor/Processor.go @@ -40,6 +40,12 @@ type Sender struct { TinyID string `json:"tiny_id"` UserID int64 `json:"user_id"` Role string `json:"role,omitempty"` + Card string `json:"card,omitempty"` + Sex string `json:"sex,omitempty"` + Age int32 `json:"age,omitempty"` + Area string `json:"area,omitempty"` + Level string `json:"level,omitempty"` + Title string `json:"title,omitempty"` } // 频道信息事件 diff --git a/handlers/get_group_info.go b/handlers/get_group_info.go index fc0d4348..67a87365 100644 --- a/handlers/get_group_info.go +++ b/handlers/get_group_info.go @@ -80,6 +80,7 @@ func handleGetGroupInfo(client callapi.Client, api openapi.OpenAPI, apiv2 openap //用GroupID给ChannelID赋值,因为我们是把频道虚拟成了群 ChannelID := params.GroupID // 使用RetrieveRowByIDv2还原真实的ChannelID + mylog.Printf("测试:%v", ChannelID.(string)) RChannelID, err := idmap.RetrieveRowByIDv2(ChannelID.(string)) if err != nil { mylog.Printf("error retrieving real ChannelID: %v", err) diff --git a/handlers/get_group_member_list.go b/handlers/get_group_member_list.go index f7c5614c..55b0d172 100644 --- a/handlers/get_group_member_list.go +++ b/handlers/get_group_member_list.go @@ -2,6 +2,7 @@ package handlers import ( "context" + "strconv" "time" "github.com/hoshinonyaruko/gensokyo/callapi" @@ -20,13 +21,22 @@ type Response struct { // Member Onebot 群成员 type MemberList struct { - UserID string `json:"user_id"` - GroupID string `json:"group_id"` - Nickname string `json:"nickname"` - Role string `json:"role"` - JoinTime string `json:"join_time"` - LastSentTime string `json:"last_sent_time"` - Level string `json:"level,omitempty"` // 我添加了 Level 字段,因为你的示例中有它,但你可以删除它,如果不需要 + GroupID int64 `json:"group_id"` + UserID int64 `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"` } func init() { @@ -43,10 +53,62 @@ func getGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap switch msgType { case "group": - mylog.Printf("getGroupMemberList(频道): 目前暂未开放该能力") + mylog.Printf("getGroupMemberList(group): 开始从本地获取群成员列表") + // 实现的功能 + var members []MemberList + + // 使用 message.Params.GroupID.(string) 作为 id 来调用 FindSubKeysById + userIDs, err := idmap.FindSubKeysById(message.Params.GroupID.(string)) + if err != nil { + mylog.Printf("Error retrieving user IDs: %v", err) + return // 或者处理错误 + } + + // 获取当前时间的前一天,并转换为10位时间戳 + yesterday := time.Now().AddDate(0, 0, -1).Unix() + + for _, userID := range userIDs { + userIDInt, err := strconv.ParseInt(userID, 10, 64) + if err != nil { + mylog.Printf("Error ParseInt73: %v", err) + } + groupIDInt, err := strconv.ParseInt(message.Params.GroupID.(string), 10, 64) + if err != nil { + mylog.Printf("Error ParseInt76: %v", err) + } + joinTimeInt := int32(yesterday) + member := MemberList{ + UserID: userIDInt, + GroupID: groupIDInt, + Nickname: "", + Card: "", + Sex: "", + Age: 0, + Area: "", + JoinTime: joinTimeInt, + LastSentTime: 0, + Level: "0", + Role: "member", + Unfriendly: false, + Title: "", + TitleExpireTime: 0, + CardChangeable: false, + ShutUpTimestamp: 0, + } + members = append(members, member) + } + mylog.Printf("member message.Echors: %+v\n", message.Echo) + + responseJSON := buildResponse(members, message.Echo) + mylog.Printf("getGroupMemberList(群): %s\n", responseJSON) + + err = client.SendMessage(responseJSON) + if err != nil { + mylog.Printf("Error sending message via client: %v", err) + } return case "private": - mylog.Printf("getGroupMemberList(频道): 目前暂未适配私聊虚拟群场景获取虚拟群列表能力") + mylog.Printf("getGroupMemberList(private): 目前暂未适配私聊虚拟群场景获取虚拟群列表能力") return case "guild": //要把group_id还原成guild_id @@ -84,13 +146,35 @@ func getGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap mylog.Println("Error parsing JoinedAt timestamp:", err) continue } - joinedAtStr := joinedAtTime.Format(time.RFC3339) // or any other format + userIDInt, err := strconv.ParseInt(memberFromAPI.User.ID, 10, 64) + if err != nil { + mylog.Printf("Error ParseInt152: %v", err) + } + + groupIDInt, err := strconv.ParseInt(message.Params.GroupID.(string), 10, 64) + if err != nil { + mylog.Printf("Error ParseInt156: %v", err) + } + + joinTimeInt := int32(joinedAtTime.Unix()) member := MemberList{ - UserID: memberFromAPI.User.ID, - GroupID: message.Params.GroupID.(string), - Nickname: memberFromAPI.Nick, - JoinTime: joinedAtStr, + UserID: userIDInt, + GroupID: groupIDInt, + Nickname: memberFromAPI.Nick, + Card: "", // 使用默认值 + Sex: "", // 使用默认值 + Age: 0, // 使用默认值 + Area: "", // 使用默认值 + JoinTime: joinTimeInt, + LastSentTime: 0, // 使用默认值 + Level: "0", // 0 + Role: "member", // + Unfriendly: false, + Title: "", // 使用默认值 + TitleExpireTime: 0, // 使用默认值 + CardChangeable: false, + ShutUpTimestamp: 0, // 使用默认值 } for _, role := range memberFromAPI.Roles { switch role { diff --git a/idmap/service.go b/idmap/service.go index 22196fb5..7157e1b7 100644 --- a/idmap/service.go +++ b/idmap/service.go @@ -1,6 +1,7 @@ package idmap import ( + "bytes" "crypto/md5" "encoding/binary" "encoding/hex" @@ -1009,3 +1010,32 @@ func FindKeysBySubAndType(sub string, typeSuffix string) ([]string, error) { return ids, nil } + +// 取相同前缀下的所有key的:后边 比如取群成员列表 +func FindSubKeysById(id string) ([]string, error) { + var subKeys []string + + err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("ids")) + if b == nil { + return fmt.Errorf("bucket %s not found", "ids") + } + + c := b.Cursor() + prefix := []byte(id + ":") + for k, _ := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, _ = c.Next() { + keyParts := bytes.Split(k, []byte(":")) + if len(keyParts) == 2 { + subKeys = append(subKeys, string(keyParts[1])) + } + } + + return nil + }) + + if err != nil { + return nil, err + } + + return subKeys, nil +}