From 77eb3cd0a17f489159778d4c0f421ac3c1f0c5ba Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 28 Nov 2023 23:59:21 +0800 Subject: [PATCH 1/7] beta57 --- handlers/get_group_list.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/get_group_list.go b/handlers/get_group_list.go index 714a2133..922526eb 100644 --- a/handlers/get_group_list.go +++ b/handlers/get_group_list.go @@ -92,7 +92,7 @@ func getGroupList(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.Open mylog.Println("Error parsing JoinedAt timestamp:", err) continue } - joinedAtStr := joinedAtTime.Format(time.RFC3339) // or any other format you prefer + joinedAtStr := strconv.FormatInt(joinedAtTime.Unix(), 10) // 转换为 10 位时间戳 group := Group{ GroupCreateTime: joinedAtStr, GroupID: guild.ID, From 7872ccd78ca627988f99252d3c2ffae9f7bc37af Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 29 Nov 2023 00:21:13 +0800 Subject: [PATCH 2/7] beta60 --- handlers/get_group_list.go | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/handlers/get_group_list.go b/handlers/get_group_list.go index 922526eb..ff3552be 100644 --- a/handlers/get_group_list.go +++ b/handlers/get_group_list.go @@ -3,7 +3,6 @@ package handlers import ( "context" "encoding/json" - "fmt" "strconv" "time" @@ -37,13 +36,13 @@ type Guild struct { } type Group struct { - GroupCreateTime string `json:"group_create_time"` - GroupID string `json:"group_id"` - GroupLevel string `json:"group_level"` + GroupCreateTime int32 `json:"group_create_time"` + GroupID int64 `json:"group_id"` + GroupLevel int32 `json:"group_level"` GroupMemo string `json:"group_memo"` GroupName string `json:"group_name"` - MaxMemberCount string `json:"max_member_count"` - MemberCount string `json:"member_count"` + MaxMemberCount int32 `json:"max_member_count"` + MemberCount int32 `json:"member_count"` } type GroupList struct { @@ -92,15 +91,16 @@ func getGroupList(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.Open mylog.Println("Error parsing JoinedAt timestamp:", err) continue } - joinedAtStr := strconv.FormatInt(joinedAtTime.Unix(), 10) // 转换为 10 位时间戳 + groupID, _ := strconv.ParseInt(guild.ID, 10, 64) + joinedAtTimestamp := int32(joinedAtTime.Unix()) // 获取 10 位时间戳并转换为 int32 类型 group := Group{ - GroupCreateTime: joinedAtStr, - GroupID: guild.ID, - GroupLevel: guild.OwnerID, + GroupCreateTime: joinedAtTimestamp, + GroupID: groupID, + GroupLevel: 0, GroupMemo: guild.Desc, GroupName: "*" + guild.Name, - MaxMemberCount: strconv.FormatInt(guild.MaxMembers, 10), - MemberCount: strconv.Itoa(guild.MemberCount), + MaxMemberCount: int32(guild.MaxMembers), // 确保这里也是 int32 类型 + MemberCount: int32(guild.MemberCount), // 将这里也转换为 int32 类型 } groupList.Data = append(groupList.Data, group) // 获取每个guild的channel信息 @@ -117,13 +117,13 @@ func getGroupList(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.Open mylog.Printf("Error storing ID: %v", err) } channelGroup := Group{ - GroupCreateTime: "", // 频道没有直接对应的创建时间字段 - GroupID: fmt.Sprint(ChannelID64), - GroupLevel: "", // 频道没有直接对应的级别字段 + GroupCreateTime: 0, // 频道没有直接对应的创建时间字段 + GroupID: ChannelID64, + GroupLevel: 0, // 频道没有直接对应的级别字段 GroupMemo: "", // 频道没有直接对应的描述字段 GroupName: channel.Name, - MaxMemberCount: "", // 频道没有直接对应的最大成员数字段 - MemberCount: "", // 频道没有直接对应的成员数字段 + MaxMemberCount: 0, // 频道没有直接对应的最大成员数字段 + MemberCount: 0, // 频道没有直接对应的成员数字段 } groupList.Data = append(groupList.Data, channelGroup) } From b5382fa85a868532df93d6b7bf35862b6a820345 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 29 Nov 2023 20:52:35 +0800 Subject: [PATCH 3/7] beta60 --- handlers/get_group_info.go | 83 +++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 24 deletions(-) diff --git a/handlers/get_group_info.go b/handlers/get_group_info.go index 84a53bfe..fc0d4348 100644 --- a/handlers/get_group_info.go +++ b/handlers/get_group_info.go @@ -3,8 +3,12 @@ package handlers import ( "context" "encoding/json" + "strconv" + "time" "github.com/hoshinonyaruko/gensokyo/callapi" + "github.com/hoshinonyaruko/gensokyo/config" + "github.com/hoshinonyaruko/gensokyo/echo" "github.com/hoshinonyaruko/gensokyo/idmap" "github.com/hoshinonyaruko/gensokyo/mylog" @@ -20,8 +24,8 @@ type OnebotGroupInfo struct { GroupID int64 `json:"group_id"` GroupName string `json:"group_name"` GroupMemo string `json:"group_memo"` - GroupCreateTime uint32 `json:"group_create_time"` - GroupLevel uint32 `json:"group_level"` + GroupCreateTime int32 `json:"group_create_time"` + GroupLevel int32 `json:"group_level"` MemberCount int32 `json:"member_count"` MaxMemberCount int32 `json:"max_member_count"` } @@ -39,7 +43,7 @@ func ConvertGuildToGroupInfo(guild *dto.Guild, GroupId string) *OnebotGroupInfo mylog.Printf("转换JoinedAt失败: %v", err) return nil } - groupCreateTime := uint32(ts.Unix()) + groupCreateTime := int32(ts.Unix()) return &OnebotGroupInfo{ GroupID: groupid64, @@ -54,30 +58,61 @@ func ConvertGuildToGroupInfo(guild *dto.Guild, GroupId string) *OnebotGroupInfo func handleGetGroupInfo(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.OpenAPI, message callapi.ActionMessage) { params := message.Params - - //用GroupID给ChannelID赋值,因为我们是把频道虚拟成了群 - ChannelID := params.GroupID - // 使用RetrieveRowByIDv2还原真实的ChannelID - RChannelID, err := idmap.RetrieveRowByIDv2(ChannelID.(string)) - if err != nil { - mylog.Printf("error retrieving real ChannelID: %v", err) + // 使用 message.Echo 作为key来获取消息类型 + var msgType string + var groupInfo *OnebotGroupInfo + var err error + if echoStr, ok := message.Echo.(string); ok { + // 当 message.Echo 是字符串类型时执行此块 + msgType = echo.GetMsgTypeByKey(echoStr) } - //读取ini 通过ChannelID取回之前储存的guild_id - value, err := idmap.ReadConfigv2(RChannelID, "guild_id") - if err != nil { - mylog.Printf("handleGetGroupInfo:Error reading config: %v\n", err) - return - } - //最后获取到guildID - guildID := value - mylog.Printf("调试,准备groupInfoMap(频道)guildID:%v", guildID) - guild, err := api.Guild(context.TODO(), guildID) - if err != nil { - mylog.Printf("获取频道信息失败: %v", err) - return + //如果获取不到 就用user_id获取信息类型 + if msgType == "" { + msgType = GetMessageTypeByUserid(config.GetAppIDStr(), message.Params.UserID) } - groupInfo := ConvertGuildToGroupInfo(guild, guildID) + //如果获取不到 就用group_id获取信息类型 + if msgType == "" { + msgType = GetMessageTypeByGroupid(config.GetAppIDStr(), message.Params.GroupID) + } + switch msgType { + case "guild", "guild_private": + //用GroupID给ChannelID赋值,因为我们是把频道虚拟成了群 + ChannelID := params.GroupID + // 使用RetrieveRowByIDv2还原真实的ChannelID + RChannelID, err := idmap.RetrieveRowByIDv2(ChannelID.(string)) + if err != nil { + mylog.Printf("error retrieving real ChannelID: %v", err) + } + //读取ini 通过ChannelID取回之前储存的guild_id + value, err := idmap.ReadConfigv2(RChannelID, "guild_id") + if err != nil { + mylog.Printf("handleGetGroupInfo:Error reading config: %v\n", err) + return + } + //最后获取到guildID + guildID := value + mylog.Printf("调试,准备groupInfoMap(频道)guildID:%v", guildID) + guild, err := api.Guild(context.TODO(), guildID) + if err != nil { + mylog.Printf("获取频道信息失败: %v", err) + return + } + groupInfo = ConvertGuildToGroupInfo(guild, guildID) + default: + var groupid int64 + groupid, _ = strconv.ParseInt(message.Params.GroupID.(string), 10, 64) + groupCreateTime := time.Now().Unix() + groupInfo = &OnebotGroupInfo{ + GroupID: groupid, + GroupName: "测试群", + GroupMemo: "这是一个测试群", + GroupCreateTime: int32(groupCreateTime), + GroupLevel: 0, + MemberCount: 500, + MaxMemberCount: 1000, + } + } groupInfoMap := structToMap(groupInfo) // 打印groupInfoMap的内容 From db620a22644aab67e84d4a072230ef0fa1bc5285 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 29 Nov 2023 21:31:43 +0800 Subject: [PATCH 4/7] beta61 --- handlers/get_group_list.go | 190 +++++++++++++++++++++---------------- idmap/service.go | 31 ++++++ 2 files changed, 137 insertions(+), 84 deletions(-) diff --git a/handlers/get_group_list.go b/handlers/get_group_list.go index ff3552be..872751eb 100644 --- a/handlers/get_group_list.go +++ b/handlers/get_group_list.go @@ -56,107 +56,129 @@ type GroupList struct { func getGroupList(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.OpenAPI, message callapi.ActionMessage) { //群还不支持,这里取得是频道的,如果后期支持了群,那都请求,一起返回 var groupList GroupList - actiontype := "guild" - if actiontype == "guild" { - // 初始化 groupList.Data 为一个空数组 - groupList.Data = []Group{} - // 检查时间差异 - if time.Since(lastCallTime) > 5*time.Minute { - // 如果超过5分钟,则重置分页状态 - globalPager = &dto.GuildPager{Limit: "10"} - } - // 全局pager - guilds, err := api.MeGuilds(context.TODO(), globalPager) + + // 初始化 groupList.Data 为一个空数组 + groupList.Data = []Group{} + // 检查时间差异 + if time.Since(lastCallTime) > 5*time.Minute { + // 如果超过5分钟,则重置分页状态 + globalPager = &dto.GuildPager{Limit: "10"} + } + // 全局pager + guilds, err := api.MeGuilds(context.TODO(), globalPager) + if err != nil { + mylog.Println("Error fetching guild list:", err) + return + } + if len(guilds) > 0 { + // 更新Pager的After为最后一个元素的ID + globalPager.After = guilds[len(guilds)-1].ID + } + lastCallTime = time.Now() // 更新上次调用API的时间 + //如果为空 则不使用分页 + if len(guilds) == 0 { + Pager := &dto.GuildPager{Limit: "10"} + guilds, err = api.MeGuilds(context.TODO(), Pager) if err != nil { - mylog.Println("Error fetching guild list:", err) + mylog.Println("Error fetching guild list2:", err) return } - if len(guilds) > 0 { - // 更新Pager的After为最后一个元素的ID - globalPager.After = guilds[len(guilds)-1].ID + } + for _, guild := range guilds { + joinedAtTime, err := guild.JoinedAt.Time() + if err != nil { + mylog.Println("Error parsing JoinedAt timestamp:", err) + continue } - lastCallTime = time.Now() // 更新上次调用API的时间 - //如果为空 则不使用分页 - if len(guilds) == 0 { - Pager := &dto.GuildPager{Limit: "10"} - guilds, err = api.MeGuilds(context.TODO(), Pager) - if err != nil { - mylog.Println("Error fetching guild list2:", err) - return - } + groupID, _ := strconv.ParseInt(guild.ID, 10, 64) + joinedAtTimestamp := int32(joinedAtTime.Unix()) // 获取 10 位时间戳并转换为 int32 类型 + group := Group{ + GroupCreateTime: joinedAtTimestamp, + GroupID: groupID, + GroupLevel: 0, + GroupMemo: guild.Desc, + GroupName: "*" + guild.Name, + MaxMemberCount: int32(guild.MaxMembers), // 确保这里也是 int32 类型 + MemberCount: int32(guild.MemberCount), // 将这里也转换为 int32 类型 } - for _, guild := range guilds { - joinedAtTime, err := guild.JoinedAt.Time() - if err != nil { - mylog.Println("Error parsing JoinedAt timestamp:", err) - continue - } - groupID, _ := strconv.ParseInt(guild.ID, 10, 64) - joinedAtTimestamp := int32(joinedAtTime.Unix()) // 获取 10 位时间戳并转换为 int32 类型 - group := Group{ - GroupCreateTime: joinedAtTimestamp, - GroupID: groupID, - GroupLevel: 0, - GroupMemo: guild.Desc, - GroupName: "*" + guild.Name, - MaxMemberCount: int32(guild.MaxMembers), // 确保这里也是 int32 类型 - MemberCount: int32(guild.MemberCount), // 将这里也转换为 int32 类型 - } - groupList.Data = append(groupList.Data, group) - // 获取每个guild的channel信息 - channels, err := api.Channels(context.TODO(), guild.ID) // 使用guild.ID作为参数 + groupList.Data = append(groupList.Data, group) + // 获取每个guild的channel信息 + channels, err := api.Channels(context.TODO(), guild.ID) // 使用guild.ID作为参数 + if err != nil { + mylog.Println("Error fetching channels list:", err) + continue + } + // 将channel信息转换为Group对象并添加到groups + for _, channel := range channels { + //转换ChannelID64 + ChannelID64, err := idmap.StoreIDv2(channel.ID) if err != nil { - mylog.Println("Error fetching channels list:", err) - continue + mylog.Printf("Error storing ID: %v", err) } - // 将channel信息转换为Group对象并添加到groups - for _, channel := range channels { - //转换ChannelID64 - ChannelID64, err := idmap.StoreIDv2(channel.ID) - if err != nil { - mylog.Printf("Error storing ID: %v", err) - } - channelGroup := Group{ - GroupCreateTime: 0, // 频道没有直接对应的创建时间字段 - GroupID: ChannelID64, - GroupLevel: 0, // 频道没有直接对应的级别字段 - GroupMemo: "", // 频道没有直接对应的描述字段 - GroupName: channel.Name, - MaxMemberCount: 0, // 频道没有直接对应的最大成员数字段 - MemberCount: 0, // 频道没有直接对应的成员数字段 - } - groupList.Data = append(groupList.Data, channelGroup) + channelGroup := Group{ + GroupCreateTime: 0, // 频道没有直接对应的创建时间字段 + GroupID: ChannelID64, + GroupLevel: 0, // 频道没有直接对应的级别字段 + GroupMemo: "", // 频道没有直接对应的描述字段 + GroupName: channel.Name, + MaxMemberCount: 0, // 频道没有直接对应的最大成员数字段 + MemberCount: 0, // 频道没有直接对应的成员数字段 } + groupList.Data = append(groupList.Data, channelGroup) + } + } + //从idmaps数据库找群,组合成群列表需要的格式 + groupIDs, err := idmap.FindKeysBySubAndType("group", "type") + if err != nil { + mylog.Printf("Error FindKeysBySubAndType %s", err) + } + // 当前时间的 10 位 Unix 时间戳 + currentTimestamp := int32(time.Now().Unix()) + + for _, idStr := range groupIDs { + groupID, err := strconv.ParseInt(idStr, 10, 64) + if err != nil { + mylog.Printf("Error converting group ID %s to int64: %v", idStr, err) + continue } - groupList.Message = "" - groupList.RetCode = 0 - groupList.Status = "ok" - if message.Echo == "" { - groupList.Echo = "0" - } else { - groupList.Echo = message.Echo + group := Group{ + GroupCreateTime: currentTimestamp, // 使用当前时间的时间戳 + GroupID: groupID, + GroupLevel: 0, + GroupMemo: "", + GroupName: "", + MaxMemberCount: 0, + MemberCount: 0, + } - outputMap := structToMap(groupList) + groupList.Data = append(groupList.Data, group) + } + groupList.Message = "" + groupList.RetCode = 0 + groupList.Status = "ok" - mylog.Printf("getGroupList(频道): %+v\n", outputMap) + if message.Echo == "" { + groupList.Echo = "0" + } else { + groupList.Echo = message.Echo - err = client.SendMessage(outputMap) - if err != nil { - mylog.Printf("error sending group info via wsclient: %v", err) - } + outputMap := structToMap(groupList) - result, err := json.Marshal(groupList) - if err != nil { - mylog.Printf("Error marshaling data: %v", err) - return - } + mylog.Printf("getGroupList(频道): %+v\n", outputMap) - mylog.Printf("get_group_list: %s", result) + err = client.SendMessage(outputMap) + if err != nil { + mylog.Printf("error sending group info via wsclient: %v", err) } - } else { - // todo 等待群 群列表api + result, err := json.Marshal(groupList) + if err != nil { + mylog.Printf("Error marshaling data: %v", err) + return + } + + mylog.Printf("get_group_list: %s", result) } } diff --git a/idmap/service.go b/idmap/service.go index fa3f4545..22196fb5 100644 --- a/idmap/service.go +++ b/idmap/service.go @@ -978,3 +978,34 @@ func UpdateVirtualValuev2Pro(oldVirtualValue1, newVirtualValue1, oldVirtualValue return UpdateVirtualValuePro(oldVirtualValue1, newVirtualValue1, oldVirtualValue2, newVirtualValue2) } + +// sub 要匹配的类型 typesuffix 相当于:type 的type +func FindKeysBySubAndType(sub string, typeSuffix string) ([]string, error) { + var ids []string + + err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(ConfigBucket)) + if b == nil { + return fmt.Errorf("bucket %s not found", ConfigBucket) + } + + return b.ForEach(func(k, v []byte) error { + key := string(k) + value := string(v) + + // 检查键是否以:type结尾,并且值是否匹配sub + if strings.HasSuffix(key, typeSuffix) && value == sub { + // 提取id部分 + id := strings.Split(key, ":")[0] + ids = append(ids, id) + } + return nil + }) + }) + + if err != nil { + return nil, err + } + + return ids, nil +} From f36eaa4bceaf2cc8252071e230b27efa01e038f6 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 29 Nov 2023 23:01:24 +0800 Subject: [PATCH 5/7] beta61 --- Processor/ProcessC2CMessage.go | 6 ++++++ Processor/ProcessChannelDirectMessage.go | 11 +++++++++++ Processor/ProcessGroupMessage.go | 5 +++++ Processor/ProcessGuildATMessage.go | 10 ++++++++++ Processor/ProcessGuildNormalMessage.go | 5 +++++ Processor/Processor.go | 6 ++++++ 6 files changed, 43 insertions(+) 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..a43600d8 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(), 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"` } // 频道信息事件 From 4683c4f34dd9d1e617cd95e7fe6f989498adba02 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 29 Nov 2023 23:25:27 +0800 Subject: [PATCH 6/7] beta62 --- handlers/get_group_info.go | 1 + handlers/get_group_member_list.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) 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..d0c60e80 100644 --- a/handlers/get_group_member_list.go +++ b/handlers/get_group_member_list.go @@ -43,10 +43,10 @@ func getGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap switch msgType { case "group": - mylog.Printf("getGroupMemberList(频道): 目前暂未开放该能力") + mylog.Printf("getGroupMemberList(group): 目前暂未开放该能力") return case "private": - mylog.Printf("getGroupMemberList(频道): 目前暂未适配私聊虚拟群场景获取虚拟群列表能力") + mylog.Printf("getGroupMemberList(private): 目前暂未适配私聊虚拟群场景获取虚拟群列表能力") return case "guild": //要把group_id还原成guild_id From 99185ea10d61368b002db3f10f1026348ffb0f5d Mon Sep 17 00:00:00 2001 From: cosmo Date: Thu, 30 Nov 2023 00:12:04 +0800 Subject: [PATCH 7/7] beta62 --- Processor/ProcessGuildNormalMessage.go | 5 ++++ handlers/get_group_member_list.go | 36 +++++++++++++++++++++++++- idmap/service.go | 30 +++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/Processor/ProcessGuildNormalMessage.go b/Processor/ProcessGuildNormalMessage.go index a43600d8..2653e66a 100644 --- a/Processor/ProcessGuildNormalMessage.go +++ b/Processor/ProcessGuildNormalMessage.go @@ -190,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/handlers/get_group_member_list.go b/handlers/get_group_member_list.go index d0c60e80..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,7 +44,40 @@ func getGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap switch msgType { case "group": - mylog.Printf("getGroupMemberList(group): 目前暂未开放该能力") + 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(private): 目前暂未适配私聊虚拟群场景获取虚拟群列表能力") 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 +}