changelog.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package model
  2. import (
  3. "time"
  4. "git.jiaxianghudong.com/go/logs"
  5. "git.jiaxianghudong.com/webs/pkg/dbx"
  6. "git.jiaxianghudong.com/webs/pkg/rds"
  7. "golang.org/x/sync/singleflight"
  8. )
  9. type ChangeLog struct {
  10. Id int `json:"id" sql:"id"`
  11. GameId int `json:"game_id" sql:"game_id"`
  12. Tab string `json:"tab" sql:"tab"`
  13. Name string `json:"name" sql:"name"`
  14. Version int `json:"version" sql:"version"`
  15. ChangeLogs []ChangeLogContent
  16. }
  17. type ChangeLogContent struct {
  18. Id int `json:"id" sql:"id"`
  19. LogId int `json:"log_id" sql:"log_id"`
  20. Content string `json:"content" sql:"content"`
  21. UpdateTime int64 `json:"update_time" sql:"update_time"`
  22. }
  23. var (
  24. changelogVersion = -1
  25. changelogSF singleflight.Group
  26. changelogs []ChangeLog
  27. )
  28. func getChangeLogs() []ChangeLog {
  29. v, err, _ := changelogSF.Do("changelog", func() (interface{}, error) {
  30. version, err := rds.Redis8.Get("game_rule:changelog:version").Int()
  31. if err != nil {
  32. logs.Errorf("Get game_rule:changelog:version failed,err:%v", err)
  33. }
  34. if version == changelogVersion {
  35. return changelogs, nil
  36. }
  37. var logs []ChangeLog
  38. if err = dbx.MySQLExt.Query2("SELECT id,game_id,tab,name,version FROM `ext`.`changelog`", &logs); err != nil {
  39. return nil, err
  40. }
  41. var logIdMap = map[int]*ChangeLog{}
  42. for i := range logs {
  43. logIdMap[logs[i].Id] = &logs[i]
  44. }
  45. var logContents []ChangeLogContent
  46. if err = dbx.MySQLExt.Query2("SELECT id,log_id,content,UNIX_TIMESTAMP(update_time)update_time FROM `ext`.`changelog_content` order BY update_time DESC,id desc ", &logContents); err != nil {
  47. return nil, err
  48. }
  49. for _, content := range logContents {
  50. logIdMap[content.LogId].ChangeLogs = append(logIdMap[content.LogId].ChangeLogs, content)
  51. }
  52. changelogs = logs
  53. changelogVersion = version
  54. return changelogs, nil
  55. })
  56. if err != nil {
  57. logs.Errorf("getChangeLogs failed,err:%v", err)
  58. }
  59. return v.([]ChangeLog)
  60. }
  61. func GetAllChangeLogVersionInfo() (infos []map[string]interface{}) {
  62. now := time.Now().Unix()
  63. for _, log := range getChangeLogs() {
  64. var updateTime int64
  65. for _, c := range log.ChangeLogs {
  66. if c.UpdateTime > now {
  67. continue
  68. }
  69. if updateTime < c.UpdateTime {
  70. updateTime = c.UpdateTime
  71. }
  72. }
  73. infos = append(infos, map[string]interface{}{
  74. "game_id": log.GameId,
  75. "tab": log.Tab,
  76. "version": log.Version,
  77. "update_time": updateTime,
  78. })
  79. }
  80. return
  81. }
  82. func GetChangeLog(gameId int, tab string) (contents []string) {
  83. now := time.Now().Unix()
  84. for _, log := range getChangeLogs() {
  85. if log.GameId != gameId || log.Tab != tab {
  86. continue
  87. }
  88. for _, content := range log.ChangeLogs {
  89. if content.UpdateTime > now {
  90. continue
  91. }
  92. contents = append(contents, content.Content)
  93. }
  94. }
  95. return
  96. }