Files
YaeMikoBot/plugins/waifus.go
2026-02-12 15:09:06 +03:00

268 lines
7.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}