module.exports = (lib) => { lib.trigger.add({ name: 'sync', call: /^!sync$/i, level: 100, active: 1, func: (e) => { lib.bot.names(e.channel, e.network, names => { Object.keys(names).forEach(key => { if(key === lib.bot.me.nick) { return; } lib.bot.whois(key, e.network, (err, data) => { if(data.channels[e.channel]) { var h = modesToString(data.channels[e.channel]), q = ""; if(lib.admins[data.account]) q = levelToModes(lib.admins[data.account].level); var diff = lib.groupUserModes(userModeDiff(h, q)); diff.forEach(entry => lib.bot.mode(e.channel, entry + (' ' + key).repeat(entry.length - 1), e.network)); } }); }); }); }, desc: 'sync' }); }; var userModeDiff = (h, q) => { var ret = [], index; while(h.length && q.length) { if((index = q.indexOf(h[h.length - 1])) !== -1) q = q.slice(0, index) + q.slice(index + 1); else ret.push('-' + h[h.length - 1]); h = h.slice(0, -1); } var sign = q.length ? '+' : '-'; if(!q.length) q = h; if(index = q.length) while(index--) ret.push(sign + q[index]); return ret; }; var levelToModes = level => { if(level >= 70) return "ao"; if(level >= 60) return "o"; if(level >= 50) return "h"; if(level >= 10) return "v"; return ""; }; var modesToString = modes => { var modeStr = ""; modes.forEach(entry => { if(entry === "~") modeStr += "q"; else if(entry === "&") modeStr += "a"; else if(entry === "@") modeStr += "o"; else if(entry === "%") modeStr += "h"; else if(entry === "+") modeStr += "v"; }); return modeStr; };