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