Member
Member Src » Member
sample users: KirQ, Viken-K, chamik, slashannemoo, murzei_chaos, Dr_Grom, Tanija, Ralliston, morhadow, Alert301, DrMacro, ukwhatn, Nanigashi Sato, 7happy7, Dr Devan, Areyoucrazytom, Salamander724, Aiken Drum, thd-glasses, Dexanote, aismallard, DrEverettMann, pxdnbluesoul, Croquembouche, Yossipossi, EstrellaYoshte, Rounderhouse, Woedenaz
EN, INT, KO, CN, FR, PL, ES, TH, JP, DE, IT, UA, PTBR, CS, ZHTR, VN
(-RU wiki prohibits the cross-site [[include]])
<head> <script> window.Promise || alert('Use modern browsers, not an antique.'); </script> <script src="2" defer></script> <link rel="stylesheet" href="3"></script> </head> <body> <b>user name:</b> <span class="user-wrap"> <input type="text" onfocus="this.select()" /> <span class="load animated"> <span></span> <span></span> <span></span> <span></span> </span> </span> <hr /> <div class="wrap"> <pre></pre> </div> </body>
var getJSON = async url => await (await fetch(url)).json(); var getText = async url => await (await fetch(url)).text(); var sleep = ms => new Promise(r => setTimeout(r, ms)); var SITE_ID = { EN : 66711, INT : 1427610, KO : 486864, CN : 530812, FR : 464696, PL : 647733, ES : 560484, TH : 547203, JP : 578002, DE : 1269857, IT : 530167, UA : 1398197, PTBR: 783633, CS : 2060442, ZHTR: 3947998, VN : 836589, RU : 169125, }; var SRC_URL = Object.keys(SITE_ID) .map((v, i) => [v, i + 1]) .reduce((p, v) => { p[ v[0] ] = `/local--code_/member-src/${v[1]}`; return p; }, {}); var user = s => { var user, res = [], reg = /\[{2}\*user (.+?)\]{2}/ig; while(user = reg.exec(s)) res.push(user[1].trim()); return res; }; var UserList = class { constructor(obj) { var _obj = {}; for(var k in obj) (_obj[ k.toLowerCase() ] = obj[k]); this._obj = _obj; } $(uname) { return this._obj[ uname.toLowerCase() ]; } }; var DIV = class { constructor(content, attr) { this.content = content; this._attr = attr.trim() || ''; } get attr() { var reg = /(class|style|data\-[\da-z\-_\.\:]+)(?:\="(.+?)"|) ?/ig, res = {}, atr; while(atr = reg.exec(this._attr)) (res[ atr[1] ] = atr[2]); return res; } get class() { return (this.attr.class || '').split(' ').filter(v => v); } hasClass(name) { return !!this.class.find(v => v == name); } style(reg) { return !!(this.attr.style || '').match(reg); } toString() { return this.content.trim(); } }; var DIV_LIST = class { constructor(str) { var _str = (str || '').replace(/\[\!\-{2}[\s\S]*?\-{2}\]/g, ''); var div_st, div_ed, divs = [], div_st_reg = /\[{2}div( .+?)?\]{2}/g, div_ed_reg = /\[{2}\/div\]{2}/g; while((div_st = div_st_reg.exec(_str))) (div_st.st = true, divs.push(div_st)); while((div_ed = div_ed_reg.exec(_str))) divs.push(div_ed); divs = divs.sort((a, b) => a.index > b.index ? 1 : -1); var st = divs.shift(), ed, i_st = 1, i_ed = 0, tags = [], next = false; if(st && !st.st) throw new Error('no'); for(var t of divs) { next && (next = false, st = t) t.st ? i_st++ : (i_ed++, ed = t); if(i_st == i_ed) { var cont = _str.slice(st[0].length + st.index, ed.index); var d = new DIV(cont, st[1]); tags.push(d); if(1 < i_st) { d.children = new DIV_LIST(cont); for(var c of d.children.tags) (c.parent = d, tags.push(c)); } next = true; i_st = i_ed = 0; } } this.tags = tags; } getDivsByClass(name) { return this.tags.filter(v => v.hasClass(name)); } getDivsByStyle(name) { return this.tags.filter(v => v.style(name)); } }; var getRoles = {}; // EN getRoles.EN = async () => { var t = await getText(SRC_URL.EN); var obj = {}; var src = t.split(/(\n\+ [\S ]+)/).map(v => v.trim()).slice(1); var temp; while((temp = src.splice(0, 2), temp.length)) { var role = temp[0].replace(/^\+ /, ''); var head = temp[1].trim().split('\n'); var mems = head.splice(1); head = head[0].split(/ ?\|{2}~? ?/); head.pop(), head.shift(), head.shift(); for(var m of mems) { var _ = m.split(/ ?\|{2} ?/); _.pop(), _.shift(); var user = (_.shift().match(/\[{2}\*user (.+?)\]{2}/) || [])[1]; if(!user) continue; obj[user] = {role: role}; for(var i in _) { obj[user][ head[i] ] = _[i].trim(); } } } return new UserList(obj); }; // INT getRoles.INT = async () => { var t = await getText(SRC_URL.INT); var obj = {}; var tab, tabs = [], tab_reg = /\[{2}tab .+?\]{2}([\s\S]+?)\[{2}\/tab\]{2}/g; while(tab = tab_reg.exec(t)) tabs.push(tab[1]); var rep, rep_reg = /\n\* \[{2}image .+?\.png\]{2} \*{2}(.+?)\*{2}([\S ]+)/g; while(rep = rep_reg.exec(tabs[0])) { var lang = rep[1]; for(var u of user(rep[2])) { obj[u] = {role: [`Representative (${lang})`]}; } } var _ = tabs[1].split('----')[0].split(/(\n\+{2} [\S ]+)/).map(v => v.trim()).slice(1); var temp; while((temp = _.splice(0, 2), temp.length)) { var role = temp[0].replace(/\+{2} /, ''); role = {'Moderators': 'Moderator', 'Administrators': 'Administrator'}[role] || role; for(var u of user( temp[1] )) { var name = u; var name_low = name.toLowerCase(); if(name != name_low && obj[name_low]) { obj[name] = obj[name_low]; delete obj[name_low]; } var _n = Object.keys(obj).find(n => n.toLowerCase() == name) || name; obj[_n] ? obj[_n].role.push(role) : (obj[_n] = {role: [role]}); } } return new UserList(obj); }; // KO getRoles.KO = async () => { var t = await getText(SRC_URL.KO); var obj = {}; var divs = new DIV_LIST(t).getDivsByStyle('background-color:').map(v => v + '').slice(1); for(var u of user(divs[0])) (obj[u] = {role: 'Administrator' }); for(var u of user(divs[1])) (obj[u] = {role: 'Moderator' }); for(var u of user(divs[2])) (obj[u] = {role: 'Operational Staff'}); for(var u of user(divs[3])) (obj[u] = {role: 'Junior Staff' }); // fix obj['shaftmetal'] || (obj['shaftmetal'] = {role: 'Operational Staff'}); for(var u of user(divs[4])) (obj[u] && (obj[u].job = ['Site Management Team'])); for(var u of user(divs[5])) (obj[u] && (obj[u].job = ['Critique Team'] )); for(var u of user(divs[6])) (obj[u] && (obj[u].job = ['Page Management Team'])); for(var u of user(divs[7])) (obj[u] && (obj[u].job = ['Public Affairs Team'] )); return new UserList(obj); }; // CN getRoles.CN = async () => { var t = await getText(SRC_URL.CN); var obj = {}; var a = t.split('**活跃管理员')[1]; var b = a.split('**活跃版主'); var c = b[1].split('**其他'); for(var u of user(b[0])) (obj[u] = {role: 'Administrator'}); for(var u of user(c[0])) (obj[u] = {role: 'Moderator' }); return new UserList(obj); }; // FR getRoles.FR = async () => { var t = await getText(SRC_URL.FR); var obj = {}; var a = t.split('**Administrateurs')[1]; var b = a.split('**Modérateurs'); var c = b[1].split('**Membres Seniors'); var d = c[1].split('**Membres Juniors'); var e = d[1].split('**Vétérans'); for(var u of user(b[0])) (obj[u] = {role: 'Administrator'}); for(var u of user(c[0])) (obj[u] = {role: 'Moderator' }); for(var u of user(d[0])) (obj[u] = {role: 'Senior Staff' }); for(var u of user(e[0])) (obj[u] = {role: 'Junior Staff' }); return new UserList(obj); }; // PL getRoles.PL = async () => { var t = await getText(SRC_URL.PL); var obj = {}; var divs = new DIV_LIST(t).getDivsByStyle('background-color:').map(v => v + ''); var sep = divs[0].split('[[size 120%]]').slice(1, 4).map(v => user(v)); for(var u of sep[0]) (obj[u] = {role: 'Administrator' }); for(var u of sep[1]) (obj[u] = {role: 'Moderator' }); for(var u of sep[2]) (obj[u] = {role: 'Operational Staff'}); return new UserList(obj); }; // ES getRoles.ES = async () => { var t = await getText(SRC_URL.ES); var obj = {}; var divs = new DIV_LIST(t).getDivsByClass('standalone').map(v => v + '').slice(1, 4); for(var u of user(divs[0])) (obj[u] = {role: 'Administrator'}); for(var u of user(divs[1])) (obj[u] = {role: 'Moderator' }); for(var u of user(divs[2])) (obj[u] = {role: 'Junior Staff' }); return new UserList(obj); }; // TH getRoles.TH = async () => { var t = await getText(SRC_URL.TH); var obj = {}; var sep = t.split('\n||').slice(1); for(var s of sep) { var u = user(s)[0]; if(s.match('ผู้ดูแล')) { obj[u] = {role: 'Administrator'}; } else if(s.match('เจ้าหน้าที่')) { obj[u] = {role: 'Moderator' }; } } return new UserList(obj); }; // JP getRoles.JP = async () => { var t = await getText(SRC_URL.JP); var priority = (...roles) => { var lab = ['Contributor', 'Moderator', 'Administrator']; var i = roles.map(r => lab.indexOf(r)).reduce((a, b) => a > b ? a : b); return lab[i]; } var obj = {}; var src = t.split(/(\n\+ [\S ]+)/).map(v => v.trim()).slice(1); var temp; while((temp = src.splice(0, 2), temp.length)) { var _ = temp[0].split('::'); var role = _[0].replace(/^\+ /, ''); var _job = _[1]; var users = temp[1], user; var reg = /\n\* \[{2}\*user (.+?)\]{2}( \(.+?\))?/g; while(user = reg.exec(users)) { var job = {name: _job, captain: !!user[2]} if(obj[ user[1] ]) { obj[ user[1] ].job.push(job); obj[ user[1] ].role = priority(obj[ user[1] ].role, role); }else { obj[ user[1] ] = {job: [job], role: role}; } } } return new UserList(obj); }; // DE getRoles.DE = async () => { var t = await getText(SRC_URL.DE); var obj = {}; var sep = t.split('\n') .filter(v => v.match(/^\s?\|{2}/)) .map(v => v.trim()); var team = {'Freigabeteam': 'Approval Team', 'News-Team': 'News Publishing Team', 'Korrekturbeauftragter': 'Proofreading Team', 'Mentor': 'Mentors', 'Vertonungsbeauftragter': 'YouTube-channels liaison Team'}; for(var s of sep) { var u = user(s)[0]; var jobs = s.match(/\|{2}([^\|]+?)\|{2}$/)[1] .split(/(?:;|,) ?/) .map(v => v.trim()); if(jobs.length == 1 && jobs[0] == 'Personal') continue; var ad = jobs.indexOf('Administrator'); var md = jobs.indexOf('Moderator'); obj[u] = {role: 'Junior Staff'}; if(-1 < ad) { delete jobs[ad]; obj[u] = {role: 'Administrator'}; } else if(-1 < md) { delete jobs[md]; obj[u] = {role: 'Moderator'}; } obj[u].job = jobs.filter(v => v).map(v => team[v] || v); } return new UserList(obj); }; // IT getRoles.IT = async () => { var t = await getText(SRC_URL.IT); var obj = {}; var sep = new DIV_LIST(t).getDivsByStyle('background-color:').map(v => user(v + '')); for(var u of sep[1]) (obj[u] = {role: 'Administrator' }); for(var u of sep[2]) (obj[u] = {role: 'Moderator' }); for(var u of sep[3]) (obj[u] = {role: 'Honorary Staff' }); return new UserList(obj); }; // UA getRoles.UA = async () => { var t = await getText(SRC_URL.UA); var obj = {}; for(var u of user(t)) (obj[u] = {role: 'Staff'}); return new UserList(obj); }; // PTBR getRoles.PTBR = async () => { var t = await getText(SRC_URL.PTBR); var obj = {}; var sep = new DIV_LIST(t).getDivsByStyle('background-color:').map(v => user(v + '')); for(var u of sep[1]) (obj[u] = {role: 'Administrator' }); for(var u of sep[2]) (obj[u] = {role: 'Moderator' }); for(var u of sep[3]) (obj[u] = {role: 'Discord Operator'}); return new UserList(obj); }; // CS getRoles.CS = async () => { var t = await getText(SRC_URL.CS); var obj = {}; var users = t.split('----').filter(v => !v.match(/\+{2} Bývalí zaměstnanci/)).map(v => user(v + '')).flat(); for(var u of users) (obj[u] = {role: 'Staff'}); return new UserList(obj); }; // ZHTR getRoles.ZHTR = async () => { var t = await getText(SRC_URL.ZHTR); var obj = {}; var divs = new DIV_LIST(t).getDivsByClass('standalone').slice(2); var sep = (divs.shift() + '').split(/\+{3}\*? 版主/).map(v => user(v)); for(var u of sep[0]) (obj[u] = {job: [], role: 'Administrator' }); for(var u of sep[1]) (obj[u] = {job: [], role: 'Moderator' }); for(var u of user(divs.shift())) (obj[u] = {job: [], role: 'Contributor'}); for(var u of user(divs[0])) {obj[u] && obj[u].job.push('Wiki Management Team' )}; for(var u of user(divs[1])) {obj[u] && obj[u].job.push('Engineering Team' )}; for(var u of user(divs[2])) {obj[u] && obj[u].job.push('Community Management Team')}; return new UserList(obj); }; // VN getRoles.VN = async () => { var t = await getText(SRC_URL.VN); var obj = {}; var sep = t.split(/\n\|{2}\~/).slice(1).map(v => user(v)); for(var u of sep[0]) (obj[u] = {role: 'Administrator'}); for(var u of sep[1]) (obj[u] = {role: 'Moderator' }); for(var u of sep[2]) (obj[u] = {role: 'Senior Staff' }); for(var u of sep[3]) (obj[u] = {role: 'Junior Staff' }); return new UserList(obj); }; var _isMemberCache = {}; var isMember = async (username, siteid=66711) => { _isMemberCache[siteid] || (_isMemberCache[siteid] = {}); var cache = _isMemberCache[siteid][username]; if(cache) return cache; var url = `/quickmodule.php?module=MemberLookupQModule&q=${username}&s=${siteid}`; var users = (await getJSON(url)).users || []; var res = users.find(u => u.name.toLowerCase() == username.toLowerCase()) || false; _isMemberCache[siteid][username] = res; return res; }; var getKarma = async id => { var kar = await fetch(`/userkarma.php?u=${id}`); var buf = await kar.arrayBuffer(); var u8a = new Uint8Array(buf); if(u8a[19] != 33) throw new Error('Invalid ID'); var lv, pro = false; switch(u8a.length) { case 295:lv=0; break; case 304:lv=1; break; case 306:lv=2; break; case 310:lv=3; break; case 311:lv=4; break; case 309:lv=5; break; case 1094:lv=0; pro=true; break; case 1099:lv=1; pro=true; break; //case XXX:lv=2; pro=true; break; case 1098:lv=3; pro=true; break; case 1097:lv=4; pro=true; break; case 1093:lv=5; pro=true; break; //default:break; default:lv=2; pro=true; break; } return {lv:lv, pro:pro}; } // main (async () => { var input = document.querySelector('input'); var button = document.querySelector('button'); var wrap = document.querySelector('.wrap'); var pre = document.querySelector('pre'); var load = document.querySelector('.load'); input.disabled = true; var load_anim = reset => { reset ? load.classList.remove('animated') : load.classList.add('animated') input.disabled = !reset; }; var Log = (str, reset, elm) => { if(reset) { elm.innerHTML = str; }else { elm.innerHTML += str; } }; var UL = ary => { if(!ary?.length) return ''; return `<ul><li>${ary.join('</li><li>')}</li></ul>`; }; // fail-safe while(true) { try { if(window.parent.frames[0] != window) return Log(`<div class="awaiting">Two frame detected:\nThe frame in-activated.</div>`, true, pre); else break; }catch(e){ await sleep(250); }; } var roles = {}, lang = Object.keys(getRoles); for(var i in lang) { load.dataset.tgt = `[${lang[i]}]`; Log(`<div class="awaiting">Loading assets... ( ${i} / ${lang.length} ):\n[ ${lang[i]} ]</div>`, true, pre); roles[ lang[i] ] = await getRoles[ lang[i] ](); } var hash = location.hash.match(/^#(.+?)$/); var uname = hash ? hash[1] : 'Dr_Grom'; input.value = uname; var max_str = '[ Role (SCP-PTBR) ]'; var Padding = str => `${str}${' '.repeat(max_str.length - str.length)}`; var search = async e => { load_anim(); Log('', true, pre); var [_user, _role] = [...Array(2).keys()] .map(_ => { var div = document.createElement('div'); pre.appendChild(div); div.classList.add('empty'); return div; }); var user_log = (str, reset=false) => { Log(`<div>${str}</div>`, reset, _user); _user.classList.remove('empty'); }; var role_log = (str, reset=false) => { Log(`<div>${str}</div>`, reset, _role); _role.classList.remove('empty'); }; var _uname = e ? input.value : uname; uname = null; if(_uname.length < 4) { user_log(`<b>[ ! ]: </b><span>the value is too short (< 4)</span>`); return load_anim(true); } var ui; var uinfo_update = async _ui => { if(ui || !_ui) return; ui = _ui; var k = await getKarma(ui.user_id); user_log(`<b>${Padding('[ ! ]')}: </b>this account type is <span class="pro${k.pro ? ' haspro' : ''}">${k.pro ? 'Pro' : 'Free'}</span>.`, true); user_log(`<b>${Padding('[ ID ]')}: </b><span>${ui.user_id}</span>`); user_log(`<b>${Padding('[ Karma ]')}: </b><span data-karma="${k.lv}">${k.lv}</span>`); return; } load.dataset.tgt = '[EN]'; var uinfo_EN = await isMember(_uname); await uinfo_update(uinfo_EN); uinfo_EN && role_log(`<b>${Padding('[ Role (SCP-EN) ]')}: </b><span class="${roles.EN.$(_uname) ? 'hasrole' : ''}">${ roles.EN.$(_uname) ? roles.EN.$(_uname).role + UL( (roles.EN.$(_uname).Teams || roles.EN.$(_uname)['Team(s)']).split(/, ?/) ) : 'Member' }</span>`); load.dataset.tgt = '[INT]'; var uinfo_INT = await isMember(_uname, SITE_ID.INT); await uinfo_update(uinfo_INT); (uinfo_INT || roles.INT.$(_uname)) && role_log(`<b>${Padding('[ Role (SCP-INT) ]')}: </b><span class="${roles.INT.$(_uname) ? 'hasrole' : ''}">${ roles.INT.$(_uname) ? roles.INT.$(_uname).role.join('\n') : 'Member' }</span>`); load.dataset.tgt = '[RU]'; var uinfo_RU = await isMember(_uname, SITE_ID.RU); await uinfo_update(uinfo_RU); uinfo_RU && role_log(`<b>${Padding('[ Role (SCP-RU) ]')}: </b><span>Member</span>`); load.dataset.tgt = '[KO]'; var uinfo_KO = await isMember(_uname, SITE_ID.KO); await uinfo_update(uinfo_KO); uinfo_KO && role_log(`<b>${Padding('[ Role (SCP-KO) ]')}: </b><span class="${roles.KO.$(_uname) ? 'hasrole' : ''}">${ roles.KO.$(_uname) ? roles.KO.$(_uname).role + UL(roles.KO.$(_uname).job) : 'Member' }</span>`); load.dataset.tgt = '[CN]'; var uinfo_CN = await isMember(_uname, SITE_ID.CN); await uinfo_update(uinfo_CN); uinfo_CN && role_log(`<b>${Padding('[ Role (SCP-CN) ]')}: </b><span class="${roles.CN.$(_uname) ? 'hasrole' : ''}">${ roles.CN.$(_uname) ? roles.CN.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[FR]'; var uinfo_FR = await isMember(_uname, SITE_ID.FR); await uinfo_update(uinfo_FR); uinfo_FR && role_log(`<b>${Padding('[ Role (SCP-FR) ]')}: </b><span class="${roles.FR.$(_uname) ? 'hasrole' : ''}">${ roles.FR.$(_uname) ? roles.FR.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[PL]'; var uinfo_PL = await isMember(_uname, SITE_ID.PL); await uinfo_update(uinfo_PL); uinfo_PL && role_log(`<b>${Padding('[ Role (SCP-PL)]')}: </b><span class="${roles.PL.$(_uname) ? 'hasrole' : ''}">${ roles.PL.$(_uname) ? roles.PL.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[ES]'; var uinfo_ES = await isMember(_uname, SITE_ID.ES); await uinfo_update(uinfo_ES); uinfo_ES && role_log(`<b>${Padding('[ Role (SCP-ES)]')}: </b><span class="${roles.ES.$(_uname) ? 'hasrole' : ''}">${ roles.ES.$(_uname) ? roles.ES.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[TH]'; var uinfo_TH = await isMember(_uname, SITE_ID.TH); await uinfo_update(uinfo_TH); uinfo_TH && role_log(`<b>${Padding('[ Role (SCP-TH)]')}: </b><span class="${roles.TH.$(_uname) ? 'hasrole' : ''}">${ roles.TH.$(_uname) ? roles.TH.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[JP]'; var uinfo_JP = await isMember(_uname, SITE_ID.JP); await uinfo_update(uinfo_JP); uinfo_JP && role_log(`<b>${Padding('[ Role (SCP-JP) ]')}: </b><span class="${roles.JP.$(_uname) ? 'hasrole' : ''}">${ roles.JP.$(_uname) ? roles.JP.$(_uname).role + UL( roles.JP.$(_uname).job.map(v => v.name + (v.captain ? ' (Captain)' : '')) ) : 'Member' }</span>`); load.dataset.tgt = '[DE]'; var uinfo_DE = await isMember(_uname, SITE_ID.DE); await uinfo_update(uinfo_DE); uinfo_DE && role_log(`<b>${Padding('[ Role (SCP-DE) ]')}: </b><span class="${roles.DE.$(_uname) ? 'hasrole' : ''}">${ roles.DE.$(_uname) ? roles.DE.$(_uname).role + UL( roles.DE.$(_uname).job ) : 'Member' }</span>`); load.dataset.tgt = '[IT]'; var uinfo_IT = await isMember(_uname, SITE_ID.IT); await uinfo_update(uinfo_IT); uinfo_IT && role_log(`<b>${Padding('[ Role (SCP-IT)]')}: </b><span class="${roles.IT.$(_uname) ? 'hasrole' : ''}">${ roles.IT.$(_uname) ? roles.IT.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[UA]'; var uinfo_UA = await isMember(_uname, SITE_ID.UA); await uinfo_update(uinfo_UA); uinfo_UA && role_log(`<b>${Padding('[ Role (SCP-UA)]')}: </b><span class="${roles.UA.$(_uname) ? 'hasrole' : ''}">${ roles.UA.$(_uname) ? roles.UA.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[PTBR]'; var uinfo_PTBR = await isMember(_uname, SITE_ID.PTBR); await uinfo_update(uinfo_PTBR); uinfo_PTBR && role_log(`<b>${Padding('[ Role (SCP-PTBR)]')}: </b><span class="${roles.PTBR.$(_uname) ? 'hasrole' : ''}">${ roles.PTBR.$(_uname) ? roles.PTBR.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[CS]'; var uinfo_CS = await isMember(_uname, SITE_ID.CS); await uinfo_update(uinfo_CS); uinfo_CS && role_log(`<b>${Padding('[ Role (SCP-CS)]')}: </b><span class="${roles.CS.$(_uname) ? 'hasrole' : ''}">${ roles.CS.$(_uname) ? roles.CS.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = '[ZHTR]'; var uinfo_ZHTR = await isMember(_uname, SITE_ID.ZHTR); await uinfo_update(uinfo_ZHTR); uinfo_ZHTR && role_log(`<b>${Padding('[ Role (SCP-ZHTR) ]')}: </b><span class="${roles.ZHTR.$(_uname) ? 'hasrole' : ''}">${ roles.ZHTR.$(_uname) ? roles.ZHTR.$(_uname).role + UL( roles.ZHTR.$(_uname).job ) : 'Member' }</span>`); load.dataset.tgt = '[VN]'; var uinfo_VN = await isMember(_uname, SITE_ID.VN); await uinfo_update(uinfo_VN); uinfo_VN && role_log(`<b>${Padding('[ Role (SCP-VN)]')}: </b><span class="${roles.VN.$(_uname) ? 'hasrole' : ''}">${ roles.VN.$(_uname) ? roles.VN.$(_uname).role : 'Member' }</span>`); load.dataset.tgt = ''; ui || user_log(`<b>[ ! ]: </b><span>"${_uname}" is not a member of any Official SCP Wikis.</span>`, true); load_anim(true); }; input.onchange = search; search(); })();
@import url(https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css); ::-webkit-scrollbar { width: 9px; height: 9px; border: solid 1px rgba(0, 0, 0, .1); } ::-webkit-scrollbar-thumb { background: rgba(50, 50, 50, .3); } ::-webkit-scrollbar-track { background: rgba(0, 0, 0, .1); } body { color: #333; font-family: sans-serif; font-size: .8em; margin: 0; } .wrap { position: relative; } /* .wrap::before { border: 1px solid #aaa; content: 'Fetching...'; display: inline-block; font-family: Courier, monospace; padding: 0.125em 0.5em; position: absolute; bottom: 0; opacity: 0; pointer-events: none; right: 2px; transition: opacity .5s; vertical-align: middle; } .wrap.fetching::before { animation: blink .35s infinite; } @keyframes blink { 0%, 100% {opacity:0} 50% {opacity:1} } */ input, pre { background: #fff; border: none; border-radius: 0; box-shadow: 1px 1px 3px #aaa; color: #333; display: inline-block; font-family: Courier, monospace; margin: 0; padding: 0.25em 0.5em; -webkit-appearance: none; } input { color: #901; font-size: 16px; font-weight: bold; padding: .25em 0; text-align: center; } input:disabled { background: #ccc; } pre { display: block; font-size: .8em; height: 18em; margin: 0 0.25em; overflow-x: scroll; white-space: pre; } input:focus{ outline: none; } pre > div:not(.empty, .awaiting) { border-bottom: 1px solid #333; margin-bottom: 1em; padding: 2px 0.5em; } pre > div > div b { user-select: none; } .awaiting { font-size: 1.3em; font-weight: bold; padding: 1.75em 0; text-align: center; } pre ul { list-style: none; margin: 0; padding: 0; } pre ul > li { padding: 0; } pre ul > li::before { content: '-> '; } pre span { display: inline-block; vertical-align: top; } pre span.hasrole { color: #b01; } pre span.pro { background: #fff; box-shadow: 1px 1px 3px #aaa; color: #b01; display: inline-block; font-weight: bold; padding: 0 0.5em; text-align: center; width: 3em; } pre span.pro.haspro::after { content: '\f005'; color: #fad880; display: inline-block; font-family: FontAwesome; font-weight: 400; padding: 0 0 0 .25em; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; transform: translate(0, 0); } pre span[data-karma] { background: #000; box-shadow: 1px 1px 3px #aaa; color: #b01; display: inline-block; font-weight: bold; padding: 0 0.5em; text-shadow: 0 0 1px #fff, 0 0 2px #fff, 0 0 2px #fff, 0 0 2px #fff, 0 0 2px #fff, 0 0 3px #fff, 0 0 4px #fff, 0 0 5px #fff; text-align: center; width: 3em; } pre span[data-karma="5"] { background: linear-gradient(90deg, #61F3A7, #61F328, #FFF20E, #EC810E, #FF2D2D); } pre span[data-karma="4"] { background: linear-gradient(90deg, #61F3A7, #61F328, #FFF20E, #EC810E, #000); } pre span[data-karma="3"] { background: linear-gradient(90deg, #61F3A7, #61F328, #FFF20E, #000, #000); } pre span[data-karma="2"] { background: linear-gradient(90deg, #61F3A7, #61F328, #000, #000, #000); } pre span[data-karma="1"] { background: linear-gradient(90deg, #61F3A7, #000, #000, #000, #000); } @keyframes line-scale-party { 0%, 100% {transform: scale(1)} 50% {transform: scale(.5)} } span.user-wrap { display: inline-flex; } span.user-wrap span.load { --size: 24px; display: inline-flex; height: var(--size); justify-content: space-around; margin: 0 0 0 0.5em; padding: calc(var(--size) / 4); position: relative; width: var( --size); } span.user-wrap span.load > span { animation-fill-mode: both; animation-name: line-scale-party; animation-iteration-count: infinite; animation-delay: 0; background: #ed5565; border-radius: 2px; box-sizing: border-box; display: inline-block; opacity: 0; transform-origin: center; transition: opacity .5s; width: calc(var(--size) / 6); } span.user-wrap span.load > span:nth-child(1) { animation-delay: .48s; animation-duration: .54s } span.user-wrap span.load > span:nth-child(2) { animation-delay: -.15s; animation-duration: 1.15s } span.user-wrap span.load > span:nth-child(3) { animation-delay: 40ms; animation-duration: .77s } span.user-wrap span.load > span:nth-child(4) { animation-delay: -.12s; animation-duration: .61s } span.user-wrap span.load.animated > span { opacity: 1; z-index: -1; } span.user-wrap span.load.animated::before { bottom: calc(50% - 1em); content: attr(data-tgt); color: #ed5565; font-family: Courier, monospace; font-size: .7em; font-weight: bold; position: absolute; text-align: center; text-shadow: 0 0 2px #fff, 0 0 3px #fff, 0 0 3px #fff, 0 0 4px #fff; }






