some fixes and changes; #4

This commit is contained in:
2026-02-02 21:28:00 +03:00
parent d95fc70664
commit d6590680e2
5 changed files with 117 additions and 39 deletions

View File

@@ -9,6 +9,7 @@ import (
"kurumibot/database/red"
"kurumibot/utils"
"kurumibot/utils/ai"
"slices"
"strconv"
"strings"
@@ -330,13 +331,17 @@ func chatStat(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
fmt.Sprintf("*Кол-во токенов*: %d", tokens),
}
psqlRpRep := psql.NewRPRepository(db)
scenarioId := redisRpRep.GetChatScenarioID(ctx.FromID, waifuId)
if scenarioId > 0 {
scenario, err := psqlRpRep.GetScenario(scenarioId)
if err != nil {
ctx.Error(err)
scenarioIds := redisRpRep.GetChatScenariosIDs(ctx.FromID, waifuId)
if len(scenarioIds) > 0 && scenarioIds[0] > 0 {
scenarioNames := make([]string, len(scenarioIds))
for i, id := range scenarioIds {
scenario, err := psqlRpRep.GetScenario(id)
if err != nil {
ctx.Error(err)
}
scenarioNames[i] = fmt.Sprintf("%s (ID: %d)", scenario.Name, scenario.ID)
}
out = append(out, fmt.Sprintf("*Выбранный сценарий*: %s (ID: %d)", scenario.Name, scenario.ID))
out = append(out, fmt.Sprintf("*Выбранные сценарии*: %s", strings.Join(scenarioNames, ", ")))
}
settingId := redisRpRep.GetChatSettingID(ctx.FromID, waifuId)
@@ -391,15 +396,40 @@ func newChatStage2(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
return
}
selectedScenariosIds := make([]int, 0)
if len(ctx.Args) > 1 {
selectedScenariosIds = utils.Map(utils.StringToInt, ctx.Args[1:])
}
out := []string{
"Выбери сценарий:",
}
kb := laniakea.NewInlineKeyboard(2)
scenariosIds := make([]int, 0)
for _, scenario := range scenarios {
out = append(out, fmt.Sprintf("*%s* - %s", scenario.Name, scenario.Description))
kb.AddCallbackButton(scenario.Name, "rp.new_chat", settingId, scenario.ID)
isSelected := slices.Index(selectedScenariosIds, scenario.ID) >= 0
prefix := ""
if isSelected {
prefix = "✅"
}
out = append(out, fmt.Sprintf("%s*%s* - %s", prefix, scenario.Name, scenario.Description))
if isSelected {
scenariosIds = utils.PopSlice(
selectedScenariosIds,
slices.Index(selectedScenariosIds, scenario.ID),
)
} else {
scenariosIds = append(selectedScenariosIds, scenario.ID)
}
kb.AddCallbackButton(
fmt.Sprintf("%s%s", prefix, scenario.Name),
"rp.new_chat_s2", utils.AppendToInt(settingId, scenariosIds)...,
)
}
kb.AddCallbackButton("Без сценария", "rp.new_chat", 0)
if len(scenariosIds) == 0 {
scenariosIds = append(scenariosIds, 0)
}
kb.AddCallbackButton("Продолжить", "rp.new_chat", utils.AppendToInt(settingId, selectedScenariosIds)...)
kb.AddLine()
kb.AddCallbackButton("Назад", "rp.new_chat_s1")
ctx.EditCallback(strings.Join(out, "\n"), kb)
@@ -438,24 +468,27 @@ func newChat(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
chatPrompt = "Вот краткое описание мира(сеттинг): " + scenario.Prompt + "."
}
scenarioId, err := strconv.Atoi(ctx.Args[1])
if err != nil {
ctx.Error(err)
return
}
if scenarioId > 0 {
scenariosIds := utils.Map(utils.StringToInt, ctx.Args[1:])
if len(scenariosIds) > 0 && scenariosIds[0] > 0 {
rep := psql.NewRPRepository(db)
scenario, err := rep.GetScenario(scenarioId)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
ctx.Answerf("Сценарий №%d не найден", scenarioId)
} else {
ctx.Error(err)
var scenariosPrompt []string
for _, scenarioId := range scenariosIds {
scenario, err := rep.GetScenario(scenarioId)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
ctx.Answerf("Сценарий №%d не найден", scenarioId)
} else {
ctx.Error(err)
}
return
}
return
scenariosPrompt = append(scenariosPrompt, scenario.Prompt)
}
chatPrompt += "Вот дополнительная информация: " + scenario.Prompt + "."
chatPrompt += "Вот дополнительная информация - " + strings.Join(scenariosPrompt, ".")
}
if chatPrompt != "" {
err = redisRpRep.SetChatPrompt(ctx.FromID, waifuId, chatPrompt)
if err != nil {
@@ -468,7 +501,7 @@ func newChat(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
if err != nil {
ctx.Error(err)
}
err = redisRpRep.SetChatScenarioID(ctx.FromID, waifuId, scenarioId)
err = redisRpRep.SetChatScenariosIDs(ctx.FromID, waifuId, strings.Join(utils.Map(utils.AnyToString, scenariosIds), ","))
if err != nil {
ctx.Error(err)
}
@@ -637,20 +670,20 @@ func generate(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
m.Delete()
kb = laniakea.NewInlineKeyboard(1)
kb.AddCallbackButton("Перегенерировать", "rp.regenerate", counter+2)
kb.AddCallbackButton("🔄Перегенерировать", "rp.regenerate", counter+2)
ctx.Keyboard(laniakea.EscapeMarkdown(answerContent), kb)
// Auto compress
compressMethod := rpUser.CompressMethod
if compressMethod == "messages" {
if counter+2 >= rpUser.CompressLimit {
m = ctx.EditCallback("Запущено сжатие чата…", nil)
m = ctx.Answer("Запущено сжатие чата…")
_compress(ctx, db)
m.Delete()
}
} else if compressMethod == "tokens" {
if tokens >= rpUser.CompressLimit*1000 {
m = ctx.EditCallback("Запущено сжатие чата…", nil)
m = ctx.Answer("Запущено сжатие чата…")
_compress(ctx, db)
m.Delete()
}