PageStats.coffee 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. class PageStats extends Class
  2. constructor: ->
  3. @need_update = false
  4. @need_load_chartjs = true
  5. @chartjs_loaded = false
  6. @chart_timeline = new ChartTimeline()
  7. @chart_big = new ChartBig()
  8. @chart_big.types = [
  9. {name: "file_bytes_sent", dataset_id: 0}
  10. {name: "file_bytes_recv", dataset_id: 1, negative: true}
  11. {name: "request_num_sent", dataset_id: 2, negative: true}
  12. {name: "request_num_recv", dataset_id: 3}
  13. ]
  14. @chart_legend = new ChartLegend()
  15. @chart_legend.items_left = [
  16. {title: "Upload", getValue: ( => Text.formatSize(@chart_big.data_total.file_bytes_sent) ), color: "#1dfc59"},
  17. {title: "Download", getValue: ( => Text.formatSize(@chart_big.data_total.file_bytes_recv) ), color: "#c94d47"},
  18. {title: "Ratio", getValue: ( => @chart_big.data_total.file_bytes_sent / @chart_big.data_total.file_bytes_recv), type: "ratio", color: "#16ffe9"}
  19. ]
  20. @chart_legend.items_right = [
  21. {title: "Sent", getValue: ( => @chart_big.data_total.request_num_sent ), post: "requests", dot: "\u2500", color: "#2da3b3"},
  22. {title: "Received", getValue: ( => @chart_big.data_total.request_num_recv ), post: "requests", dot: "\u2500", color: "#80623f"}
  23. ]
  24. @chart_radar = new ChartRadar()
  25. # Chart connections
  26. @chart_connections = new Chart()
  27. @chart_connections.title = "Connections"
  28. @chart_connections.type_names = ["peer", "peer_onion", "connection", "connection_onion", "connection_in", "connection_ping_avg", "connection_ping_min"]
  29. @chart_connections.formatValue = (type_data) ->
  30. return "#{type_data.connection} of #{type_data.peer} peers"
  31. @chart_connections.formatDetails = (type_data) ->
  32. back = []
  33. back.push "Onion: #{type_data.peer_onion} peers (#{type_data.connection_onion or 0} connections)"
  34. back.push "Incoming: #{Math.round(type_data.connection_in / type_data.connection * 100)}%"
  35. back.push "Ping avg: #{type_data.connection_ping_avg}ms (min: #{type_data.connection_ping_min}ms)"
  36. return back
  37. @chart_connections.chart_stroke = ["#608DECAA", "#D74C58FF"]
  38. @chart_connections.getChartQuery = ->
  39. "SELECT * FROM data WHERE type_id = #{Page.page_stats.type_id_db['connection']} ORDER BY date_added DESC LIMIT 50"
  40. # Chart size
  41. @chart_size = new Chart()
  42. @chart_size.getTitle = ->
  43. h("a", {href: Page.createUrl("bigchart", "size"), onclick: Page.handleLinkClick}, "Total size")
  44. @chart_size.chart_stroke = ["#F99739AA", "#51B8F2"]
  45. @chart_size.type_names = ["size", "size_optional", "optional_limit", "optional_used", "content"]
  46. @chart_size.formatValue = (type_data) ->
  47. return Text.formatSize(type_data.size) + " in #{Page.site_list.sites.length} sites"
  48. @chart_size.formatDetails = (type_data) ->
  49. back = []
  50. back.push "Content sources: #{type_data.content} files"
  51. back.push "Optional downloaded: #{Text.formatSize(type_data.optional_used) or '0 MB'} of #{Text.formatSize(type_data.size_optional) or '0 MB'} (limit: #{Text.formatSize(type_data.optional_limit)})"
  52. return back
  53. @chart_size.getChartQuery = ->
  54. "SELECT CAST(value AS FLOAT) / 1024 / 1024 AS value FROM data WHERE type_id = #{Page.page_stats.type_id_db['size']} GROUP BY ROUND(date_added / 10000) ORDER BY date_added DESC LIMIT 50"
  55. @chart_world = new ChartWorld()
  56. @country_list = new StatList()
  57. @type_name_db = {}
  58. @type_id_db = {}
  59. @site_address_db = {}
  60. @site_id_db = {}
  61. setInterval ( =>
  62. @need_update = true
  63. Page.projector.scheduleRender()
  64. ), 5 * 60 * 1000
  65. handleChartjsLoad: =>
  66. @chartjs_loaded = true
  67. Page.projector.scheduleRender()
  68. update: =>
  69. Page.cmd "chartDbQuery", "SELECT * FROM type", (res) =>
  70. @type_id_db = {}
  71. @type_name_db = {}
  72. for row in res
  73. @type_id_db[row.name] = row.type_id
  74. @type_name_db[row.type_id] = row.name
  75. Page.cmd "chartDbQuery", "SELECT * FROM site", (res) =>
  76. sites = {}
  77. @sites_by_id = {}
  78. for row in res
  79. @site_id_db[row.address] = row.site_id
  80. @site_address_db[row.site_id] = row.address
  81. @chart_big.need_update = true
  82. @chart_timeline.need_update = true
  83. @chart_connections.need_update = true
  84. @chart_size.need_update = true
  85. @chart_radar.need_update = true
  86. @chart_world.need_update = true
  87. Page.projector.scheduleRender()
  88. loadChartjs: =>
  89. e = document.createElement("script")
  90. e.type = "text/javascript"
  91. e.src = "chartjs/chart.bundle.min.js"
  92. e.onload = @handleChartjsLoad
  93. document.body.appendChild e
  94. render: =>
  95. if Page.server_info?.rev < 3220
  96. return h("div#PageStats",
  97. h("div.empty", [
  98. h("h4", "Need update"),
  99. h("small", "You have to update to ZeroNet version 0.6.1 to use this feature.")
  100. ])
  101. )
  102. if @need_update
  103. @update()
  104. @need_update = false
  105. if not @need_update and document.body.className != "loaded"
  106. setTimeout ( -> document.body.classList.add("loaded") ), 1000
  107. if @need_load_chartjs
  108. setTimeout @loadChartjs, 500
  109. @need_load_chartjs = false
  110. intervals = ["1w", "1d"]
  111. h("div#PageStats", [
  112. h("div.intervals", intervals.map (interval) =>
  113. if interval == "1d"
  114. interval_param = undefined
  115. else
  116. interval_param = interval
  117. h("a.interval", {href: Page.createUrl("interval", interval_param), onclick: Page.handleLinkClick, classes: {active: interval_param == Page.params.interval}}, interval)
  118. )
  119. @chart_timeline.render(),
  120. if @chartjs_loaded then [
  121. @chart_big.render()
  122. @chart_legend.render()
  123. @chart_radar.render()
  124. h("div.Charts", [
  125. @chart_connections.render(),
  126. @chart_size.render()
  127. ])
  128. @chart_world.render()
  129. @country_list.render()
  130. ]
  131. ])
  132. window.PageStats = PageStats