mirror of https://github.com/186526/net186-bot
127 lines
3.1 KiB
TypeScript
127 lines
3.1 KiB
TypeScript
import { Context, deunionize, Scenes, session } from "telegraf";
|
|
import Address from "../lib/address";
|
|
import type { Address4, Address6 } from "ip-address";
|
|
|
|
interface querySession extends Scenes.SceneSession {
|
|
choosenDevice: device;
|
|
devices: device[];
|
|
address: Address4 | Address6;
|
|
}
|
|
|
|
export interface queryContext extends Context {
|
|
session: querySession;
|
|
|
|
scene: Scenes.SceneContextScene<queryContext>;
|
|
}
|
|
|
|
export default (capability: capabilities, adapter: adapter) => {
|
|
const queryScene = new Scenes.BaseScene<queryContext>(capability);
|
|
queryScene.enter(async (ctx) => {
|
|
let text = deunionize(ctx.message)?.text;
|
|
if (!text) return;
|
|
let command = text.split(" ").filter((k) => k);
|
|
|
|
if (command.length == 1) {
|
|
ctx.reply(`Usage: ${text} target [Device]`);
|
|
return;
|
|
}
|
|
|
|
const originMessage = await ctx.reply("Querying Looking Glass...", {
|
|
reply_to_message_id: ctx.message?.message_id,
|
|
});
|
|
|
|
try {
|
|
ctx.session.address = Address(command[1]);
|
|
} catch (e: any) {
|
|
await ctx.telegram.editMessageText(
|
|
originMessage.chat.id,
|
|
originMessage.message_id,
|
|
undefined,
|
|
e.toString()
|
|
);
|
|
return;
|
|
}
|
|
ctx.session.devices = await adapter.devices();
|
|
|
|
if (command.length == 2) {
|
|
await ctx.telegram.editMessageText(
|
|
originMessage.chat.id,
|
|
originMessage.message_id,
|
|
undefined,
|
|
"Please select the device you want to query about.",
|
|
{
|
|
reply_markup: {
|
|
inline_keyboard: ctx.session.devices.reduce(
|
|
(
|
|
pre: {
|
|
text: string;
|
|
callback_data: string;
|
|
}[][],
|
|
cur
|
|
) => {
|
|
if (pre[pre.length - 1].length == 2) pre.push([]);
|
|
pre[pre.length - 1].push({
|
|
text: cur.name,
|
|
callback_data: cur.name,
|
|
});
|
|
return pre;
|
|
},
|
|
[
|
|
[
|
|
{
|
|
text: "Random Device",
|
|
callback_data: "random",
|
|
},
|
|
],
|
|
]
|
|
),
|
|
},
|
|
}
|
|
);
|
|
return;
|
|
} else if (command.length == 3) {
|
|
ctx.session.choosenDevice =
|
|
ctx.session.devices.find((v) =>
|
|
v.name.toLocaleLowerCase().includes(command[2].toLocaleLowerCase())
|
|
) ?? ctx.session.devices[0];
|
|
}
|
|
|
|
const result = await adapter.query(
|
|
capability,
|
|
ctx.session.choosenDevice,
|
|
ctx.session.choosenDevice.vrfs[0],
|
|
ctx.session.address
|
|
);
|
|
|
|
await ctx.telegram.editMessageText(
|
|
originMessage.chat.id,
|
|
originMessage.message_id,
|
|
undefined,
|
|
`Query Result from <code>${ctx.session.choosenDevice.name}</code>.\n<code>${result.output}</code>`,
|
|
{ parse_mode: "HTML" }
|
|
);
|
|
});
|
|
queryScene.action(/.+/, async (ctx) => {
|
|
if (ctx.match[0] != "random") {
|
|
ctx.session.choosenDevice =
|
|
ctx.session.devices.find((v) => v.name.includes(ctx.match[0])) ??
|
|
ctx.session.devices[0];
|
|
} else
|
|
ctx.session.choosenDevice =
|
|
ctx.session.devices[(Math.random() * ctx.session.devices.length) | 0];
|
|
|
|
const result = await adapter.query(
|
|
capability,
|
|
ctx.session.choosenDevice,
|
|
ctx.session.choosenDevice.vrfs[0],
|
|
ctx.session.address
|
|
);
|
|
|
|
await ctx.editMessageText(
|
|
`Query Result from <code>${ctx.session.choosenDevice.name}</code>.\n<code>${result.output}</code>`,
|
|
{ parse_mode: "HTML" }
|
|
);
|
|
});
|
|
return queryScene;
|
|
};
|