compress wip

This commit is contained in:
2026-01-29 22:58:41 +03:00
parent 9be2ad1fd9
commit c3b7192516
5 changed files with 129 additions and 8 deletions

View File

@@ -36,6 +36,10 @@ func RegisterRP(bot *laniakea.Bot) {
rp.Command(generate, "g", "gen", "г")
rp.Payload(compress, "rp.compress_chat")
rp.Payload(compressSettingStage1, "rp.compress_setting_s1")
rp.Payload(compressSettingStage2, "rp.compress_setting_s2")
rp.Payload(compressSetting, "rp.compress_setting")
bot.AddPlugins(rp.Build())
}
@@ -85,11 +89,17 @@ func rpInfo(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
ctx.Error(err)
}
}
compressText := "сообщений"
if rpUser.CompressMethod == "tokens" {
compressText = "токенов"
}
out := []string{
fmt.Sprintf("Привет, %s!", ctx.From.FirstName),
fmt.Sprintf("*Выбранная вайфу*: %s", waifu.Name),
fmt.Sprintf("*Выбранный пресет*: %s", laniakea.EscapeMarkdown(rpUser.Preset.Name)),
fmt.Sprintf("*Выбранная модель*: %s", rpUser.Model.Name),
fmt.Sprintf("*Использовано токенов*: %d", rpUser.UsedTokens),
fmt.Sprintf("*Настройки сжатия*: %d %s", rpUser.CompressLimit, compressText),
fmt.Sprintf("*Твоё описание персонажа*: %s", rpUser.UserPrompt),
}
@@ -100,6 +110,7 @@ func rpInfo(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
kb.AddCallbackButton("Сменить модель", "rp.model_list")
kb.AddCallbackButton("Список сценариев", "rp.scenario_list")
kb.AddCallbackButton("Список сеттингов", "rp.setting_list")
kb.AddCallbackButton("Настройки сжатия", "rp.compress_setting_s1")
kb.AddCallbackButton("Новый чат", "rp.new_chat_s1")
kb.AddLine()
kb.AddCallbackButton("Закрыть", "general.close")
@@ -567,19 +578,37 @@ func generate(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
}
rpUser.UsedTokens = rpUser.UsedTokens + int64(len(userMessage)) + int64(len(answerContent))
err = rpRep.UpdateUser(rpUser)
if err != nil {
ctx.Error(err)
}
tokens := redisRpRep.GetChatTokens(ctx.FromID, waifuId)
tokens += len(userMessage) + len(answerContent)
err = redisRpRep.SetChatTokens(ctx.FromID, waifuId, tokens)
if err != nil {
ctx.Error(err)
}
err = rpRep.UpdateUser(rpUser)
counter := redisRpRep.GetCounter(ctx.FromID, waifuId)
err = redisRpRep.SetCounter(ctx.FromID, waifuId, counter+2)
if err != nil {
ctx.Error(err)
}
m.Delete()
ctx.Answer(laniakea.EscapeMarkdown(answerContent))
// Auto compress
compressMethod := rpUser.CompressMethod
if compressMethod == "messages" {
if counter+2 >= rpUser.CompressLimit {
compress(ctx, db)
}
} else if compressMethod == "token" {
if tokens >= rpUser.CompressLimit*1000 {
compress(ctx, db)
}
}
}
func compress(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
@@ -650,3 +679,76 @@ func compress(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
kb = kb.AddCallbackButton("На главную", "rp.info")
ctx.EditCallback("Сжатие завершено", kb)
}
var messagesMethodCount = []int{
20, 50, 100, 200, 500,
}
var tokenMethodCount = []int{
16, 32, 64, 128, 256,
}
func compressSettingStage1(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
kb := laniakea.NewInlineKeyboard(2)
kb.AddCallbackButton("По сообщениям", "rp.compress_setting_s2", "messages")
kb.AddCallbackButton("По токенам", "rp.compress_setting_s2", "tokens")
kb.AddLine().AddCallbackButton("На главную", "rp.info")
out := []string{
"Выбери метод для определения сжатия",
"*По сообщениям* — чат будет сжиматься после достижения определенного кол-ва сообщений в нём",
"*По токенам* — чат будет сжиматься после достижения определенного кол-ва токенов в нём",
}
ctx.EditCallback(strings.Join(out, "\n"), kb)
}
func compressSettingStage2(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
if len(ctx.Args) == 0 {
return
}
method := ctx.Args[0]
out := []string{
"При выборе маленьких значений, чат будет сжиматься чаще, что замедляет вывод сообщений.",
"При выборе слишком больших значений, некоторые детали могут теряться.",
}
kb := laniakea.NewInlineKeyboard(3)
if method == "messages" {
out = append(out, "Выбери количество сообщений, после которых будет происходить сжатие чата")
for _, i := range messagesMethodCount {
kb.AddCallbackButton(strconv.Itoa(i), "rp.compress_setting", method, i)
}
} else if method == "tokens" {
out = append(out, "Выбери количество токенов, после которых будет происходить сжатие чата")
for _, i := range tokenMethodCount {
kb.AddCallbackButton(strconv.Itoa(i), "rp.compress_setting", method, i)
}
}
kb.AddLine().AddCallbackButton("Назад", "rp.compress_setting_s1", method)
kb.AddCallbackButton("На главную", "rp.info")
ctx.EditCallback(strings.Join(out, "\n"), kb)
}
func compressSetting(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
rep := psql.NewRPRepository(db)
user, err := rep.GetUser(int64(ctx.FromID))
if err != nil {
ctx.Error(err)
return
}
if len(ctx.Args) != 2 {
return
}
method := ctx.Args[0]
count, err := strconv.Atoi(ctx.Args[1])
if err != nil {
return
}
user.CompressMethod = method
user.CompressLimit = count
_, err = rep.UpdateUserCompressSettings(user)
if err != nil {
ctx.Error(err)
}
kb := laniakea.NewInlineKeyboard(1).AddCallbackButton("На главную", "rp.info")
ctx.EditCallback("Настройки сжатия были обновлены", kb)
}