Merge branch 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful

This commit is contained in:
昔念
2026-03-24 11:56:42 +08:00
35 changed files with 498 additions and 116 deletions

View File

@@ -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) //获取第一个配置因为塔只绑定一组bossbossid也是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"))
}
}
})
}

View File

@@ -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"))
})
}

View File

@@ -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"))
})
}

View File

@@ -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")))
})
}

View File

@@ -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"))
})
}

View File

@@ -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"))
})
}

View File

@@ -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"))
}
}
})
}

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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})

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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
}
// 获取物品的最大数限制

View File

@@ -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()))
})
}

View File

@@ -651,7 +651,7 @@ func GenPetInfo(
}
// ---- 属性计算 ----
p.CalculatePetPane(true)
p.CalculatePetPane(0)
p.Update(false)

View File

@@ -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

View File

@@ -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 {