264 lines
7.3 KiB
Go
264 lines
7.3 KiB
Go
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(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()
|
||
ctx.AnswerPhotoKeyboard(waifu.Image, strings.Join(out, "\n"), kb)
|
||
} else {
|
||
ctx.EditCallback(strings.Join(out, "\n"), kb)
|
||
}
|
||
}
|
||
|
||
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 []*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)
|
||
}
|