small fix
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user