mail_handler.go
8.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
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
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
package mail
import (
"strconv"
"common/logger"
"common/beegomap"
"World/resume"
"encoding/json"
"time"
"sort"
"World/pb"
)
//todo..
//系统邮件存储格式给hashmap key为SYS_MAIL_KEY field为mailid value为json格式的邮件内容
//个人邮件存储格式为hashmap key为PERSON_MAIL_KEY field为uid+mailid value为json格式的邮件内容
var (
//m_userMailMap *beegomap.BeeMap // = make(map[int32]*MailInfo) int32为MailID //个人邮件列表
m_SysMailMap *beegomap.BeeMap // = make(map[int32]*MailInfo) //系统邮件列表
)
const MAX_MAIL_NUM = 99 //最大邮件数量
const PERSON_MAIL_KEY = "PersonMailMap" //玩家个人邮件集合
const SYS_MAIL_KEY = "SysMailMap" //系统邮件集合
const USER_FETCH_SYS_MAILTIME_KEY = "UserFetchSysMailMap" //玩家领取系统邮件时间戳
type Mails []*pb.MailInfo
func (c Mails) Len() int {
return len(c)
}
func (c Mails) Less(i, j int) bool {
if c[i].MailExpiredtime > c[j].MailExpiredtime {
return true
} else if c[i].MailExpiredtime < c[j].MailExpiredtime {
return false
} else {
return c[i].MailId < c[j].MailId
}
}
func (c Mails) Swap(i, j int) {
tmp := c[i]
c[i] = c[j]
c[j] = tmp
}
/*
//结构暂定 等待道具结构具体定义以后可以修改
type AttInfo struct {
ItemId uint32 //物品ID
ItemNum uint32 //物品数量
}
type MailInfo struct {
MailID uint32 //邮件ID
MailType int32 //邮件类型 0系统 1个人
MailState int32 //是否已经领取 0未1已经领取
Title string //邮件标题
SenderID uint32 //发送者ID 系统为0
Appellation string //开头
Content string //内容
Inscribe string //签名
Sendtime uint32 //发送时间
ExpiredTime uint32 //过期时间
Attachement []AttInfo //附件
}*/
func MyTest() {
var sysmailinfo pb.MailInfo
var minfos []*pb.MailInfo
sysmailinfo.MailTitle = "what thefuck"
sysmailinfo.MailSendtime = uint32(time.Now().Unix())
sysmailinfo.MailSenderId = 0
sysmailinfo.MailType = 0
sysmailinfo.MailState = 0
sysmailinfo.MailId = 3
sysmailinfo.MailInscribe = "you idot"
sysmailinfo.MailExpiredtime = uint32(time.Now().Unix() + 3600*24*30)
sysmailinfo.MailContent = "i am stupid"
sysmailinfo.AttachmentList = nil
sysmailinfo.MailAppelaction = "hahahaha"
minfo := new(pb.MailInfo)
minfo.MailTitle = "什么情况"
minfo.MailSendtime = uint32(time.Now().Unix())
minfo.MailSenderId = 0
minfo.MailType = 0
minfo.MailState = 0
minfo.MailId = 1
minfo.MailInscribe = "你这个傻逼"
minfo.MailExpiredtime = uint32(time.Now().Unix() + 3600*24*20)
minfo.MailContent = "我是一封傻逼傻鸟巨大的傻逼邮件"
minfo.AttachmentList = nil
minfo.MailAppelaction = "哈哈哈哈"
minfo1 := new(pb.MailInfo)
minfo1.MailTitle = "what thefuck"
minfo1.MailSendtime = uint32(time.Now().Unix())
minfo1.MailSenderId = 0
minfo1.MailType = 0
minfo1.MailState = 0
minfo1.MailId = 2
minfo1.MailInscribe = "you idot"
minfo1.MailExpiredtime = uint32(time.Now().Unix() + 3600*24*10)
minfo1.MailContent = "i am stupid"
minfo1.AttachmentList = nil
minfo1.MailAppelaction = "hahahaha"
minfos = append(minfos,minfo)
minfos = append(minfos,minfo1)
cur := uint32(time.Now().Unix())
cli := resume.GetRedisClient()
sMailInfos, _ := json.Marshal(sysmailinfo)
spMailInfos, _ := json.Marshal(minfos)
cli.HSet(SYS_MAIL_KEY,strconv.Itoa(int(sysmailinfo.MailId)),string(sMailInfos))
cli.HSet(PERSON_MAIL_KEY,strconv.Itoa(12355),string(spMailInfos))
cli.HSet(PERSON_MAIL_KEY,strconv.Itoa(12365),string(spMailInfos))
cli.HSet(USER_FETCH_SYS_MAILTIME_KEY,strconv.Itoa(12355),strconv.Itoa(int(cur)))
logger.Info("MAILMyTest")
}
//初始化
func InitMail() error {
m_SysMailMap = beegomap.NewBeeMap()
//临时测试
MyTest()
err := LoadSysMail()
if err != nil {
logger.Notic("InitMail failed err:%v",err)
return err
}
return nil
}
//加载系统邮件
func LoadSysMail() error {
logger.Info("LoadSysMail!")
cli := resume.GetRedisClient()
v, err := cli.HMGets(SYS_MAIL_KEY)
if err != nil {
logger.Warn("redis get Map_ClubGame failed")
return err
}else {
for i := 0; i < len(v); i += 2 {
//k := v[i].([]byte)
val := v[i+1].([]byte)
var mailInfo pb.MailInfo
err := json.Unmarshal([]byte(val), &mailInfo)
if err != nil {
logger.Warn("LoadSysMail Unmarshal failed err:%v", err)
break
}
pMailInfo := new(pb.MailInfo)
pMailInfo.MailAppelaction = mailInfo.MailAppelaction
pMailInfo.AttachmentList = append(pMailInfo.AttachmentList,mailInfo.AttachmentList...)
pMailInfo.MailContent = mailInfo.MailContent
pMailInfo.MailExpiredtime = mailInfo.MailExpiredtime
pMailInfo.MailInscribe = mailInfo.MailInscribe
pMailInfo.MailId = mailInfo.MailId
pMailInfo.MailState = mailInfo.MailState
pMailInfo.MailType = mailInfo.MailType
pMailInfo.MailSenderId = mailInfo.MailSenderId
pMailInfo.MailSendtime = mailInfo.MailSendtime
pMailInfo.MailTitle = mailInfo.MailTitle
pMailInfo.Isexpired = mailInfo.Isexpired
m_SysMailMap.Set(mailInfo.MailId,pMailInfo)
logger.Info("LoadSysMail mailed %v mailinfo:%v", mailInfo.MailId,mailInfo)
}
}
return nil
}
//保存系统邮件
func SaveOneSysMail(mailid uint32,mailinfo *pb.MailInfo) error {
cli := resume.GetRedisClient()
var s_mailinfo pb.MailInfo
s_mailinfo = *mailinfo
sMailInfos, _ := json.Marshal(s_mailinfo)
err := cli.HSet(SYS_MAIL_KEY,strconv.Itoa(int(mailid)),string(sMailInfos))
if err != nil {
logger.Notic("SaveOneSysMail failed err:%v",err)
return err
}
logger.Info("SaveOneSysMail success mailid:%v mailinfo:%v",mailid,s_mailinfo)
return nil
}
//处理玩家邮件 删除多余的
func HandleAndGetUserMail(uid uint32,lasttime uint32) (Mails,error) {
var finalList Mails
mailFromUserRedis,err := LoadUserMail(uid)
if err != nil {
logger.Notic("LoadUserMail failed uid:%v err:%v",uid,err)
return nil,err
}
finalList = append(finalList,mailFromUserRedis...)
//将系统邮件中未读取的取出发出
for _, vv := range m_SysMailMap.Items() {
valMailInfos, _ := vv.(*pb.MailInfo)
if valMailInfos.MailSendtime > lasttime {
finalList = append(finalList,valMailInfos)
}
}
//排序
sort.Sort(finalList)
if len(finalList) > MAX_MAIL_NUM {
finalList = finalList[0:MAX_MAIL_NUM]
}
logger.Info("HandleAndGetUserMail finalList:%v",finalList)
return finalList,nil
}
//加载玩家邮件
func LoadUserMail(uid uint32) (Mails,error) {
logger.Info("LoadUserMail!")
var mails Mails
cli := resume.GetRedisClient()
v, err := cli.HGet(PERSON_MAIL_KEY,strconv.Itoa(int(uid)))
if err != nil {
logger.Warn("redis get LoadUserMail failed err:%v",err)
return nil,err
}else {
err = json.Unmarshal([]byte(v), &mails)
logger.Info("LoadUserMail v:%v", v)
logger.Info("LoadUserMail mailinfo:%v", mails)
}
return mails,nil
}
//保存玩家邮件
func SaveUserMail(mails Mails,uid uint32) error {
logger.Info("SaveUserMail!")
cli := resume.GetRedisClient()
sMailInfos, _ := json.Marshal(mails)
err := cli.HSet(PERSON_MAIL_KEY,strconv.Itoa(int(uid)),string(sMailInfos))
if err != nil {
logger.Warn("redis SaveUserMail failed err:%v",err)
return err
}
return nil
}
//加载玩家最后一次读取系统邮件时间
func LoadUserFetchSysMailTime(uid uint32) (uint32,error){
cli := resume.GetRedisClient()
last_time,err := cli.HGet(USER_FETCH_SYS_MAILTIME_KEY,strconv.Itoa(int(uid)))
if err != nil {
logger.Notic("LoadUserFetchSysMailTime failed err:%v",err)
return 0,err
}
n_last_time,_ := strconv.Atoi(last_time)
return uint32(n_last_time),nil
}
//保存玩家最后一次读取系统邮件时间
func SaveUserFetchSysMailTime(uid uint32,last_time uint32) error {
cli := resume.GetRedisClient()
err := cli.HSet(USER_FETCH_SYS_MAILTIME_KEY,strconv.Itoa(int(uid)),string(last_time))
if err != nil {
logger.Notic("SaveUserFetchSysMailTime failed err:%v",err)
return err
}
logger.Info("SaveUserFetchSysMailTime success uid:%v last_time:%v",uid,last_time)
return nil
}
func ModifyMailInfo(uid uint32,mail_id uint32) (*pb.MailInfo,error){
var mailList Mails
var err error
var mailinfo *pb.MailInfo
if mailList, err = HandleAndGetUserMail(uid, uint32(time.Now().Unix())); err != nil {
logger.Notic("player uid:%v mail.ModifyMailInfo:%v ", uid, err)
return nil,nil
}
for _,mails := range mailList {
if mails.MailId != mail_id {
continue
}
mails.MailState = 1
mailinfo = new(pb.MailInfo)
mailinfo.MailId = mails.MailId
mailinfo.MailState = mails.MailState
mailinfo.Isexpired = mails.Isexpired
mailinfo.MailAppelaction = mails.MailAppelaction
mailinfo.MailContent = mails.MailContent
mailinfo.MailExpiredtime = mails.MailExpiredtime
mailinfo.MailInscribe = mails.MailInscribe
mailinfo.MailSenderId = mails.MailSenderId
mailinfo.MailTitle = mails.MailTitle
mailinfo.MailType = mails.MailType
mailinfo.AttachmentList = append(mailinfo.AttachmentList,mails.AttachmentList...)
mailinfo.MailSendtime = mails.MailId
break
}
SaveUserMail(mailList,uid)
return mailinfo,nil
}
//add a line of comment