all database switched to repository model. some other fixes and features

This commit is contained in:
2026-01-22 20:58:46 +03:00
parent 804d683f9e
commit 331f6854b6
14 changed files with 283 additions and 187 deletions

View File

@@ -14,33 +14,32 @@ import (
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(myWaifu, "waifu.my")
waifus.Payload(waifuList, "waifu.list")
waifus.Command(waifuInfo, "winfo", "waifuinfo", "винфо")
waifus.Payload(waifuSell, "waifu.sell")
waifus.Payload(buyWaifu, "waifu.buy")
waifus.Payload(waifuInfo, "waifu.info")
waifus.Command(waifuSearch, "wsearch", "waifusearch", "впоиск")
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, _ *laniakea.DatabaseContext) {
user, err := psql.GetUser(ctx.FromID)
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
}
waifus, err := psql.GetUserWaifus(user.ID)
rep := psql.NewWaifuRepository(db)
waifus, err := rep.GetByUserId(user.ID)
if err != nil {
ctx.Error(err)
return
@@ -59,6 +58,8 @@ func myWaifu(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
kb.AddLine()
kb.AddCallbackButton("Искать", "waifu.search")
kb.AddLine()
kb.AddCallbackButton("Все вайфу", "waifu.list")
if ctx.CallbackMsgId > 0 {
ctx.EditCallback(strings.Join(out, "\n"), kb)
} else {
@@ -66,19 +67,16 @@ func myWaifu(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
}
}
func sellWaifu(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
}
func waifuList(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
waifus, err := psql.GetAllWaifus()
func waifuList(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
rep := psql.NewWaifuRepository(db)
waifus, err := rep.GetAll()
if err != nil {
ctx.Answer(err.Error())
ctx.Error(err)
return
}
out := make([]string, len(waifus))
kb := laniakea.NewInlineKeyboard(1)
kb := laniakea.NewInlineKeyboard(2)
for i, w := range waifus {
var owner string
if w.Owner == nil {
@@ -89,15 +87,65 @@ func waifuList(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
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 {
ctx.EditCallback(strings.Join(out, "\n"), kb)
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 waifuInfo(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
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
@@ -109,7 +157,8 @@ func waifuInfo(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
return
}
waifu, err := psql.GetWaifuById(waifuId)
rep := psql.NewWaifuRepository(db)
waifu, err := rep.GetById(waifuId)
if err != nil {
ctx.Error(err)
return
@@ -122,21 +171,28 @@ 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)
kb := laniakea.NewInlineKeyboard(2)
if !waifu.OwnerID.Valid {
kb.AddCallbackButton("Купить", "waifu.confirm_buy")
kb.AddCallbackButton("Купить", "waifu.buy", waifu.ID)
}
if waifu.OwnerID.Valid && waifu.OwnerID.Int64 == int64(ctx.FromID) {
kb.AddCallbackButton("Продать", "waifu.sell", waifu.ID)
}
kb.AddCallbackButton("Назад", "waifu.list")
kb.AddLine()
kb.AddCallbackButton("Все вайфу", "waifu.list")
kb.AddCallbackButton("Мои вайфу", "waifu.my")
if len(waifu.Image) > 0 {
ctx.AnswerPhoto(waifu.Image, strings.Join(out, "\n"))
ctx.CallbackDelete()
ctx.AnswerPhotoKeyboard(waifu.Image, strings.Join(out, "\n"), kb)
} 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)
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
@@ -148,7 +204,8 @@ func waifuSearch(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
return
}
count, err := psql.GetFreeWaifusCount()
rep := psql.NewWaifuRepository(db)
count, err := rep.GetFreeCount()
if err != nil {
ctx.Error(err)
return
@@ -172,7 +229,7 @@ func waifuSearch(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
rarity = 4
}
freeWaifus, err = psql.GetFreeWaifusWithRarity(rarity)
freeWaifus, err = rep.GetFreeByRarity(rarity)
if err != nil {
ctx.Error(err)
return