pet_home_server/src/server/game/MailMgr.go
2025-11-28 16:21:00 +08:00

123 lines
2.6 KiB
Go

package game
import (
"encoding/json"
"server/GoUtil"
"server/db"
"server/game/mod/item"
"server/game/mod/msg"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
const (
MAIL_SEND_TYPE_SERVER = 1
MAIL_SEND_TYPE_USER = 2
)
type MailMgr struct {
*ServerMod
list map[int]*ServerMail
}
type MailData struct {
List map[int][]*msg.Msg
}
type ServerMail struct {
Id int
Title string
Content string
TitleEn string
ContentEn string
TitlePtBr string
ContentPtBr string
Items []*item.Item
Start_time int64
Register_time int64
End_time int64
Send_type int
Mail_type int
To_uids []int
}
func (m *MailMgr) Init() {
m.key = MAIL_MGR_KEY
m.data = &MailData{
List: make(map[int][]*msg.Msg),
}
m.list = make(map[int]*ServerMail)
// 注册处理函数
m.init()
m.LoadMail(nil)
m.RegisterHandler(msg.HANDLE_TYPE_MAIL_ADD, m.AddMail)
m.RegisterHandler(msg.HANDLE_TYPE_MAIL_RELOAD, m.LoadMail)
}
func (m *MailMgr) AddMail(msg *msg.Msg) (interface{}, error) {
ServerMail := msg.Extra.(*ServerMail)
m.list[ServerMail.Id] = ServerMail
return nil, nil
}
func (r *MailMgr) LoadMail(msg *msg.Msg) (interface{}, error) {
// 从数据库加载邮件
data := make([]*db.SqlServerMailStruct, 0)
err := db.GetServerMailData(&data)
if err != nil {
log.Error("LoadMail error: %v", err)
return nil, err
}
for _, v := range data {
Uids := make([]int, 0)
UidArr := strings.Split(v.To_uids, ",")
for _, v := range UidArr {
Uids = append(Uids, GoUtil.Int(v))
}
var items []interface{}
json.Unmarshal([]byte(v.Items), &items)
r.list[v.Id] = &ServerMail{
Id: v.Id,
Title: v.Title,
Content: v.Content,
TitleEn: v.TitleEn,
ContentEn: v.ContentEn,
TitlePtBr: v.TitlePtBr,
ContentPtBr: v.ContentPtBr,
Items: item.ParseItem(items),
Start_time: v.Start_time,
Register_time: v.Register_time,
End_time: v.End_time,
Mail_type: v.Mail_type,
Send_type: v.Send_type,
To_uids: Uids,
}
}
return nil, nil
}
func (r *MailMgr) Sync(Uid int, Register int64) []ServerMail {
// 同步邮件
Now := GoUtil.Now()
list := make([]ServerMail, 0)
for _, v := range r.list {
if v.Start_time > 0 && v.Start_time > Now {
continue
}
if v.End_time > 0 && v.End_time < Now {
continue
}
if v.Register_time > 0 && v.Register_time < Register {
continue
}
if v.Send_type == MAIL_SEND_TYPE_SERVER { //全服邮件
list = append(list, *v)
} else {
if GoUtil.InArray(Uid, v.To_uids) {
list = append(list, *v)
}
}
}
return list
}