package plugins import ( "fmt" "kurumibot/database/psql" "kurumibot/utils" "strconv" "strings" "time" "kurumibot/laniakea" ) func RegisterWaifus(bot *laniakea.Bot) { waifus := laniakea.NewPlugin("Waifus") 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()) } func myWaifu(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { user, err := psql.GetUser(ctx.FromID) if err != nil { ctx.Error(err) return } 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) } 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) { } func waifuList(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { waifus, err := psql.GetAllWaifus() if err != nil { ctx.Answer(err.Error()) return } out := make([]string, len(waifus)) kb := laniakea.NewInlineKeyboard(1) for i, w := range waifus { var owner string if w.Owner == nil { owner = "нет" } else { owner = w.Owner.Name } 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) } 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) { if len(ctx.Args) != 1 { ctx.Answer("Не указан ID вайфу!") return } waifuId, err := strconv.Atoi(ctx.Args[0]) if err != nil { ctx.Error(err) return } waifu, err := psql.GetWaifuById(waifuId) if err != nil { ctx.Error(err) return } out := []string{ fmt.Sprintf("*%s* из \"*%s*\"", waifu.Name, waifu.Fandom), fmt.Sprintf("Редкость: %d☆", waifu.Rarity), fmt.Sprintf("Бонус к деньгам: x%.2f", waifu.MoneyBonus.InexactFloat64()), 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.EditCallback(strings.Join(out, "\n"), kb) } } func waifuSearch(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) { user, err := psql.GetOrCreateUser(ctx.FromID, ctx.Msg.From.FirstName) if err != nil { ctx.Error(err) return } kb := laniakea.NewInlineKeyboard(2).AddCallbackButton("Мои вайфу", "waifu.my").AddCallbackButton("Все вайфу", "waifu.list") if time.Now().Before(user.WaifuSearchTime.Add(time.Hour * 4)) { ctx.EditCallback("Вайфу можно искать раз в 4 часа.", kb) return } count, err := psql.GetFreeWaifusCount() if err != nil { ctx.Error(err) return } if count == 0 { ctx.EditCallback("Не осталось свободных вайфу... :(\nПопробуй позже или купи на рынке!", kb) return } rand := utils.RandRange(0, 100) if 10 < rand && rand < 90 { ctx.EditCallback("Ты ничего не нашел!", kb) return } var freeWaifus []*psql.Waifu rarity := 3 if rand == 0 { rarity = 5 } else if rand > 0 && rand < 7 { rarity = 4 } freeWaifus, err = psql.GetFreeWaifusWithRarity(rarity) if err != nil { ctx.Error(err) return } if len(freeWaifus) == 0 { ctx.EditCallback("Ты ничего не нашел!", kb) return } foundWaifuIndex := utils.RandRange(0, len(freeWaifus)) waifu := freeWaifus[foundWaifuIndex] out := []string{ "Ты нашел новую вайфу!", fmt.Sprintf("*%s* из \"*%s*\"", waifu.Name, waifu.Fandom), fmt.Sprintf("Редкость: %d☆", waifu.Rarity), fmt.Sprintf("Бонус к деньгам: x%.2f", waifu.MoneyBonus.InexactFloat64()), fmt.Sprintf("Бонус к опыту: x%.2f", waifu.ExpBonus.InexactFloat64()), fmt.Sprintf("Рыночная стоимость: %s¥", utils.DecimalComma(&waifu.MarketPrice)), } if len(waifu.Image) > 0 { ctx.AnswerPhoto(waifu.Image, strings.Join(out, "\n")) } else { 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) }