# RegMaster ```javascript= const TgBot = require('../tgbot'); // Irrelevant require('dotenv').config({path:'../../.env'}); const fs = require('fs'); const tgbot = new TgBot({ botAPIKey : process.env.BOT_API_KEY, }); const admins_passwords = process.env.ADMIN_PASSWORDS; const flag = process.env.FLAG; const source = [{ name: 'src.zip', data:fs.readFileSync('./regexMaster.zip') }]; class RegexSlave { constructor (name, chatid) { this.currentCmd = undefined; this.username = name; this.password = '.'; this.chatid = chatid; } } class RegexMaster { constructor () { this.slaves = {}; } getSlave(name) { return this.slaves[name]; } addSlave(name, chatid) { this.slaves[name] = new RegexSlave(name, chatid); return this.slaves[name]; } handle(username, chatid, text) { let user = this.getSlave(username); console.log(`usernane: ${username}`); console.log(user); let match; if( (match = /^\/(?<cmd>\w*)$/.exec(text)) ) { user.currentCmd = match.groups.cmd; if(user.currentCmd === 'start') { tgbot.sendFiles(source, chatid); }else if(user.currentCmd === 'regex'){ let re; try { re = new RegExp(user.password); }catch(e){ console.log(e); tgbot.sendMessage('Errrrr', chatid); return; } match = re.exec(admins_passwords) || {}; if(match.groups?.admins?.password && user.chatid === chatid) { console.log('Ok'); tgbot.sendMessage(flag, chatid); }else { console.log('Failed'); tgbot.sendMessage('Nononoo', chatid); } } }else if(user.currentCmd === 'setpassword') { user.password = text; user.chatid = chatid; }else if(user.currentCmd === 'echo') { console.log(`Echo: ${text}`); tgbot.sendMessage(text, chatid); } } } module.exports = RegexMaster; ``` group: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Ranges https://javascript.info/regexp-groups ``` (?<admins>.+(?<password>[a-z])) (?<admins>(?<password>.+)) ``` * regex 沒有正規可以這樣一層一層 call 的方法,所以要想別的 (?<admins>.+(?<password>.+)) AIS3{aHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD1QTDEyVWFBZl94emZxMVF3M2hPNDNXdmNnQW9fU2p1Nkl4Cg==}