Blame view

models/role.go 5.49 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 {
1584eb4b   zhangqijia   修复创建唯一索引的bug
25
26
  	data := &pb.Role{Uid: uid}
  
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 {
1584eb4b   zhangqijia   修复创建唯一索引的bug
45
  	data := &pb.Role{Id: id}
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
64
65
66
  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)
  	return v + common.MaxCommNum
  }
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
67
  func (m *RoleModel) InitRole() {
8d983031   zhangqijia   loginReq uid -> t...
68
69
  	//init hero
  	h1 := pb.Hero{
101d1cc1   zhangqijia   feat: 一个基于redis的自...
70
  		Id:         fmt.Sprintf("%s%d", m.Role.Id, m.IncreByKey("hero", 1)),
6f0d72bd   zhangqijia   定时器功能完善优化
71
72
73
74
75
  		RoleId:     m.Role.Id,
  		Type:       1,
  		Level:      1,
  		ReinCount:  0,
  		ReinPoint:  0,
8d983031   zhangqijia   loginReq uid -> t...
76
  		Equipments: "",
6f0d72bd   zhangqijia   定时器功能完善优化
77
  	}
8d983031   zhangqijia   loginReq uid -> t...
78
79
80
  	m.AddHero(&h1)
  
  	h2 := h1
101d1cc1   zhangqijia   feat: 一个基于redis的自...
81
  	h2.Id = fmt.Sprintf("%s%d", m.Role.Id, m.IncreByKey("hero", 1))
8d983031   zhangqijia   loginReq uid -> t...
82
83
84
85
  	h2.Type = 2
  	m.AddHero(&h2)
  
  	h3 := h1
101d1cc1   zhangqijia   feat: 一个基于redis的自...
86
  	h3.Id = fmt.Sprintf("%s%d", m.Role.Id, m.IncreByKey("hero", 1))
8d983031   zhangqijia   loginReq uid -> t...
87
88
89
90
  	h3.Type = 3
  	m.AddHero(&h3)
  
  	h4 := h1
101d1cc1   zhangqijia   feat: 一个基于redis的自...
91
  	h4.Id = fmt.Sprintf("%s%d", m.Role.Id, m.IncreByKey("hero", 1))
8d983031   zhangqijia   loginReq uid -> t...
92
93
94
95
96
  	h4.Type = 4
  	m.AddHero(&h4)
  
  	//init team
  	t1 := pb.Team{
101d1cc1   zhangqijia   feat: 一个基于redis的自...
97
  		Id:      fmt.Sprintf("%s%d", m.Role.Id, m.IncreByKey("team", 1)),
8d983031   zhangqijia   loginReq uid -> t...
98
99
100
101
102
103
104
105
  		RoleId:  m.Role.Id,
  		HeroId1: h1.Id,
  		HeroId2: h2.Id,
  		HeroId3: h3.Id,
  	}
  	m.AddTeam(&t1)
  
  	t2 := t1
101d1cc1   zhangqijia   feat: 一个基于redis的自...
106
  	t2.Id = fmt.Sprintf("%s%d", m.Role.Id, m.IncreByKey("team", 1))
8d983031   zhangqijia   loginReq uid -> t...
107
108
109
  	m.AddTeam(&t2)
  
  	t3 := t1
101d1cc1   zhangqijia   feat: 一个基于redis的自...
110
  	t3.Id = fmt.Sprintf("%s%d", m.Role.Id, m.IncreByKey("team", 1))
8d983031   zhangqijia   loginReq uid -> t...
111
112
113
  	m.AddTeam(&t3)
  
  	t4 := t1
101d1cc1   zhangqijia   feat: 一个基于redis的自...
114
  	t4.Id = fmt.Sprintf("%s%d", m.Role.Id, m.IncreByKey("team", 1))
8d983031   zhangqijia   loginReq uid -> t...
115
  	m.AddTeam(&t4)
ee23102d   zhangqijia   支持mongo, grpc接服务器
116
  }
eb417b0b   zhangqijia   reactor mongo
117
  
8d983031   zhangqijia   loginReq uid -> t...
118
119
  func (m *RoleModel) LoadHero() {
  	heros := make([]*pb.Hero, 10)
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
120
  	err := mongoproxy.FindMany("hero", "roleid", m.Role.Id, &heros)
8d983031   zhangqijia   loginReq uid -> t...
121
122
123
124
125
126
  	if err != nil {
  		logger.Error(err)
  		return
  	}
  	for _, hero := range heros {
  		m.Heros[hero.Id] = NewHero(hero)
6f0d72bd   zhangqijia   定时器功能完善优化
127
128
129
  	}
  }
  
8d983031   zhangqijia   loginReq uid -> t...
130
131
  func (m *RoleModel) LoadTeams() {
  	teams := make([]*pb.Team, 4)
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
132
  	err := mongoproxy.FindMany("team", "roleid", m.Role.Id, &teams)
8d983031   zhangqijia   loginReq uid -> t...
133
134
135
136
  	if err != nil {
  		logger.Error(err)
  		return
  	}
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
137
  	for _, team := range teams {
8d983031   zhangqijia   loginReq uid -> t...
138
  		m.Teams[team.Id] = NewTeam(team)
6f0d72bd   zhangqijia   定时器功能完善优化
139
140
141
  	}
  }
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
142
  func (m *RoleModel) LoadAll() {
6f0d72bd   zhangqijia   定时器功能完善优化
143
144
  	m.LoadHero()
  	m.LoadTeams()
eb417b0b   zhangqijia   reactor mongo
145
146
  }
  
4255fd8e   zhangqijia   feat: 更新字段
147
  func (m *RoleModel) UpdateProperty(conn components.IConnection, key string, val interface{}, notify bool) {
d771e9e3   zhangqijia   fix: 优化FieldByNam...
148
  	m.UpdateProperties(conn, map[string]interface{}{key: val}, notify)
4255fd8e   zhangqijia   feat: 更新字段
149
150
151
152
153
154
155
  }
  
  func (m *RoleModel) UpdateProperties(conn components.IConnection, property map[string]interface{}, notify bool) {
  	if len(property) < 1 {
  		return
  	}
  
d771e9e3   zhangqijia   fix: 优化FieldByNam...
156
  	role := &pb.Role{}
4255fd8e   zhangqijia   feat: 更新字段
157
158
159
160
161
162
163
  	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...
164
  		Id:   ids,
4255fd8e   zhangqijia   feat: 更新字段
165
166
167
168
169
  		Role: role,
  	}
  	if rsp, err := proto.Marshal(update); err != nil {
  		logger.Error("id %s, err:", m.Role.Id, err)
  		return
d771e9e3   zhangqijia   fix: 优化FieldByNam...
170
  	} else {
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
171
  		if conn != nil && notify {
d771e9e3   zhangqijia   fix: 优化FieldByNam...
172
173
  			conn.Send(0, uint32(pb.ProtoCode_UpdateRolePropertyRsp), rsp)
  		}
4255fd8e   zhangqijia   feat: 更新字段
174
  	}
7f269318   zhangqijia   add pb.go; 添加关闭连接...
175
176
  }
  
2e0aa298   zhangqijia   update 每条连接新增一条协程...
177
178
179
  func (m *RoleModel) GetAllHero() []*pb.Hero {
  	var h []*pb.Hero
  	for _, hero := range m.Heros {
8d983031   zhangqijia   loginReq uid -> t...
180
  		h = append(h, hero.(*HeroModel).Hero)
6f0d72bd   zhangqijia   定时器功能完善优化
181
182
183
  	}
  	return h
  }
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
184
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
185
  func (m *RoleModel) GetAllTeam() []*pb.Team {
8d983031   zhangqijia   loginReq uid -> t...
186
  	var t []*pb.Team
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
187
188
  	for _, team := range m.Teams {
  		t = append(t, team.(*TeamModel).Team)
8d983031   zhangqijia   loginReq uid -> t...
189
190
191
192
  	}
  	return t
  }
  
8d983031   zhangqijia   loginReq uid -> t...
193
194
  func (m *RoleModel) AddHero(hero *pb.Hero) {
  	h := NewHero(hero)
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
195
  	h.Create()
8d983031   zhangqijia   loginReq uid -> t...
196
197
198
199
200
201
202
203
204
  	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: 增加上阵下阵协议,增加...
205
206
207
208
209
210
211
212
213
214
  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 在一条...
215
  func (m *RoleModel) OnRecoverTimer(now int64) {
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
216
  	m.SaveRoleData(now)
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
217
218
  }
  
7f269318   zhangqijia   add pb.go; 添加关闭连接...
219
220
  func (m *RoleModel) OnOfflineEvent() {
  	// 设置最新的登录时间
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
221
  	m.SaveRoleData(common.Timex())
7f269318   zhangqijia   add pb.go; 添加关闭连接...
222
223
  }
  
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
224
225
  func (m *RoleModel) SaveRoleData(now int64) {
  	if now > 0 && now-m.lastSaveTs < common.SaveDataInterval {
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
226
227
228
229
  		return
  	}
  	atomic.StoreInt64(&m.lastSaveTs, now)
  	m.Update()
8d983031   zhangqijia   loginReq uid -> t...
230
231
232
233
234
235
236
237
  
  	tbObjs := []components.ISchema{}
  	for _, tbObj := range tbObjs {
  		if tbObj != nil {
  			tbObj.Update()
  		}
  	}
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
238
239
240
241
242
243
244
245
246
  	mpObjs := []SchemaMap{m.Heros, m.Teams}
  	for _, mpObj := range mpObjs {
  		for _, v := range mpObj {
  			if v != nil {
  				v.Update()
  			}
  		}
  	}
  }
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  
  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)
  	}
  
  }