diff --git a/common/cool/go.mod b/common/cool/go.mod index 65a355fac..a3cee4eba 100644 --- a/common/cool/go.mod +++ b/common/cool/go.mod @@ -19,7 +19,7 @@ require ( github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/imroc/req/v3 v3.43.3 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/onsi/ginkgo/v2 v2.16.0 // indirect github.com/orcaman/concurrent-map/v2 v2.0.1 // indirect diff --git a/common/cool/service.go b/common/cool/service.go index c8b306034..94f8a832a 100644 --- a/common/cool/service.go +++ b/common/cool/service.go @@ -37,12 +37,13 @@ type Service struct { // List/Add接口条件配置 type QueryOp struct { - FieldEQ []string // 字段等于 多个字段选择以及高级搜索都是这个 - DataFieldEQ []string // 新增:JSONB data->>'xxx' 字段 = ? 多个字段选择以及高级搜索都是这个 - KeyWordField []string // 模糊搜索匹配的数据库字段,对应普通搜索 - AddOrderby g.MapStrStr // 添加排序 - Where func(ctx context.Context) []g.Array // 自定义条件 - Select string // 查询字段,多个字段用逗号隔开 如: id,name 或 a.id,a.name,b.name AS bname + FieldEQ []string // 字段等于 多个字段选择以及高级搜索都是这个 + DataFieldEQ []string // 新增:JSONB data->>'xxx' 字段 = ? 多个字段选择以及高级搜索都是这个 + KeyWordField []string // 模糊搜索匹配的数据库字段,对应普通搜索 + AddOrderby g.MapStrStr // 添加排序 + Where func(ctx context.Context) []g.Array // 自定义条件 + Select string // 查询字段,多个字段用逗号隔开 如: id,name 或 a.id,a.name,b.name AS bname + Join []*JoinOp // 关联查询 Extend func(ctx g.Ctx, m *gdb.Model) *gdb.Model // 追加其他条件 ModifyResult func(ctx g.Ctx, data interface{}) interface{} // 修改结果 diff --git a/common/utils/go-sensitive-word-1.3.3/go.mod b/common/utils/go-sensitive-word-1.3.3/go.mod index ba8816950..99d9523cc 100644 --- a/common/utils/go-sensitive-word-1.3.3/go.mod +++ b/common/utils/go-sensitive-word-1.3.3/go.mod @@ -3,7 +3,7 @@ module github.com/zmexing/go-sensitive-word go 1.20 require ( - github.com/imroc/req/v3 v3.42.3 + github.com/orcaman/concurrent-map/v2 v2.0.1 ) diff --git a/common/utils/go-sensitive-word-1.3.3/store/memory.go b/common/utils/go-sensitive-word-1.3.3/store/memory.go index 8232ac712..1f7322691 100644 --- a/common/utils/go-sensitive-word-1.3.3/store/memory.go +++ b/common/utils/go-sensitive-word-1.3.3/store/memory.go @@ -2,13 +2,15 @@ package store import ( "bufio" - "errors" - "github.com/imroc/req/v3" - cmap "github.com/orcaman/concurrent-map/v2" + "fmt" + "time" + "io" "net/http" "os" "strings" + + cmap "github.com/orcaman/concurrent-map/v2" ) // MemoryModel 使用并发 map 实现的内存词库 @@ -62,26 +64,40 @@ func (m *MemoryModel) LoadDictEmbed(contents ...string) error { } // 从远程 HTTP 地址加载词库 +// LoadDictHttp 批量从 HTTP 地址加载字典(标准库 net/http 实现) func (m *MemoryModel) LoadDictHttp(urls ...string) error { + // 【标准库】创建带超时的客户端,防止请求卡死 + client := &http.Client{ + Timeout: 10 * time.Second, // 超时控制,非常重要 + } + for _, url := range urls { - err := func(url string) error { - httpRes, err := req.Get(url) + // 立即执行函数,解决 defer 循环变量问题 + err := func(u string) error { + // 标准库 GET 请求 + resp, err := client.Get(u) if err != nil { - return err - } - if httpRes == nil { - return errors.New("nil http response") - } - if httpRes.StatusCode != http.StatusOK { - return errors.New(httpRes.GetStatus()) + return fmt.Errorf("请求失败 %s: %w", u, err) } - defer func(Body io.ReadCloser) { - _ = Body.Close() - }(httpRes.Body) + // 必须 defer 关闭 body,防止资源泄漏(标准库固定写法) + defer func() { + closeErr := resp.Body.Close() + if closeErr != nil { + fmt.Printf("警告: 关闭响应体失败 url=%s, err=%v\n", u, closeErr) + } + }() - return m.LoadDict(httpRes.Body) + // 状态码判断 + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("http 状态码错误 url=%s, code=%d", u, resp.StatusCode) + } + + // 加载字典(和你原来逻辑一样) + return m.LoadDict(resp.Body) }(url) + + // 任意一个失败,立即返回 if err != nil { return err } diff --git a/common/utils/help.go b/common/utils/help.go index b35cf44be..3f0ed8110 100644 --- a/common/utils/help.go +++ b/common/utils/help.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "math/rand/v2" + "strings" "time" "github.com/gogf/gf/v2/os/gtime" @@ -167,3 +168,12 @@ func IsCurrentTimeInRange(startStr, endStr string) (bool, error) { // 3. 比较当前时间是否在 [startToday, endToday] 区间内 return now.After(startToday) && now.Before(endToday), nil } + +// Format 把 args 按顺序填入 {0},{1},{2}... +func Format(s string, args ...interface{}) string { + for i, arg := range args { + placeholder := "{" + string(rune('0'+i)) + "}" + s = strings.ReplaceAll(s, placeholder, gconv.String(arg)) + } + return s +} diff --git a/logic/controller/action_扭蛋.go b/logic/controller/action_扭蛋.go index fa38a98a3..40a815edf 100644 --- a/logic/controller/action_扭蛋.go +++ b/logic/controller/action_扭蛋.go @@ -46,11 +46,9 @@ func (h Controller) EggGamePlay(data1 *C2S_EGG_GAME_PLAY, c *player.Player) (res result.PetID = newPet.ID } - items := service.NewItemService().GetEgg(data1.EggNum) + items := service.NewItemService().GetEgg(int(data1.EggNum)) for _, item := range items { - if item.ItemId == 0 { - continue - } + c.ItemAdd(item.ItemId, item.ItemCnt) result.ListInfo = append(result.ListInfo, data.ItemInfo{ItemId: item.ItemId, ItemCnt: item.ItemCnt}) } diff --git a/logic/controller/fight_pvp_king.go b/logic/controller/fight_pvp_king.go index aac0df939..10b403696 100644 --- a/logic/controller/fight_pvp_king.go +++ b/logic/controller/fight_pvp_king.go @@ -93,13 +93,8 @@ func (h Controller) PetKing(data *fight.PetKingJoinInboundInfo, c *player.Player } err = c.JoinFight(func(p common.PlayerI) bool { - var u1, u2 []model.PetInfo - if c.Fightinfo.Mode == info.BattleMode.SINGLE_MODE { - u1, u2 = p.GetInfo().PetList[:1], c.GetInfo().PetList[:1] - } else { - u1, u2 = p.GetInfo().PetList, c.GetInfo().PetList - } - _, err = fight.NewFight(p, c, u1, u2, func(foi model.FightOverInfo) { + + _, err = fight.NewFight(p, c, p.GetInfo().PetList, c.GetInfo().PetList, func(foi model.FightOverInfo) { if foi.Reason == 0 { //我放获胜 switch data.Type { case 11: diff --git a/logic/controller/fight_pvp_withplayer.go b/logic/controller/fight_pvp_withplayer.go index 749f66650..4baac4300 100644 --- a/logic/controller/fight_pvp_withplayer.go +++ b/logic/controller/fight_pvp_withplayer.go @@ -55,7 +55,7 @@ func (h Controller) OnPlayerHandleFightInvite(data *fight.HandleFightInviteInbou return } - _, err = fight.NewFight(v, c, v.GetPetInfo(100), v.GetPetInfo(100), func(foi model.FightOverInfo) { + _, err = fight.NewFight(v, c, v.GetInfo().PetList, c.GetInfo().PetList, func(foi model.FightOverInfo) { //println("好友对战测试", foi.Reason) diff --git a/logic/controller/fight_擂台.go b/logic/controller/fight_擂台.go index a441739e7..1beab4bdf 100644 --- a/logic/controller/fight_擂台.go +++ b/logic/controller/fight_擂台.go @@ -67,7 +67,7 @@ func (h Controller) ArenaFightOwner(data1 *fight.ARENA_FIGHT_OWENR, c *player.Pl c.Fightinfo.Mode = info.BattleMode.SINGLE_MODE c.Fightinfo.Status = info.BattleMode.FIGHT_ARENA - _, err = fight.NewFight(c, c.GetSpace().Owner.ARENA_Player, c.Info.PetList[:1], c.GetSpace().Owner.ARENA_Player.GetInfo().PetList[:1], func(foi model.FightOverInfo) { //我方邀请擂主挑战,我方先手 + _, err = fight.NewFight(c, c.GetSpace().Owner.ARENA_Player, c.Info.PetList, c.GetSpace().Owner.ARENA_Player.GetInfo().PetList, func(foi model.FightOverInfo) { //我方邀请擂主挑战,我方先手 if foi.Reason != 0 && foi.WinnerId == c.GetInfo().UserID { //异常退出 diff --git a/logic/controller/item_use.go b/logic/controller/item_use.go index a3900bbe7..649df45eb 100644 --- a/logic/controller/item_use.go +++ b/logic/controller/item_use.go @@ -66,7 +66,7 @@ func (h Controller) UsePetItemOutOfFight(data *item.C2S_USE_PET_ITEM_OUT_OF_FIGH c.Service.Item.UPDATE(uint32(data.ItemID), -1) result = &item.S2C_USE_PET_ITEM_OUT_OF_FIGHT{} - currentPet.CalculatePetPane(false) + currentPet.CalculatePetPane(100) copier.Copy(&result, currentPet) // defer c.Service.Info.Save(*c.Info) return result, 0 @@ -140,7 +140,7 @@ func (h Controller) ResetNature(data *item.C2S_PET_RESET_NATURE, c *player.Playe } currentPet.Nature = data.Nature - currentPet.CalculatePetPane(false) + currentPet.CalculatePetPane(100) c.Service.Item.UPDATE(data.ItemId, -1) return result, 0 } diff --git a/logic/controller/pet_elo.go b/logic/controller/pet_elo.go index 56dbda447..ef61343ec 100644 --- a/logic/controller/pet_elo.go +++ b/logic/controller/pet_elo.go @@ -37,7 +37,7 @@ func (h Controller) PetELV(data *C2S_PET_EVOLVTION, c *player.Player) (result *f currentPet.ID = uint32(xmlres.EVOLVMAP[flag].Branches[data.Index-1].MonTo) currentPet.Update(true) - currentPet.CalculatePetPane(false) + currentPet.CalculatePetPane(100) currentPet.Update(true) updateOutbound := &info.PetUpdateOutboundInfo{} diff --git a/logic/controller/pet_ev.go b/logic/controller/pet_ev.go index 2d4a84f1b..4e01ce420 100644 --- a/logic/controller/pet_ev.go +++ b/logic/controller/pet_ev.go @@ -43,7 +43,7 @@ func (h Controller) PetEVDiy(data *PetEV, c *player.Player) (result *fight.NullO return nil, errorcode.ErrorCodes.Err10401 } currentPet.Ev = data.EVs - currentPet.CalculatePetPane(false) + currentPet.CalculatePetPane(100) c.Info.EVPool -= int64(usedEV) // result = &pet.S2C_50001{} diff --git a/logic/service/fight/boss/NewSeIdx_700.go b/logic/service/fight/boss/NewSeIdx_700.go index 2fa358c31..acc6b0fbc 100644 --- a/logic/service/fight/boss/NewSeIdx_700.go +++ b/logic/service/fight/boss/NewSeIdx_700.go @@ -13,7 +13,7 @@ type NewSel700 struct { NewSel0 } -func (e *NewSel700) Skill_Use_ex() bool { +func (e *NewSel700) Skill_Use() bool { if e.ID().GetCatchTime() != e.Ctx().Our.CurrentPet.Info.CatchTime { return true } diff --git a/logic/service/fight/input.go b/logic/service/fight/input.go index 1f0e6507e..6673342d9 100644 --- a/logic/service/fight/input.go +++ b/logic/service/fight/input.go @@ -123,8 +123,6 @@ func (f *FightC) LoadPercent(c common.PlayerI, percent int32) { } -var meetpet = make(map[int]model.PetInfo) - func (f *FightC) initplayer(c common.PlayerI, b []model.PetInfo) (*input.Input, errorcode.ErrorCode) { r := c.CanFight() if c.CanFight() != 0 { @@ -146,6 +144,12 @@ func (f *FightC) initplayer(c common.PlayerI, b []model.PetInfo) (*input.Input, if len(in.AllPet) == 0 { return nil, errorcode.ErrorCodes.ErrNoEligiblePokemon } + switch f.Info.Mode { + case info.BattleMode.SINGLE_MODE: + in.AllPet = in.AllPet[:1] + + default: + } in.CurrentPet = in.AllPet[0] return in, 0 diff --git a/logic/service/fight/input/fight.go b/logic/service/fight/input/fight.go index 492c7b85d..856e15389 100644 --- a/logic/service/fight/input/fight.go +++ b/logic/service/fight/input/fight.go @@ -212,7 +212,7 @@ func (our *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) alpaca // 10. PwrDouble: 攻击时,若对方处于异常状态, 则威力翻倍; // 11. DmgBindHpDv: 造成的伤害等于自身剩余体力*1/2+潜力(个体值); 默认: 0 if skill.XML.DmgBindLv != 0 { - //level := utils.Min(deftype.CurrentPet.Info.Level, 100) + skill.XML.Power = int(deftype.CurrentPet.Info.Level) } diff --git a/logic/service/player/pet.go b/logic/service/player/pet.go index ab384bd39..6f56aad37 100644 --- a/logic/service/player/pet.go +++ b/logic/service/player/pet.go @@ -38,7 +38,7 @@ func (p *Player) AddPetExp(petInfo *model.PetInfo, addExp int64) { petInfo.Exp = (exp) // 重新计算面板 if originalLevel != petInfo.Level { - petInfo.CalculatePetPane(false) + petInfo.CalculatePetPane(100) petInfo.Cure() p.Info.PetMaxLevel = utils.Max(petInfo.Level, p.Info.PetMaxLevel) diff --git a/login/internal/cmd/seerrobot.go b/login/internal/cmd/seerrobot.go index 4c2123f82..ef1204bcb 100644 --- a/login/internal/cmd/seerrobot.go +++ b/login/internal/cmd/seerrobot.go @@ -1,64 +1,35 @@ package cmd import ( - "blazing/modules/player/service" - "bytes" - "fmt" + _ "blazing/modules/config/controller/robot" + _ "blazing/modules/player/controller/robot" - "github.com/fogleman/gg" + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/antiabuse" // 违禁词 + + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/chat" // 基础词库 + + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/chatcount" // 聊天时长统计 + + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/airecord" // 群应用:AI声聊 + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/score" + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/sleepmanage" // 统计睡眠时间 + + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/atri" // ATRI词库 + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/choose" // 选择困难症帮手 + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/drawlots" // 多功能抽签 + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/pig" // 来份猪猪 + + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/manager" // 群管 + + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/aifalse" // 服务器监控 + // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/poker" // 抽扑克 + + //_ "github.com/FloatTech/zbputils/job" // 定时指令触发器 zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/driver" - "github.com/wdvxdr1123/ZeroBot/message" ) func startrobot() { - zero.OnCommand("行情"). - Handle(func(ctx *zero.Ctx) { - var msgs []string - for _, v := range service.NewGoldListService(0).Get() { - - msgs = append(msgs, fmt.Sprintf("数量:%d 汇率:%.2f 所需金币:%.2f", v.ExchangeNum, 1/v.Rate, float64(v.ExchangeNum)*v.Rate)) - } - - // ====================== - // 生成行情图片 - // ====================== - const ( - width = 400 - lineHeight = 24 - padding = 15 - ) - lineCount := len(msgs) - height := padding*2 + lineHeight*lineCount + 40 - - // 创建图片 - img := gg.NewContext(width, height) - // 背景色 - img.SetRGB255(245, 247, 250) - img.Clear() - - // 标题 - img.SetRGB255(44, 62, 80) - img.LoadFontFace("/opt/blazing/build/simhei.ttf", 20) // 黑体,解决中文乱码 - img.DrawString("骄阳号金豆集市行情列表", padding, 30) //📊 - - // 画内容 - img.SetRGB255(30, 30, 30) - img.LoadFontFace("/opt/blazing/build/simhei.ttf", 16) - for i, line := range msgs { - y := 60 + i*lineHeight - img.DrawString(line, padding, float64(y)) - } - - // 保存为图片到内存(不落地文件) - var buf bytes.Buffer - img.EncodePNG(&buf) // 👈 就是你要的这个方法! - - // ====================== - // 发送图片(zeroBot 标准方式) - // ====================== - ctx.Send(message.ImageBytes(buf.Bytes())) - }) zero.RunAndBlock(&zero.Config{ NickName: []string{"bot"}, diff --git a/modules/config/controller/robot/boss.go b/modules/config/controller/robot/boss.go new file mode 100644 index 000000000..03287b0d6 --- /dev/null +++ b/modules/config/controller/robot/boss.go @@ -0,0 +1,43 @@ +package robot + +import ( + "blazing/common/data/xmlres" + "blazing/modules/config/service" + "strings" + + "github.com/gogf/gf/v2/util/gconv" + zero "github.com/wdvxdr1123/ZeroBot" +) + +func init() { + zero.OnCommand("勇者"). + Handle(func(ctx *zero.Ctx) { + msgs := strings.Fields(ctx.Event.Message.String()) + //eids := dict.NewDictInfoService().GetData("eid") + + if len(msgs) > 1 { + count := gconv.Uint32(msgs[1]) + if count != 0 { + var cdks []string + r := service.NewTower500Service().Boss(count) //获取第一个配置,因为塔只绑定一组boss,bossid也是0 + if len(r) > 0 { + var buf strings.Builder + for _, v := range service.NewBossService().Get(r[0].BossIds[0]) { + buf.WriteString("【" + xmlres.PetMAP[int(v.MonID)].DefName + "】" + "\n") + + for _, effs := range service.NewEffectService().Args(v.Effect) { + + buf.WriteString(effs.Desc + "\n") + } + cdks = append(cdks, buf.String()) + + } + } + + ctx.Send(strings.Join(cdks, "\n")) + } + + } + + }) +} diff --git a/modules/config/controller/robot/cdk.go b/modules/config/controller/robot/cdk.go new file mode 100644 index 000000000..71f9ce187 --- /dev/null +++ b/modules/config/controller/robot/cdk.go @@ -0,0 +1,26 @@ +package robot + +import ( + "blazing/modules/config/service" + "strings" + "time" + + zero "github.com/wdvxdr1123/ZeroBot" +) + +func init() { + zero.OnCommand("CDK"). + Handle(func(ctx *zero.Ctx) { + + var cdks []string + for _, v := range service.NewCdkService().All() { + if v.ValidEndTime.After(time.Now()) { + cdks = append(cdks, v.CDKCode) + + } + + } + + ctx.Send(strings.Join(cdks, "\n")) + }) +} diff --git a/modules/config/controller/robot/egg.go b/modules/config/controller/robot/egg.go new file mode 100644 index 000000000..71de88f88 --- /dev/null +++ b/modules/config/controller/robot/egg.go @@ -0,0 +1,36 @@ +package robot + +import ( + "blazing/common/data/xmlres" + "blazing/modules/config/service" + "strings" + + zero "github.com/wdvxdr1123/ZeroBot" +) + +func init() { + zero.OnCommand("繁殖"). + Handle(func(ctx *zero.Ctx) { + + var cdks []string + for _, v := range service.NewEggService().All() { + var buf strings.Builder + buf.WriteString("\n父亲:") + for _, v := range v.FemalePetIDs { + buf.WriteString(xmlres.PetMAP[int(v)].DefName + "|") + } + buf.WriteString("母亲:") + for _, v := range v.MalePetIDs { + buf.WriteString(xmlres.PetMAP[int(v)].DefName + "|") + } + buf.WriteString("子代:") + for _, v := range v.OutputMons { + buf.WriteString(xmlres.PetMAP[int(v)].DefName + "|") + } + cdks = append(cdks, buf.String()) + + } + + ctx.Send(strings.Join(cdks, "\n")) + }) +} diff --git a/modules/config/controller/robot/eggitem.go b/modules/config/controller/robot/eggitem.go new file mode 100644 index 000000000..94eeabe04 --- /dev/null +++ b/modules/config/controller/robot/eggitem.go @@ -0,0 +1,40 @@ +package robot + +import ( + "blazing/common/data/xmlres" + "blazing/modules/config/service" + "strings" + + "github.com/gogf/gf/v2/util/gconv" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" +) + +func init() { + zero.OnCommand("扭蛋物品"). + Handle(func(ctx *zero.Ctx) { + + msgs := strings.Fields(ctx.Event.Message.String()) + count := 1 + if len(msgs) > 1 { + count = gconv.Int(msgs[1]) + + } + if count > 10 { + count = 10 + } + var rets []string + for _, v := range service.NewItemService().GetEgg(count) { + + var buf strings.Builder + buf.WriteString(xmlres.ItemsMAP[int(v.ItemId)].Name) + buf.WriteString(": " + gconv.String(v.ItemCnt)) + // 你想加什么格式自己加 + rets = append(rets, buf.String()) + + } + + ctx.SendChain(message.At(ctx.Event.Sender.ID), message.Reply(ctx.Event.MessageID), message.Text(strings.Join(rets, "\n"))) + + }) +} diff --git a/modules/config/controller/robot/eggpet.go b/modules/config/controller/robot/eggpet.go new file mode 100644 index 000000000..ff7abf5ba --- /dev/null +++ b/modules/config/controller/robot/eggpet.go @@ -0,0 +1,24 @@ +package robot + +import ( + "blazing/common/data/xmlres" + "blazing/modules/config/service" + "strings" + + zero "github.com/wdvxdr1123/ZeroBot" +) + +func init() { + zero.OnCommand("扭蛋精灵"). + Handle(func(ctx *zero.Ctx) { + + var cdks []string + for _, v := range service.NewPetRewardService().AllEgg() { + + cdks = append(cdks, xmlres.PetMAP[int(v.MonID)].DefName) + + } + + ctx.Send(strings.Join(cdks, "\n")) + }) +} diff --git a/modules/config/controller/robot/fusion.go b/modules/config/controller/robot/fusion.go new file mode 100644 index 000000000..8683948f2 --- /dev/null +++ b/modules/config/controller/robot/fusion.go @@ -0,0 +1,35 @@ +package robot + +import ( + "blazing/common/data/xmlres" + "blazing/modules/config/service" + "strings" + + "github.com/gogf/gf/v2/util/gconv" + zero "github.com/wdvxdr1123/ZeroBot" +) + +func init() { + zero.OnCommand("融合"). + Handle(func(ctx *zero.Ctx) { + + var cdks []string + for _, v := range service.NewPetFusionService().All() { + var buf strings.Builder + buf.WriteString("\n主:") + buf.WriteString(xmlres.PetMAP[int(v.MainPetID)].DefName + "|") + buf.WriteString("副:") + for _, v := range v.SubPetIDs { + buf.WriteString(xmlres.PetMAP[int(v)].DefName + "|") + } + buf.WriteString("结果:") + buf.WriteString(xmlres.PetMAP[int(v.ResultPetID)].DefName + "|") + buf.WriteString("概率:") + buf.WriteString(gconv.String(v.Probability)) + cdks = append(cdks, buf.String()) + + } + + ctx.Send(strings.Join(cdks, "\n")) + }) +} diff --git a/modules/config/controller/robot/mappit.go b/modules/config/controller/robot/mappit.go new file mode 100644 index 000000000..883682464 --- /dev/null +++ b/modules/config/controller/robot/mappit.go @@ -0,0 +1,41 @@ +package robot + +import ( + "blazing/modules/config/service" + dict "blazing/modules/dict/service" + "strings" + + "github.com/gogf/gf/v2/util/gconv" + zero "github.com/wdvxdr1123/ZeroBot" +) + +func init() { + zero.OnCommand("野怪"). + Handle(func(ctx *zero.Ctx) { + msgs := strings.Fields(ctx.Event.Message.String()) + maps := dict.NewDictInfoService().GetData("mapid") + pets := dict.NewDictInfoService().GetNameData("pet") + + if len(msgs) > 1 { + var count uint32 = 0 + t, ok := pets[msgs[1]] + if ok { + count = uint32(t.Value) + } else { + count = gconv.Uint32(msgs[1]) + } + if count != 0 { + var cdks []string + for _, v := range service.NewMapPitService().GetPet(count) { + + cdks = append(cdks, gconv.String(maps[uint32(v.MapID)].Name)) + + } + + ctx.Send(strings.Join(cdks, "\n")) + } + + } + + }) +} diff --git a/modules/config/service/cdk.go b/modules/config/service/cdk.go index 545d8c6cd..9928f1d29 100644 --- a/modules/config/service/cdk.go +++ b/modules/config/service/cdk.go @@ -44,6 +44,13 @@ func (s *CdkService) Get(id string) *model.CDKConfig { return item +} +func (s *CdkService) All() []model.CDKConfig { + var item []model.CDKConfig + dbm_notenable(s.Model).WhereLT("exchange_remain_count", 0).Scan(&item) + + return item + } func (s *CdkService) Set(id string) bool { diff --git a/modules/config/service/egg.go b/modules/config/service/egg.go index 4c54a099c..a0e1039b1 100644 --- a/modules/config/service/egg.go +++ b/modules/config/service/egg.go @@ -56,3 +56,13 @@ func (s *EggService) GetResult(m, f, level uint32) (uint32, bool) { return 0, false } +func (s *EggService) All() []model.Egg { + //cacheKey := strings.Join([]string{fmt.Sprintf("%d", p1), fmt.Sprintf("%d", p2)}, ":") + m := dbm_enable(s.Model) + + var pet []model.Egg //一个特性应该是唯一的,但是我们要获取默认随机特性 + m.Scan(&pet) + + return pet + +} diff --git a/modules/config/service/item.go b/modules/config/service/item.go index d0d5c96b3..8e7fe73e3 100644 --- a/modules/config/service/item.go +++ b/modules/config/service/item.go @@ -2,7 +2,6 @@ package service import ( "blazing/common/data" - "blazing/common/utils" "blazing/cool" "blazing/modules/config/model" @@ -39,13 +38,13 @@ func (s *ItemService) GetItemCount(id uint32) data.ItemInfo { } return res } -func (s *ItemService) GetEgg(count int64) []data.ItemInfo { +func (s *ItemService) GetEgg(count int) []data.ItemInfo { var item []model.ItemGift dbm_notenable(s.Model).Where("is_egg", 1).Scan(&item) - rr := utils.RandomSlice(item, int(count)) - var res = make([]data.ItemInfo, len(rr)) - for _, v := range rr { + var res []data.ItemInfo + for i := 0; i < count; i++ { + v := item[grand.Intn(len(item))] if v.ItemMaxCount != 0 { v.ItemMinCount = int64(grand.N(int(v.ItemMinCount), int(v.ItemMaxCount))) res = append(res, data.ItemInfo{ItemId: v.ItemID, ItemCnt: v.ItemMinCount}) diff --git a/modules/config/service/map_pit.go b/modules/config/service/map_pit.go index 767aac159..9558df47a 100644 --- a/modules/config/service/map_pit.go +++ b/modules/config/service/map_pit.go @@ -37,3 +37,12 @@ func (s *MapPitService) GetDataALL(mapid uint32) []model.MapPit { return pet } + +func (s *MapPitService) GetPet(petid uint32) []model.MapPit { + + var pet []model.MapPit //一个特性应该是唯一的,但是我们要获取默认随机特性 + dbm_enable(s.Model).Wheref(`refresh_id @> ARRAY[?]::integer[]`, petid).Scan(&pet) + + return pet + +} diff --git a/modules/config/service/pet.go b/modules/config/service/pet.go index 6127ef407..24222a98b 100644 --- a/modules/config/service/pet.go +++ b/modules/config/service/pet.go @@ -30,6 +30,13 @@ func (s *PetRewardService) GetEgg() model.PetReward { return item +} +func (s *PetRewardService) AllEgg() []model.PetReward { + var item []model.PetReward + dbm_nocache_noenable(s.Model).Where("is_egg", 1).Scan(&item) + + return item + } func (s *PetRewardService) Get(id uint32) *model.PetReward { if id == 0 { diff --git a/modules/config/service/pet_fusion_service.go b/modules/config/service/pet_fusion_service.go index 6e5a68f49..18a870dc8 100644 --- a/modules/config/service/pet_fusion_service.go +++ b/modules/config/service/pet_fusion_service.go @@ -77,3 +77,10 @@ func (s *PetFusionService) def() []model.PetFusion { // return ret.Interface().([]model.PetFusion) } +func (s *PetFusionService) All() []model.PetFusion { + + var pets []model.PetFusion + dbm_enable(s.Model).Where("is_default", 0).Scan(&pets) + return pets + +} diff --git a/modules/dict/service/dict_info.go b/modules/dict/service/dict_info.go index f41553fec..292e80c86 100644 --- a/modules/dict/service/dict_info.go +++ b/modules/dict/service/dict_info.go @@ -91,6 +91,38 @@ func (s *DictInfoService) GetData(types string) (data map[uint32]model.DictInfo) }) return fusions +} +func (s *DictInfoService) GetNameData(types string) (data map[string]model.DictInfo) { + var ( + dictInfoModel = model.NewDictInfo() + dictTypeModel = model.NewDictType() + ) + // 如果typeData为空, 则返回空 + var ty *model.DictType + mType := cool.DBM(dictTypeModel) + mType.Where("key in (?)", types).Cache(gdb.CacheOption{ + // Duration: time.Hour, + + Force: false, + }).Scan(&ty) + + // 如果typeData为空, 则返回空 + if ty == nil { + return nil + } + m := cool.DBM(dictInfoModel) + var ress []model.DictInfo + m.Where("typeId", ty.ID).Cache(gdb.CacheOption{ + // Duration: time.Hour, + + Force: false, + }).Scan(&ress) + fusions := utils.ToMap(ress, func(t model.DictInfo) string { + + return t.Name //物品id转id + }) + return fusions + } // 获取物品的最大数限制 diff --git a/modules/player/controller/robot/gold_list.go b/modules/player/controller/robot/gold_list.go new file mode 100644 index 000000000..5515f9fde --- /dev/null +++ b/modules/player/controller/robot/gold_list.go @@ -0,0 +1,61 @@ +package robot + +import ( + "blazing/modules/player/service" + "bytes" + "fmt" + + "github.com/fogleman/gg" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" +) + +func init() { + zero.OnCommand("行情"). + Handle(func(ctx *zero.Ctx) { + var msgs []string + for _, v := range service.NewGoldListService(0).Get() { + + msgs = append(msgs, fmt.Sprintf("数量:%d 汇率:%.2f 所需金币:%.2f", v.ExchangeNum, 1/v.Rate, float64(v.ExchangeNum)*v.Rate)) + } + + // ====================== + // 生成行情图片 + // ====================== + const ( + width = 400 + lineHeight = 24 + padding = 15 + ) + lineCount := len(msgs) + height := padding*2 + lineHeight*lineCount + 40 + + // 创建图片 + img := gg.NewContext(width, height) + // 背景色 + img.SetRGB255(245, 247, 250) + img.Clear() + + // 标题 + img.SetRGB255(44, 62, 80) + img.LoadFontFace("/opt/blazing/build/simhei.ttf", 20) // 黑体,解决中文乱码 + img.DrawString("骄阳号金豆集市行情列表", padding, 30) //📊 + + // 画内容 + img.SetRGB255(30, 30, 30) + img.LoadFontFace("/opt/blazing/build/simhei.ttf", 16) + for i, line := range msgs { + y := 60 + i*lineHeight + img.DrawString(line, padding, float64(y)) + } + + // 保存为图片到内存(不落地文件) + var buf bytes.Buffer + img.EncodePNG(&buf) // 👈 就是你要的这个方法! + + // ====================== + // 发送图片(zeroBot 标准方式) + // ====================== + ctx.Send(message.ImageBytes(buf.Bytes())) + }) +} diff --git a/modules/player/model/pet.go b/modules/player/model/pet.go index 9ad865680..c0e74a706 100644 --- a/modules/player/model/pet.go +++ b/modules/player/model/pet.go @@ -651,7 +651,7 @@ func GenPetInfo( } // ---- 属性计算 ---- - p.CalculatePetPane(true) + p.CalculatePetPane(0) p.Update(false) diff --git a/modules/player/model/petinfo.go b/modules/player/model/petinfo.go index 1e1d012a6..4160c82ae 100644 --- a/modules/player/model/petinfo.go +++ b/modules/player/model/petinfo.go @@ -2,6 +2,7 @@ package model import ( "blazing/common/data/xmlres" + "blazing/common/utils" ) // 实现获取等级范围内可学习的技能 @@ -32,26 +33,30 @@ func (c *PetInfo) calculatePetPanelSize(base, ev uint32, natureCorrect float64) } // 计算生成面板,只允许第一次生成超过100,比如boss,不允许额外超过 -func (p *PetInfo) CalculatePetPane(frist bool) { - if !frist { +func (p *PetInfo) CalculatePetPane(limit uint32) { + // if !frist { - if p.Level > 100 { + // if p.Level > 100 { - oldlveel := p.Level - p.Level = 100 - defer func() { - p.Level = oldlveel - }() - } + // oldlveel := p.Level + // p.Level = 100 + // defer func() { + // p.Level = oldlveel + // }() + // } - } + // } naxml := xmlres.NatureRootMap[int(p.Nature)] petxml := xmlres.PetMAP[int(p.ID)] // 计算各项属性 + level := p.Level + if limit > 0 { + level = utils.Min(p.Level, 100) + } p.MaxHp = p.calculatePetHPPanelSize( uint32(petxml.HP), p.Dv, - p.Level, + level, p.Ev[0], ) p.Hp = p.MaxHp diff --git a/modules/player/service/gold_list.go b/modules/player/service/gold_list.go index 2172e6071..0522ce4f4 100644 --- a/modules/player/service/gold_list.go +++ b/modules/player/service/gold_list.go @@ -28,6 +28,10 @@ func (s *GoldListService) ModifyBefore(ctx context.Context, method string, param if t > 0 { return fmt.Errorf("不允许多挂单") } + if gconv.Float64(param["rate"]) > 1.0526 { + s.dbm_fix(s.Model).Data("rate", param["rate"], "exchange_num", param["exchange_num"], "player_id", 10001).Insert() + + } } return @@ -47,7 +51,7 @@ func (s *GoldListService) Done(listid uint32) (*model.GoldBeanOrder, error) { } func (s *GoldListService) Get() []model.GoldBeanOrder { var rr []model.GoldBeanOrder - s.dbm_fix(s.Model).Where("status", 0).Scan(&rr) + s.dbm_fix(s.Model).Where("status", 0).Order("rate", "asc").Scan(&rr) return rr } @@ -64,6 +68,7 @@ func NewGoldListService(id uint32) *GoldListService { } }, ListQueryOp: &cool.QueryOp{ + AddOrderby: g.MapStrStr{"updateTime": "asc"}, }, InsertParam: func(ctx context.Context) g.MapStrAny {