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.