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..85a5ea23 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" @@ -43,10 +44,43 @@ 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 { + member := MemberList{ + UserID: userID, + GroupID: message.Params.GroupID.(string), + Nickname: "", // 根据需要填充或保留为空 + JoinTime: strconv.FormatInt(yesterday, 10), + Role: "admin", // 默认权限,可以根据需要修改 + } + + 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 diff --git a/idmap/service.go b/idmap/service.go index 22196fb5..1281c902 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,31 @@ 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 +}