Browse Source

[refactor] organize runtime stuff

master
Pavan Jadhaw 6 years ago
parent
commit
0fea417c0d
  1. 67
      app.js

67
app.js

@ -3,6 +3,17 @@ const { spawn } = require('child_process');
const { EOL } = require('os'); const { EOL } = require('os');
const os = require('os'); const os = require('os');
// Runtime
const runtime = {
home: os.homedir(),
hostname: os.hostname(),
username: os.userInfo().username,
shell: os.platform() === 'win32' ? 'cmd.exe' : 'bash',
sessions: [],
identifierState: 0,
history: [],
}
// Modules // Modules
const Telegraf = require('telegraf'); const Telegraf = require('telegraf');
@ -28,37 +39,27 @@ const dateOptions = {
}; };
const bot = new Telegraf(config.botApiKey); const bot = new Telegraf(config.botApiKey);
const sessions = []; const getSession = sessionFinder(runtime.sessions);
let identifierState = 0;
sessions.history = [];
const getSession = sessionFinder(sessions);
// get os info
const home = os.homedir();
const hostname = os.hostname();
const username = os.userInfo().username;
const defaultShell = os.platform() === 'win32' ? 'cmd.exe' : 'bash';
// Validate bot's master // Validate bot's master
bot.use(validator); bot.use(validator);
bot.command('start', bot.command('start',
ctx => { ctx => {
const newProc = spawn(defaultShell, { const newProc = spawn(runtime.shell, {
cwd: home cwd: runtime.home
}); });
const identifier = extractCommandText('start')(ctx); const identifier = extractCommandText('start')(ctx);
if(identifier) newProc.identifier = identifier; if(identifier) newProc.identifier = identifier;
else newProc.identifier = identifierState; else newProc.identifier = runtime.identifierState;
newProc.index = identifierState; newProc.index = runtime.identifierState;
sessions[identifierState] = newProc; runtime.sessions[runtime.identifierState] = newProc;
identifierState++; runtime.identifierState++;
sessions.currentSession = newProc; runtime.sessions.currentSession = newProc;
listeners.add(sessions.currentSession, responder, ctx); listeners.add(runtime.sessions.currentSession, responder, ctx);
return responder.success(`Welcome to tsh -- <code>Telegram Shell!</code>\n\n` return responder.success(`Welcome to tsh -- <code>Telegram Shell!</code>\n\n`
+ `You are now connected to <code>${hostname}</code>` + `You are now connected to <code>${runtime.hostname}</code>`
+ ` as <strong>${username}</strong>.`, + ` as <strong>${runtime.username}</strong>.`,
'html' 'html'
)(ctx); )(ctx);
}); });
@ -67,13 +68,13 @@ bot.command('save',
ctx => { ctx => {
const identifier = extractCommandText('save')(ctx); const identifier = extractCommandText('save')(ctx);
if(!identifier) return responder.fail('Need a valid identifier to save session.')(ctx); if(!identifier) return responder.fail('Need a valid identifier to save session.')(ctx);
sessions.currentSession.identifier = identifier; runtime.sessions.currentSession.identifier = identifier;
return responder.success(`Saved session <code>${identifier}</code>.`, 'html')(ctx); return responder.success(`Saved session <code>${identifier}</code>.`, 'html')(ctx);
}); });
bot.command('ls', bot.command('ls',
ctx => ctx.reply( ctx => ctx.reply(
sessions.reduce((acc, session) => runtime.sessions.reduce((acc, session) =>
acc ? `${acc}\n${session.identifier}` : `${session.identifier}`, '') acc ? `${acc}\n${session.identifier}` : `${session.identifier}`, '')
|| `No sessions found. Start one with /start.` || `No sessions found. Start one with /start.`
)); ));
@ -83,41 +84,41 @@ bot.command('attach',
const session = getSession(ctx)('attach'); const session = getSession(ctx)('attach');
if(!session) if(!session)
return responder.fail('Session not found. /ls for list of sessions')(ctx); return responder.fail('Session not found. /ls for list of sessions')(ctx);
sessions.currentSession = session; runtime.sessions.currentSession = session;
listeners.add(sessions.currentSession, responder, ctx); listeners.add(runtime.sessions.currentSession, responder, ctx);
return responder.success(`Reattached to shell ${session.identifier}`)(ctx); return responder.success(`Reattached to shell ${session.identifier}`)(ctx);
}); });
bot.command('detach', bot.command('detach',
ctx => { ctx => {
const session = getSession(ctx)('detach') || sessions.currentSession; const session = getSession(ctx)('detach') || runtime.sessions.currentSession;
if(!session) if(!session)
return responder.fail('Session not found. /ls for list of sessions.')(ctx); return responder.fail('Session not found. /ls for list of sessions.')(ctx);
listeners.remove(session); listeners.remove(session);
sessions.currentSession = undefined; runtime.sessions.currentSession = undefined;
return responder.success(`Detached from shell ${session.identifier}`)(ctx); return responder.success(`Detached from shell ${session.identifier}`)(ctx);
}); });
bot.command('kill', bot.command('kill',
ctx => { ctx => {
const session = getSession(ctx)('kill') || sessions.currentSession; const session = getSession(ctx)('kill') || runtime.sessions.currentSession;
if(!session) if(!session)
return responder.fail('Session not found. /ls for list of sessions.')(ctx); return responder.fail('Session not found. /ls for list of sessions.')(ctx);
session.kill(); session.kill();
delete sessions[session.index]; delete runtime.sessions[session.index];
if(session === sessions.currentSession) sessions.currentSession = undefined; if(session === runtime.sessions.currentSession) runtime.sessions.currentSession = undefined;
ctx.reply('Session killed. /ls for list of sessions.') ctx.reply('Session killed. /ls for list of sessions.')
}) })
bot.use(ctx => { bot.use(ctx => {
if(!sessions.currentSession) if(!runtime.sessions.currentSession)
return responder.fail(`No active session. ` return responder.fail(`No active session. `
+ `Start one with /start or view list of sessions by sending /ls.`)(ctx); + `Start one with /start or view list of sessions by sending /ls.`)(ctx);
const cmd = ctx.update.message.text; const cmd = ctx.update.message.text;
const history = `${new Date().toLocaleDateString('en-IN', dateOptions)}: ${cmd}`; const history = `${new Date().toLocaleDateString('en-IN', dateOptions)}: ${cmd}`;
sessions.history.push(history); runtime.history.push(history);
console.log(history); console.log(history);
sessions.currentSession.stdin.write(cmd + EOL); runtime.sessions.currentSession.stdin.write(cmd + EOL);
}); });
bot.startPolling(); bot.startPolling();

Loading…
Cancel
Save