diff --git a/laniakea b/laniakea index ce13b19..7a3e40a 160000 --- a/laniakea +++ b/laniakea @@ -1 +1 @@ -Subproject commit ce13b1967658012da013965d60f44f0cd4a6ccf5 +Subproject commit 7a3e40a74dc6c1e233ae96760fb5005114409969 diff --git a/plugins/rp.go b/plugins/rp.go index 7ab65d6..b64aa47 100644 --- a/plugins/rp.go +++ b/plugins/rp.go @@ -17,22 +17,21 @@ import ( func RegisterRP(bot *laniakea.Bot) { rp := laniakea.NewPlugin("RP") - rp = rp.Command(rpInfo, "rp", "рп") - rp = rp.Payload(rpInfo, "rp.info") + rp.Command(rpInfo, "rp", "рп") + rp.Payload(rpInfo, "rp.info") + rp.Payload(rpWaifuList, "rp.waifu_list") + rp.Payload(rpWaifuSet, "rp.waifu_set") + rp.Payload(rpPresetsList, "rp.preset_list") + rp.Payload(rpPresetSet, "rp.preset_set") + rp.Payload(rpScenarioList, "rp.scenario_list") + rp.Payload(rpScenarioSet, "rp.scenario_set") + rp.Payload(chatStat, "rp.tokens") + rp.Payload(newChat, "rp.new_chat") - rp = rp.Payload(rpWaifuList, "rp.waifu_list") - rp = rp.Payload(rpWaifuSet, "rp.waifu_set") - rp = rp.Payload(rpPresetsList, "rp.preset_list") - rp = rp.Payload(rpPresetSet, "rp.preset_set") - rp = rp.Payload(rpScenarioList, "rp.scenario_list") - rp = rp.Payload(rpScenarioSet, "rp.scenario_set") - rp = rp.Payload(chatStat, "rp.tokens") - rp = rp.Payload(newChat, "rp.new_chat") - - rp = rp.Command(rpUserPromptGet, "rpuserpget") - rp = rp.Command(rpUserPromptSet, "rpuserpset") - rp = rp.Command(generate, "g", "gen", "г") - rp = rp.Payload(compress, "rp.compress_chat") + rp.Command(rpUserPromptGet, "rpuserpget") + rp.Command(rpUserPromptSet, "rpuserpset") + rp.Command(generate, "g", "gen", "г") + rp.Payload(compress, "rp.compress_chat") bot.AddPlugins(rp.Build()) } diff --git a/plugins/waifus.go b/plugins/waifus.go index 1f06eec..2b4cb57 100644 --- a/plugins/waifus.go +++ b/plugins/waifus.go @@ -14,11 +14,21 @@ import ( func RegisterWaifus(bot *laniakea.Bot) { waifus := laniakea.NewPlugin("Waifus") - waifus.Command(myWaifu, "mywaifu", "моивайфу") waifus.Command(sellWaifu, "sellwaifu") + + waifus.Command(myWaifu, "mywaifu", "моивайфу") + waifus.Command(myWaifu, "waifu.my") + waifus.Command(waifuList, "wlist", "waifulist", "влист", "вайфулист") + waifus.Payload(waifuList, "waifu.list") + waifus.Command(waifuInfo, "winfo", "waifuinfo", "винфо") + waifus.Payload(waifuInfo, "waifu.info") + waifus.Command(waifuSearch, "wsearch", "waifusearch", "впоиск") + waifus.Payload(waifuSearch, "waifu.search") + + waifus.Payload(waifuNotImplemented, "waifu.confirm_buy") bot.AddPlugins(waifus.Build()) } @@ -26,26 +36,34 @@ func RegisterWaifus(bot *laniakea.Bot) { func myWaifu(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { user, err := psql.GetUser(ctx.FromID) if err != nil { - ctx.Answer(err.Error()) + ctx.Error(err) return } - out := []string{ - fmt.Sprintf("%s, %s!", user.Greeting, user.Name), - "Список твоих вайфу:", - } - waifus, err := psql.GetUserWaifus(user.ID) if err != nil { ctx.Error(err) return } + + kb := laniakea.NewInlineKeyboard(2) + out := []string{ + fmt.Sprintf("%s, %s!", user.Greeting, user.Name), + "Список твоих вайфу:", + } for _, w := range waifus { s := fmt.Sprintf("*%s* из \"*%s*\" (%d☆, ID: %d)", w.Name, w.Fandom, w.Rarity, w.ID) out = append(out, s) + kb.AddCallbackButton(w.Name, "waifu.info", w.ID) } - ctx.Answer(strings.Join(out, "\n")) + kb.AddLine() + kb.AddCallbackButton("Искать", "waifu.search") + if ctx.CallbackMsgId > 0 { + ctx.EditCallback(strings.Join(out, "\n"), kb) + } else { + ctx.Keyboard(strings.Join(out, "\n"), kb) + } } func sellWaifu(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { @@ -58,33 +76,36 @@ func waifuList(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { ctx.Answer(err.Error()) return } - var out []string + out := make([]string, len(waifus)) - for _, w := range waifus { + kb := laniakea.NewInlineKeyboard(1) + for i, w := range waifus { var owner string if w.Owner == nil { owner = "нет" } else { owner = w.Owner.Name } - s := fmt.Sprintf("*%s* из \"*%s*\" (%d☆, ID: %d) Владелец: %v", w.Name, w.Fandom, w.Rarity, w.ID, owner) - out = append(out, s) + out[i] = fmt.Sprintf("*%s* из \"*%s*\" (%d☆, ID: %d) Владелец: *%s*", w.Name, w.Fandom, w.Rarity, w.ID, owner) + kb.AddCallbackButton(w.Name, "waifu.info", w.ID) } - ctx.Answer(strings.Join(out, "\n")) + if ctx.CallbackMsgId > 0 { + ctx.EditCallback(strings.Join(out, "\n"), kb) + } else { + ctx.Keyboard(strings.Join(out, "\n"), kb) + } } func waifuInfo(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { - rawArgs := strings.TrimSpace(ctx.Text) - args := strings.Split(rawArgs, " ") - if len(args) != 1 { + if len(ctx.Args) != 1 { ctx.Answer("Не указан ID вайфу!") return } - waifuId, err := strconv.Atoi(args[0]) + waifuId, err := strconv.Atoi(ctx.Args[0]) if err != nil { - ctx.Answer("Во время выполнения команды произошла ошибка!") + ctx.Error(err) return } @@ -101,10 +122,16 @@ func waifuInfo(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { fmt.Sprintf("Бонус к опыту: x%.2f", waifu.ExpBonus.InexactFloat64()), fmt.Sprintf("Рыночная стоимость: %s¥", utils.DecimalComma(&waifu.MarketPrice)), } + kb := laniakea.NewInlineKeyboard(1) + if !waifu.OwnerID.Valid { + kb.AddCallbackButton("Купить", "waifu.confirm_buy") + } + + kb.AddCallbackButton("Назад", "waifu.list") if len(waifu.Image) > 0 { ctx.AnswerPhoto(waifu.Image, strings.Join(out, "\n")) } else { - ctx.Answer(strings.Join(out, "\n")) + ctx.EditCallback(strings.Join(out, "\n"), kb) } } @@ -115,8 +142,9 @@ func waifuSearch(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { return } + kb := laniakea.NewInlineKeyboard(2).AddCallbackButton("Мои вайфу", "waifu.my").AddCallbackButton("Все вайфу", "waifu.list") if time.Now().Before(user.WaifuSearchTime.Add(time.Hour * 4)) { - ctx.Answer("Вайфу можно искать раз в 4 часа.") + ctx.EditCallback("Вайфу можно искать раз в 4 часа.", kb) return } @@ -126,13 +154,13 @@ func waifuSearch(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { return } if count == 0 { - ctx.Answer("Не осталось свободных вайфу... :(\nПопробуй позже или купи на рынке!") + ctx.EditCallback("Не осталось свободных вайфу... :(\nПопробуй позже или купи на рынке!", kb) return } rand := utils.RandRange(0, 100) if 10 < rand && rand < 90 { - ctx.Answer("Ты ничего не нашел!") + ctx.EditCallback("Ты ничего не нашел!", kb) return } @@ -144,8 +172,6 @@ func waifuSearch(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { rarity = 4 } - fmt.Println(rarity) - freeWaifus, err = psql.GetFreeWaifusWithRarity(rarity) if err != nil { ctx.Error(err) @@ -153,7 +179,7 @@ func waifuSearch(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { } if len(freeWaifus) == 0 { - ctx.Answer("Ты ничего не нашел!") + ctx.EditCallback("Ты ничего не нашел!", kb) return } @@ -170,6 +196,11 @@ func waifuSearch(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { if len(waifu.Image) > 0 { ctx.AnswerPhoto(waifu.Image, strings.Join(out, "\n")) } else { - ctx.Answer(strings.Join(out, "\n")) + ctx.EditCallback(strings.Join(out, "\n"), kb) } } + +func waifuNotImplemented(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { + kb := laniakea.NewInlineKeyboard(2).AddCallbackButton("Мои вайфу", "waifu.my").AddCallbackButton("Все вайфу", "waifu.list") + ctx.EditCallback("Данная функция ещё не реализована", kb) +} diff --git a/utils/ai/openai.go b/utils/ai/openai.go index 9d1fb9d..369b814 100644 --- a/utils/ai/openai.go +++ b/utils/ai/openai.go @@ -123,7 +123,14 @@ func (o *OpenAIAPI) DoRequest(url string, params any) ([]byte, error) { if res.StatusCode == 504 || res.StatusCode == 400 || res.StatusCode == 502 { o.Logger.Warn(fmt.Sprintf("[%d] %s", res.StatusCode, res.Status)) time.Sleep(5 * time.Second) - return o.DoRequest(url, params) + res, err = o.client.Do(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + if res.StatusCode == 504 || res.StatusCode == 400 || res.StatusCode == 502 { + return nil, fmt.Errorf("[%d] %s", res.StatusCode, res.Status) + } } responseBody, err = io.ReadAll(res.Body) if err != nil {