initial
This commit is contained in:
commit
512a10ca29
|
@ -0,0 +1,3 @@
|
||||||
|
NODE_ENV=development
|
||||||
|
LOG_LEVEL=trace
|
||||||
|
TOKEN=
|
|
@ -0,0 +1,3 @@
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
.env
|
|
@ -0,0 +1,10 @@
|
||||||
|
# remove-keyboard-bot
|
||||||
|
|
||||||
|
## Run bot
|
||||||
|
1) install NodeJS
|
||||||
|
2) clone this repo: `git clone https://git.zeldon.ru/zeldon/remove-keyboard-bot.git`
|
||||||
|
3) cd to dir with bot
|
||||||
|
4) write `npm i`
|
||||||
|
5) cp env: `cp .env.example .env`
|
||||||
|
6) edit `.env` (add token)
|
||||||
|
7) start in dev mode: `npm run dev` and prod: `npm run build && node dist/index.js`
|
|
@ -0,0 +1,19 @@
|
||||||
|
import { env } from "#root/env.js";
|
||||||
|
import { removeKeyboardFeature } from "#root/features/remove-keyboard.js";
|
||||||
|
import { welcomeFeature } from "#root/features/welcome.js";
|
||||||
|
import { logger } from "#root/logger.js";
|
||||||
|
import { Bot } from "grammy";
|
||||||
|
|
||||||
|
const bot = new Bot(env.TOKEN);
|
||||||
|
|
||||||
|
bot.use(welcomeFeature);
|
||||||
|
bot.use(removeKeyboardFeature);
|
||||||
|
|
||||||
|
bot.start({
|
||||||
|
onStart: ({ username }) =>
|
||||||
|
logger.info({
|
||||||
|
msg: "bot running...",
|
||||||
|
username,
|
||||||
|
}),
|
||||||
|
drop_pending_updates: true
|
||||||
|
});
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"name": "remove-keyboard-bot",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"type": "module",
|
||||||
|
"imports": {
|
||||||
|
"#root/*": "./dist/src/*"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"dev": "npm run clean && tsc-watch --onSuccess \"tsx index.ts\"",
|
||||||
|
"build": "npm run clean && tsc --noEmit false",
|
||||||
|
"clean": "rimraf dist"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.9.0",
|
||||||
|
"rimraf": "^5.0.5",
|
||||||
|
"tsc-watch": "^6.0.4",
|
||||||
|
"tsx": "^3.14.0",
|
||||||
|
"typescript": "^5.2.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": "^16.3.1",
|
||||||
|
"envalid": "^7.3.1",
|
||||||
|
"grammy": "^1.19.2",
|
||||||
|
"pino": "^8.16.1",
|
||||||
|
"pino-pretty": "^10.2.3"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import 'dotenv/config';
|
||||||
|
import { cleanEnv, str } from 'envalid';
|
||||||
|
|
||||||
|
export const env = cleanEnv(process.env, {
|
||||||
|
NODE_ENV: str({ choices: ["development", "production"] }),
|
||||||
|
LOG_LEVEL: str({
|
||||||
|
choices: ["trace", "debug", "info", "warn", "error", "fatal", "silent"],
|
||||||
|
}),
|
||||||
|
TOKEN: str()
|
||||||
|
});
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { Composer, Context } from "grammy";
|
||||||
|
|
||||||
|
const composer = new Composer<Context>();
|
||||||
|
const feature = composer.chatType(['group', 'supergroup']);
|
||||||
|
|
||||||
|
feature.command('remove', async (ctx) => {
|
||||||
|
await ctx.reply('keboard removed', {
|
||||||
|
reply_markup: { remove_keyboard: true }
|
||||||
|
});
|
||||||
|
|
||||||
|
ctx.editMessageReplyMarkup();
|
||||||
|
});
|
||||||
|
|
||||||
|
export { composer as removeKeyboardFeature };
|
|
@ -0,0 +1,10 @@
|
||||||
|
import { Composer, Context } from "grammy";
|
||||||
|
|
||||||
|
const composer = new Composer<Context>();
|
||||||
|
const feature = composer.chatType('private');
|
||||||
|
|
||||||
|
feature.command(['help', 'start'], async (ctx) => {
|
||||||
|
ctx.reply('Add this bot to chat and type /remove command');
|
||||||
|
});
|
||||||
|
|
||||||
|
export { composer as welcomeFeature };
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { env } from "#root/env.js";
|
||||||
|
import { LoggerOptions, pino } from "pino";
|
||||||
|
import PinoPretty, { PrettyOptions } from "pino-pretty";
|
||||||
|
|
||||||
|
const options: LoggerOptions = {
|
||||||
|
level: env.LOG_LEVEL
|
||||||
|
};
|
||||||
|
|
||||||
|
const prettyOptions: PrettyOptions = {
|
||||||
|
ignore: 'pid,hostname',
|
||||||
|
colorize: env.isDev ? true : false,
|
||||||
|
translateTime: 'SYS:dd.mm.yyyy, HH:MM:ss'
|
||||||
|
};
|
||||||
|
|
||||||
|
export let logger = pino(options);
|
||||||
|
|
||||||
|
if (env.isDev) {
|
||||||
|
// @ts-ignore
|
||||||
|
logger = pino(options, PinoPretty(prettyOptions));
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"strict": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"preserveWatchOutput": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"module": "NodeNext",
|
||||||
|
"target": "ES2021",
|
||||||
|
"moduleResolution": "NodeNext",
|
||||||
|
"sourceMap": true,
|
||||||
|
"outDir": "dist",
|
||||||
|
"rootDir": ".",
|
||||||
|
"paths": {
|
||||||
|
"#root/*": [
|
||||||
|
"./src/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src/**/*",
|
||||||
|
"index.ts"
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue