refactor: cleanup redundant code
This commit is contained in:
parent
9e7432a1a1
commit
89286b7e73
|
@ -12,7 +12,7 @@ import (
|
|||
tele "gopkg.in/telebot.v3"
|
||||
)
|
||||
|
||||
var assistantWritingSign = "\n...📝"
|
||||
var assistantWritingSign = "\n... 📝"
|
||||
|
||||
func matchAssistantConversation(botUsr *tele.User, msg *tele.Message) []*tele.Message {
|
||||
// A thread must meet the following conditions to be considered a conversation with the assistant (for now):
|
||||
|
@ -227,11 +227,7 @@ func handleAssistantConversation(c tele.Context, thread []*tele.Message) error {
|
|||
MaxTokens: 2048,
|
||||
}
|
||||
|
||||
typingNotifyCh := make(chan struct{})
|
||||
go func() {
|
||||
defer close(typingNotifyCh)
|
||||
_ = c.Bot().Notify(lastMsg.Chat, tele.Typing)
|
||||
}()
|
||||
typingNotifyCh := setTyping(c)
|
||||
|
||||
var replyMsg *tele.Message
|
||||
reqErr := assistantStreamedResponse(req, func(text string, finished bool) error {
|
||||
|
|
9
bot.go
9
bot.go
|
@ -117,3 +117,12 @@ func stickerFromID(id string) *tele.Sticker {
|
|||
},
|
||||
}
|
||||
}
|
||||
|
||||
func setTyping(c tele.Context) chan error {
|
||||
resultCh := make(chan error, 1)
|
||||
go func() {
|
||||
defer close(resultCh)
|
||||
resultCh <- c.Bot().Notify(c.Chat(), tele.Typing)
|
||||
}()
|
||||
return resultCh
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ package main
|
|||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/samber/lo"
|
||||
tele "gopkg.in/telebot.v3"
|
||||
|
@ -72,13 +71,6 @@ func handleTranslateBtn(c tele.Context) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// pretend to be typing
|
||||
if err := c.Bot().Notify(msg.Chat, tele.Typing); err != nil {
|
||||
logger.Warnf("failed to send typing action: %v", err)
|
||||
}
|
||||
|
||||
ai := openai.NewClient(config.OpenAIApiKey)
|
||||
|
||||
req := openai.ChatRequest{
|
||||
Model: openai.ModelGpt0305Turbo,
|
||||
Messages: []openai.ChatMessage{
|
||||
|
@ -93,67 +85,27 @@ func handleTranslateBtn(c tele.Context) error {
|
|||
},
|
||||
Temperature: lo.ToPtr(0.2),
|
||||
}
|
||||
logger.Debugf("Openai chat request: %#+v", req)
|
||||
|
||||
resp, err := ai.ChatCompletionStream(req)
|
||||
actionCh := setTyping(c)
|
||||
err := assistantStreamedResponse(req, func(text string, finished bool) error {
|
||||
var err error
|
||||
<-actionCh
|
||||
if finished {
|
||||
retryBtn := translateBtnRetry
|
||||
retryBtn.Data = targetLang
|
||||
respMenu := &tele.ReplyMarkup{}
|
||||
respMenu.Inline(respMenu.Row(retryBtn))
|
||||
|
||||
msg, err = c.Bot().Edit(msg, text, respMenu)
|
||||
} else {
|
||||
msg, err = c.Bot().Edit(msg, text)
|
||||
}
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
logger.Errorf("failed to translate: req: %#+v, err: %v", req, err)
|
||||
_, _ = c.Bot().Reply(origMsg, stickerFromID(stickerPanic), tele.Silent)
|
||||
return err
|
||||
}
|
||||
|
||||
respBuilder := strings.Builder{}
|
||||
minWait := time.After(1 * time.Second)
|
||||
for {
|
||||
var (
|
||||
nNewChunk int
|
||||
finished bool
|
||||
minWaitSatisfied bool
|
||||
)
|
||||
Drain:
|
||||
for {
|
||||
select {
|
||||
case chunk, ok := <-resp.Stream:
|
||||
if !ok {
|
||||
finished = true
|
||||
break Drain
|
||||
}
|
||||
nNewChunk += 1
|
||||
respBuilder.WriteString(chunk)
|
||||
default:
|
||||
if minWaitSatisfied {
|
||||
break Drain
|
||||
}
|
||||
<-minWait
|
||||
minWaitSatisfied = true
|
||||
}
|
||||
}
|
||||
|
||||
if nNewChunk == 0 {
|
||||
if chunk, ok := <-resp.Stream; !ok {
|
||||
finished = true
|
||||
} else {
|
||||
respBuilder.WriteString(chunk)
|
||||
}
|
||||
}
|
||||
if finished {
|
||||
break
|
||||
}
|
||||
|
||||
respoText := respBuilder.String() + assistantWritingSign
|
||||
minWait = time.After(691 * time.Millisecond) // renew the timer
|
||||
if msg, err = c.Bot().Edit(msg, respoText, tele.Silent); err != nil {
|
||||
logger.Warnf("failed to edit the temporary message: %v", err)
|
||||
break
|
||||
}
|
||||
logger.Debugf("... message edited")
|
||||
}
|
||||
|
||||
respText := respBuilder.String()
|
||||
retryBtn := translateBtnRetry
|
||||
retryBtn.Data = targetLang
|
||||
respMenu := &tele.ReplyMarkup{}
|
||||
respMenu.Inline(respMenu.Row(retryBtn))
|
||||
_, err = c.Bot().Edit(msg, respText, tele.Silent, respMenu)
|
||||
return err
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue