/
get_group_member_list.go
210 lines (189 loc) · 6.31 KB
/
get_group_member_list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
package handlers
import (
"log"
"strconv"
"github.com/bwmarrin/discordgo"
"github.com/hoshinonyaruko/gensokyo-discord/callapi"
"github.com/hoshinonyaruko/gensokyo-discord/idmap"
"github.com/hoshinonyaruko/gensokyo-discord/mylog"
)
type Response struct {
Retcode int `json:"retcode"`
Status string `json:"status"`
Data []MemberList `json:"data"`
Echo interface{} `json:"echo"` // 使用 interface{} 类型以容纳整数或文本
}
// Member Onebot 群成员
type MemberList struct {
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() {
callapi.RegisterHandler("get_group_member_list", GetGroupMemberList)
}
func GetGroupMemberList(client callapi.Client, s *discordgo.Session, message callapi.ActionMessage) (string, error) {
msgType, err := idmap.ReadConfigv2(message.Params.GroupID.(string), "type")
if err != nil {
mylog.Printf("Error reading config: %v", err)
return "", nil
}
switch msgType {
case "private":
mylog.Printf("getGroupMemberList(private): 目前暂未适配私聊虚拟群场景获取虚拟群列表能力")
return "", nil
case "guild":
//要把group_id还原成guild_id
//用group_id还原出channelid 这是虚拟成群的私聊信息
message.Params.ChannelID = message.Params.GroupID.(string)
// 使用RetrieveRowByIDv2还原真实的ChannelID
RChannelID, err := idmap.RetrieveRowByIDv2(message.Params.ChannelID)
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("Error reading config: %v", err)
return "", nil
}
// pager := &dto.GuildMembersPager{
// Limit: "400",
// }
membersFromAPI, err := s.GuildMembers(value, "", 400)
if err != nil {
log.Printf("Failed to fetch group members for guild %s: %v", value, err)
return "", nil
}
// mylog.Println("Number of members in membersFromAPI:", len(membersFromAPI))
// for i, member := range membersFromAPI {
// mylog.Printf("Member %d: %+v\n", i+1, *member)
// }
var members []MemberList
for _, memberFromAPI := range membersFromAPI {
joinedAtTime := memberFromAPI.JoinedAt
if err != nil {
mylog.Println("Error parsing JoinedAt timestamp:", err)
continue
}
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: userIDInt,
GroupID: groupIDInt,
Nickname: memberFromAPI.Nick,
Card: "主人", // 使用默认值
Sex: "0", // 使用默认值
Age: 0, // 使用默认值
Area: "0", // 使用默认值
JoinTime: joinTimeInt,
LastSentTime: 0, // 使用默认值
Level: "0", // 0
Role: "member", //
Unfriendly: false,
Title: "0", // 使用默认值
TitleExpireTime: 0, // 使用默认值
CardChangeable: false,
ShutUpTimestamp: 0, // 使用默认值
}
for _, role := range memberFromAPI.Roles {
switch role {
case "4":
member.Role = "owner"
case "2":
member.Role = "admin"
case "11", "default":
member.Role = "member"
}
if member.Role == "owner" || member.Role == "admin" {
break
}
}
members = append(members, member)
}
mylog.Printf("member message.Echors: %+v\n", message.Echo)
responseJSON := buildResponse(members, message.Echo) // assume echoValue is your echo data
mylog.Printf("getGroupMemberList(频道): %s\n", responseJSON)
err = client.SendMessage(responseJSON) //发回去
if err != nil {
mylog.Printf("Error sending message via client: %v", err)
}
result, err := ConvertMapToJSONString(responseJSON)
if err != nil {
mylog.Printf("Error marshaling data: %v", err)
//todo 符合onebotv11 ws返回的错误码
return "", nil
}
return string(result), nil
default:
mylog.Printf("Unknown msgType: %s", msgType)
}
return "", nil
}
func buildResponse(members []MemberList, echoValue interface{}) map[string]interface{} {
data := make([]map[string]interface{}, len(members))
for i, member := range members {
memberMap := map[string]interface{}{
"user_id": member.UserID,
"group_id": member.GroupID,
"nickname": member.Nickname,
"card": member.Card,
"sex": member.Sex,
"age": member.Age,
"area": member.Area,
"join_time": member.JoinTime,
"last_sent_time": member.LastSentTime,
"level": member.Level,
"role": member.Role,
"unfriendly": member.Unfriendly,
"title": member.Title,
"title_expire_time": member.TitleExpireTime,
"card_changeable": member.CardChangeable,
"shut_up_timestamp": member.ShutUpTimestamp,
}
data[i] = memberMap
}
response := map[string]interface{}{
"retcode": 0,
"status": "ok",
"data": data,
}
// Set echo based on the type of echoValue
switch v := echoValue.(type) {
case int:
mylog.Printf("Setting echo as int: %d", v)
response["echo"] = v
case string:
mylog.Printf("Setting echo as string: %s", v)
response["echo"] = v
case []interface{}:
mylog.Printf("Setting echo as array: %v", v)
response["echo"] = v
case map[string]interface{}:
mylog.Printf("Setting echo as object: %v", v)
response["echo"] = v
default:
mylog.Printf("Unknown type for echo: %T", v)
}
return response
}