gamelevel.go 2.9 KB

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