From c3b7192516831d50937d8ecbbd2c235221aac7ff Mon Sep 17 00:00:00 2001 From: ScuroNeko Date: Thu, 29 Jan 2026 22:58:41 +0300 Subject: [PATCH] compress wip --- database/psql/rp.go | 23 ++++++-- go.mod | 2 +- go.sum | 4 +- plugins/rp.go | 104 ++++++++++++++++++++++++++++++++++++- scripts/postgres/06-rp.sql | 4 +- 5 files changed, 129 insertions(+), 8 deletions(-) diff --git a/database/psql/rp.go b/database/psql/rp.go index 0e4057e..40c5fbc 100644 --- a/database/psql/rp.go +++ b/database/psql/rp.go @@ -34,13 +34,17 @@ type RPSetting struct { Prompt string } type RPUser struct { - UserID int64 `db:"user_id"` - UserPrompt string `db:"user_prompt"` + UserID int64 `db:"user_id"` + UserPrompt string `db:"user_prompt"` + UsedTokens int64 `db:"used_tokens"` + SelectedPreset string `db:"selected_preset"` Preset *RPPreset SelectedModel string `db:"selected_model"` Model *RPModel - UsedTokens int64 `db:"used_tokens"` + + CompressMethod string `db:"compress_method"` + CompressLimit int `db:"compress_limit"` } type RPRepository struct { @@ -150,3 +154,16 @@ func (rep *RPRepository) GetSetting(id int) (*RPSetting, error) { err := rep.db.Get(setting, "SELECT * FROM rp_settings WHERE id=$1;", id) return setting, err } + +func (rep *RPRepository) UpdateUserCompressSettings(user *RPUser) (*RPUser, error) { + query, args, err := sqlx.In( + "UPDATE rp_users SET compress_method=?, compress_limit=? WHERE user_id=?;", + user.CompressMethod, user.CompressLimit, user.UserID, + ) + if err != nil { + return user, err + } + query = rep.db.Rebind(query) + _, err = rep.db.Exec(query, args...) + return user, err +} diff --git a/go.mod b/go.mod index 5636890..0f2eb26 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( git.nix13.pw/scuroneko/slog v1.0.2 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/lib/pq v1.11.0 + github.com/lib/pq v1.11.1 github.com/redis/go-redis/v9 v9.17.3 github.com/shopspring/decimal v1.4.0 github.com/vinovest/sqlx v1.7.1 diff --git a/go.sum b/go.sum index 4e97446..3a3a0d0 100644 --- a/go.sum +++ b/go.sum @@ -26,8 +26,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw= github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= -github.com/lib/pq v1.11.0 h1:aJpnw24caDH5XfSwI/tSUnN8RJRNqbNyArYazaGulzw= -github.com/lib/pq v1.11.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= +github.com/lib/pq v1.11.1 h1:wuChtj2hfsGmmx3nf1m7xC2XpK6OtelS2shMY+bGMtI= +github.com/lib/pq v1.11.1/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= diff --git a/plugins/rp.go b/plugins/rp.go index 74ca28b..eead133 100644 --- a/plugins/rp.go +++ b/plugins/rp.go @@ -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) +} diff --git a/scripts/postgres/06-rp.sql b/scripts/postgres/06-rp.sql index 3c04b38..bd38b14 100644 --- a/scripts/postgres/06-rp.sql +++ b/scripts/postgres/06-rp.sql @@ -39,7 +39,9 @@ CREATE TABLE rp_users( user_prompt text NOT NULL DEFAULT '', selected_preset text REFERENCES rp_presets(id) DEFAULT 'soft', selected_model text REFERENCES rp_models(id) DEFAULT 'deepseek3.1', - used_tokens int8 NOT NULL DEFAULT 0 + used_tokens int8 NOT NULL DEFAULT 0, + compress_method text NOT NULL DEFAULT 'messages', + compress_limit integer NOT NULL DEFAULT 100 ); CREATE UNIQUE INDEX rp_users_uindex ON rp_users(user_id);