外观
世界喇叭与公告 · 技术实现
「玩家设定 →」
1. 代码位置
| 层 | 类 | 职责 |
|---|---|---|
| Controller | controller/NoticeController(/api/notice) | 公告列表/喇叭发送/跑马灯/已读 |
| Service | service/WorldHornService | 喇叭发送:物品扣减、冷却、内容去重、限流 |
| Service | service/NoticeService、service/NoticeCacheService、service/EventNoticeService | 公告/缓存/事件通知 |
| Service | service/SensitiveWordService | 敏感词过滤(sensitive_word 表 + 重复字符上限 10) |
| domain | domain/ServerMessage、domain/NoticeMessageType、domain/NoticeEventSubtype、domain/NoticeMessageStatus | 公告消息模型 |
2. 数据表
| 表 | 关键列 | 说明 |
|---|---|---|
server_message | message_id、type、subtype、content、expire_at | 公告/跑马灯(V76) |
world_horn_flow | player_id、message、create_time | 喇叭发送流水(V76) |
player_world_horn_state | player_id、sent_today、last_sent_at | 喇叭每日状态(V76) |
sensitive_word | word、enabled | 敏感词库(V76) |
player_notice_read_state | player_id、message_id、read_at | 公告已读状态(V76) |
3. 配置与常量
- 福利点券兑换(
ShopBalanceRules):WORLD_HORN_PRICE=100(100 福利点券/个)、DAILY_WORLD_HORN_LIMIT=10(每日限购 10 个)、物品WORLD_HORN_ITEM_ID=9501、WORLD_HORN_LIMIT_ID=9501限额池 - yml 键(
emberfall.notice.*):world-horn:item-id: 9501、cost: 1、cooldown-seconds: 300、global-cooldown-seconds: 3、daily-limit: 30、min-level: 10、min-length: 2、max-length: 40、dup-content-ttl-seconds: 300、send-rate-limit-per-second: 1list:default-limit: 30、max-limit: 50、history-days: 14marquee:horn-display-seconds: 15sensitive:enabled: true、max-repeated-chars: 10
4. 数据流简述
POST /api/notice/horn/send 校验等级 ≥10、消耗 1 个世界喇叭(9501,由福利点券 100 兑换)、内容长度 2~40 且过敏感词与重复检测,冷却 300 秒、全服 3 秒节流、每日上限(物品口径 30 / 兑换口径 10)。发送写 world_horn_flow 并进 server_message 跑马灯(15 秒展示)。公告列表按 list.* 配置分页返回,已读写 player_notice_read_state。
5. 已知差异
无
6. 相关代码
- 商城(
ShopController /world-horn/exchange:福利点券兑换喇叭) - 每日限额(
DailyLimitPool:9501 限额池) - 管理端公告(
admin/controller/AdminNoticeController)