package plugins import ( "fmt" "kurumibot/database/psql" "kurumibot/utils" "log" "strconv" "strings" "time" "git.nix13.pw/scuroneko/extypes" "git.nix13.pw/scuroneko/laniakea" ) func RegisterWaifus(bot *laniakea.Bot) { waifus := laniakea.NewPlugin("Waifus") waifus.Command(myWaifu, "mywaifu", "моивайфу") waifus.Command(waifuList, "wlist", "waifulist", "влист", "вайфулист") waifus.Payload(myWaifu, "waifu.my") waifus.Payload(waifuList, "waifu.list") waifus.Payload(waifuSell, "waifu.sell") waifus.Payload(buyWaifu, "waifu.buy") waifus.Payload(waifuInfo, "waifu.info") waifus.Payload(waifuSearch, "waifu.search") waifus.Payload(waifuNotImplemented, "waifu.confirm_buy") waifus.Payload(waifuNotImplemented, "waifu.confirm_sell") bot.AddPlugins(waifus.Build()) } func myWaifu(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) { userRep := psql.NewUserRepository(db) user, err := userRep.GetOrCreate(ctx.FromID, ctx.From.FirstName) if err != nil { ctx.Error(err) return } rep := psql.NewWaifuRepository(db) waifus, err := rep.GetByUserId(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") kb.AddLine() kb.AddCallbackButton("Все вайфу", "waifu.list") if ctx.CallbackMsgId > 0 { ctx.EditCallback(strings.Join(out, "\n"), kb) } else { ctx.Keyboard(strings.Join(out, "\n"), kb) } } func waifuList(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) { rep := psql.NewWaifuRepository(db) waifus, err := rep.GetAll() if err != nil { ctx.Error(err) return } out := make([]string, len(waifus)) kb := laniakea.NewInlineKeyboard(2) 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) } kb.AddLine() kb.AddCallbackButton("Мои вайфу", "waifu.my") if ctx.CallbackMsgId > 0 { if len(ctx.Msg.Photo) > 0 { ctx.CallbackDelete() ctx.Keyboard(strings.Join(out, "\n"), kb) } else { ctx.EditCallback(strings.Join(out, "\n"), kb) } } else { ctx.Keyboard(strings.Join(out, "\n"), kb) } } func waifuSell(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) { const CantSellWaifu = "Не удалось продать вайфу" waifuId, err := strconv.Atoi(ctx.Args[0]) if err != nil { ctx.Error(err) return } rep := psql.NewWaifuRepository(db) waifu, err := rep.GetById(waifuId) if err != nil { ctx.Error(err) return } // Убедились что ид владельца совпадает с отправителем if waifu.Owner == nil { ctx.Answer(CantSellWaifu) return } if waifu.Owner.ID != ctx.FromID { ctx.Answer(CantSellWaifu) return } out := []string{ fmt.Sprintf("Ты собираешься продать %s на рынок.", waifu.Name), "Это действие нельзя будет отменить!", fmt.Sprintf("Цена продажи составляет %s", utils.DecimalComma(&waifu.MarketPrice)), } kb := laniakea.NewInlineKeyboard(1) kb.AddCallbackButton("Продать", "waifu.confirm_sell", waifu.ID) kb.AddCallbackButton("Отмена", "waifu.info", waifu.ID) ctx.CallbackDelete() ctx.Keyboard(strings.Join(out, "\n"), kb) } func buyWaifu(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) { } func waifuInfo(ctx *laniakea.MsgContext, db *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 } rep := psql.NewWaifuRepository(db) waifu, err := rep.GetById(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(2) if !waifu.OwnerID.Valid { kb.AddCallbackButton("Купить", "waifu.buy", waifu.ID) } if waifu.OwnerID.Valid && waifu.OwnerID.Int64 == int64(ctx.FromID) { kb.AddCallbackButton("Продать", "waifu.sell", waifu.ID) } kb.AddLine() kb.AddCallbackButton("Все вайфу", "waifu.list") kb.AddCallbackButton("Мои вайфу", "waifu.my") if len(waifu.Image) > 0 { ctx.CallbackDelete() log.Println(waifu.Image) ctx.AnswerPhotoKeyboard(waifu.Image, strings.Join(out, "\n"), kb) } else { ctx.EditCallback(strings.Join(out, "\n"), kb) } ctx.AnswerCbQuery() } func waifuSearch(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) { userRep := psql.NewUserRepository(db) user, err := userRep.GetOrCreate(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 } rep := psql.NewWaifuRepository(db) count, err := rep.GetFreeCount() 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 extypes.Slice[psql.Waifu] rarity := 3 if rand == 0 { rarity = 5 } else if rand > 0 && rand < 7 { rarity = 4 } freeWaifus, err = rep.GetFreeByRarity(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) }