|
6 | 6 | "day-day-review/internal/util"
|
7 | 7 | "fmt"
|
8 | 8 | "log"
|
| 9 | + "math/rand" |
9 | 10 | "strconv"
|
10 | 11 | "strings"
|
11 | 12 | "time"
|
@@ -183,52 +184,54 @@ func getScrumsByDate(session *discordgo.Session, interaction *discordgo.Interact
|
183 | 184 |
|
184 | 185 | // getRandomUserByChannel 채널에 있는 사용자 중 랜덤으로 한 명을 선택합니다.
|
185 | 186 | func getRandomUserByChannel(session *discordgo.Session, interaction *discordgo.InteractionCreate) {
|
186 |
| - channel, err := session.Channel(interaction.ChannelID) |
187 |
| - // 채널 정보를 불러오는 중 오류가 발생하면 에러 메시지를 전송합니다. |
188 |
| - if err != nil { |
189 |
| - logErrorAndSendMessage(session, interaction, "채널을 불러오는 중 오류가 발생했습니다.", err) |
190 |
| - return |
| 187 | + count := 1 |
| 188 | + // 옵션을 받았을 경우 옵션 값을 사용합니다. |
| 189 | + if options := interaction.ApplicationCommandData().Options; len(options) > 0 { |
| 190 | + count = int(options[0].IntValue()) |
191 | 191 | }
|
192 |
| - // 음성 채널이 아니면 에러 메시지를 전송합니다. |
193 |
| - if channel.Type != discordgo.ChannelTypeGuildVoice { |
194 |
| - sendMessage(session, interaction, "음성 채널에서만 사용할 수 있는 명령어입니다.") |
195 |
| - return |
196 |
| - } |
197 |
| - guild, err := session.State.Guild(channel.GuildID) |
198 |
| - // 서버 정보를 불러오는 중 오류가 발생하면 에러 메시지를 전송합니다. |
| 192 | + log.Println("GetRandomUserByChannel | Received count:", count) |
| 193 | + guild, err := session.State.Guild(guildId) |
| 194 | + // 채널 정보를 불러오는 중 오류가 발생하면 에러 메시지를 전송합니다. |
199 | 195 | if err != nil {
|
200 | 196 | logErrorAndSendMessage(session, interaction, "서버 정보를 불러오는 중 오류가 발생했습니다.", err)
|
201 | 197 | return
|
202 | 198 | }
|
203 |
| - var members []*discordgo.Member // 음성 채널에 있는 사용자 목록을 저장합니다. |
204 |
| - memberMap := make(map[string]*discordgo.Member) // 사용자 ID를 키로 사용자 정보를 저장합니다. |
205 |
| - for _, member := range guild.Members { |
206 |
| - memberMap[member.User.ID] = member |
207 |
| - } |
208 |
| - |
209 |
| - // 음성 채널에 있는 사용자 목록을 불러옵니다. |
210 |
| - for _, vs := range guild.VoiceStates { |
211 |
| - if vs.ChannelID == channel.ID { |
212 |
| - if member, ok := memberMap[vs.UserID]; ok { |
213 |
| - members = append(members, member) |
| 199 | + // 채널에 참여중인 사용자를 불러옵니다. |
| 200 | + var members []string |
| 201 | + for _, voiceState := range guild.VoiceStates { |
| 202 | + if voiceState.ChannelID == interaction.ChannelID { |
| 203 | + member, err := session.GuildMember(guildId, voiceState.UserID) |
| 204 | + if err != nil { |
| 205 | + log.Printf("Error getting member: %v", err) |
| 206 | + continue |
| 207 | + } |
| 208 | + username := member.Nick |
| 209 | + if username == "" { |
| 210 | + username = member.User.GlobalName |
214 | 211 | }
|
| 212 | + members = append(members, username) |
215 | 213 | }
|
216 | 214 | }
|
217 |
| - log.Printf("Members: %+v", members) |
218 |
| - // 음성 채널에 사용자가 없으면 에러 메시지를 전송합니다. |
219 |
| - if len(members) == 0 { |
220 |
| - sendMessage(session, interaction, "음성 채널에 사용자가 없습니다.") |
| 215 | + // 채널에 참여중인 사용자가 없거나 요청한 사용자 수가 채널에 참여중인 사용자 수보다 많을 경우 에러 메시지를 전송합니다. |
| 216 | + log.Printf("GetRandomUserByChannel | Current member arr: %+v", members) |
| 217 | + if len(members) == 0 || count > len(members) { |
| 218 | + logErrorAndSendMessage(session, interaction, "채널에 참여중인 사용자가 부족합니다.", nil) |
221 | 219 | return
|
222 | 220 | }
|
223 |
| - |
224 |
| - // 음성 채널에 있는 사용자 중 랜덤으로 한 명을 선택합니다. |
225 |
| - randomMember := members[util.PickRandomNumber(len(members))] |
226 |
| - // 사용자의 닉네임이 없으면 사용자 이름을 사용합니다. |
227 |
| - username := randomMember.Nick |
228 |
| - if username == "" { |
229 |
| - username = randomMember.User.GlobalName |
| 221 | + // 모든 사용자를 선택할 경우 모든 사용자를 선택했다는 메시지를 전송합니다. |
| 222 | + if count == len(members) { |
| 223 | + sendMessage(session, interaction, "모든 사용자가 선택되었습니다.") |
| 224 | + return |
230 | 225 | }
|
231 |
| - sendMessage(session, interaction, fmt.Sprintf("랜덤으로 선택된 사람은 %s입니다!", username)) |
| 226 | + // 랜덤으로 사용자를 선택합니다. |
| 227 | + r := rand.New(rand.NewSource(time.Now().UnixNano())) |
| 228 | + r.Shuffle(len(members), func(i, j int) { |
| 229 | + members[i], members[j] = members[j], members[i] |
| 230 | + }) |
| 231 | + members = members[:count] |
| 232 | + // 선택된 사용자를 메시지로 전송합니다. |
| 233 | + sendMessage(session, interaction, fmt.Sprintf("선택된 사람은 %v 입니다!", strings.Join(members, ", "))) |
| 234 | + return |
232 | 235 | }
|
233 | 236 |
|
234 | 237 | // retrospectiveToString 회고 목록을 문자열로 변환합니다.
|
|
0 commit comments