lean-analytics.swig 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. {%- if theme.leancloud_visitors.enable and not theme.valine.visitor %}
  2. <script{{ pjax }}>
  3. (function() {
  4. function leancloudSelector(url) {
  5. url = encodeURI(url);
  6. return document.getElementById(url).querySelector('.leancloud-visitors-count');
  7. }
  8. function addCount(Counter) {
  9. var visitors = document.querySelector('.leancloud_visitors');
  10. var url = decodeURI(visitors.id);
  11. var title = visitors.dataset.flagTitle;
  12. Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url })))
  13. .then(response => response.json())
  14. .then(({ results }) => {
  15. if (results.length > 0) {
  16. var counter = results[0];
  17. leancloudSelector(url).innerText = counter.time + 1;
  18. Counter('put', '/classes/Counter/' + counter.objectId, { time: { '__op': 'Increment', 'amount': 1 } })
  19. .catch(error => {
  20. console.error('Failed to save visitor count', error);
  21. });
  22. } else {
  23. {%- if theme.leancloud_visitors.security %}
  24. leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.';
  25. console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.');
  26. {% else %}
  27. Counter('post', '/classes/Counter', { title, url, time: 1 })
  28. .then(response => response.json())
  29. .then(() => {
  30. leancloudSelector(url).innerText = 1;
  31. })
  32. .catch(error => {
  33. console.error('Failed to create', error);
  34. });
  35. {%- endif %}
  36. }
  37. })
  38. .catch(error => {
  39. console.error('LeanCloud Counter Error', error);
  40. });
  41. }
  42. function showTime(Counter) {
  43. var visitors = document.querySelectorAll('.leancloud_visitors');
  44. var entries = [...visitors].map(element => {
  45. return decodeURI(element.id);
  46. });
  47. Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url: { '$in': entries } })))
  48. .then(response => response.json())
  49. .then(({ results }) => {
  50. for (let url of entries) {
  51. let target = results.find(item => item.url === url);
  52. leancloudSelector(url).innerText = target ? target.time : 0;
  53. }
  54. })
  55. .catch(error => {
  56. console.error('LeanCloud Counter Error', error);
  57. });
  58. }
  59. let { app_id, app_key, server_url } = {{ theme.leancloud_visitors | json }};
  60. function fetchData(api_server) {
  61. var Counter = (method, url, data) => {
  62. return fetch(`${api_server}/1.1${url}`, {
  63. method,
  64. headers: {
  65. 'X-LC-Id' : app_id,
  66. 'X-LC-Key' : app_key,
  67. 'Content-Type': 'application/json',
  68. },
  69. body: JSON.stringify(data)
  70. });
  71. };
  72. if (CONFIG.page.isPost) {
  73. if (CONFIG.hostname !== location.hostname) return;
  74. addCount(Counter);
  75. } else if (document.querySelectorAll('.post-title-link').length >= 1) {
  76. showTime(Counter);
  77. }
  78. }
  79. let api_server = app_id.slice(-9) !== '-MdYXbMMI' ? server_url : `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
  80. if (api_server) {
  81. fetchData(api_server);
  82. } else {
  83. fetch('https://app-router.leancloud.cn/2/route?appId=' + app_id)
  84. .then(response => response.json())
  85. .then(({ api_server }) => {
  86. fetchData('https://' + api_server);
  87. });
  88. }
  89. })();
  90. </script>
  91. {%- endif %}