diff --git a/README.md b/README.md index 565835e8e2..336281875a 100644 --- a/README.md +++ b/README.md @@ -900,7 +900,7 @@ print("run[CQ:image,file="+j["img"]+"]") - [x] 钓鱼商店 - [x] 购买xxx [数量] - - [x] 出售xxx [数量] + - [x] 出售[xxx [数量]|所有垃圾] - [x] 钓鱼背包 - [x] 装备[xx竿|三叉戟|美西螈] - [x] 附魔[诱钓|海之眷顾] diff --git a/plugin/mcfish/main.go b/plugin/mcfish/main.go index 150263db3f..8b58a58585 100644 --- a/plugin/mcfish/main.go +++ b/plugin/mcfish/main.go @@ -131,7 +131,7 @@ var ( DisableOnDefault: false, Brief: "钓鱼", Help: "一款钓鱼模拟器\n----------指令----------\n" + - "- 钓鱼看板/钓鱼商店\n- 购买xxx\n- 购买xxx [数量]\n- 出售xxx\n- 出售xxx [数量]\n" + + "- 钓鱼看板/钓鱼商店\n- 购买xxx\n- 购买xxx [数量]\n- 出售xxx\n- 出售xxx [数量]\n- 出售所有垃圾\n" + "- 钓鱼背包\n- 装备[xx竿|三叉戟|美西螈]\n- 附魔[诱钓|海之眷顾]\n- 修复鱼竿\n- 合成[xx竿|三叉戟]\n- 消除[绑定|宝藏]诅咒\n- 消除[绑定|宝藏]诅咒 [数量]\n" + "- 进行钓鱼\n- 进行n次钓鱼\n- 当前装备概率明细\n" + "规则V" + version + ":\n" + @@ -530,6 +530,26 @@ func (sql *fishdb) getNumberFor(uid int64, thing string) (number int, err error) return } +// 获取用户的某类物品信息 +func (sql *fishdb) getUserTypeInfo(uid int64, thingType string) (thingInfos []article, err error) { + name := strconv.FormatInt(uid, 10) + "Pack" + sql.Lock() + defer sql.Unlock() + userInfo := article{} + err = sql.db.Create(name, &userInfo) + if err != nil { + return + } + if !sql.db.CanFind(name, "where Type = '"+thingType+"'") { + return + } + err = sql.db.FindFor(name, &userInfo, "where Type = '"+thingType+"'", func() error { + thingInfos = append(thingInfos, userInfo) + return nil + }) + return +} + /*********************************************************/ /************************商店相关函数***********************/ /*********************************************************/ diff --git a/plugin/mcfish/store.go b/plugin/mcfish/store.go index a7d5935436..85e90dc2a6 100644 --- a/plugin/mcfish/store.go +++ b/plugin/mcfish/store.go @@ -306,6 +306,77 @@ func init() { } ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("出售成功,你赚到了", pice*number, msg))) }) + engine.OnRegex(`^出售所有垃圾`, getdb, refreshFish).SetBlock(true).Limit(limitSet).Handle(func(ctx *zero.Ctx) { + uid := ctx.Event.UserID + + articles, err := dbdata.getUserTypeInfo(uid, "waste") + if err != nil { + ctx.SendChain(message.Text("[ERROR]:获取背包信息错误", err)) + return + } + if len(articles) == 0 { + ctx.SendChain(message.Text("你的背包不存在该物品")) + return + } + if len(articles) > 1 { + msg := make(message.Message, 0, 3+len(articles)) + msg = append(msg, message.Reply(ctx.Event.MessageID), message.Text("找到以下物品:\n")) + for i, info := range articles { + msg = append(msg, message.Text( + "[", i, "]", info.Name, " 数量: ", info.Number, "\n")) + } + ctx.Send(msg) + } + + pice := 0 + for _, info := range articles { + pice += (priceList[info.Name] * discountList[info.Name] / 100) * info.Number * 8 / 10 + } + + ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("是否接受商店将以", pice, "收购全部垃圾", "?\n回答\"是\"或\"否\""))) + // 等待用户下一步选择 + recv, cancel1 := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`^(是|否)$`), zero.CheckUser(ctx.Event.UserID)).Repeat() + defer cancel1() + buy := false + for { + select { + case <-time.After(time.Second * 60): + ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("等待超时,取消钓鱼"))) + return + case e := <-recv: + nextcmd := e.Event.Message.String() + if nextcmd == "否" { + ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("已取消出售"))) + return + } + buy = true + } + if buy { + break + } + } + + msg := "" + curse, err := dbdata.getNumberFor(uid, "宝藏诅咒") + if err != nil { + ctx.SendChain(message.Text("[ERROR at store.go.9.3]:", err)) + return + } + if curse != 0 { + msg = "\n(你身上绑定了" + strconv.Itoa(curse) + "层诅咒)" + pice = pice * (100 - 10*curse) / 100 + } + + for _, info := range articles { + info.Number = 0 + err = dbdata.updateUserThingInfo(uid, info) + if err != nil { + ctx.SendChain(message.Text("[ERROR at store.go.6]:", err)) + return + } + } + ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("出售成功,你赚到了", pice, msg))) + }) engine.OnRegex(`^购买(`+strings.Join(thingList, "|")+`)\s*(\d*)$`, getdb, refreshFish).SetBlock(true).Limit(limitSet).Handle(func(ctx *zero.Ctx) { uid := ctx.Event.UserID numberOfPole, err := dbdata.getNumberFor(uid, "竿")