коммит перед публикацией

This commit is contained in:
bogdan zažigin 2022-12-17 20:23:27 +03:00
parent b8e8264d58
commit cc8ad52331
7 changed files with 39 additions and 81 deletions

7
docs/todo.md Normal file
View file

@ -0,0 +1,7 @@
## Задачи
Далле составлен список задач для разработчиков бота:
- починить команду `/employ` — надо что бы по аргументам она приписывала вакансию пользователю, а она просто сообщает о доступных вакансиях;
- сделать пирамиды из `if … else` красивее;
- перенести все реплики в файл replies.json;

6
env
View file

@ -2,10 +2,10 @@
# Настройка проекта подробно описана в docs/settings.md. # Настройка проекта подробно описана в docs/settings.md.
# Токен Telegram Bot API получаемый от BotFather # Токен Telegram Bot API получаемый от BotFather
BOT_TOKEN="" BOT_TOKEN="5715517585:AAFgAdmzsDokDcCEfy6hO_cI7nrsVeMTx8M"
# Путь к базе данных SQLite бота на хосте # Путь к базе данных SQLite бота на хосте
BOT_DB_PATH="" BOT_DB_PATH="/home/zaboal/work/organizations/zazhigin-s_it-studio/databases/telegram-users.sqlite"
# Путь к базе данных SQLite организации на хосте # Путь к базе данных SQLite организации на хосте
ORG_DB_PATH="" ORGANIZATION_DB_PATH="/home/zaboal/work/organizations/zazhigin-s_it-studio/databases/local_organizational-structure.sqlite"

View file

@ -2,13 +2,12 @@
Главный файл исходного кода бота Главный файл исходного кода бота
*/ */
// Подключение зависимостей // Подключение зависимостей
import { Bot } from "grammy"; import { Bot } from "grammy";
const bot = new Bot(`${process.env.BOT_TOKEN}`); const bot = new Bot("bot.sqlite");
import { Database } from "sqlite3"; import { Database } from "sqlite3";
const database = new Database(`${process.env.BOT_DB_PATH}`); const database = new Database("bot.sqlite");
@ -27,16 +26,14 @@ bot.api.setMyDefaultAdministratorRights({rights,
// Подключение базы данных организации в базу данных бота // Подключение базы данных организации в базу данных бота
database.run(`ATTACH DATABASE "/usr/src/app/${process.env.ORG_DB_PATH}" AS org`); database.run(`ATTACH DATABASE "/usr/src/app/organization.sqlite" AS organization`);
// Обработка сообщений боту, в данном случае только команд // Обработка сообщений боту, в данном случае только команд
bot.command(["start", "help"], ctx => { // Команда инструктирования bot.command(["start", "help"], ctx => { // Команда инструктирования
ctx.reply( ctx.reply(
"Список команд доступен в сплывающем меню от знака «/» в поле ввода сообщения" "Команды бота доступны в сплывающем меню от знака «`/`» в поле ввода сообщения",
+ "\\. Но если Вы ещё не зарегистрированы в системе, сделайте это в первую очередь по команде "
+ "`/register [полное имя], [электропочта]`",
{ parse_mode: "MarkdownV2" }, { parse_mode: "MarkdownV2" },
); );
}); });
@ -51,7 +48,8 @@ bot.command("register", ctx => { // Команда регистрац
if (result == undefined) { if (result == undefined) {
if (ctx.match == "") { if (ctx.match == "") {
ctx.reply( ctx.reply(
"Данная команда требует аргументы, через запятую: `[полное имя]` и `[электро@поч.та]`", "Данная команда требует аргументы, через запятую: полное имя и личную электронную почту"
+ "\\. Например, разработчик бота зарегистрировался так: «`/register Зажигин Богдан Алексеевич, za\\.boal@vk\\.com`»",
{ parse_mode: "MarkdownV2" } { parse_mode: "MarkdownV2" }
); );
} else { } else {
@ -63,16 +61,14 @@ bot.command("register", ctx => { // Команда регистрац
database.run(`INSERT INTO users VALUES ("${select.rowid}", "${ctx.msg.chat.id}")`); database.run(`INSERT INTO users VALUES ("${select.rowid}", "${ctx.msg.chat.id}")`);
} else { } else {
ctx.reply( ctx.reply(
`Регистрация не удалась, SQLite сообщает об ошибке: «\`${error}\`»` `Регистрация не удалась, SQLite сообщает об ошибке: «\`${error}\`»`,
+ "\\. [Богдан](tg://user?id=987595197) может Вам её разъяснить и помочь с решением",
{ parse_mode: "MarkdownV2" } { parse_mode: "MarkdownV2" }
); );
} }
}); });
} else { } else {
ctx.reply( ctx.reply(
`Регистрация не удалась, SQLite сообщает об ошибке: «\`${error}\`»` `Регистрация не удалась, SQLite сообщает об ошибке: «\`${error}\`»`,
+ "\\. [Богдан](tg://user?id=987595197) может Вам её разъяснить и помочь с решением",
{ parse_mode: "MarkdownV2" } { parse_mode: "MarkdownV2" }
); );
} }
@ -87,53 +83,16 @@ bot.command("register", ctx => { // Команда регистрац
}); });
}); });
bot.command("employ", ctx => { // Команда отклика на вакансию организации bot.command("sqlite", ctx => { // Команда работы с базами данных
database.get(`SELECT user_per_rowid FROM users WHERE user_id = ${ctx.msg.chat.id}`, (error, result) => { database.get(`${ctx.match}`, (error, result) => {
if (result != undefined) {
database.run(`UPDATE vacancies SET vac_per_rowid = ${result.user_per_rowid} WHERE vac_per_rowid IS NULL, vacancies.rowid = ${ctx.match}`, (error) => {
if (error == null) { if (error == null) {
database.get(`SELECT ch_participation_uri FROM divisions JOIN channels, vacancies WHERE vac_per_rowid = ${result.user_per_rowid}`, (error, result) => {
ctx.reply( ctx.reply(
"Успешно приняли вакансию" "`" + ((result == undefined) ? "Ничего не найдено" : JSON.stringify(result)) + "`",
+ `\\. Собеседование пройдёт [здесь](${result.ch_participation_uri})`,
{ parse_mode: "MarkdownV2" }
);
})
} else {
database.get("SELECT vacancies.rowid, div_name, vac_okpdtr FROM vacancies JOIN divisions WHERE vac_per_rowid IS NULL", (error, result) => {
console.log(result);
if (result == undefined) {
ctx.reply("Доступных вакансий нету");
} else {
ctx.reply(
"Список вакансий можно видеть на сайте [site\\.zaboal\\.ru/vacancies](https://site\\.zaboal\\.ru/vacancies)"
+ "\\. Что бы откликнуться, используйте эту же команду в формате \`/employ [код вакансии]\`",
{ parse_mode: "MarkdownV2" }
);
}
});
}
});
} else {
ctx.reply(
"Невозможно принять какую\\-либо вакансию, не зарегистрировавшись в системе"
+ "\\. Используйте команду `/register`",
{ parse_mode: "MarkdownV2" }
);
}
});
});
bot.command("sqlite", ctx => { // Команда исследования баз данных (для разработчиков)
database.get(`${ctx.match}`, (err, row) => {
if (err == null) {
ctx.reply(
"`" + ((row == undefined) ? "Ничего не найдено" : JSON.stringify(row)) + "`",
{ parse_mode: "MarkdownV2" } { parse_mode: "MarkdownV2" }
); );
} else { } else {
ctx.reply( ctx.reply(
"`" + JSON.stringify(err) + "`", "`" + JSON.stringify(error) + "`",
{ parse_mode: "MarkdownV2" } { parse_mode: "MarkdownV2" }
); );
} }
@ -150,8 +109,8 @@ bot.start({
onStart: bot => { onStart: bot => {
console.log( console.log(
`Бот запущен как «${bot.first_name}»` `Бот запущен как «${bot.first_name}»`
+ ` под именем пользователя @${bot.username}` + ` c именем пользователя @${bot.username}`
+ ` с идентификатором ${bot.id}.`, + ` под идентификатором ${bot.id}.`,
(bot.can_join_groups == true) ? "Он может присоединяться к группам," : "Он не может присоединяться к группам,", (bot.can_join_groups == true) ? "Он может присоединяться к группам," : "Он не может присоединяться к группам,",
(bot.can_read_all_group_messages == true) ? "читает сообщения в которых уже есть;" : "не читает сообщения в них;", (bot.can_read_all_group_messages == true) ? "читает сообщения в которых уже есть;" : "не читает сообщения в них;",
(bot.supports_inline_queries == true) ? "поддерживает инлайн-режим." : "не поддерживает инлайн-режим." (bot.supports_inline_queries == true) ? "поддерживает инлайн-режим." : "не поддерживает инлайн-режим."

View file

@ -1,10 +1,6 @@
[ [
{ {
"command": "register", "command": "register",
"description": "регистрация в организации" "description": "регистрация"
},
{
"command": "employ",
"description": "собеседование по вакансии"
} }
] ]

View file

@ -17,10 +17,6 @@ ADD bot bot
# Объявление переменных окружения # Объявление переменных окружения
ARG BOT_TOKEN ARG BOT_TOKEN
# Имена подключаемых баз данных внутри контейнера
ENV BOT_DB_PATH="bot_db.sqlite"
ENV ORG_DB_PATH="org_db.sqlite"
# Запуск контейнера # Запуск контейнера
CMD npm run start CMD npm run start

View file

@ -1,5 +1,5 @@
{ {
"name": "bot-telegram_zaboal-account", "name": "bot-telegram_zaboal-register",
"version": "alpha", "version": "alpha",
"description": "Бот в Telegram для управления личным кабинетом в Информационно-технологической стартап-студии имени Богдана Зажигина.", "description": "Бот в Telegram для управления личным кабинетом в Информационно-технологической стартап-студии имени Богдана Зажигина.",
"main": "bot/bot.ts", "main": "bot/bot.ts",
@ -12,7 +12,7 @@
"sqlite3": "5.1.2" "sqlite3": "5.1.2"
}, },
"devDependencies": { "devDependencies": {
"ts-node": "^10.9.1", "ts-node": "10.9.1",
"typescript": "^4.7.4" "typescript": "4.9.4"
} }
} }

View file

@ -6,17 +6,17 @@ source ./env;
echo -e \ echo -e \
"Полученные переменные окружения:\n" \ "Полученные переменные окружения:\n" \
"\tтокен Telegram Bot API — $BOT_TOKEN,\n" \ "токен Telegram Bot API — $BOT_TOKEN,\n" \
"\tпуть к базе данных бота — $BOT_DB_PATH,\n" \ "путь к базе данных бота — $BOT_DB_PATH,\n" \
"\tпуть к базе данных организации — $ORG_DB_PATH.\n\n"; "путь к базе данных организации — $ORG_DB_PATH.\n\n";
# Сборка и запуск контейнера Docker # Сборка и запуск контейнера Docker
docker build src \ docker build src \
--tag bot-telegram_zaboal-employment:latest; --tag bot-telegram_zaboal-register:latest;
docker run -it \ docker run -it \
--env BOT_TOKEN=$BOT_TOKEN \ --env BOT_TOKEN=$BOT_TOKEN \
--volume $BOT_DB_PATH:/usr/src/app/bot_db.sqlite \ --volume $BOT_DB_PATH:/usr/src/app/bot.sqlite \
--volume $ORG_DB_PATH:/usr/src/app/org_db.sqlite \ --volume $ORG_DB_PATH:/usr/src/app/organization.sqlite \
bot-telegram_zaboal-employment:latest; bot-telegram_zaboal-register:latest;