diff --git a/nex/ranking/database/get_vote_and_win_count.go b/nex/ranking/database/get_vote_and_win_count.go new file mode 100644 index 0000000..6be9118 --- /dev/null +++ b/nex/ranking/database/get_vote_and_win_count.go @@ -0,0 +1,46 @@ +package database + +import ( + "github.com/PretendoNetwork/nex-go/v2/types" + "github.com/PretendoNetwork/splatoon/globals" +) + +// might be better to just return a struct here cause its not immediately obbvious from the signature which is which +func GetVoteAndWinCount(splatfestID uint32) (types.List[types.UInt32], types.List[types.UInt32], error) { + row := globals.Postgres.QueryRow(`SELECT + (SELECT + COUNT(user_id) + FROM ranking_splatoon.user_scores WHERE splatfest_id=$1 AND team_id=0) as alpha_team_votes, + (SELECT + COUNT(user_id) + FROM ranking_splatoon.user_scores WHERE splatfest_id=$1 AND team_id=1) as bravo_team_votes, + (SELECT + SUM(team_score) + FROM ranking_splatoon.results + WHERE splatfest_id=$1 + AND team_id=1 + ) as alpha_team_wins, + (SELECT + COUNT(team_score) + FROM ranking_splatoon.results + WHERE splatfest_id=$1 + AND team_id=1 + ) as bravo_team_wins + `, uint64(splatfestID)) + + if row.Err() != nil { + return types.NewList[types.UInt32](), types.NewList[types.UInt32](), row.Err() + } + var alpha_team_votes uint32 + var bravo_team_votes uint32 + var alpha_team_wins uint32 + var bravo_team_wins uint32 + + err := row.Scan(&alpha_team_votes, &bravo_team_votes, &alpha_team_wins, &bravo_team_wins) + if err != nil { + return types.NewList[types.UInt32](), types.NewList[types.UInt32](), err + } + + return types.List[types.UInt32]{types.NewUInt32(alpha_team_votes), types.NewUInt32(bravo_team_votes)}, + types.List[types.UInt32]{types.NewUInt32(alpha_team_wins), types.NewUInt32(bravo_team_wins)}, nil +} diff --git a/nex/ranking/database/get_vote_count.go b/nex/ranking/database/get_vote_count.go deleted file mode 100644 index 9cb74b7..0000000 --- a/nex/ranking/database/get_vote_count.go +++ /dev/null @@ -1,23 +0,0 @@ -package database - -import ( - "github.com/PretendoNetwork/splatoon/globals" -) - -func GetVoteCount(splatfestID uint32, team_id uint8) (uint32, error) { - row := globals.Postgres.QueryRow(`SELECT - COUNT(user_id) - FROM ranking_splatoon.user_scores WHERE splatfest_id=$1 AND team_id=$2`, uint64(splatfestID), int16(team_id)) - - if row.Err() != nil { - return 0, row.Err() - } - var count uint32 - - err := row.Scan(&count) - if err != nil { - return 0, err - } - - return count, nil -} diff --git a/nex/ranking/database/get_win_count.go b/nex/ranking/database/get_win_count.go deleted file mode 100644 index 504b788..0000000 --- a/nex/ranking/database/get_win_count.go +++ /dev/null @@ -1,28 +0,0 @@ -package database - -import ( - "github.com/PretendoNetwork/splatoon/globals" -) - -func GetWinCount(splatfestID uint32, team_id uint8) (uint32, error) { - row := globals.Postgres.QueryRow(`SELECT - COUNT(upload_id) - FROM ranking_splatoon.results - WHERE splatfest_id=$1 - AND ( - (has_won = false AND team_id NOT EQUAL $2) OR - (has_won = true AND team_id=$2) - )`, uint64(splatfestID), int16(team_id)) - - if row.Err() != nil { - return 0, row.Err() - } - var count uint32 - - err := row.Scan(&count) - if err != nil { - return 0, err - } - - return count, nil -} diff --git a/nex/ranking/database/setup.go b/nex/ranking/database/setup.go index 509f4c7..7679d3f 100644 --- a/nex/ranking/database/setup.go +++ b/nex/ranking/database/setup.go @@ -18,8 +18,9 @@ func Setup() { uploader_pid int8 not null, splatfest_id int8 not null, team_id int2 not null, - has_won int2 not null, + team_score int8 not null, app_data bytea not null, + created_at timestamp not null default now() )`) _, err = globals.Postgres.Exec(`CREATE TABLE IF NOT EXISTS ranking_splatoon.user_scores ( uploader_pid int8 not null, @@ -27,7 +28,8 @@ func Setup() { score int8 not null, team_id boolean not null, user_data bytea not null, - last_updated int8 not null + last_updated int8 not null, + created_at timestamp not null default now(), PRIMARY KEY(uploader_pid, splatfest_id) )`) if err != nil { diff --git a/nex/ranking/database/store_user_match_result.go b/nex/ranking/database/store_user_match_result.go index f7b87c3..271fcc1 100644 --- a/nex/ranking/database/store_user_match_result.go +++ b/nex/ranking/database/store_user_match_result.go @@ -14,9 +14,9 @@ func StoreUserMatchResult(userPID types.PID, data ranking_splatoon_types.Competi splatfest_id, score, team_id, - has_won + team_score ) VALUES ($1, $2, $3, $4, $5) - `, int64(userPID), int64(data.SplatfestId), int64(data.Score), int16(data.TeamId), bool(data.HasWon)) + `, int64(userPID), int64(data.SplatfestId), int64(data.Score), int16(data.TeamId), int64(data.TeamScore)) if err != nil { return err diff --git a/nex/ranking/get_competition_ranking_score.go b/nex/ranking/get_competition_ranking_score.go index 327202a..05cafa9 100644 --- a/nex/ranking/get_competition_ranking_score.go +++ b/nex/ranking/get_competition_ranking_score.go @@ -16,33 +16,14 @@ func GetSingleCompetitionRankingScore(splatfestID uint32) (ranking_splatoon_type info.FestId = types.UInt32(splatfestID) - var team_alpha_count uint32 - team_alpha_count, err = database.GetVoteCount(splatfestID, 0) - if err != nil { - return info, err - } - info.TeamVotes = append(info.TeamVotes, types.UInt32(team_alpha_count)) + team_wins, team_votes, err := database.GetVoteAndWinCount(splatfestID) - var team_bravo_count uint32 - team_bravo_count, err = database.GetVoteCount(splatfestID, 1) if err != nil { return info, err } - info.TeamVotes = append(info.TeamVotes, types.UInt32(team_bravo_count)) - var team_alpha_wins uint32 - team_alpha_wins, err = database.GetWinCount(splatfestID, 0) - if err != nil { - return info, err - } - info.TeamWins = append(info.TeamWins, types.UInt32(team_alpha_wins)) - - var team_bravo_wins uint32 - team_bravo_wins, err = database.GetVoteCount(splatfestID, 1) - if err != nil { - return info, err - } - info.TeamWins = append(info.TeamWins, types.UInt32(team_bravo_wins)) + info.TeamWins = types.List[types.UInt32](team_wins) + info.TeamVotes = types.List[types.UInt32](team_votes) var scoreDataEntries []ranking_splatoon_types.CompetitionRankingScoreData scoreDataEntries, err = database.GetScoreDataEntries(splatfestID) @@ -70,19 +51,18 @@ func GetCompetitionRankingScore(err error, packet nex.PacketInterface, callID ui } retVal := types.NewList[ranking_splatoon_types.CompetitionRankingScoreInfo]() - var festListIndex uint32 - for festListIndex = 0; festListIndex < uint32(params.ResultRange.Length); festListIndex++ { - if festListIndex >= uint32(len(params.FestivalIds)) { - return nil, nex.NewError(nex.ResultCodes.Core.InvalidArgument, "out of resultrange is out of bounds") - } - festId := params.FestivalIds[festListIndex+uint32(params.ResultRange.Offset)] - info, err := GetSingleCompetitionRankingScore(uint32(festId)) - if err != nil { - return nil, nex.NewError(nex.ResultCodes.Core.Exception, "error retrieving ranking scores") - } - retVal = append(retVal, info) + + if uint32(params.ResultRange.Offset) >= uint32(len(params.FestivalIds)) { + return nil, nex.NewError(nex.ResultCodes.Core.InvalidArgument, "out of resultrange is out of bounds") } + festId := params.FestivalIds[uint32(params.ResultRange.Offset)] + info, err := GetSingleCompetitionRankingScore(uint32(festId)) + if err != nil { + return nil, nex.NewError(nex.ResultCodes.Core.Exception, "error retrieving ranking scores") + } + retVal = append(retVal, info) + retVal.WriteTo(rmcResponseStream) rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes()) diff --git a/nex/ranking/types/competition_ranking_upload_score_param.go b/nex/ranking/types/competition_ranking_upload_score_param.go index 9b40e1f..c0e52ed 100644 --- a/nex/ranking/types/competition_ranking_upload_score_param.go +++ b/nex/ranking/types/competition_ranking_upload_score_param.go @@ -16,7 +16,7 @@ type CompetitionRankingUploadScoreParam struct { Unknown2 types.UInt32 Score types.UInt32 TeamId types.UInt8 - HasWon types.Bool + TeamScore types.UInt32 IsFirstUpload types.Bool AppData types.QBuffer } @@ -30,7 +30,7 @@ func (crusp CompetitionRankingUploadScoreParam) WriteTo(writable types.Writable) crusp.Unknown2.WriteTo(contentWritable) crusp.Score.WriteTo(contentWritable) crusp.TeamId.WriteTo(contentWritable) - crusp.HasWon.WriteTo(contentWritable) + crusp.TeamScore.WriteTo(contentWritable) crusp.IsFirstUpload.WriteTo(contentWritable) crusp.AppData.WriteTo(contentWritable) @@ -62,7 +62,7 @@ func (crusp CompetitionRankingUploadScoreParam) ExtractFrom(readable types.Reada if err := crusp.TeamId.ExtractFrom(readable); err != nil { return fmt.Errorf("failed to extract CompetitionRankingUploadScoreParam.TeamId. %s", err.Error()) } - if err := crusp.HasWon.ExtractFrom(readable); err != nil { + if err := crusp.TeamScore.ExtractFrom(readable); err != nil { return fmt.Errorf("failed to extract CompetitionRankingUploadScoreParam.TeamWin. %s", err.Error()) } if err := crusp.IsFirstUpload.ExtractFrom(readable); err != nil { @@ -85,7 +85,7 @@ func (crusp CompetitionRankingUploadScoreParam) Copy() types.RVType { copied.Unknown2 = crusp.Unknown2.Copy().(types.UInt32) copied.Score = crusp.Score.Copy().(types.UInt32) copied.TeamId = crusp.TeamId.Copy().(types.UInt8) - copied.HasWon = crusp.HasWon.Copy().(types.Bool) + copied.TeamScore = crusp.TeamScore.Copy().(types.UInt32) copied.IsFirstUpload = crusp.IsFirstUpload.Copy().(types.Bool) copied.AppData = crusp.AppData.Copy().(types.QBuffer) @@ -119,7 +119,7 @@ func (crusp CompetitionRankingUploadScoreParam) Equals(o types.RVType) bool { if !crusp.TeamId.Equals(other.TeamId) { return false } - if !crusp.HasWon.Equals(other.HasWon) { + if !crusp.TeamScore.Equals(other.TeamScore) { return false } if !crusp.IsFirstUpload.Equals(other.IsFirstUpload) { @@ -161,7 +161,7 @@ func (crusp CompetitionRankingUploadScoreParam) FormatToString(indentationLevel fmt.Fprintf(&b, "%sUnknown2: %s,\n", indentationValues, crusp.Unknown2) fmt.Fprintf(&b, "%sScore: %s,\n", indentationValues, crusp.Score) fmt.Fprintf(&b, "%sTeamId: %s,\n", indentationValues, crusp.TeamId) - fmt.Fprintf(&b, "%sHasWon: %s,\n", indentationValues, crusp.HasWon) + fmt.Fprintf(&b, "%TeamScore: %s,\n", indentationValues, crusp.TeamScore) fmt.Fprintf(&b, "%sIsFirstUpload: %s,\n", indentationValues, crusp.IsFirstUpload) fmt.Fprintf(&b, "%sAppData: %s,\n", indentationValues, crusp.AppData) fmt.Fprintf(&b, "%s}", indentationEnd) @@ -177,7 +177,7 @@ func NewCompetitionRankingUploadScoreParam() CompetitionRankingUploadScoreParam Unknown2: types.NewUInt32(0), Score: types.NewUInt32(0), TeamId: types.NewUInt8(0), - HasWon: types.NewBool(false), + TeamScore: types.NewUInt32(0), IsFirstUpload: types.NewBool(false), AppData: types.NewQBuffer([]byte{}), }