123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- package blockchain
- import (
- "errors"
- "ktogame/controller"
- "ktogame/dbUtil"
- "ktogame/models"
- "ktogame/util"
- "strconv"
- "github.com/astaxie/beego/logs"
- "github.com/go-xorm/xorm"
- )
- func participate(user, inviter, hash string, amount float64) error {
- logs.Info("into participate=====")
- sesion := dbUtil.Engine.NewSession()
- var Error error
- defer func() {
- if Error != nil {
- sesion.Rollback()
- } else {
- sesion.Commit()
- logs.Info("participate end=====")
- }
- }()
- var ui, dui models.UserInfo
- ok, Error := sesion.ID(inviter).Get(&dui)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- if !ok {
- dui.Id = -1
- dui.Direct = ""
- dui.Superiors = "-1"
- ui.Direct = ""
- } else {
- ui.Direct = inviter
- }
- logs.Info("inviter info:", dui.Id, dui.Direct, dui.Indirect, dui.Superiors)
- //insert new user info
- ui.Addr = user
- ui.Indirect = dui.Direct
- ui.Superiors = dui.Superiors + "," + strconv.FormatInt(dui.Id, 10)
- ui.ParticipateAmount = amount
- ui.State = 1
- ui.CreateTime = util.NowTimeString()
- ui.Hash = hash
- logs.Info("user info:", ui.Direct, ui.Indirect, ui.Superiors)
- okk, Error := sesion.ID(ui.Addr).Get(&dui)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- if okk {
- Error = errors.New("user already participated")
- logs.Info("%v already participated!", ui.Addr)
- return nil
- }
- _, Error = sesion.Insert(&ui)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- //insert new user Performance
- var uper models.Performance
- uper.Addr = user
- _, Error = sesion.Insert(&uper)
- if Error != nil {
- return Error
- }
- //update rewards pool
- Error = controller.UpdateRewardsPool(sesion, amount)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- ///update Recommendation Rewards
- ///update direct recommend rewards(10%)
- rewards := amount * 10 / 100
- if ui.Direct != "" {
- Error = controller.UpdateAvailableRewards(sesion, rewards, ui.Direct, true, true)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- }
- ///update indirect recommend rewards(10%)
- if ui.Indirect != "" {
- Error = controller.UpdateAvailableRewards(sesion, rewards, ui.Indirect, true, false)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- }
- //update all supers performance (15%)
- Error = controller.UpdateSuperiorsPerformance(sesion, ui.Superiors, amount)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- //update Community Gift(50%)
- Error = controller.UpdateCommunityGift(sesion, amount, inviter)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- //Update Community Nodes(5%)
- Error = controller.UpdateCommunityNodes(sesion, amount)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- //update Market(10%)
- Error = controller.UpdateMarket(sesion, amount)
- if Error != nil {
- logs.Info(Error)
- return Error
- }
- return nil
- }
- func checkClaim(engine *xorm.Engine, addr, hash string, height int64, amount float64, sign string) error {
- var tx models.ClaimedTxs
- ok, err := engine.Id(hash).Get(&tx)
- if err != nil {
- logs.Error(err)
- return err
- }
- if !ok {
- logs.Info("set new claim record,addr:%v,hash:%v", addr, hash)
- itx := models.ClaimedTxs{
- Addr: addr,
- BlockHeight: height,
- Hash: hash,
- Signature: sign,
- Amount: amount,
- State: 1,
- Droped: 0,
- CreateTime: util.NowTimeString(),
- }
- _, err := engine.Insert(&itx)
- if err != nil {
- return err
- }
- return nil
- }
- logs.Info("update record========:", addr, hash)
- tx.State = 1
- tx.BlockHeight = height
- _, err = engine.ID(hash).Cols("block_height,state").Update(&tx)
- if err != nil {
- return err
- }
- return nil
- }
|