small fix

This commit is contained in:
2026-03-06 10:02:40 +03:00
parent bca84ad269
commit 3b673d5e2b
5 changed files with 69 additions and 51 deletions

View File

@@ -4,9 +4,11 @@ import (
"database/sql"
"errors"
"fmt"
"io"
"log"
"strconv"
"strings"
"sync"
"time"
"ymgb/database"
"ymgb/database/mdb"
@@ -479,7 +481,6 @@ func newChat(ctx *laniakea.MsgContext, db *database.Context) {
return
}
log.Println(ctx.Args)
chatPrompt := ""
settingId, err := strconv.Atoi(ctx.Args[0])
if err != nil {
@@ -664,15 +665,50 @@ func generate(ctx *laniakea.MsgContext, db *database.Context) {
}
answerContent := ""
type DraftQueue struct {
message string
mu sync.Mutex
}
draft := ctx.NewDraft()
for r, err := range res {
if m != nil {
m.Delete()
m = nil
}
var mu sync.Mutex
buffer := strings.Builder{} // накапливаем фрагменты
ticker := time.NewTicker(time.Second)
done := make(chan struct{}) // сигнал завершения горутины
// Горутина для периодической отправки
go func() {
flush := func() {
mu.Lock()
msg := buffer.String()
buffer.Reset()
mu.Unlock()
if msg != "" {
if err := draft.Push(msg); err != nil {
log.Println(err)
}
}
}
for {
select {
case <-ticker.C:
// Каждую секунду отправляем накопленное
flush()
ctx.SendAction(tgapi.ChatActionTyping)
case <-done:
// Завершаем работу: отправляем остаток и выходим
flush()
ticker.Stop()
return
}
}
}()
for r, err := range res {
if err != nil {
if errors.Is(err, io.EOF) {
break
}
ctx.Error(err)
close(done)
return
}
@@ -683,14 +719,30 @@ func generate(ctx *laniakea.MsgContext, db *database.Context) {
if content == "" {
continue
}
answerContent += content
err = draft.Push(content)
if err != nil {
ctx.Error(err)
//draft.Flush()
break
if m != nil {
m.Delete()
m = nil
}
time.Sleep(time.Millisecond * 250)
answerContent += content
mu.Lock()
buffer.WriteString(content)
mu.Unlock()
// Если нужна искусственная задержка, оставьте:
// time.Sleep(time.Millisecond * 50)
}
// Завершаем горутину и отправляем последнюю порцию
close(done)
if answerContent == "" {
if m != nil {
m.Delete()
m = nil
}
ctx.Answer("Не удалось сгенерировать ответ. Попробуйте снова")
return
}
counter := redisRpRep.GetCounter(ctx.FromID, waifuId)