Blame view

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