Oppaitime's version of Gazelle
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

users.php 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?
  2. if (!list($Countries, $Rank, $CountryUsers, $CountryMax, $CountryMin, $LogIncrements) = $Cache->get_value('geodistribution')) {
  3. include_once(SERVER_ROOT.'/classes/charts.class.php');
  4. $DB->query('
  5. SELECT Code, Users
  6. FROM users_geodistribution');
  7. $Data = $DB->to_array();
  8. $Count = $DB->record_count() - 1;
  9. $CountryMinThreshold = Min($Count, 30);
  10. $CountryMax = ceil(log(Max(1, $Data[0][1])) / log(2)) + 1;
  11. $CountryMin = floor(log(Max(1, $Data[$CountryMinThreshold][1])) / log(2));
  12. $CountryRegions = array('RS' => array('RS-KM')); // Count Kosovo as Serbia as it doesn't have a TLD
  13. foreach ($Data as $Key => $Item) {
  14. list($Country, $UserCount) = $Item;
  15. $Countries[] = $Country;
  16. $CountryUsers[] = number_format((((log($UserCount) / log(2)) - $CountryMin) / ($CountryMax - $CountryMin)) * 100, 2);
  17. $Rank[] = round((1 - ($Key / $Count)) * 100);
  18. if (isset($CountryRegions[$Country])) {
  19. foreach ($CountryRegions[$Country] as $Region) {
  20. $Countries[] = $Region;
  21. $Rank[] = end($Rank);
  22. }
  23. }
  24. }
  25. reset($Rank);
  26. for ($i = $CountryMin; $i <= $CountryMax; $i++) {
  27. $LogIncrements[] = Format::human_format(pow(2, $i));
  28. }
  29. $Cache->cache_value('geodistribution', array($Countries, $Rank, $CountryUsers, $CountryMax, $CountryMin, $LogIncrements), 0);
  30. }
  31. if (!$ClassDistribution = $Cache->get_value('class_distribution')) {
  32. $DB->query("
  33. SELECT p.Name, COUNT(m.ID) AS Users
  34. FROM users_main AS m
  35. JOIN permissions AS p ON m.PermissionID = p.ID
  36. WHERE m.Enabled = '1'
  37. GROUP BY p.Name
  38. ORDER BY Users DESC");
  39. $ClassDistribution = $DB->to_array();
  40. $Cache->cache_value('class_distribution', $ClassDistribution, 3600 * 24 * 14);
  41. }
  42. if (!$PlatformDistribution = $Cache->get_value('platform_distribution')) {
  43. $DB->query("
  44. SELECT OperatingSystem, COUNT(UserID) AS Users
  45. FROM users_sessions
  46. GROUP BY OperatingSystem
  47. ORDER BY Users DESC");
  48. $PlatformDistribution = $DB->to_array();
  49. $Cache->cache_value('platform_distribution', $PlatformDistribution, 3600 * 24 * 14);
  50. }
  51. if (!$BrowserDistribution = $Cache->get_value('browser_distribution')) {
  52. $DB->query("
  53. SELECT Browser, COUNT(UserID) AS Users
  54. FROM users_sessions
  55. GROUP BY Browser
  56. ORDER BY Users DESC");
  57. $BrowserDistribution = $DB->to_array();
  58. $Cache->cache_value('browser_distribution', $BrowserDistribution, 3600 * 24 * 14);
  59. }
  60. //Timeline generation
  61. if (!list($Labels, $InFlow, $OutFlow) = $Cache->get_value('users_timeline')) {
  62. $DB->query("
  63. SELECT DATE_FORMAT(JoinDate,\"%b %Y\") AS Month, COUNT(UserID)
  64. FROM users_info
  65. GROUP BY Month
  66. ORDER BY JoinDate DESC
  67. LIMIT 1, 11");
  68. $TimelineIn = array_reverse($DB->to_array());
  69. $DB->query("
  70. SELECT DATE_FORMAT(BanDate,\"%b %Y\") AS Month, COUNT(UserID)
  71. FROM users_info
  72. WHERE BanDate > 0
  73. GROUP BY Month
  74. ORDER BY BanDate DESC
  75. LIMIT 1, 11");
  76. $TimelineOut = array_reverse($DB->to_array());
  77. $Labels = array();
  78. foreach($TimelineIn as $Month) {
  79. list($Labels[], $InFlow[]) = $Month;
  80. }
  81. foreach($TimelineOut as $Month) {
  82. list(, $OutFlow[]) = $Month;
  83. }
  84. $Cache->cache_value('users_timeline', array($Labels, $InFlow, $OutFlow), mktime(0, 0, 0, date('n') + 1, 2)); //Tested: fine for Dec -> Jan
  85. }
  86. //End timeline generation
  87. View::show_header('Detailed User Statistics', 'chart');
  88. ?>
  89. <h3 id="User_Flow"><a href="#User_Flow">User Flow</a></h3>
  90. <div class="box pad center">
  91. <canvas class="chart" id="chart_user_timeline"></canvas>
  92. <script>
  93. new Chart($('#chart_user_timeline').raw().getContext('2d'), {
  94. type: 'line',
  95. data: {
  96. labels: <? print '["'.implode('","',$Labels).'"]'; ?>,
  97. datasets: [ {
  98. label: "New Registrations",
  99. backgroundColor: "rgba(0,0,255,0.2)",
  100. borderColor: "rgba(0,0,255,0.8)",
  101. data: <? print "[".implode(",",$InFlow)."]"; ?>
  102. }, {
  103. label: "Disabled Users",
  104. backgroundColor: "rgba(255,0,0,0.2)",
  105. borderColor: "rgba(255,0,0,0.8)",
  106. data: <? print "[".implode(",",$OutFlow)."]"; ?>
  107. }]
  108. }
  109. })
  110. </script>
  111. </div>
  112. <br />
  113. <h3 id="User_Classes"><a href="#User_Classes">User Classes</a></h3>
  114. <div class="box pad center">
  115. <canvas class="chart" id="chart_user_classes"></canvas>
  116. <script>
  117. new Chart($('#chart_user_classes').raw().getContext('2d'), {
  118. type: 'pie',
  119. data: {
  120. labels: <? print '["'.implode('","', array_column($ClassDistribution, 'Name')).'"]'; ?>,
  121. datasets: [ {
  122. data: <? print "[".implode(",", array_column($ClassDistribution, 'Users'))."]"; ?>,
  123. backgroundColor: ['#8a00b8','#a944cb','#be71d8','#e8ccf1', '#f3e3f9', '#fbf6fd', '#ffffff']
  124. }]
  125. }
  126. })
  127. </script>
  128. </div>
  129. <br />
  130. <h3 id="User_Platforms"><a href="#User_Platforms">User Platforms</a></h3>
  131. <div class="box pad center">
  132. <canvas class="chart" id="chart_user_platforms"></canvas>
  133. <script>
  134. new Chart($('#chart_user_platforms').raw().getContext('2d'), {
  135. type: 'pie',
  136. data: {
  137. labels: <? print '["'.implode('","', array_column($PlatformDistribution, 'OperatingSystem')).'"]'; ?>,
  138. datasets: [ {
  139. data: <? print "[".implode(",", array_column($PlatformDistribution, 'Users'))."]"; ?>,
  140. backgroundColor: ['#8a00b8','#9416bf','#9f2dc5','#a944cb','#b45bd2','#be71d8','#c988de','#d39fe5','#deb6eb','#e8ccf1', '#ffffff', '#ffffff', '#ffffff', '#ffffff']
  141. }]
  142. }
  143. })
  144. </script>
  145. </div>
  146. <br />
  147. <h3 id="User_Browsers"><a href="#User_Browsers">User Browsers</a></h3>
  148. <div class="box pad center">
  149. <canvas class="chart" id="chart_user_browsers"></canvas>
  150. <script>
  151. new Chart($('#chart_user_browsers').raw().getContext('2d'), {
  152. type: 'pie',
  153. data: {
  154. labels: <? print '["'.implode('","', array_column($BrowserDistribution, 'Browser')).'"]'; ?>,
  155. datasets: [ {
  156. data: <? print "[".implode(",", array_column($BrowserDistribution, 'Users'))."]"; ?>,
  157. backgroundColor: ['#8a00b8','#9416bf','#9f2dc5','#a944cb','#b45bd2','#be71d8','#c988de','#d39fe5','#deb6eb','#e8ccf1', '#ffffff', '#ffffff', '#ffffff', '#ffffff']
  158. }]
  159. }
  160. })
  161. </script>
  162. </div>
  163. <br />
  164. <h3 id="Geo_Dist_Map"><a href="#Geo_Dist_Map">Geographical Distribution Map</a></h3>
  165. <div class="box center">
  166. <img src="<?=ImageTools::process('https://chart.googleapis.com/chart?cht=map:fixed=-55,-180,73,180&amp;chs=440x220&amp;chd=t:'.implode(',', $Rank).'&amp;chco=FFFFFF,EDEDED,1F0066&amp;chld='.implode('|', $Countries).'&amp;chf=bg,s,CCD6FF&.png')?>" alt="Geographical Distribution Map - Worldwide" />
  167. <img src="<?=ImageTools::process('https://chart.googleapis.com/chart?cht=map:fixed=37,-26,65,67&amp;chs=440x220&amp;chs=440x220&amp;chd=t:'.implode(',', $Rank).'&amp;chco=FFFFFF,EDEDED,1F0066&amp;chld='.implode('|', $Countries).'&amp;chf=bg,s,CCD6FF&.png')?>" alt="Geographical Distribution Map - Europe" />
  168. <br />
  169. <img src="<?=ImageTools::process('https://chart.googleapis.com/chart?cht=map:fixed=-46,-132,24,21.5&amp;chs=440x220&amp;chd=t:'.implode(',', $Rank).'&amp;chco=FFFFFF,EDEDED,1F0066&amp;chld='.implode('|', $Countries).'&amp;chf=bg,s,CCD6FF&.png')?>" alt="Geographical Distribution Map - South America" />
  170. <img src="<?=ImageTools::process('https://chart.googleapis.com/chart?cht=map:fixed=-11,22,50,160&amp;chs=440x220&amp;chd=t:'.implode(',', $Rank).'&amp;chco=FFFFFF,EDEDED,1F0066&amp;chld='.implode('|', $Countries).'&amp;chf=bg,s,CCD6FF&.png')?>" alt="Geographical Distribution Map - Asia" />
  171. <br />
  172. <img src="<?=ImageTools::process('https://chart.googleapis.com/chart?cht=map:fixed=-36,-57,37,100&amp;chs=440x220&amp;chd=t:'.implode(',', $Rank).'&amp;chco=FFFFFF,EDEDED,1F0066&amp;chld='.implode('|', $Countries).'&amp;chf=bg,s,CCD6FF&.png')?>" alt="Geographical Distribution Map - Africa" />
  173. <img src="<?=ImageTools::process('https://chart.googleapis.com/chart?cht=map:fixed=14.8,15,45,86&amp;chs=440x220&amp;chd=t:'.implode(',', $Rank).'&amp;chco=FFFFFF,EDEDED,1F0066&amp;chld='.implode('|', $Countries).'&amp;chf=bg,s,CCD6FF&.png')?>" alt="Geographical Distribution Map - Middle East" />
  174. <br />
  175. <img src="<?=ImageTools::process('https://chart.googleapis.com/chart?chxt=y,x&amp;chg=0,-1,1,1&amp;chxs=0,h&amp;cht=bvs&amp;chco=76A4FB&amp;chs=880x300&amp;chd=t:'.implode(',', array_slice($CountryUsers, 0, 31)).'&amp;chxl=1:|'.implode('|', array_slice($Countries, 0, 31)).'|0:|'.implode('|', $LogIncrements).'&amp;chf=bg,s,FFFFFF00&.png')?>" alt="Number of users by country" />
  176. </div>
  177. <?
  178. View::show_footer();