From 1402b854c617af0217f25ff49099b650959b7d3f Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 12 Mar 2024 15:34:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20modular=20=E5=8C=85=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20dimension=20=E6=A6=82=E5=BF=B5=EF=BC=8C=E9=80=82=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E6=A0=B9=E6=8D=AE=E7=89=B9=E5=AE=9A=E5=AE=BF=E4=B8=BB?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=A8=A1=E5=9D=97=E5=8C=96=EF=BC=8C=E4=BE=8B?= =?UTF-8?q?=E5=A6=82=E6=88=BF=E9=97=B4=E4=B8=8E=E6=88=BF=E9=97=B4=E4=B9=8B?= =?UTF-8?q?=E9=97=B4=E7=9A=84=E5=90=84=E7=BB=84=E4=BB=B6=E7=9B=B8=E4=BA=92?= =?UTF-8?q?=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modular/dimension.go | 40 ++++++++++++ .../example/internal/dimension/core/events.go | 4 ++ .../example/internal/dimension/core/room.go | 9 +++ .../example/internal/dimension/dimension.go | 20 ++++++ .../dimensions/visitors/visitors.go | 64 +++++++++++++++++++ .../dimension/dimensions/exposes/visitors.go | 27 ++++++++ .../dimension/dimensions/models/visitors.go | 7 ++ modular/example/main.go | 7 ++ 8 files changed, 178 insertions(+) create mode 100644 modular/dimension.go create mode 100644 modular/example/internal/dimension/core/events.go create mode 100644 modular/example/internal/dimension/core/room.go create mode 100644 modular/example/internal/dimension/dimension.go create mode 100644 modular/example/internal/dimension/dimensions/dimensions/visitors/visitors.go create mode 100644 modular/example/internal/dimension/dimensions/exposes/visitors.go create mode 100644 modular/example/internal/dimension/dimensions/models/visitors.go diff --git a/modular/dimension.go b/modular/dimension.go new file mode 100644 index 0000000..0c98e8c --- /dev/null +++ b/modular/dimension.go @@ -0,0 +1,40 @@ +package modular + +// Dimension 维度接口 +// - 维度与服务的区别在于,维度是对非全局性的服务进行抽象,例如:依赖特定游戏房间的局内玩家管理服务 +type Dimension[Owner any] interface { + // OnInit 服务初始化阶段,该阶段不应该依赖其他任何服务 + OnInit(owner Owner) error + + // OnPreload 预加载阶段,在进入该阶段时,所有服务已经初始化完成,可在该阶段注入其他服务的依赖 + OnPreload() error + + // OnMount 挂载阶段,该阶段所有服务本身及依赖的服务都已经初始化完成,可在该阶段进行服务功能的定义 + OnMount() error +} + +// RunDimensions 运行维度 +func RunDimensions[Owner any](owner Owner, dimensions ...Dimension[Owner]) error { + // OnInit + for _, dimension := range dimensions { + if err := dimension.OnInit(owner); err != nil { + return err + } + } + + // OnPreload + for _, dimension := range dimensions { + if err := dimension.OnPreload(); err != nil { + return err + } + } + + // OnMount + for _, dimension := range dimensions { + if err := dimension.OnMount(); err != nil { + return err + } + } + + return nil +} diff --git a/modular/example/internal/dimension/core/events.go b/modular/example/internal/dimension/core/events.go new file mode 100644 index 0000000..f6f5f6f --- /dev/null +++ b/modular/example/internal/dimension/core/events.go @@ -0,0 +1,4 @@ +package core + +type Events struct { +} diff --git a/modular/example/internal/dimension/core/room.go b/modular/example/internal/dimension/core/room.go new file mode 100644 index 0000000..dbf7899 --- /dev/null +++ b/modular/example/internal/dimension/core/room.go @@ -0,0 +1,9 @@ +package core + +import "github.com/kercylan98/minotaur/modular/example/internal/dimension/dimensions/exposes" + +type Room struct { + RoomId int64 + *Events + exposes.VisitorsExpose +} diff --git a/modular/example/internal/dimension/dimension.go b/modular/example/internal/dimension/dimension.go new file mode 100644 index 0000000..5f75d6f --- /dev/null +++ b/modular/example/internal/dimension/dimension.go @@ -0,0 +1,20 @@ +package dimension + +import ( + "github.com/kercylan98/minotaur/modular" + "github.com/kercylan98/minotaur/modular/example/internal/dimension/core" + "github.com/kercylan98/minotaur/modular/example/internal/dimension/dimensions/dimensions/visitors" +) + +func New(roomId int64) error { + visitorsDimension := new(visitors.Dimension) + + return modular.RunDimensions(&core.Room{ + RoomId: roomId, + Events: &core.Events{}, + + VisitorsExpose: visitorsDimension, + }, + visitorsDimension, + ) +} diff --git a/modular/example/internal/dimension/dimensions/dimensions/visitors/visitors.go b/modular/example/internal/dimension/dimensions/dimensions/visitors/visitors.go new file mode 100644 index 0000000..0e1a91f --- /dev/null +++ b/modular/example/internal/dimension/dimensions/dimensions/visitors/visitors.go @@ -0,0 +1,64 @@ +package visitors + +import ( + "fmt" + "github.com/kercylan98/minotaur/modular/example/internal/dimension/core" + "github.com/kercylan98/minotaur/modular/example/internal/dimension/dimensions/exposes" + "github.com/kercylan98/minotaur/modular/example/internal/dimension/dimensions/models" + "github.com/kercylan98/minotaur/utils/collection" +) + +type Dimension struct { + *core.Room // 房间 Id + visitors map[string]*models.VisitorsMember // 所有访客 + visitorIds []string // 所有访客 OpenId +} + +func (d *Dimension) OnInit(owner *core.Room) error { + exposes.Visitors = d + d.Room = owner + d.visitors = make(map[string]*models.VisitorsMember) + fmt.Println("visitors dimension initialized") + return nil +} + +func (d *Dimension) OnPreload() error { + fmt.Println("visitors dimension preloaded") + return nil +} + +func (d *Dimension) OnMount() error { + fmt.Println("visitors dimension mounted") + return nil +} + +func (d *Dimension) Count() int { + return len(d.visitors) +} + +func (d *Dimension) OpenIds() []string { + return d.visitorIds +} + +func (d *Dimension) Has(openId string) bool { + return collection.KeyInMap(d.visitors, openId) +} + +func (d *Dimension) Del(openId string) { + member := d.Get(openId) + if member == nil { + return + } + delete(d.visitors, openId) + collection.DropSliceByIndices(&d.visitorIds, member.OpenIdIdx) +} + +func (d *Dimension) Get(openId string) *models.VisitorsMember { + return d.visitors[openId] +} + +func (d *Dimension) Add(member *models.VisitorsMember) { + member.OpenIdIdx = len(d.visitorIds) + d.visitorIds = append(d.visitorIds, member.OpenId) + d.visitors[member.OpenId] = member +} diff --git a/modular/example/internal/dimension/dimensions/exposes/visitors.go b/modular/example/internal/dimension/dimensions/exposes/visitors.go new file mode 100644 index 0000000..f21281c --- /dev/null +++ b/modular/example/internal/dimension/dimensions/exposes/visitors.go @@ -0,0 +1,27 @@ +package exposes + +import ( + "github.com/kercylan98/minotaur/modular/example/internal/dimension/dimensions/models" +) + +var Visitors VisitorsExpose + +type VisitorsExpose interface { + // Count 访客数量 + Count() int + + // OpenIds 访客 OpenId 列表 + OpenIds() []string + + // Has 是否存在指定 OpenId 的访客 + Has(openId string) bool + + // Del 删除指定 OpenId 的访客 + Del(openId string) + + // Get 获取指定 OpenId 的访客 + Get(openId string) *models.VisitorsMember + + // Add 添加访客 + Add(member *models.VisitorsMember) +} diff --git a/modular/example/internal/dimension/dimensions/models/visitors.go b/modular/example/internal/dimension/dimensions/models/visitors.go new file mode 100644 index 0000000..20592bc --- /dev/null +++ b/modular/example/internal/dimension/dimensions/models/visitors.go @@ -0,0 +1,7 @@ +package models + +// VisitorsMember 访客成员 +type VisitorsMember struct { + OpenId string // 访客成员 OpenId + OpenIdIdx int // 访客成员 OpenId 索引 +} diff --git a/modular/example/main.go b/modular/example/main.go index 3ff1e99..683a19b 100644 --- a/modular/example/main.go +++ b/modular/example/main.go @@ -2,6 +2,7 @@ package main import ( "github.com/kercylan98/minotaur/modular" + "github.com/kercylan98/minotaur/modular/example/internal/dimension" "github.com/kercylan98/minotaur/modular/example/internal/service/services/attack" "github.com/kercylan98/minotaur/modular/example/internal/service/services/login" "github.com/kercylan98/minotaur/modular/example/internal/service/services/server" @@ -13,5 +14,11 @@ func main() { new(server.Service), new(login.Service), ) + + err := dimension.New(1) // generate a room + if err != nil { + panic(err) + } + modular.Run() }