package call
import (
"fmt"
"server/common"
"server/config"
"server/db"
"server/pb"
"server/util"
"time"
"github.com/liangdas/mqant/log"
"github.com/olivere/elastic/v7"
"gorm.io/gorm"
)
func IsActivityValid ( actID int ) bool {
act := GetConfigActivityByID ( actID )
if act == nil {
return false
}
return act . IsValid ( )
}
// NotifyActivityItem 通知客户端获得活动物品
func NotifyActivityItem ( uid , activityID int , items [ ] * pb . ActivityItem ) {
activityNotify := & pb . ActivityResp {
ActivityID : int64 ( activityID ) ,
ActivityItems : items ,
}
SendNR ( uid , int ( pb . ServerCommonResp_CommonActivityItemResp ) , activityNotify , "common" )
}
func GetAcitivityPddData ( uid int ) * common . PddData {
pddData := & common . PddData { UID : uid }
db . Mysql ( ) . Get ( pddData )
con := GetConfigActivityPdd ( )
if con == nil {
return nil
}
now := time . Now ( ) . Unix ( )
if now - pddData . Time < con . Expire * 60 {
// 每天有一次免费旋转
if ! util . IsSameDayTimeStamp ( now , pddData . FreeSpinTime ) {
pddData . Spin ++
}
return pddData
}
resetSpinCount := 1
if ! config . GetBase ( ) . Release {
resetSpinCount = 100
}
if pddData . ID == 0 {
pddData . Time = now
pddData . Spin = resetSpinCount
db . Mysql ( ) . Create ( pddData )
} else {
db . Mysql ( ) . Update ( & common . PddData { UID : pddData . UID , Time : pddData . Time } ,
map [ string ] interface { } { "amount" : 0 , "time" : now , "Spin" : resetSpinCount , "free_spin_time" : 0 , "new_record_time" : 0 } )
pddData . Amount = 0
pddData . Time = now
pddData . Spin = resetSpinCount
pddData . FreeSpinTime = 0
pddData . NewRecordTime = 0
}
return pddData
}
// 是否有新邀请
func HasNewAcitivityPddShare ( uid int ) bool {
if ! IsActivityValid ( common . ActivityIDPDD ) {
return false
}
pddData := GetAcitivityPddData ( uid )
if pddData . NewRecordTime <= 0 {
return false
}
q := elastic . NewBoolQuery ( )
q . Filter ( elastic . NewTermQuery ( "Referer" , uid ) )
q . Filter ( elastic . NewRangeQuery ( "Time" ) . Gte ( pddData . NewRecordTime ) )
return db . ES ( ) . Count ( common . ESIndexBackPddRecord , q ) > 0
}
func GetUserFreeSpinData ( uid int ) * common . ActivityFreeSpinData {
data := & common . ActivityFreeSpinData { UID : uid }
db . Mysql ( ) . Get ( data )
return data
}
func GetUserFirstRechargeBackData ( uid int ) * common . ActivityFirstRechargeBackData {
data := & common . ActivityFirstRechargeBackData { UID : uid }
db . Mysql ( ) . Get ( data )
return data
}
func GetFirstRechargeBackSumAmount ( ) int64 {
var awardSum * int64
err := db . Mysql ( ) . C ( ) . Model ( & common . ActivityFirstRechargeBackData { } ) . Select ( "sum(reward) as reward" ) . Where ( "reward > 0 and reward_time > 0" ) . Scan ( & awardSum ) . Error
if err != nil {
log . Error ( "get sum of amount err, %s" , err . Error ( ) )
return 0
}
if awardSum == nil {
return 0
}
return * awardSum
}
func ShouldShowActivityFirstRechargeBack ( uid int ) bool {
if ! IsActivityValid ( common . ActivityIDFirstRechargeBack ) {
return false
}
if uid == 0 {
return true
}
now := time . Now ( ) . Unix ( )
conf := GetConfigActivityFirstRechargeBack ( )
p , _ := GetUserXInfo ( uid , "birth" )
data := GetUserFirstRechargeBackData ( uid )
if now > p . Birth + conf . CD { // 超时
if data . RewardTime == 0 && data . Reward > 0 { // 有奖励 未领取
return true
}
return false
}
if data . RewardTime > 0 { // 已经领奖
return false
}
return true
}
func UploadActivityData ( uid , activityID , t int , amount int64 ) {
db . ES ( ) . InsertToESGO ( common . ESIndexBackActivity , & common . ESActivity {
ActivityID : activityID ,
UID : uid ,
Time : time . Now ( ) . Unix ( ) ,
Type : t ,
Amount : amount ,
} )
}
func ShouldShowActivitySign ( uid int ) bool {
if ! IsActivityValid ( common . ActivityIDSign ) {
return false
}
if uid == 0 {
return true
}
p , _ := GetUserXInfo ( uid , "birth" )
now := util . GetZeroTime ( time . Now ( ) ) . Unix ( )
birth := util . GetZeroTime ( time . Unix ( p . Birth , 0 ) ) . Unix ( )
return now - birth <= 6 * common . OneDay
}
func GetUserWeekCard ( uid int ) * common . ActivityWeekCardData {
data := & common . ActivityWeekCardData { UID : uid }
db . Mysql ( ) . Get ( data )
return data
}
func ShouldShowActivityWeekCard ( uid int ) bool {
if ! IsActivityValid ( common . ActivityIDWeekCard ) {
return false
}
if uid == 0 {
return true
}
return true
}
func GetUserActivitySlotsData ( uid int ) * common . ActivitySlotsData {
data := & common . ActivitySlotsData { UID : uid }
db . Mysql ( ) . Get ( data )
now := time . Now ( ) . Unix ( )
isSingle := IsActivitySingleDay ( common . ActivityIDSlots )
t := data . Time2
if isSingle {
t = data . Time1
}
if ! util . IsSameDayTimeStamp ( now , t ) {
data . Spin = 0
}
if data . ID == 0 {
if isSingle {
data . Time1 = now
} else {
data . Time2 = now
}
p , _ := GetUserXInfo ( uid , "mobile" , "avatar" )
data . Avatar = p . Avatar
data . Nick = p . Nick
db . Mysql ( ) . Create ( data )
}
return data
}
func UpdateUserActivitySlotsData ( uid int , count int ) {
data := & common . ActivitySlotsData { UID : uid }
db . Mysql ( ) . Get ( data )
now := time . Now ( ) . Unix ( )
isSingle := IsActivitySingleDay ( common . ActivityIDSlots )
if data . ID == 0 {
if isSingle {
data . Time1 = now
} else {
data . Time2 = now
}
data . Spin = count
db . Mysql ( ) . Create ( data )
return
}
update := map [ string ] interface { } { }
t := data . Time2
str := "time2"
if isSingle {
t = data . Time1
str = "time1"
}
if ! util . IsSameDayTimeStamp ( now , t ) {
update [ "spin" ] = count
update [ str ] = now
} else {
update [ "spin" ] = gorm . Expr ( "spin + ?" , count )
}
log . Debug ( "UpdateUserActivitySlotsData uid:%v,count:%v,isSingle:%v,update:%v" , uid , count , isSingle , update )
db . Mysql ( ) . Update ( & common . ActivitySlotsData { UID : uid } , update )
}
func ShouldShowActivityLuckShop ( uid int ) bool {
if ! IsActivityValid ( common . ActivityIDLuckyShop ) {
return false
}
if uid == 0 {
return true
}
return GetShowActivityLuckShopData ( uid ) != nil
}
func GetShowActivityLuckShopData ( uid int ) * common . ActivityLuckyShopData {
if uid == 0 {
return nil
}
re := GetRechargeInfo ( uid )
if re . TotalRecharge == 0 {
return nil
}
datas := [ ] * common . ActivityLuckyShopData { }
db . Mysql ( ) . QueryAll ( fmt . Sprintf ( "uid = %d" , uid ) , "type asc" , & common . ActivityLuckyShopData { } , & datas )
now := time . Now ( ) . Unix ( )
// 先判断首充礼包,两种礼包互斥,弹了其中一种,另一种不会弹了
var rechargeData * common . ActivityLuckyShopData
for i , v := range datas {
if v . Type == common . ActivityLuckyShopTypeRechargeLess || v . Type == common . ActivityLuckyShopTypeRechargeMore {
rechargeData = datas [ i ]
break
}
}
if rechargeData != nil && rechargeData . IsValid ( ) {
return rechargeData
}
for i := common . ActivityLuckyShopType + 1 ; i < common . ActivityLuckyShopTypeAll ; i ++ {
// 如果已有首充礼包,那么直接跳过后续判断
if rechargeData != nil {
if i == common . ActivityLuckyShopTypeRechargeLess || i == common . ActivityLuckyShopTypeRechargeMore {
continue
}
}
con := GetConfigActivityLuckShop ( i )
var tmp * common . ActivityLuckyShopData
for i , v := range datas {
if con . Type == v . Type {
tmp = datas [ i ]
break
}
}
if tmp == nil {
if con . Type == common . ActivityLuckyShopTypeRechargeLess {
if re . TotalRecharge < con . Recharge {
return & common . ActivityLuckyShopData { UID : uid , Type : con . Type , Push : now , ProductID : con . ProductID }
}
continue
}
if con . Type == common . ActivityLuckyShopTypeRechargeMore {
if re . TotalRecharge >= con . Recharge {
return & common . ActivityLuckyShopData { UID : uid , Type : con . Type , Push : now , ProductID : con . ProductID }
}
continue
}
p , _ := GetUserXInfo ( uid , "birth" )
tmp := p . Birth + 3 * 24 * 3600
if util . IsSameDayTimeStamp ( now , tmp ) || now > tmp {
return & common . ActivityLuckyShopData { UID : uid , Type : con . Type , Push : now , ProductID : con . ProductID }
}
} else if tmp . IsValid ( ) {
return tmp
}
}
return nil
}
// IsActivitySingleDay 返回活动是否是单数天
func IsActivitySingleDay ( id int ) bool {
act := GetConfigActivityByID ( id )
if act == nil || ! act . IsValid ( ) {
return false
}
// if config.GetBase().Release {
diff := int ( ( util . GetZeroTime ( time . Now ( ) ) . Unix ( ) - util . GetZeroTime ( time . Unix ( act . Start , 0 ) ) . Unix ( ) ) / ( 24 * 60 * 60 ) )
return util . IsSingle ( diff )
// }
// now := time.Now()
// _, m, _ := now.Clock()
// return util.IsSingle(m / 5)
}
func GetUserActivitySuperData ( uid int ) * common . ActivitySuperData {
p , _ := GetUserXInfo ( uid , "birth" )
data := & common . ActivitySuperData { UID : uid }
db . Mysql ( ) . Get ( data )
if util . GetZeroTime ( time . Now ( ) ) . Unix ( ) - util . GetZeroTime ( time . Unix ( p . Birth , 0 ) ) . Unix ( ) < 5 * common . OneDay {
data . Type = 1
} else {
data . Type = 2
}
data . CanBuy = ! util . IsSameDayTimeStamp ( time . Now ( ) . Unix ( ) , data . Time )
if data . ID == 0 {
db . Mysql ( ) . Create ( data )
}
return data
}