Skip to content

Commit dd365d0

Browse files
committed
feat: add fake random
1 parent 213eb0e commit dd365d0

File tree

5 files changed

+69
-13
lines changed

5 files changed

+69
-13
lines changed

README.md

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,27 @@
2020
- 🔒 **管理员保护**:可配置管理员消息保护
2121
- 📏 **媒体限制**:支持配置媒体文件大小限制
2222
- 👥 **转发消息用户选择**:支持从转发消息中选择相关用户进行绑定
23+
- ⚖️ **加权随机抽取**:根据消息被抽取次数动态调整抽取概率,被抽取次数越多,概率越低。使用公式:
24+
```
25+
权重 = 1 / (1 + drawCount * α)
26+
概率 = 权重 / 总权重
27+
```
28+
其中,`drawCount` 为消息被抽取次数,`α` 为调整因子(可配置,默认0.2)
2329

2430
## 📋 命令列表
2531

26-
| 命令 | 说明 | 权限要求 |
27-
|----------------------|-------------------------|-----------------|
28-
| `cave` | 随机获取一条回声洞消息 | 所有人 |
29-
| `cave <id>` | 获取特定 ID 的回声洞消息 | 所有人 |
30-
| `cave.echo [...userIds]` | 将引用的消息存入回声洞 | 所有人 |
31-
| `cave.drop <id>` | 删除特定 ID 的回声洞消息 | 消息存储者、原始发送者或管理员 |
32-
| `cave.listen` | 获取自己投稿的回声洞列表 | 所有人 |
33-
| `cave.trace` | 获取自己发言被投稿的回声洞列表 | 所有人 |
34-
| `cave.purge <...ids>` | 批量删除多个 ID 的回声洞消息 | 消息存储者、原始发送者或管理员 |
35-
| `cave.search <id>` | 搜索特定 ID 的回声洞消息 | 所有人 |
32+
| 命令 | 说明 | 权限要求 |
33+
|-------------------------------|------------------|-----------------|
34+
| `cave` | 随机获取一条回声洞消息 | 所有人 |
35+
| `cave <id>` | 获取特定 ID 的回声洞消息 | 所有人 |
36+
| `cave.echo [...userIds]` | 将引用的消息存入回声洞 | 所有人 |
37+
| `cave.drop <id>` | 删除特定 ID 的回声洞消息 | 消息存储者、原始发送者或管理员 |
38+
| `cave.listen` | 获取自己投稿的回声洞列表 | 所有人 |
39+
| `cave.trace` | 获取自己发言被投稿的回声洞列表 | 所有人 |
40+
| `cave.purge <...ids>` | 批量删除多个 ID 的回声洞消息 | 消息存储者、原始发送者或管理员 |
41+
| `cave.search <id>` | 搜索特定 ID 的回声洞消息 | 所有人 |
3642
| `cave.bind <id> <...userIds>` | 将用户绑定到特定 ID 的回声洞 | 所有人 |
37-
| `cave.rank [period]` | 查看回声洞排行榜,支持多种时间段 | 所有人 |
43+
| `cave.rank [period]` | 查看回声洞排行榜,支持多种时间段 | 所有人 |
3844

3945
## 🚀 使用指南
4046

@@ -64,6 +70,7 @@ npm install koishi-plugin-echo-cave
6470
| `rankingTopCount` | number | `10` | 排行榜显示的用户数量 |
6571
| `forwardSelectTimeout` | number | `20` | 转发消息用户选择超时时间(秒) |
6672
| `enableForwardUserSelection` | boolean | `true` | 启用转发消息用户选择功能 |
73+
| `alpha` | number | `0.2` | 加权随机抽取的调整因子,控制抽取次数对概率的影响程度,值越大影响越明显 |
6774

6875
## 📝 注意事项
6976

src/config/config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export interface Config {
1616
rankingTopCount?: number;
1717
forwardSelectTimeout?: number;
1818
enableForwardUserSelection?: boolean;
19+
alpha?: number;
1920
}
2021

2122
export const Config: Schema<Config> = Schema.object({
@@ -33,6 +34,7 @@ export const Config: Schema<Config> = Schema.object({
3334
rankingTopCount: Schema.number().default(10),
3435
forwardSelectTimeout: Schema.number().default(20),
3536
enableForwardUserSelection: Schema.boolean().default(true),
37+
alpha: Schema.number().default(0.2).min(0).max(2),
3638
}).i18n({
3739
'zh-CN': zhCN,
3840
});

src/config/locales/zh-CN.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
"sendAllAsForwardMsg": "是否将所有消息以转发消息形式发送,开启后普通消息也会转换为转发消息格式",
1313
"rankingTopCount": "排行榜显示的用户数量",
1414
"forwardSelectTimeout": "合并转发消息选择关联用户的超时时间 (秒)",
15-
"enableForwardUserSelection": "是否启用合并转发消息的关联用户选择功能"
15+
"enableForwardUserSelection": "是否启用合并转发消息的关联用户选择功能",
16+
"alpha": "加权随机抽取的调整因子,控制抽取次数对概率的影响程度,值越大影响越明显"
1617
}

src/core/command/get-cave.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,38 @@ export async function getCave(ctx: Context, session: Session, cfg: Config, id: n
6969
return session.text('.noMsgInCave');
7070
}
7171

72-
caveMsg = caves[Math.floor(Math.random() * caves.length)];
72+
// Use weighted random selection based on drawCount
73+
const alpha = cfg.alpha || 0.2;
74+
75+
// Calculate weights for each cave
76+
const weights = caves.map((cave) => 1 / (1 + cave.drawCount * alpha));
77+
78+
// Calculate total weight
79+
const totalWeight = weights.reduce((sum, weight) => sum + weight, 0);
80+
81+
// Generate a random number between 0 and totalWeight
82+
let random = Math.random() * totalWeight;
83+
84+
// Select cave based on weights
85+
let selectedIndex = 0;
86+
while (random > weights[selectedIndex]) {
87+
random -= weights[selectedIndex];
88+
selectedIndex++;
89+
}
90+
91+
caveMsg = caves[selectedIndex];
92+
93+
// Update drawCount for the selected cave
94+
await ctx.database.set(
95+
'echo_cave_v2',
96+
{
97+
id: caveMsg.id,
98+
channelId,
99+
},
100+
{
101+
drawCount: caveMsg.drawCount + 1,
102+
}
103+
);
73104
} else {
74105
const caves = await ctx.database.get('echo_cave_v2', {
75106
id,
@@ -81,6 +112,18 @@ export async function getCave(ctx: Context, session: Session, cfg: Config, id: n
81112
}
82113

83114
caveMsg = caves[0];
115+
116+
// Update drawCount for the specified cave
117+
await ctx.database.set(
118+
'echo_cave_v2',
119+
{
120+
id,
121+
channelId,
122+
},
123+
{
124+
drawCount: caveMsg.drawCount + 1,
125+
}
126+
);
84127
}
85128

86129
await sendCaveMsg(ctx, session, caveMsg, cfg);

src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface EchoCave {
2323
type: 'forward' | 'msg';
2424
content: string;
2525
relatedUsers: string[];
26+
drawCount: number;
2627
}
2728

2829
declare module 'koishi' {
@@ -46,6 +47,7 @@ export function apply(ctx: Context, cfg: Config) {
4647
type: 'string',
4748
content: 'text',
4849
relatedUsers: 'list',
50+
drawCount: { type: 'unsigned', default: 0 },
4951
},
5052
{
5153
primary: 'id',
@@ -64,6 +66,7 @@ export function apply(ctx: Context, cfg: Config) {
6466
type: 'string',
6567
content: 'text',
6668
relatedUsers: 'list',
69+
drawCount: { type: 'unsigned', default: 0 },
6770
},
6871
{
6972
primary: 'id',

0 commit comments

Comments
 (0)