DelayNoMore/battle_srv/models/player.go
2022-10-01 20:45:52 +08:00

141 lines
3.8 KiB
Go

package models
import (
"database/sql"
"fmt"
sq "github.com/Masterminds/squirrel"
"github.com/jmoiron/sqlx"
)
type PlayerBattleState struct {
ADDED_PENDING_BATTLE_COLLIDER_ACK int32
READDED_PENDING_BATTLE_COLLIDER_ACK int32
ACTIVE int32
DISCONNECTED int32
LOST int32
EXPELLED_DURING_GAME int32
EXPELLED_IN_DISMISSAL int32
}
var PlayerBattleStateIns PlayerBattleState
func InitPlayerBattleStateIns() {
PlayerBattleStateIns = PlayerBattleState{
ADDED_PENDING_BATTLE_COLLIDER_ACK: 0,
READDED_PENDING_BATTLE_COLLIDER_ACK: 1,
ACTIVE: 2,
DISCONNECTED: 3,
LOST: 4,
EXPELLED_DURING_GAME: 5,
EXPELLED_IN_DISMISSAL: 6,
}
}
type Player struct {
Id int32 `json:"id,omitempty" db:"id"`
X float64 `json:"x,omitempty"`
Y float64 `json:"y,omitempty"`
Dir *Direction `json:"dir,omitempty"`
Speed float64 `json:"speed,omitempty"`
BattleState int32 `json:"battleState,omitempty"`
LastMoveGmtMillis int32 `json:"lastMoveGmtMillis,omitempty"`
Score int32 `json:"score,omitempty"`
Removed bool `json:"removed,omitempty"`
JoinIndex int32
Name string `json:"name,omitempty" db:"name"`
DisplayName string `json:"displayName,omitempty" db:"display_name"`
Avatar string `json:"avatar,omitempty"`
FrozenAtGmtMillis int64 `json:"-" db:"-"`
AddSpeedAtGmtMillis int64 `json:"-" db:"-"`
CreatedAt int64 `json:"-" db:"created_at"`
UpdatedAt int64 `json:"-" db:"updated_at"`
DeletedAt NullInt64 `json:"-" db:"deleted_at"`
TutorialStage int `json:"-" db:"tutorial_stage"`
AckingFrameId int32 `json:"ackingFrameId"`
AckingInputFrameId int32 `json:"-"`
LastSentInputFrameId int32 `json:"-"`
}
func ExistPlayerByName(name string) (bool, error) {
return exist("player", sq.Eq{"name": name, "deleted_at": nil})
}
func GetPlayerByName(name string) (*Player, error) {
return getPlayer(sq.Eq{"name": name, "deleted_at": nil})
}
func GetPlayerById(id int) (*Player, error) {
return getPlayer(sq.Eq{"id": id, "deleted_at": nil})
}
func getPlayer(cond sq.Eq) (*Player, error) {
var p Player
err := getObj("player", cond, &p)
if err == sql.ErrNoRows {
return nil, nil
}
p.Dir = &Direction{
Dx: 0,
Dy: 0,
}
return &p, nil
}
func (p *Player) Insert(tx *sqlx.Tx) error {
result, err := txInsert(tx, "player", []string{"name", "display_name", "created_at", "updated_at", "avatar"},
[]interface{}{p.Name, p.DisplayName, p.CreatedAt, p.UpdatedAt, p.Avatar})
if err != nil {
return err
}
id, err := result.LastInsertId()
if err != nil {
return err
}
p.Id = int32(id)
return nil
}
func Update(tx *sqlx.Tx, id int32, p *Player) (bool, error) {
query, args, err := sq.Update("player").
Set("display_name", p.DisplayName).
Set("avatar", p.Avatar).
Where(sq.Eq{"id": id}).ToSql()
fmt.Println(query)
if err != nil {
return false, err
}
result, err := tx.Exec(query, args...)
if err != nil {
fmt.Println("ERRRRRRR: ")
fmt.Println(err)
return false, err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return false, err
}
return rowsAffected >= 1, nil
}
func UpdatePlayerTutorialStage(tx *sqlx.Tx, id int) (bool, error) {
query, args, err := sq.Update("player").
Set("tutorial_stage", 1).
Where(sq.Eq{"tutorial_stage": 0, "id": id}).ToSql()
if err != nil {
return false, err
}
result, err := tx.Exec(query, args...)
if err != nil {
return false, err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return false, err
}
return rowsAffected >= 1, nil
}