mirror of
https://github.com/iLoveElysia/openbilibili.git
synced 2026-06-08 05:58:29 -05:00
156 lines
3.6 KiB
Go
156 lines
3.6 KiB
Go
|
|
package model
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"encoding/json"
|
|||
|
|
// "fmt"
|
|||
|
|
// "time"
|
|||
|
|
|
|||
|
|
"go-common/library/log"
|
|||
|
|
|
|||
|
|
"github.com/pkg/errors"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// Trend enum
|
|||
|
|
const (
|
|||
|
|
TrendHold = 0
|
|||
|
|
TrendUp = 1
|
|||
|
|
TrendDown = 2
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// Charge 充电,amount: 总充电数
|
|||
|
|
func (e *RankElecPrepUPProto) Charge(payMID int64, amount int64, newElecer bool) {
|
|||
|
|
// 检查是否在榜,如果在榜直接更新
|
|||
|
|
ele := e.Find(payMID)
|
|||
|
|
if ele != nil {
|
|||
|
|
ele.Amount = amount
|
|||
|
|
e.update(ele)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
if newElecer {
|
|||
|
|
e.Count++
|
|||
|
|
e.CountUPTotalElec++
|
|||
|
|
}
|
|||
|
|
// 排行榜列表为最大长度 且 榜单末位的充电数 >= 新的充电数,返回
|
|||
|
|
if len(e.List) >= e.Size_ && e.List[len(e.List)-1].Amount >= amount {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
// 没有在榜且可以上榜则插入原榜
|
|||
|
|
newEle := &RankElecPrepElementProto{
|
|||
|
|
Rank: -1,
|
|||
|
|
MID: payMID,
|
|||
|
|
TrendType: TrendHold,
|
|||
|
|
Amount: amount,
|
|||
|
|
}
|
|||
|
|
e.insert(newEle)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UpdateMessage 更新留言
|
|||
|
|
func (e *RankElecPrepUPProto) UpdateMessage(payMID int64, message string, hidden bool) {
|
|||
|
|
ele := e.Find(payMID)
|
|||
|
|
if ele != nil {
|
|||
|
|
ele.Message = &ElecMessageProto{
|
|||
|
|
Message: message,
|
|||
|
|
Hidden: hidden,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Find 获得榜单中payMID的排名信息,如果不存在则返回nil
|
|||
|
|
func (e *RankElecPrepUPProto) Find(payMID int64) (ele *RankElecPrepElementProto) {
|
|||
|
|
for _, r := range e.List {
|
|||
|
|
if r.MID == payMID {
|
|||
|
|
ele = r
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新排名
|
|||
|
|
func (e *RankElecPrepUPProto) update(ele *RankElecPrepElementProto) {
|
|||
|
|
for i := range e.List {
|
|||
|
|
if e.List[i] == nil {
|
|||
|
|
log.Error("ElecPrepUPRank: %s, index: %d, ele: %+v", e, i, ele)
|
|||
|
|
}
|
|||
|
|
if e.List[i].MID != ele.MID && e.List[i].Amount >= ele.Amount {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
newRank := e.List[i].Rank
|
|||
|
|
if err := e.shift(i, ele.Rank-1); err != nil {
|
|||
|
|
log.Error("ElecPrepUPRank.update err: %+v, ele: %+v in rank: %s ", err, ele, e)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
ele.Rank = newRank
|
|||
|
|
e.List[i] = ele
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 插入新排名到榜单
|
|||
|
|
func (e *RankElecPrepUPProto) insert(ele *RankElecPrepElementProto) {
|
|||
|
|
for i := range e.List {
|
|||
|
|
if e.List[i].Amount >= ele.Amount {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
// 找到新排名的位置,并插入
|
|||
|
|
ele.Rank = e.List[i].Rank
|
|||
|
|
if len(e.List) >= e.Size_ { // 榜单已满
|
|||
|
|
if err := e.shift(i, len(e.List)-1); err != nil {
|
|||
|
|
log.Error("ElecPrepUPRank.insert err: %+v, ele: %+v in rank: %s ", err, ele, e)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
} else { // 榜单未满
|
|||
|
|
tailEle := e.List[len(e.List)-1]
|
|||
|
|
if err := e.shift(i, len(e.List)-1); err != nil {
|
|||
|
|
log.Error("ElecPrepUPRank.insert err: %+v, ele: %+v in rank: %s ", err, ele, e)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
tailEle.Rank++
|
|||
|
|
e.List = append(e.List, tailEle)
|
|||
|
|
}
|
|||
|
|
e.List[i] = ele
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
// 插入到末位
|
|||
|
|
if ele.Rank < 0 {
|
|||
|
|
e.List = append(e.List, ele)
|
|||
|
|
ele.Rank = len(e.List)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// shift 将排名从 fromRank 起后移一位到 toRank,原 toRank 会被丢弃,原 fromRank 将会空出
|
|||
|
|
func (e *RankElecPrepUPProto) shift(fromIndex, toIndex int) (err error) {
|
|||
|
|
if fromIndex > toIndex {
|
|||
|
|
err = errors.Errorf("shift from(%d) > to(%d)", fromIndex, toIndex)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
if len(e.List)-1 < toIndex {
|
|||
|
|
err = errors.Errorf("shift out of range [%d,%d], just have: %d", fromIndex, toIndex, len(e.List))
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
lastEle := e.List[fromIndex]
|
|||
|
|
e.List[fromIndex] = nil
|
|||
|
|
|
|||
|
|
for i := fromIndex + 1; i <= toIndex; i++ {
|
|||
|
|
lastEle.Rank++
|
|||
|
|
e.List[i], lastEle = lastEle, e.List[i]
|
|||
|
|
}
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Message binlog databus msg.
|
|||
|
|
type Message struct {
|
|||
|
|
Action string `json:"action"`
|
|||
|
|
Table string `json:"table"`
|
|||
|
|
New json.RawMessage `json:"new"`
|
|||
|
|
Old json.RawMessage `json:"old"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ElecUserSetting .
|
|||
|
|
type ElecUserSetting int32
|
|||
|
|
|
|||
|
|
// ShowMessage 充电榜单是否显示留言
|
|||
|
|
func (e ElecUserSetting) ShowMessage() bool {
|
|||
|
|
return (e & 0x1) > 0
|
|||
|
|
}
|