shadowsocks-manager
Version:
A shadowsocks manager tool for multi user and traffic control.
214 lines (203 loc) • 7.92 kB
JavaScript
const tg = appRequire('plugins/webgui_telegram/index');
const isNotUserOrAdmin = appRequire('plugins/webgui_telegram/index').isNotUserOrAdmin;
const telegram = appRequire('plugins/webgui_telegram/index').telegram;
const getMe = appRequire('plugins/webgui_telegram/index').getMe;
const knex = appRequire('init/knex').knex;
const user = appRequire('plugins/user/index');
const emailPlugin = appRequire('plugins/email/index');
const account = appRequire('plugins/account/index');
const redis = appRequire('init/redis').redis;
const isUserBindMessage = message => {
if(!message.message || !message.message.text) { return false; }
if(!message.message || !message.message.chat || !message.message.chat.type === 'private') { return false; }
if(!message.message.text.trim().match(/^\d{8}$/)) { return false; }
return true;
};
telegram.on('message', async message => {
if(isUserBindMessage(message)) {
let isFailed = true;
const telegramId = message.message.chat.id.toString();
const failNumber = await redis.get(`Temp:TelegramFail:${ telegramId }`);
if(+failNumber >= 10) {
console.log(`telegram id[${telegramId}] is blocked in 10 mins`);
return;
}
const keys = await redis.keys('Temp:TelegramBind:*');
for(const key of keys) {
const code = await redis.get(key);
if(code === message.message.text.trim()) {
isFailed = false;
const userId = key.split(':')[2];
bindUser(userId, message);
}
}
if(isFailed) {
const failNumber = await redis.incr(`Temp:TelegramFail:${ telegramId }`);
if(+failNumber === 1) {
await redis.expire(`Temp:TelegramFail:${ telegramId }`, 120);
}
}
}
});
const bindUser = async (userId, message) => {
const telegramId = message.message.chat.id.toString();
if(!telegramId) {
return Promise.reject('');
}
const exists = await knex('user').where({
telegram: telegramId
}).then(success => success[0]);
if(exists) {
return Promise.reject('');
}
await user.edit({ id: userId }, { telegram: telegramId });
// telegram.emit('reply', message, 'Telegram账号绑定成功,输入 help 查看使用方法');
tg.sendMessage('Telegram账号绑定成功,输入 help 查看使用方法', telegramId);
};
const unbindUser = async (userId) => {
const exists = await knex('user').where({
id: userId
}).then(success => success[0]);
if(!exists) {
return Promise.reject('');
}
if(!exists.telegram) {
return Promise.reject('');
}
await user.edit({ id: userId }, { telegram: null });
// telegram.emit('send', +exists.telegram, 'Telegram账号已经解除绑定');
tg.sendMessage('Telegram账号已经解除绑定', +exists.telegram);
};
exports.getCode = async (userId) => {
const exists = await knex('user').where({
id: userId
}).then(success => success[0]);
if(exists && exists.telegram) {
return {
user: exists.telegram,
};
}
const botInfo = await getMe();
let code = await redis.get(`Temp:TelegramBind:${userId}`);
if(code) {
return {
code,
telegram: botInfo.result.username,
};
} else {
code = Math.random().toString().substr(2, 8);
await redis.set(`Temp:TelegramBind:${userId}`, code, 'EX', 120);
return {
code,
telegram: botInfo.result.username,
};
}
};
exports.unbindUser = unbindUser;
// 用户注册功能
const isEmail = message => {
if(!message.message || !message.message.text) { return false; }
if(!message.message || !message.message.chat || !message.message.chat.type === 'private') { return false; }
if(!message.message.text.trim().match(/^[\w.\-]+@(?:[a-z0-9]+(?:-[a-z0-9]+)*\.)+[a-z]{2,3}$/)) { return false; }
return true;
};
const isSignupCodeMessage = message => {
if(!message.message || !message.message.text) { return false; }
if(!message.message || !message.message.chat || !message.message.chat.type === 'private') { return false; }
if(!message.message.text.trim().match(/^\d{6}$/)) { return false; }
return true;
};
telegram.on('message', async message => {
try {
if(isEmail(message)) {
const telegramId = message.message.chat.id.toString();
await isNotUserOrAdmin(telegramId);
const setting = await knex('webguiSetting').select().where({
key: 'account',
}).then(success => JSON.parse(success[0].value));
if(!setting.signUp.isEnable) {
return Promise.reject();
}
const mailSetting = await knex('webguiSetting').select().where({
key: 'mail',
}).then(success => JSON.parse(success[0].value)).then(s => s.code);
const email = message.message.text;
const isUserExists = await knex('user').where({ email }).then(s => s[0]);
if(isUserExists) { return; }
await emailPlugin.sendCode(email, mailSetting.title || 'ss验证码', mailSetting.content || '欢迎新用户注册,\n您的验证码是:', {
telegramId
});
await tg.sendMessage(`验证码已经发送至[ ${email} ],输入验证码即可完成注册`, telegramId);
} else if(isSignupCodeMessage(message)) {
const telegramId = message.message.chat.id.toString();
await isNotUserOrAdmin(telegramId);
const code = message.message.text.trim();
const emailInfo = await emailPlugin.checkCodeFromTelegram(telegramId, code);
const userId = (await user.add({
username: emailInfo.to,
email: emailInfo.to,
password: Math.random().toString().substr(2),
type: 'normal',
telegramId,
}))[0];
const setting = await knex('webguiSetting').select().where({
key: 'account',
}).then(success => JSON.parse(success[0].value));
const newUserAccount = setting.accountForNewUser;
if(!setting.accountForNewUser.isEnable) {
return;
}
const getNewPort = async () => {
const setting = await knex('webguiSetting').select().where({
key: 'account',
}).then(success => JSON.parse(success[0].value));
const port = setting.port;
if(port.random) {
const getRandomPort = () => Math.floor(Math.random() * (port.end - port.start + 1) + port.start);
let retry = 0;
let myPort = getRandomPort();
const checkIfPortExists = port => {
let myPort = port;
return knex('account_plugin').select()
.where({ port }).then(success => {
if(success.length && retry <= 30) {
retry++;
myPort = getRandomPort();
return checkIfPortExists(myPort);
} else if (success.length && retry > 30) {
return Promise.reject('Can not get a random port');
} else {
return myPort;
}
});
};
return checkIfPortExists(myPort);
} else {
return knex('account_plugin').select()
.whereBetween('port', [port.start, port.end])
.orderBy('port', 'DESC').limit(1).then(success => {
if(success.length) {
return success[0].port + 1;
}
return port.start;
});
}
};
const port = await getNewPort();
await account.addAccount(newUserAccount.type || 5, {
user: userId,
port,
password: Math.random().toString().substr(2,10),
time: Date.now(),
limit: newUserAccount.limit || 8,
flow: (newUserAccount.flow ? newUserAccount.flow : 350) * 1000000,
server: newUserAccount.server ? JSON.stringify(newUserAccount.server): null,
autoRemove: newUserAccount.autoRemove ? 1 : 0,
multiServerFlow: newUserAccount.multiServerFlow ? 1 : 0,
});
await tg.sendMessage(`用户[ ${ emailInfo.to } ]注册完成,输入 help 查看具体指令`, telegramId);
}
} catch(err) {
console.log(err);
}
});