Files
go-common/app/service/live/dao-anchor/model/anchor_level.go
2019-04-22 18:49:16 +08:00

107 lines
1.6 KiB
Go

package model
import (
"errors"
"math"
)
const MaxAnchorLevel = 40
var anchorLevelScoreTable = []int64{
0,
50,
200,
470,
920,
2100,
4060,
7160,
11760,
18060,
27160,
39610,
56410,
78810,
109810,
154810,
226810,
319810,
442810,
602810,
816810,
1138810,
1594810,
2214810,
3004810,
3984810,
5229810,
6909810,
9013810,
11883810,
15613810,
20613810,
27313810,
36413810,
47813810,
62013810,
79513810,
99513810,
122013810,
147013810,
int64(math.MaxInt64),
}
// Returns the index of first element that **greater** than the given value.
func upperBound(list []int64, value int64) int {
count := len(list)
first:= 0
for count > 0 {
i := first
step := count / 2
i += step
if value >= list[i] {
first = i + 1
count -= step + 1
} else {
count = step
}
}
return first
}
// GetAnchorLevel returns anchor level, i.e. Lv1 ~ Lv40, corresponding to the given score.
func GetAnchorLevel(score int64) (int64, error) {
if score < 0 {
return 0, errors.New("invalid anchor score")
}
return int64(upperBound(anchorLevelScoreTable, score)), nil
}
// GetLevelScoreInfo returns left & right score of a given level.
func GetLevelScoreInfo(lv int64) (left, right int64, err error) {
if lv < 1 || lv >= int64(len(anchorLevelScoreTable)) {
return 0, 0, errors.New("invalid request level")
}
left = anchorLevelScoreTable[lv-1]
right = anchorLevelScoreTable[lv] - 1
return
}
// GetAnchorLevelColor returns level color.
func GetAnchorLevelColor(lv int64) (int64, error) {
if lv < 1 || lv > MaxAnchorLevel {
return 0, errors.New("invalid request level")
}
q := lv / 10
r := lv % 10
if r == 0 {
q -= 1
}
return q, nil
}