邮件触发

This commit is contained in:
hahwu 2025-03-25 17:15:37 +08:00
parent f527918672
commit 496940caa3
12 changed files with 3585 additions and 3280 deletions

View File

@ -25,7 +25,12 @@ type EventObj struct {
} }
const ( const (
SECRET_KEY = ")VQbB(vpy=U(wcp)" SECRET_KEY = ")VQbB(vpy=U(wcp)"
CONDITION_EQ = "=" // 等于
CONDITION_GT = ">" // 大于
CONDITION_LT = "<" // 小于
CONDITION_GE = ">=" // 大于等于
CONDITION_LE = "<=" // 小于等于
) )
// 加密字符串 // 加密字符串
@ -242,3 +247,20 @@ func SplitInt(str, sep string) []int {
} }
return ret return ret
} }
func Compare(x int, condition string, y int) bool {
switch condition {
case CONDITION_EQ:
return x == y
case CONDITION_GT:
return x > y
case CONDITION_LT:
return x < y
case CONDITION_GE:
return x >= y
case CONDITION_LE:
return x <= y
default:
return false
}
}

View File

@ -139,3 +139,18 @@ func ZeroTime(timestamp int64) int64 {
t := time.Unix(timestamp, 0) t := time.Unix(timestamp, 0)
return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()).Unix() return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()).Unix()
} }
// 计算给定时间戳所在的 0 点到现在的 0 点过了几天
func DaysSince(timestamp int64) int {
// 获取给定时间戳的 0 点时间
t := time.Unix(timestamp, 0)
startOfDay := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
// 获取当前时间的 0 点时间
now := time.Now()
startOfToday := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
// 计算两个时间之间的天数差
days := int(startOfToday.Sub(startOfDay).Hours() / 24)
return days
}

View File

@ -1,13 +1,30 @@
package mailCfg package mailCfg
import "server/gamedata" import (
"server/GoUtil"
"server/game/mod/item"
"server/gamedata"
"strings"
)
const ( const (
CFG_LOGIN_BACK = "LoginBack" CFG_LOGIN_BACK = "LoginBack"
CFG_MAIL = "Mail"
) )
type TriggerMail struct {
Id int
Title string
Content string
EnglistTitle string
EnglistContent string
Items []*item.Item
Trigger []string
}
func init() { func init() {
gamedata.InitCfg(CFG_LOGIN_BACK) gamedata.InitCfg(CFG_LOGIN_BACK)
gamedata.InitCfg(CFG_MAIL)
} }
func GetLoginBack(Id string) (int, int) { func GetLoginBack(Id string) (int, int) {
@ -17,3 +34,28 @@ func GetLoginBack(Id string) (int, int) {
} }
return gamedata.GetIntValue(data, "Num1"), gamedata.GetIntValue(data, "Num2") return gamedata.GetIntValue(data, "Num1"), gamedata.GetIntValue(data, "Num2")
} }
func GetTriggerMail() []*TriggerMail {
data, err := gamedata.GetData(CFG_MAIL)
if err != nil {
return nil
}
ret := make([]*TriggerMail, 0)
for k, v := range data {
T := gamedata.GetStringValue(v, "Trigger")
if T != "" {
continue
}
data := &TriggerMail{
Id: GoUtil.Int(k),
Title: gamedata.GetStringValue(v, "Title"),
Content: gamedata.GetStringValue(v, "Content"),
EnglistTitle: gamedata.GetStringValue(v, "EnglistTitle"),
EnglistContent: gamedata.GetStringValue(v, "EnglistContent"),
Items: gamedata.GetItemList(v, "Items"),
Trigger: strings.Split(T, "|"),
}
ret = append(ret, data)
}
return ret
}

View File

@ -10,8 +10,8 @@ import (
) )
const ( const (
MAIL_TYPE_SERVER = 1 MAIL_SEND_TYPE_SERVER = 1
MAIL_TYPE_USER = 2 MAIL_SEND_TYPE_USER = 2
) )
type MailMgr struct { type MailMgr struct {
@ -31,6 +31,7 @@ type ServerMail struct {
Start_time int64 Start_time int64
Register_time int64 Register_time int64
End_time int64 End_time int64
Send_type int
Mail_type int Mail_type int
To_uids []int To_uids []int
} }
@ -95,7 +96,7 @@ func (r *MailMgr) Sync(Uid int, Register int64) []ServerMail {
if v.Register_time > 0 && v.Register_time < Register { if v.Register_time > 0 && v.Register_time < Register {
continue continue
} }
if v.Mail_type == MAIL_TYPE_SERVER { //全服邮件 if v.Send_type == MAIL_SEND_TYPE_SERVER { //全服邮件
list = append(list, *v) list = append(list, *v)
} else { } else {
if GoUtil.InArray(Uid, v.To_uids) { if GoUtil.InArray(Uid, v.To_uids) {

View File

@ -302,6 +302,7 @@ func (p *Player) ZeroUpdate(a []interface{}) {
p.PlayMod.getChampshipMod().ZeroUpdate() p.PlayMod.getChampshipMod().ZeroUpdate()
p.initAcitivity() p.initAcitivity()
ActivityZeroUpdate(p) ActivityZeroUpdate(p)
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_UPLV})
p.PlayMod.save() p.PlayMod.save()
} }
// 周更新 // 周更新
@ -358,6 +359,7 @@ func (p *Player) Login() {
AvatarMod.Login(PlayBaseMod.GetRegisterTime()) AvatarMod.Login(PlayBaseMod.GetRegisterTime())
HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime) HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime)
p.HandleItem(HandbookItem, msg.ITEM_POP_LABEL_AllCollectRewardHB.String()) p.HandleItem(HandbookItem, msg.ITEM_POP_LABEL_AllCollectRewardHB.String())
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_UPLV})
} }
func (p *Player) Outline() { func (p *Player) Outline() {

View File

@ -516,6 +516,7 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int) (int, error) {
// 重载活动 // 重载活动
player.initAcitivity() player.initAcitivity()
player.BackDataActivity() player.BackDataActivity()
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_UPLV})
p.p.TeLog("level_up", map[string]interface{}{ p.p.TeLog("level_up", map[string]interface{}{
"after_level": BaseMod.Level, "after_level": BaseMod.Level,
}) })

View File

@ -17,6 +17,7 @@ import (
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/friend" "server/game/mod/friend"
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/mail"
"server/game/mod/msg" "server/game/mod/msg"
"server/game/mod/order" "server/game/mod/order"
"server/game/mod/playroom" "server/game/mod/playroom"
@ -328,7 +329,7 @@ func SyncMailMsg(p *Player) {
continue continue
} }
MailMod.ServerMail = append(MailMod.ServerMail, v.Id) MailMod.ServerMail = append(MailMod.ServerMail, v.Id)
MailMod.Send(v.Title, v.Content, v.Items) MailMod.Send(v.Title, v.Content, v.Items, v.Mail_type)
} }
} }
@ -864,7 +865,7 @@ func LoignBack(p *Player) {
MailMod.Send("Test Players' Refund", MailMod.Send("Test Players' Refund",
`Welcome back to our game! `Welcome back to our game!
Here comes your refund for your scene progress and payment in test version! Here comes your refund for your scene progress and payment in test version!
Have fun in new version!`, Items) Have fun in new version!`, Items, mail.MAIL_TYPE_NORMAL)
} }
BaseMod.LoginBack = true BaseMod.LoginBack = true
} }

View File

@ -6,17 +6,79 @@ import (
"server/MergeConst" "server/MergeConst"
"server/conf" "server/conf"
champshipCfg "server/conf/champship" champshipCfg "server/conf/champship"
mailCfg "server/conf/mail"
mergeDataCfg "server/conf/mergeData" mergeDataCfg "server/conf/mergeData"
"server/db" "server/db"
"server/game/mod/base"
"server/game/mod/chess" "server/game/mod/chess"
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/mail"
"server/game/mod/order" "server/game/mod/order"
"server/game/mod/quest"
"server/msg" "server/msg"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
"sort" "sort"
"time" "time"
) )
const (
TRIGGER_PARAM_LV = "lv" // 等级
TRIGGER_PARAM_REQ = "reg" // 注册天数
)
func (player *Player) MailTrigger(Tr *quest.Trigger) bool {
MailMod := player.PlayMod.getMailMod()
BaseMod := player.PlayMod.getBaseMod()
TriggerMail := mailCfg.GetTriggerMail()
t := make([]*mailCfg.TriggerMail, 0)
for _, v := range TriggerMail {
if GoUtil.InArray(v.Id, MailMod.TriggerMail) {
continue
}
if Tr.Label != v.Trigger[0] {
continue
}
t = append(t, v)
}
if len(t) == 0 {
return false
}
for _, v := range t {
if checkTriggerCondition(player, v.Trigger) {
Title := ""
Content := ""
if BaseMod.GetLang() == base.LANG_CN {
Title = v.Title
Content = v.Content
} else {
Title = v.EnglistTitle
Content = v.EnglistContent
}
MailMod.Send(Title, Content, v.Items, mail.MAIL_TYPE_NORMAL)
MailMod.AddTriggerMail(v.Id)
}
}
player.PushClientRes(MailMod.BackData())
return true
}
func checkTriggerCondition(player *Player, Trigger []string) bool {
if len(Trigger) < 4 {
return false
}
switch Trigger[1] {
case TRIGGER_PARAM_LV:
lv := player.PlayMod.getBaseMod().GetLevel()
return GoUtil.Compare(lv, Trigger[2], GoUtil.Int(Trigger[3]))
case TRIGGER_PARAM_REQ:
reg := player.GetPlayerBaseMod().GetRegisterTime()
Day := GoUtil.DaysSince(reg)
return GoUtil.Compare(Day, Trigger[2], GoUtil.Int(Trigger[3]))
default:
return false
}
}
func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) { func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) {
OrderSn := req.OrderSn OrderSn := req.OrderSn
Status := int(req.Status) Status := int(req.Status)

View File

@ -10,6 +10,8 @@ import (
const ( const (
ModuleName = "base" ModuleName = "base"
LANG_EN = 1 //英文
LANG_CN = 2 //中文
) )
type Base struct { type Base struct {
@ -36,6 +38,7 @@ type Base struct {
EnergyAD int // 每日看广告获得的能量次数 EnergyAD int // 每日看广告获得的能量次数
Seed bool Seed bool
Source int // 体力资源 Source int // 体力资源
Lang int // 语言
} }
func (b *Base) InitData(Uid int) { func (b *Base) InitData(Uid int) {
@ -45,6 +48,9 @@ func (b *Base) InitData(Uid int) {
if b.NickName == "" { if b.NickName == "" {
b.NickName = fmt.Sprintf("Player_%d", Uid) b.NickName = fmt.Sprintf("Player_%d", Uid)
} }
if b.Lang == 0 {
b.Lang = LANG_EN
}
} }
func (b *Base) Login() { func (b *Base) Login() {
@ -185,6 +191,14 @@ func (b *Base) SetLogoutTime(LogoutTime int64) {
b.LogoutTime = LogoutTime b.LogoutTime = LogoutTime
} }
func (b *Base) GetLang() int {
return b.Lang
}
func (b *Base) SetLang(lang int) {
b.Lang = lang
}
func (b *Base) BuyEnergy(Energy int) ([]*item.Item, int, int) { func (b *Base) BuyEnergy(Energy int) ([]*item.Item, int, int) {
if !b.IsFirstBuy { if !b.IsFirstBuy {
b.IsFirstBuy = true b.IsFirstBuy = true
@ -207,6 +221,7 @@ func (b *Base) BackData() *msg.BaseInfo {
IsFirstBuy: b.IsFirstBuy, IsFirstBuy: b.IsFirstBuy,
EnergyBuy: int32(b.EnergyBuy), EnergyBuy: int32(b.EnergyBuy),
EnergyAD: int32(b.EnergyAD), EnergyAD: int32(b.EnergyAD),
Lang: int32(b.Lang),
} }
} }

View File

@ -8,9 +8,10 @@ import (
) )
type MailMod struct { type MailMod struct {
List map[int]*MailInfo // 邮件列表 List map[int]*MailInfo // 邮件列表
AutoId int // 自增id AutoId int // 自增id
ServerMail []int ServerMail []int // 后台邮件
TriggerMail []int // 触发邮件
} }
const ( const (
@ -18,6 +19,9 @@ const (
MAIL_STATUS_READ = 1 MAIL_STATUS_READ = 1
MAIL_STATUS_REWARD = 2 MAIL_STATUS_REWARD = 2
MAIL_STATUS_DEL = 3 MAIL_STATUS_DEL = 3
MAIL_TYPE_NORMAL = 1
MAIL_TYPE_FESTIVAL = 2
) )
type MailInfo struct { type MailInfo struct {
@ -37,13 +41,14 @@ func (m *MailMod) InitData() {
} }
// 发送邮件 // 发送邮件
func (m *MailMod) Send(Title, Content string, Items []*item.Item) int { func (m *MailMod) Send(Title, Content string, Items []*item.Item, t int) int {
m.AutoId++ m.AutoId++
m.List[m.AutoId] = &MailInfo{ m.List[m.AutoId] = &MailInfo{
Title: Title, Title: Title,
Content: Content, Content: Content,
Items: Items, Items: Items,
Send: GoUtil.Now(), Send: GoUtil.Now(),
Type: t,
} }
return m.AutoId return m.AutoId
} }
@ -99,6 +104,7 @@ func (m *MailMod) BackData() *msg.ResMailList {
Items: item.ItemToMsg(v.Items), Items: item.ItemToMsg(v.Items),
Status: int32(v.Status), Status: int32(v.Status),
Time: int32(v.Send), Time: int32(v.Send),
Type: int32(v.Type),
} }
} }
return res return res
@ -117,3 +123,11 @@ func (m *MailMod) NotifyMail(Id int) *msg.MailNotify {
}, },
} }
} }
func (m *MailMod) GetTriggerMail() []int {
return m.TriggerMail
}
func (m *MailMod) AddTriggerMail(i int) {
m.TriggerMail = append(m.TriggerMail, i)
}

View File

@ -24,6 +24,8 @@ const (
TRIGGER_LABEL_PLAYCAT = "PlayCat" TRIGGER_LABEL_PLAYCAT = "PlayCat"
TRIGGER_LABEL_FEEDCAT = "FeedCat" TRIGGER_LABEL_FEEDCAT = "FeedCat"
TRIGGER_LABEL_CLEANCAT = "CleanCat" TRIGGER_LABEL_CLEANCAT = "CleanCat"
TRIGGER_LABEL_UPLV = "UpLv" // 升级
TRIGGER_LABEL_LOGIN = "Login" // 登录
) )
type QuestProgress struct { type QuestProgress struct {

File diff suppressed because it is too large Load Diff