Add on-the-fly rank calculation; change "subscribed" to "subscribed_to_scores"

This commit is contained in:
Morgan Bazalgette 2017-04-18 21:08:06 +02:00
parent b2c3ada7c0
commit 330b90b172
No known key found for this signature in database
GPG Key ID: 40D328300D245DA5
6 changed files with 46 additions and 25 deletions

View File

@ -4,8 +4,11 @@ import (
"database/sql"
"fmt"
"strconv"
"strings"
"gopkg.in/thehowl/go-osuapi.v1"
"zxq.co/ripple/rippleapi/common"
"zxq.co/x/getrank"
)
// Score is a score done on Ripple.
@ -26,6 +29,7 @@ type Score struct {
PlayMode int `json:"play_mode"`
Accuracy float64 `json:"accuracy"`
PP float32 `json:"pp"`
Rank string `json:"rank"`
Completed int `json:"completed"`
}
@ -112,6 +116,15 @@ WHERE scores.beatmap_md5 = ? AND scores.completed = '3' AND `+md.User.OnlyUserPu
continue
}
s.User = u
s.Rank = strings.ToUpper(getrank.GetRank(
osuapi.Mode(s.PlayMode),
osuapi.Mods(s.Mods),
s.Accuracy,
s.Count300,
s.Count100,
s.Count50,
s.CountMiss,
))
r.Scores = append(r.Scores, s)
}
r.Code = 200

View File

@ -2,8 +2,11 @@ package v1
import (
"fmt"
"strings"
"gopkg.in/thehowl/go-osuapi.v1"
"zxq.co/ripple/rippleapi/common"
"zxq.co/x/getrank"
)
type userScore struct {
@ -106,6 +109,15 @@ func scoresPuts(md common.MethodData, whereClause string, params ...interface{})
}
b.Difficulty = b.Diff2.STD
us.Beatmap = b
us.Rank = strings.ToUpper(getrank.GetRank(
osuapi.Mode(us.PlayMode),
osuapi.Mods(us.Mods),
us.Accuracy,
us.Count300,
us.Count100,
us.Count50,
us.CountMiss,
))
scores = append(scores, us)
}
r := userScoresResponse{}

View File

@ -71,7 +71,7 @@ var messageHandler = map[string]func(c *conn, message incomingMessage){
const (
TypeConnected = "connected"
TypeInvalidMessage = "invalid_message_type"
TypeSubscribed = "subscribed"
TypeSubscribedToScores = "subscribed_to_scores"
TypeNewScore = "new_score"
)

View File

@ -3,9 +3,12 @@ package websockets
import (
"encoding/json"
"fmt"
"strings"
"sync"
"gopkg.in/thehowl/go-osuapi.v1"
"zxq.co/ripple/rippleapi/app/v1"
"zxq.co/x/getrank"
)
type subscribeScoresUser struct {
@ -40,7 +43,7 @@ func SubscribeScores(c *conn, message incomingMessage) {
scoreSubscriptionsMtx.Unlock()
c.WriteJSON(TypeSubscribed, ssu)
c.WriteJSON(TypeSubscribedToScores, ssu)
}
type scoreSubscription struct {
@ -83,6 +86,15 @@ FROM scores WHERE id = ?`, id)
fmt.Println(err)
return
}
s.Rank = strings.ToUpper(getrank.GetRank(
osuapi.Mode(s.PlayMode),
osuapi.Mods(s.Mods),
s.Accuracy,
s.Count300,
s.Count100,
s.Count50,
s.CountMiss,
))
scoreSubscriptionsMtx.RLock()
cp := make([]scoreSubscription, len(scoreSubscriptions))
copy(cp, scoreSubscriptions)

6
vendor/vendor.json vendored
View File

@ -201,10 +201,10 @@
"revisionTime": "2016-11-23T19:03:31Z"
},
{
"checksumSHA1": "ItsAqvnH+Qa+ewmWbnSxT6EzSBk=",
"checksumSHA1": "9wL5kcCkaY+bXT/mEp+67/M+6rU=",
"path": "zxq.co/x/getrank",
"revision": "e62f5bd6998d8d75fe3a2ff1becc9df06e88e3a6",
"revisionTime": "2016-05-28T18:25:35Z"
"revision": "97d2823cf77de9e0c95e89485df768518b6262a9",
"revisionTime": "2017-04-18T18:31:09Z"
}
],
"rootPath": "zxq.co/ripple/rippleapi"

View File

@ -13,7 +13,7 @@ func GetRank(gameMode osuapi.Mode, mods osuapi.Mods, acc float64, c300, c100, c5
total := c300 + c100 + c50 + cmiss
switch gameMode {
case osuapi.ModeOsu:
case osuapi.ModeOsu, osuapi.ModeTaiko:
var (
c300f = float64(c300)
totalf = float64(total)
@ -33,22 +33,6 @@ func GetRank(gameMode osuapi.Mode, mods osuapi.Mods, acc float64, c300, c100, c5
}
return "d"
case osuapi.ModeTaiko:
switch {
case acc == 100:
return s(true, mods)
case acc >= 95:
return s(false, mods)
case acc >= 90:
return "a"
case acc >= 80:
return "b"
// untested
case acc >= 70:
return "c"
}
return "d"
case osuapi.ModeCatchTheBeat:
if acc == 100 {
if mods&silver > 0 {