Blame view

models/role.go 5.05 KB
ee23102d   zhangqijia   支持mongo, grpc接服务器
1
2
3
  package models
  
  import (
4255fd8e   zhangqijia   feat: 更新字段
4
  	"github.com/golang/protobuf/proto"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
5
  	"pro2d/common"
8d983031   zhangqijia   loginReq uid -> t...
6
  	"pro2d/common/components"
436e0af4   zhangqijia   reactor: dir; Ac...
7
  	"pro2d/common/db/mongoproxy"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
8
  	"pro2d/common/logger"
7f269318   zhangqijia   add pb.go; 添加关闭连接...
9
  	"pro2d/pb"
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
10
  	"sync/atomic"
ee23102d   zhangqijia   支持mongo, grpc接服务器
11
12
13
  )
  
  type RoleModel struct {
8d983031   zhangqijia   loginReq uid -> t...
14
  	components.ISchema
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
15
  	Role  *pb.Role
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
16
17
  	Heros SchemaMap
  	Teams SchemaMap
765431a4   zhangqijia   增加schema接口, 抽象 mo...
18
  	Prop  *PropModel
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
19
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
20
  	lastSaveTs int64
ee23102d   zhangqijia   支持mongo, grpc接服务器
21
22
  }
  
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
23
  func RoleExistByUid(uid string) *RoleModel {
1584eb4b   zhangqijia   修复创建唯一索引的bug
24
25
  	data := &pb.Role{Uid: uid}
  
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
26
  	if err := mongoproxy.FindOne(mongoproxy.GetCollName(data), mongoproxy.GetBsonM("uid", uid), data); err != nil {
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
27
  		logger.Error("Role not exist err: %v", err)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
28
  		return nil
ee23102d   zhangqijia   支持mongo, grpc接服务器
29
  	}
f7f4beb5   zhangqijia   新增grpc平滑关闭,修复crea...
30
  
6f0d72bd   zhangqijia   定时器功能完善优化
31
  	r := &RoleModel{
8d983031   zhangqijia   loginReq uid -> t...
32
  		ISchema: NewSchema(data.Id, data),
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
33
34
35
36
  		Role:    data,
  		Heros:   make(SchemaMap),
  		Teams:   make(SchemaMap),
  		Prop:    new(PropModel),
f7f4beb5   zhangqijia   新增grpc平滑关闭,修复crea...
37
  	}
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
38
  	r.Load()
6f0d72bd   zhangqijia   定时器功能完善优化
39
40
  	r.LoadAll()
  	return r
ee23102d   zhangqijia   支持mongo, grpc接服务器
41
42
  }
  
33ea26ab   zhangqijia   使用schema封装mongo
43
  func NewRole(id string) *RoleModel {
1584eb4b   zhangqijia   修复创建唯一索引的bug
44
  	data := &pb.Role{Id: id}
ee23102d   zhangqijia   支持mongo, grpc接服务器
45
  	m := &RoleModel{
8d983031   zhangqijia   loginReq uid -> t...
46
  		ISchema: NewSchema(id, data),
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
47
48
49
  		Role:    data,
  		Heros:   make(SchemaMap),
  		Teams:   make(SchemaMap),
ee23102d   zhangqijia   支持mongo, grpc接服务器
50
  	}
ee23102d   zhangqijia   支持mongo, grpc接服务器
51
52
53
  	return m
  }
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
54
  func (m *RoleModel) InitRole() {
8d983031   zhangqijia   loginReq uid -> t...
55
56
57
  	//init hero
  	h1 := pb.Hero{
  		Id:         common.SnowFlack.NextValStr(),
6f0d72bd   zhangqijia   定时器功能完善优化
58
59
60
61
62
  		RoleId:     m.Role.Id,
  		Type:       1,
  		Level:      1,
  		ReinCount:  0,
  		ReinPoint:  0,
8d983031   zhangqijia   loginReq uid -> t...
63
  		Equipments: "",
6f0d72bd   zhangqijia   定时器功能完善优化
64
  	}
8d983031   zhangqijia   loginReq uid -> t...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  	m.AddHero(&h1)
  
  	h2 := h1
  	h2.Id = common.SnowFlack.NextValStr()
  	h2.Type = 2
  	m.AddHero(&h2)
  
  	h3 := h1
  	h3.Id = common.SnowFlack.NextValStr()
  	h3.Type = 3
  	m.AddHero(&h3)
  
  	h4 := h1
  	h4.Id = common.SnowFlack.NextValStr()
  	h4.Type = 4
  	m.AddHero(&h4)
  
  	//init team
  	t1 := pb.Team{
  		Id:      common.SnowFlack.NextValStr(),
  		RoleId:  m.Role.Id,
  		HeroId1: h1.Id,
  		HeroId2: h2.Id,
  		HeroId3: h3.Id,
  	}
  	m.AddTeam(&t1)
  
  	t2 := t1
  	t2.Id = common.SnowFlack.NextValStr()
  	m.AddTeam(&t2)
  
  	t3 := t1
  	t3.Id = common.SnowFlack.NextValStr()
  	m.AddTeam(&t3)
  
  	t4 := t1
  	t4.Id = common.SnowFlack.NextValStr()
  	m.AddTeam(&t4)
ee23102d   zhangqijia   支持mongo, grpc接服务器
103
  }
eb417b0b   zhangqijia   reactor mongo
104
  
8d983031   zhangqijia   loginReq uid -> t...
105
106
  func (m *RoleModel) LoadHero() {
  	heros := make([]*pb.Hero, 10)
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
107
  	err := mongoproxy.FindMany("hero", "roleid", m.Role.Id, &heros)
8d983031   zhangqijia   loginReq uid -> t...
108
109
110
111
112
113
  	if err != nil {
  		logger.Error(err)
  		return
  	}
  	for _, hero := range heros {
  		m.Heros[hero.Id] = NewHero(hero)
6f0d72bd   zhangqijia   定时器功能完善优化
114
115
116
  	}
  }
  
8d983031   zhangqijia   loginReq uid -> t...
117
118
  func (m *RoleModel) LoadTeams() {
  	teams := make([]*pb.Team, 4)
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
119
  	err := mongoproxy.FindMany("team", "roleid", m.Role.Id, &teams)
8d983031   zhangqijia   loginReq uid -> t...
120
121
122
123
  	if err != nil {
  		logger.Error(err)
  		return
  	}
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
124
  	for _, team := range teams {
8d983031   zhangqijia   loginReq uid -> t...
125
  		m.Teams[team.Id] = NewTeam(team)
6f0d72bd   zhangqijia   定时器功能完善优化
126
127
128
  	}
  }
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
129
  func (m *RoleModel) LoadAll() {
6f0d72bd   zhangqijia   定时器功能完善优化
130
131
  	m.LoadHero()
  	m.LoadTeams()
eb417b0b   zhangqijia   reactor mongo
132
133
  }
  
4255fd8e   zhangqijia   feat: 更新字段
134
  func (m *RoleModel) UpdateProperty(conn components.IConnection, key string, val interface{}, notify bool) {
d771e9e3   zhangqijia   fix: 优化FieldByNam...
135
  	m.UpdateProperties(conn, map[string]interface{}{key: val}, notify)
4255fd8e   zhangqijia   feat: 更新字段
136
137
138
139
140
141
142
  }
  
  func (m *RoleModel) UpdateProperties(conn components.IConnection, property map[string]interface{}, notify bool) {
  	if len(property) < 1 {
  		return
  	}
  
d771e9e3   zhangqijia   fix: 优化FieldByNam...
143
  	role := &pb.Role{}
4255fd8e   zhangqijia   feat: 更新字段
144
145
146
147
148
149
150
  	ids := m.ParseFields(role.ProtoReflect(), property)
  	if len(ids) == 0 {
  		logger.Error("ParseFields err, len is 0")
  		return
  	}
  
  	update := &pb.UpdateRolePropertyRsp{
d771e9e3   zhangqijia   fix: 优化FieldByNam...
151
  		Id:   ids,
4255fd8e   zhangqijia   feat: 更新字段
152
153
154
155
156
  		Role: role,
  	}
  	if rsp, err := proto.Marshal(update); err != nil {
  		logger.Error("id %s, err:", m.Role.Id, err)
  		return
d771e9e3   zhangqijia   fix: 优化FieldByNam...
157
  	} else {
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
158
  		if conn != nil && notify {
d771e9e3   zhangqijia   fix: 优化FieldByNam...
159
160
  			conn.Send(0, uint32(pb.ProtoCode_UpdateRolePropertyRsp), rsp)
  		}
4255fd8e   zhangqijia   feat: 更新字段
161
  	}
7f269318   zhangqijia   add pb.go; 添加关闭连接...
162
163
  }
  
2e0aa298   zhangqijia   update 每条连接新增一条协程...
164
165
166
  func (m *RoleModel) GetAllHero() []*pb.Hero {
  	var h []*pb.Hero
  	for _, hero := range m.Heros {
8d983031   zhangqijia   loginReq uid -> t...
167
  		h = append(h, hero.(*HeroModel).Hero)
6f0d72bd   zhangqijia   定时器功能完善优化
168
169
170
  	}
  	return h
  }
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
171
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
172
  func (m *RoleModel) GetAllTeam() []*pb.Team {
8d983031   zhangqijia   loginReq uid -> t...
173
  	var t []*pb.Team
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
174
175
  	for _, team := range m.Teams {
  		t = append(t, team.(*TeamModel).Team)
8d983031   zhangqijia   loginReq uid -> t...
176
177
178
179
  	}
  	return t
  }
  
8d983031   zhangqijia   loginReq uid -> t...
180
181
  func (m *RoleModel) AddHero(hero *pb.Hero) {
  	h := NewHero(hero)
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
182
  	h.Create()
8d983031   zhangqijia   loginReq uid -> t...
183
184
185
186
187
188
189
190
191
  	m.Heros[hero.Id] = h
  }
  
  func (m *RoleModel) AddTeam(team *pb.Team) {
  	t := NewTeam(team)
  	t.Create()
  	m.Teams[team.Id] = t
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
192
193
194
195
196
197
198
199
200
201
  func (m *RoleModel) UpdateTeam(teams []*pb.Team) {
  	for _, team := range teams {
  		team.RoleId = m.Role.Id
  		t := m.Teams[team.Id]
  		if t != nil {
  			t.UpdateSchema(team)
  		}
  	}
  }
  
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
202
  func (m *RoleModel) OnRecoverTimer(now int64) {
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
203
  	m.SaveRoleData(now)
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
204
205
  }
  
7f269318   zhangqijia   add pb.go; 添加关闭连接...
206
207
  func (m *RoleModel) OnOfflineEvent() {
  	// 设置最新的登录时间
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
208
  	m.SaveRoleData(common.Timex())
7f269318   zhangqijia   add pb.go; 添加关闭连接...
209
210
  }
  
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
211
212
  func (m *RoleModel) SaveRoleData(now int64) {
  	if now > 0 && now-m.lastSaveTs < common.SaveDataInterval {
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
213
214
215
216
  		return
  	}
  	atomic.StoreInt64(&m.lastSaveTs, now)
  	m.Update()
8d983031   zhangqijia   loginReq uid -> t...
217
218
219
220
221
222
223
224
  
  	tbObjs := []components.ISchema{}
  	for _, tbObj := range tbObjs {
  		if tbObj != nil {
  			tbObj.Update()
  		}
  	}
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
225
226
227
228
229
230
231
232
233
  	mpObjs := []SchemaMap{m.Heros, m.Teams}
  	for _, mpObj := range mpObjs {
  		for _, v := range mpObj {
  			if v != nil {
  				v.Update()
  			}
  		}
  	}
  }
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
  
  func (m *RoleModel) IncrPropertyChan(conn components.IConnection, key string, val int64) {
  	if conn != nil {
  		conn.CustomChan() <- func() {
  			m.IncrProperty(key, val)
  		}
  	} else {
  		m.IncrProperty(key, val)
  	}
  
  }
  
  func (m *RoleModel) UpdatePropertyChan(conn components.IConnection, key string, val interface{}, notify bool) {
  	if conn != nil {
  		conn.CustomChan() <- func() {
  			m.UpdateProperties(conn, map[string]interface{}{key: val}, notify)
  		}
  	} else {
  		m.UpdateProperties(conn, map[string]interface{}{key: val}, notify)
  	}
  }
  
  func (m *RoleModel) SaveRoleDataChan(conn components.IConnection, now int64) {
  	if conn != nil {
  		conn.CustomChan() <- func() {
  			m.SaveRoleData(now)
  		}
  	} else {
  		m.SaveRoleData(now)
  	}
  
  }