playerlevel.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package events
  2. import (
  3. "fmt"
  4. "os"
  5. "bufio"
  6. "io"
  7. "strings"
  8. "box-gm/utils"
  9. "time"
  10. // "log"
  11. "github.com/tealeg/xlsx"
  12. "github.com/astaxie/beego"
  13. )
  14. // 玩家等级分布
  15. func PlayerLevel_get_day_level_count(date string, serverId string) (map[int]int, int) {
  16. var plCount = make(map[int]int)
  17. var playerLevel = make(map[int]int)
  18. f, err := os.Open(fmt.Sprintf("%s/event-%s.log", utils.GetKeyConf("events", "path"), date))
  19. if err != nil {
  20. return plCount, 0
  21. }
  22. defer f.Close()
  23. buff := bufio.NewReader(f)
  24. maxLevel := 0
  25. for {
  26. line, err := buff.ReadString('\n')
  27. if err != nil || io.EOF == err {
  28. break
  29. }
  30. line = strings.TrimSpace(line)
  31. arr := strings.Split(line, ";")
  32. if arr[3] == "player-upgrade" {
  33. if serverId == "0" || arr[1] == serverId {
  34. uid := utils.StringToInt(arr[2])
  35. level := utils.StringToInt(arr[4])
  36. playerLevel[uid] = level
  37. if level > maxLevel {
  38. maxLevel = level
  39. }
  40. }
  41. }
  42. }
  43. // 关卡分布
  44. for _, v := range playerLevel {
  45. plCount[v] ++
  46. }
  47. return plCount, maxLevel
  48. }
  49. func PlayerLevel_get_range_day_level_count(days int, serverId string) ([]*tgSeries, []string) {
  50. var series []*tgSeries
  51. currTime := int(time.Now().Unix())
  52. dayCount := 0
  53. maxCategories := 0
  54. for {
  55. tiEvent := currTime - 86400*dayCount
  56. date := time.Unix(int64(tiEvent), 0).Format("2006-01-02")
  57. item := &tgSeries{}
  58. glCount, maxLevel := PlayerLevel_get_day_level_count(date, serverId)
  59. item.Name = date
  60. for i:=0; i <= maxLevel; i++ {
  61. item.Data = append(item.Data, glCount[i])
  62. }
  63. item.MapCount = glCount
  64. series = append(series, item)
  65. if maxLevel > maxCategories {
  66. maxCategories = maxLevel
  67. }
  68. // log.Printf("playerlevel date[%s] item[%v]", date, item)
  69. dayCount ++
  70. if dayCount > days {
  71. break
  72. }
  73. }
  74. var arrCate []string
  75. for i:=0; i < maxCategories + 5; i++ {
  76. arrCate = append(arrCate, fmt.Sprintf("%d", i))
  77. }
  78. // log.Printf("playerlevel series[%v] arrCate[%v]", series, arrCate)
  79. return series, arrCate
  80. }
  81. // 保存文件
  82. func Save_playerlevel_records(series []*tgSeries, user string) string {
  83. var file *xlsx.File
  84. var sheet *xlsx.Sheet
  85. var row *xlsx.Row
  86. var err error
  87. file = xlsx.NewFile()
  88. sheet, err = file.AddSheet("玩家等级")
  89. if err != nil {
  90. beego.Warn(err)
  91. return ""
  92. }
  93. row = sheet.AddRow()
  94. row.AddCell().Value = "日期"
  95. row.AddCell().Value = "等级"
  96. row.AddCell().Value = "人数"
  97. for i := 0; i < len(series); i++ {
  98. item := series[i]
  99. for k, v := range item.MapCount {
  100. row = sheet.AddRow()
  101. row.AddCell().SetString(item.Name)
  102. row.AddCell().SetInt(k)
  103. row.AddCell().SetInt(v)
  104. }
  105. }
  106. name := fmt.Sprintf("./static/统计-玩家等级-%s.xlsx", user)
  107. os.Remove(name)
  108. err = file.Save(name)
  109. if err != nil {
  110. beego.Warn(err)
  111. return ""
  112. }
  113. return name
  114. }