From d3062a0240289b3086d752400880c39de8d2954d Mon Sep 17 00:00:00 2001 From: ayflying Date: Thu, 16 Jan 2025 15:57:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cmd=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/make.go | 77 ++++++++++++++++++++++++++++++++++++++++ cmd/make/act | 40 +++++++++++++++++++++ cmd/make/logic | 25 +++++++++++++ cmd/update.go | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 237 insertions(+) create mode 100644 cmd/make.go create mode 100644 cmd/make/act create mode 100644 cmd/make/logic create mode 100644 cmd/update.go diff --git a/cmd/make.go b/cmd/make.go new file mode 100644 index 0000000..404c2af --- /dev/null +++ b/cmd/make.go @@ -0,0 +1,77 @@ +package cmd + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/os/gcmd" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" +) + +var ( + Make = gcmd.Command{ + Name: "make", + Usage: "make", + Brief: "创建模块文件", + Arguments: []gcmd.Argument{ + {Name: "model", Short: "m", Brief: "模块名"}, + {Name: "id", Short: "i", Brief: "活动id"}, + {Name: "name", Short: "n", Brief: "服务文件名"}, + }, + Examples: "make -m=act -id=1: 创建活动1的接口与服务文件 \n" + + "make -m=logic -n=test: 创建test的服务文件", + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + + //g.Dump(parser.GetOptAll(), parser.GetArgAll()) + //return + var model = parser.GetOpt("model").String() + //var name = parser.GetOpt("n").String() + this := cMake{} + switch model { + case "act": + var id = parser.GetOpt("id").Int() + if id == 0 { + return + } + err = this.Act(id) + case "logic": + var name = parser.GetOpt("name").String() + if name == "" { + return + } + err = this.Logic(name) + } + + return + }, + } +) + +type cMake struct{} + +func (c *cMake) Api() { + +} + +func (c *cMake) Act(id int) (err error) { + filePath := fmt.Sprintf("api/act/v1/act%v.go", id) + err = gfile.PutContents(filePath, "package v1\n") + + filePath = fmt.Sprintf("internal/game/act/act%d/act%d.go", id, id) + fileStr := gfile.GetContents("internal/cmd/make/act") + fileStr = gstr.Replace(fileStr, "{id}", gconv.String(id)) + err = gfile.PutContents(filePath, fileStr) + + return +} + +func (c *cMake) Logic(name string) (err error) { + var filePath = fmt.Sprintf("internal/logic/%s/%s.go", name, name) + fileStr := gfile.GetContents("internal/cmd/make/logic") + fileStr = gstr.Replace(fileStr, "{package}", name) + fileStr = gstr.Replace(fileStr, "{name}", gstr.CaseCamel(name)) + + err = gfile.PutContents(filePath, fileStr) + return +} diff --git a/cmd/make/act b/cmd/make/act new file mode 100644 index 0000000..63a90ab --- /dev/null +++ b/cmd/make/act @@ -0,0 +1,40 @@ +package act{id} + +import ( + v1 "game_server/api/act/v1" + "game_server/internal/service" + "github.com/gogf/gf/v2/os/gctx" +) + +type sAct{id} struct { +} + +func New() *sAct{id} { + return &sAct{id}{} +} + +var ( + ActId = {id} + ctx = gctx.New() +) + +type Data struct { +} + +func init() { + +} + +func (s *sAct{id}) GetData(uid int64) (data *Data) { + get, _ := service.GameAct().Info(uid, ActId) + get.Scan(&data) + if get.IsEmpty() || data == nil { + data = &Data{ + } + } + return +} + +func (s *sAct{id}) SetData(uid int64, data interface{}) { + service.GameAct().Set(uid, ActId, data) +} \ No newline at end of file diff --git a/cmd/make/logic b/cmd/make/logic new file mode 100644 index 0000000..d0fa212 --- /dev/null +++ b/cmd/make/logic @@ -0,0 +1,25 @@ +package {package} + +import ( + "game_server/internal/service" + "github.com/gogf/gf/v2/os/gctx" +) + +type s{name} struct { +} + +var ( + ctx = gctx.New() +) + +func New() *s{name} { + return &s{name}{} +} + +func init() { + service.Register{name}(New()) +} + +func (s *s{name}) Info() { + +} \ No newline at end of file diff --git a/cmd/update.go b/cmd/update.go new file mode 100644 index 0000000..57e16e4 --- /dev/null +++ b/cmd/update.go @@ -0,0 +1,95 @@ +package cmd + +import ( + "context" + "github.com/ayflying/utility_go/s3" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gcfg" + "github.com/gogf/gf/v2/os/gcmd" + "os" + "time" +) + +type serverCfg struct { + Name string `json:"name" dc:"服务名"` + Address string `json:"address" dc:"服务地址"` + Prod bool `json:"prod" dc:"是否生产环境"` +} + +type UpdateReq struct { + File *ghttp.UploadFile `json:"file" binding:"required" dc:"文件"` + FileUrl string `json:"file_url" dc:"文件地址"` +} + +var ( + Update = gcmd.Command{ + Name: "update", + Usage: "update", + Brief: "更新系统", + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + + g.Log().Info(ctx, "准备上传更新文件") + //加载编辑配置文件 + g.Cfg("hack").GetAdapter().(*gcfg.AdapterFile).SetFileName("hack/config.yaml") + getFileName, err := g.Cfg("hack").Get(ctx, "gfcli.build.name") + + var list []*serverCfg + serverList := g.Cfg().MustGet(ctx, "server_list") + serverList.Scan(&list) + + //如果有p或者prod参数,则删除prod字段为true的服务 + if parser.GetOpt("a").IsNil() { + var temp []*serverCfg + for _, v := range list { + if v.Prod == false { + temp = append(temp, v) + } + } + list = temp + } else { + g.Dump("升级", parser.GetOpt("a")) + } + + g.Dump("需要更新的服务器", list) + + filename := "linux_amd64/shining_u_server" + obj, err := os.Open(filename) + ff, err := obj.Stat() + var s3Mod *s3.Mod + //切换s3目标 + updateServerS3Name, _ := g.Config().Get(ctx, "update_server_s3_name") + if updateServerS3Name != nil { + s3Mod = s3.New(updateServerS3Name.String()) + } else { + s3Mod = s3.New("default") + } + bucketName := s3Mod.GetCfg().BucketName + + _, err = s3Mod.PutObject(obj, getFileName.String(), bucketName, ff.Size()) + if err != nil { + return err + } + + //上传当前文件 + url, err := s3Mod.GetFileUrl(getFileName.String(), bucketName) + g.Log().Debugf(ctx, "下载地址:%v", url) + + //循环服务器,推送更新 + for _, v := range list { + address := v.Address + g.Log().Debugf(ctx, "准备同步服务器:%v,url=%v", v.Name, address+"/callback/update") + get, err := g.Client().Discovery(nil).Timeout(time.Minute*1).Post(ctx, address+"/callback/update", &UpdateReq{ + FileUrl: url.String(), + }) + if err != nil { + g.Log().Error(ctx, err) + } + defer get.Close() + g.Log().Debugf(ctx, "同步服务器:%v,完成=%v", v.Name, address) + } + + return + }, + } +)