Skip to content

Commit 4d361e2

Browse files
committed
feat: only post 50 floors for summary
1 parent 4c4a8ee commit 4d361e2

2 files changed

Lines changed: 50 additions & 1 deletion

File tree

apis/hole/apis.go

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/json"
77
"fmt"
88
"io"
9+
"math/rand"
910
"net/http"
1011
"slices"
1112
"strconv"
@@ -1087,6 +1088,54 @@ func GenerateSummary(c *fiber.Ctx) error {
10871088
if err != nil {
10881089
return err
10891090
}
1091+
1092+
if len(floors) > config.Config.MaxSummaryFloors {
1093+
// 1. 按 UpdatedAt 升序排序
1094+
slices.SortFunc(floors, func(a, b *Floor) int {
1095+
if a.UpdatedAt.Equal(b.UpdatedAt) {
1096+
return 0
1097+
}
1098+
if a.UpdatedAt.Before(b.UpdatedAt) {
1099+
return -1
1100+
}
1101+
return 1
1102+
})
1103+
1104+
// 2. 提取头尾
1105+
earliestFloors := config.Config.MaxSummaryFloors / 5
1106+
newestFloors := config.Config.MaxSummaryFloors / 5 * 2
1107+
earliest := floors[:earliestFloors]
1108+
newest := floors[len(floors)-newestFloors:]
1109+
1110+
// 3. 提取中间并按 Like 降序筛选
1111+
middle := make(Floors, len(floors)-earliestFloors-newestFloors)
1112+
copy(middle, floors[earliestFloors:len(floors)-newestFloors]) // copy 防止影响原切片顺序
1113+
1114+
rand.Shuffle(len(middle), func(i, j int) {
1115+
middle[i], middle[j] = middle[j], middle[i]
1116+
})
1117+
1118+
slices.SortFunc(middle, func(a, b *Floor) int {
1119+
return b.Like - a.Like
1120+
})
1121+
1122+
// 4.即使中间不足20条也能安全截取 (len(floors)>50 保证了 middle 长度至少为 21)
1123+
topLikes := middle[:config.Config.MaxSummaryFloors-earliestFloors-newestFloors]
1124+
1125+
// 5. 合并
1126+
newFloors := make(Floors, 0, config.Config.MaxSummaryFloors)
1127+
newFloors = append(newFloors, earliest...)
1128+
newFloors = append(newFloors, topLikes...)
1129+
newFloors = append(newFloors, newest...)
1130+
1131+
floors = newFloors
1132+
1133+
// 6. 按 ID 重新排序以恢复对话流上下文
1134+
slices.SortFunc(floors, func(a, b *Floor) int {
1135+
return a.Ranking - b.Ranking
1136+
})
1137+
}
1138+
10901139
content := ""
10911140
if hole.HoleFloor.FirstFloor != nil {
10921141
content = hole.HoleFloor.FirstFloor.Content
@@ -1105,7 +1154,6 @@ func GenerateSummary(c *fiber.Ctx) error {
11051154
FloorID: floor.FloorID,
11061155
}
11071156
}
1108-
11091157
requestBody := map[string]any{
11101158
"floors": summaryFloors,
11111159
"content": content,

config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ var Config struct {
6464
SummaryReplyBoundary3 int `env:"SUMMARY_REPLY_BOUNDARY_1" envDefault:"1000"`
6565
SummaryLogLimit int `env:"SUMMARY_LOG_LIMIT" envDefault:"1000"`
6666
WhiteListUserIds []int `env:"WHITE_LIST_USER_IDS"`
67+
MaxSummaryFloors int `env:"MAX_FLOORS_PER_HOLE" envDefault:"50"`
6768
}
6869

6970
var DynamicConfig struct {

0 commit comments

Comments
 (0)