@@ -16,6 +16,7 @@ import (
1616 "mumu-bot/internal/tools"
1717 "mumu-bot/internal/utils"
1818 "os"
19+ "strconv"
1920 "strings"
2021 "sync"
2122 "time"
@@ -184,12 +185,71 @@ func (a *Agent) Start() {
184185 if a .learner != nil {
185186 a .learner .Start ()
186187 }
188+
189+ // 启动时从数据库加载历史消息到缓冲区
190+ a .loadBuffersFromDB ()
191+
187192 a .bot .OnMessage (a .onMessage )
188193 a .wg .Add (1 )
189194 go a .thinkLoop ()
190195 zap .L ().Info ("Agent 已启动" )
191196}
192197
198+ // loadBuffersFromDB 从数据库加载消息日志到缓冲区
199+ func (a * Agent ) loadBuffersFromDB () {
200+ cfg := config .Get ()
201+ for _ , gc := range cfg .Groups {
202+ if ! gc .Enabled {
203+ continue
204+ }
205+
206+ // 获取缓冲区大小
207+ bufSize := cfg .Agent .MessageBufferSize
208+ if bufSize <= 0 {
209+ bufSize = 15
210+ }
211+
212+ // 从数据库获取最近的消息
213+ logs := a .memory .GetRecentMessages (gc .GroupID , bufSize , 0 )
214+ if len (logs ) == 0 {
215+ continue
216+ }
217+
218+ // 初始化缓冲区
219+ a .buffersMu .Lock ()
220+ buf := utils.NewRingBuffer [* onebot.GroupMessage ](bufSize )
221+ a .buffers [gc .GroupID ] = buf
222+
223+ // 填充缓冲区
224+ for _ , log := range logs {
225+ msgID , _ := strconv .ParseInt (log .MessageID , 10 , 64 )
226+
227+ // 还原合并转发内容
228+ var forwards []onebot.ForwardMessage
229+ if log .Forwards != "" {
230+ _ = sonic .UnmarshalString (log .Forwards , & forwards )
231+ }
232+
233+ msg := & onebot.GroupMessage {
234+ MessageID : msgID ,
235+ GroupID : log .GroupID ,
236+ UserID : log .UserID ,
237+ Nickname : log .Nickname ,
238+ Content : log .Content , // 这里使用解析后的内容作为 Content
239+ FinalContent : log .Content , // FinalContent 也是解析后的内容
240+ IsMentioned : log .IsMentioned ,
241+ Time : log .CreatedAt ,
242+ MessageType : log .MsgType ,
243+ Forwards : forwards ,
244+ }
245+ buf .Push (msg )
246+ }
247+ a .buffersMu .Unlock ()
248+
249+ zap .L ().Info ("已从数据库加载消息历史" , zap .Int64 ("group_id" , gc .GroupID ), zap .Int ("count" , len (logs )))
250+ }
251+ }
252+
193253// Stop 停止
194254func (a * Agent ) Stop () {
195255 if a .learner != nil {
0 commit comments