PageSourceSearch

https://exe.ge/templates/Uspace-New/js/hwcheck.js

js exe.ge collected 2026-10-08 11:31:26 UTC 10,656 bytes, 277 lines download raw bytes

1/* ═══════════════════════════════════════════════════════ */
2/*  HW CHECK v4 — JS logic                                */
3/* ═══════════════════════════════════════════════════════ */
4
5(function () {
6  'use strict';
7
8  // ─── CONFIG ───
9  var HW_CHECK_ENDPOINT = '/engine/ajax/hw_check_game.php';
10  var HW_DOWNLOAD_URL   = 'https://exe.ge/uploads/execheck/EXE%20Check.exe';
11  var COOKIE_NAME       = 'exege_hardware_id';
12  // ───────────────
13
14  var block = document.getElementById('hwcheck-block');
15  if (!block) return;
16
17  var postId = block.getAttribute('data-post-id');
18  if (!postId || postId === '{news-id}') return;
19
20  var activeTab = 'min';
21  var verdictData = null;
22
23  // ── SVG icons (inline, no emoji) ──
24  var SVG_BOLT = '<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor"><path d="M8.5 1L3 9h4.5L6.5 15 13 7H8.5L9.5 1z"/></svg>';
25
26  function getCookie(name) {
27    var m = document.cookie.match(new RegExp('(?:^|; )' + name.replace(/([.$?*|{}()[\]\\/+^])/g, '\\$1') + '=([^;]*)'));
28    return m ? decodeURIComponent(m[1]) : null;
29  }
30
31  // ── Init ──
32  var hardwareId = getCookie(COOKIE_NAME);
33  initTabs();
34  setCTAIcon();
35
36  if (hardwareId) {
37    showLoading();
38    fetchHWCheck(hardwareId, postId);
39  } else {
40    var dlBtn = document.getElementById('hwcheck-download-btn');
41    if (dlBtn) dlBtn.href = HW_DOWNLOAD_URL;
42  }
43
44  function setCTAIcon() {
45    var iconEl = block.querySelector('.hwcheck__cta-icon');
46    if (iconEl) iconEl.innerHTML = SVG_BOLT;
47  }
48
49  // ── Tab switching ──
50  function initTabs() {
51    var tabs = block.querySelectorAll('.hwcheck__tab');
52    tabs.forEach(function (tab) {
53      tab.addEventListener('click', function () {
54        tabs.forEach(function (t) { t.classList.remove('hwcheck__tab--active'); });
55        tab.classList.add('hwcheck__tab--active');
56        activeTab = tab.getAttribute('data-tab');
57        updateVisibleReqs();
58        if (verdictData) {
59          updateUserColumns();
60          updateColHeader();
61        }
62      });
63    });
64  }
65
66  function updateVisibleReqs() {
67    var rows = block.querySelectorAll('.hwcheck__row');
68    rows.forEach(function (row) {
69      var minEl = row.querySelector('.hwcheck__req-min');
70      var recEl = row.querySelector('.hwcheck__req-rec');
71      if (minEl) minEl.style.display = (activeTab === 'min') ? '' : 'none';
72      if (recEl) recEl.style.display = (activeTab === 'rec') ? '' : 'none';
73    });
74  }
75
76  function updateColHeader() {
77    var el = document.getElementById('hwcheck-col-req');
78    if (el) el.textContent = (activeTab === 'min') ? 'მინიმალური' : 'რეკომენდებული';
79  }
80
81  // ── Loading ──
82  function showLoading() {
83    var cta = document.getElementById('hwcheck-cta');
84    if (cta) cta.style.display = 'none';
85
86    var loader = document.createElement('div');
87    loader.className = 'hwcheck__loading';
88    loader.id = 'hwcheck-loading';
89    loader.innerHTML = '<div class="hwcheck__spinner"></div>იტვირთება...';
90    block.querySelector('.hwcheck__card').appendChild(loader);
91  }
92
93  function hideLoading() {
94    var el = document.getElementById('hwcheck-loading');
95    if (el) el.remove();
96  }
97
98  // ── Fetch ──
99  function fetchHWCheck(hwId, pId) {
100    var url = HW_CHECK_ENDPOINT + '?hardware_id=' + encodeURIComponent(hwId) + '&post_id=' + encodeURIComponent(pId);
101
102    fetch(url)
103      .then(function (r) { return r.json(); })
104      .then(function (data) {
105        hideLoading();
106        if (data.ok) {
107          verdictData = data;
108          renderVerdict(data);
109        } else {
110          showCTA();
111        }
112      })
113      .catch(function () {
114        hideLoading();
115        showCTA();
116      });
117  }
118
119  function showCTA() {
120    var cta = document.getElementById('hwcheck-cta');
121    if (cta) cta.style.display = '';
122  }
123
124  // ── Render verdict ──
125  function renderVerdict(data) {
126    var card = block.querySelector('.hwcheck__card');
127    card.classList.add('hwcheck--has-user');
128
129    // Column headers
130    var colHeaders = document.getElementById('hwcheck-col-headers');
131    if (!colHeaders) {
132      colHeaders = document.createElement('div');
133      colHeaders.className = 'hwcheck__col-headers';
134      colHeaders.id = 'hwcheck-col-headers';
135      colHeaders.innerHTML =
136        '<span class="hwcheck__col-header">Components</span>' +
137        '<span class="hwcheck__col-header" id="hwcheck-col-req">' + (activeTab === 'min' ? 'მინიმალური' : 'რეკომენდებული') + '</span>' +
138        '<span class="hwcheck__col-header">შენი სისტემა</span>' +
139        '<span></span>';
140      var rowsContainer = block.querySelector('.hwcheck__rows');
141      rowsContainer.parentNode.insertBefore(colHeaders, rowsContainer);
142    }
143
144    // Verdict bar
145    var verdictBar = document.getElementById('hwcheck-verdict');
146    var minOk = data.verdict.minimum_ok;
147    var recOk = data.verdict.recommended_ok;
148
149    verdictBar.className = 'hwcheck__verdict';
150    if (minOk && recOk) verdictBar.classList.add('hwcheck__verdict--pass');
151    else if (minOk) verdictBar.classList.add('hwcheck__verdict--partial');
152    else verdictBar.classList.add('hwcheck__verdict--fail');
153
154    // Button-style badges
155    var badgeMin = document.getElementById('hwcheck-badge-min');
156    badgeMin.className = 'hwcheck__badge ' + (minOk ? 'hwcheck__badge--pass' : 'hwcheck__badge--fail');
157    badgeMin.innerHTML = (minOk ? '✓' : '✗') + ' მინიმალური';
158
159    var badgeRec = document.getElementById('hwcheck-badge-rec');
160    badgeRec.className = 'hwcheck__badge ' + (recOk ? 'hwcheck__badge--pass' : 'hwcheck__badge--fail');
161    badgeRec.innerHTML = (recOk ? '✓' : '✗') + ' რეკომენდებული';
162
163    // Verdict text
164    var vText = document.getElementById('hwcheck-verdict-text');
165    if (recOk) {
166      vText.textContent = 'შენი სისტემა ამ თამაშისთვის მზად არის.';
167      vText.className = 'hwcheck__verdict-text hwcheck__verdict-text--pass';
168    } else if (minOk) {
169      vText.textContent = 'თამაშს გაუშვებ, მაგრამ შეზღუდვებით';
170      vText.className = 'hwcheck__verdict-text hwcheck__verdict-text--partial';
171    } else {
172      vText.textContent = 'ამ თამაშის გასაშვებად შენი სისტემა საკმარისი არ არის';
173      vText.className = 'hwcheck__verdict-text hwcheck__verdict-text--fail';
174    }
175
176    verdictBar.style.display = '';
177
178    // User data mapping
179    var userMap = {
180      os:   { value: data.user.os || '', hasData: true },
181      cpu:  { value: data.user.cpu_model || '', hasData: true },
182      gpu:  { value: data.user.gpu_model || '', hasData: true },
183      ram:  { value: data.user.ram_gb ? data.user.ram_gb + ' GB' : '', hasData: !!data.user.ram_gb },
184      vram: { value: data.user.vram_gb ? data.user.vram_gb + ' GB' : '', hasData: !!data.user.vram_gb },
185      ds:   { value: '', hasData: false }
186    };
187
188    var minReasons = data.verdict.minimum_reasons || [];
189    var recReasons = data.verdict.recommended_reasons || [];
190
191    // Populate user columns
192    var rows = block.querySelectorAll('.hwcheck__row');
193    rows.forEach(function (row) {
194      var spec = row.getAttribute('data-spec');
195      var info = userMap[spec];
196
197      var userCol = row.querySelector('.hwcheck__row-user');
198      var statusCol = row.querySelector('.hwcheck__row-status');
199
200      if (info && info.hasData) {
201        var isMinFail = minReasons.indexOf(spec) !== -1;
202        var isRecFail = recReasons.indexOf(spec) !== -1;
203        var currentPass = (activeTab === 'min') ? !isMinFail : !isRecFail;
204
205        userCol.innerHTML =
206          '<span class="hwcheck__row-user-value ' +
207          (currentPass ? 'hwcheck__row-user-value--pass' : 'hwcheck__row-user-value--fail') +
208          '">' + escHtml(info.value) + '</span>';
209
210        statusCol.innerHTML = currentPass
211          ? '<span class="hwcheck__status-icon hwcheck__status-icon--pass">✓</span>'
212          : '<span class="hwcheck__status-icon hwcheck__status-icon--fail">✗</span>';
213
214        userCol.style.display = '';
215        statusCol.style.display = '';
216
217        row.setAttribute('data-min-pass', isMinFail ? '0' : '1');
218        row.setAttribute('data-rec-pass', isRecFail ? '0' : '1');
219        row.setAttribute('data-user-value', info.value);
220      } else {
221        userCol.innerHTML = '<span class="hwcheck__row-user-value--neutral">—</span>';
222        statusCol.innerHTML = '<span class="hwcheck__status-icon hwcheck__status-icon--unknown">?</span>';
223        userCol.style.display = '';
224        statusCol.style.display = '';
225      }
226    });
227
228    // Show footer, hide CTA
229    var cta = document.getElementById('hwcheck-cta');
230    if (cta) cta.style.display = 'none';
231
232    var footer = document.getElementById('hwcheck-footer');
233    if (footer) footer.style.display = '';
234
235    // Refresh button
236    var refreshBtn = document.getElementById('hwcheck-refresh');
237    if (refreshBtn) {
238      refreshBtn.onclick = function () {
239        var hwId = getCookie(COOKIE_NAME);
240        if (hwId) {
241          showLoading();
242          fetchHWCheck(hwId, postId);
243        }
244      };
245    }
246  }
247
248  // ── Tab switch update ──
249  function updateUserColumns() {
250    var rows = block.querySelectorAll('.hwcheck__row');
251    rows.forEach(function (row) {
252      var userValue = row.getAttribute('data-user-value');
253      if (!userValue) return;
254
255      var passAttr = (activeTab === 'min') ? row.getAttribute('data-min-pass') : row.getAttribute('data-rec-pass');
256      var pass = (passAttr === '1');
257
258      var valueEl = row.querySelector('.hwcheck__row-user-value');
259      if (valueEl) {
260        valueEl.className = 'hwcheck__row-user-value ' + (pass ? 'hwcheck__row-user-value--pass' : 'hwcheck__row-user-value--fail');
261      }
262
263      var statusEl = row.querySelector('.hwcheck__status-icon');
264      if (statusEl) {
265        statusEl.className = 'hwcheck__status-icon ' + (pass ? 'hwcheck__status-icon--pass' : 'hwcheck__status-icon--fail');
266        statusEl.textContent = pass ? '✓' : '✗';
267      }
268    });
269  }
270
271  function escHtml(s) {
272    var d = document.createElement('div');
273    d.textContent = s;
274    return d.innerHTML;
275  }
276
277})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.