From 1c323f2c48c1f004ea8efb49504f49531d81adcd Mon Sep 17 00:00:00 2001 From: NightStrang6r Date: Mon, 12 Sep 2022 20:49:50 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=BE=20v0.4.0=20Added=20telegram=20bot?= =?UTF-8?q?=20+=20code=20improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - добавлено частичное управление через Telegram бота - оптимизирована работа автовыдачи / отправки сообщений - исправлена ошибка с выдачей нескольких товаров в одно и то же время - оптимизирована обработка событий --- README.md | 46 +++---- package-lock.json | 259 +++++++++++++++++++++++++++++++++++- package.json | 6 +- src/activity.js | 2 +- src/chat.js | 14 +- src/fetch.js | 3 +- src/index.js | 9 ++ src/runner.js | 59 ++------- src/sales.js | 51 ++++---- src/storage.js | 71 ++++++++-- src/telegram.js | 327 ++++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 729 insertions(+), 118 deletions(-) create mode 100644 src/telegram.js diff --git a/README.md b/README.md index ee65000..1522b8c 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,18 @@ 2. Автоподнятие предложений. 3. Автовосстановление предложений после продажи. 4. Автоответ на сообщения. -5. Подсчёт продаж. -6. Подсчёт заработка с продаж. +5. Вечный онлайн. +6. Подсчёт продаж. +7. Подсчёт заработка с продаж. + +## 🏆 **Преимущества** + +- Оптимизированность + *Для работы достаточно до 200мб свободного места на диске, 64-разрядная OS, любой процессор, до 250 мб ОЗУ, доступ в Интернет* +- Доступность + *Программу можно запустить на любой платформе, которую поддерживает NodeJS: от Windows и Linux, до Android и iOS.* +- Частичное управление через Telegram +- Наличие самого нужного функционала ## ⚡ **Установка** @@ -38,6 +48,10 @@ 5. Получите `golden_key` из cookie FunPay. Вы можете использовать расширение [Edit This Cookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg). 4. Запустите файл `Start.bat`, это установит зависимости для работы программы. После запустите этот файл повторно и следуйте инструкциям в консоли. Готово! +

♨️ Linux / Ubuntu ♨️

+ +- [Статья](https://lolz.guru/threads/4287473/) +

⚫ Termux (Android) ⚫

1. Установите **Termux** на свой Android одним из вариантов: @@ -72,14 +86,8 @@ [{ "name": "ТУТ ТОЧЬ В ТОЧЬ НАЗВАНИЕ ТОВАРА НА FUNPAY", "nodes": [ - { - "message": "Тут сообщение, которое будет выдано после первой оплаты. Для переноса строки используйте символы \n. Пример: первая строка\nвторая строка ", - "sold": false - }, - { - "message": "Тут сообщение, которое будет выдано после второй оплаты данного лота.", - "sold": false - } + "Тут сообщение, которое будет выдано после первой оплаты. Для переноса строки используйте символы \n. Пример: первая строка\nвторая строка ", + "Тут сообщение, которое будет выдано после второй оплаты данного лота.", ] }] ``` @@ -88,14 +96,8 @@ [{ "name": "ТУТ ТОЧЬ В ТОЧЬ НАЗВАНИЕ ТОВАРА НА FUNPAY", "nodes": [ - { - "message": "Тут сообщение, которое будет выдано после первой оплаты. Для переноса строки используйте символы \n. Пример: первая строка\nвторая строка ", - "sold": false - }, - { - "message": "Тут сообщение, которое будет выдано после второй оплаты данного лота.", - "sold": false - } + "Тут сообщение, которое будет выдано после первой оплаты. Для переноса строки используйте символы \n. Пример: первая строка\nвторая строка ", + "Тут сообщение, которое будет выдано после второй оплаты данного лота.", ] }, { @@ -144,15 +146,15 @@ ``` { "token": "golden_key", // golden_key с FunPay cookies [string] + "telegramBot": true, // функция управления через Telegram [true / false] + "telegramToken": "", // токен телеграм бота [string] + "telegramUserName": "", // username пользователя [string] + "alwaysOnline": true, // функция вечного онлайна [true / false] "lotsRaise": true, // функция автоподнятия предложений [true / false] "goodsStateCheck": true, // функция автовосстановления предложений [true / false] "autoIssue": true, // функция автовыдачи [true / false] "autoResponse": true, // функция автоответа [true / false] "userDataUpdate": true, // функция автоматического обновления данных (не рекомендуется отключать) [true / false] - "intervals": { // настройка интервалов обновления данных в секундах [number] - "lotsRaise": 120, - "userDataUpdate": 100 - }, "autoIssueTestCommand": false, // функция включения команды "!автовыдача" для теста автовыдачи; требуется функция "autoResponse" для работы [true / false] "proxy": { "useProxy": false, // функция использования прокси [true / false] diff --git a/package-lock.json b/package-lock.json index 3736365..082f346 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "funpayserver", - "version": "0.3.1", + "version": "0.3.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "funpayserver", - "version": "0.3.1", + "version": "0.3.2", "license": "ISC", "dependencies": { "chalk": "^5.0.1", @@ -16,7 +16,9 @@ "inquirer": "^9.1.0", "jsdom": "^19.0.0", "node-fetch": "^3.2.1", - "project-version": "^2.0.0" + "project-version": "^2.0.0", + "telegraf": "^4.9.1", + "telegram-keyboard": "^2.3.2" } }, "node_modules/@babel/code-frame": { @@ -82,6 +84,17 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", @@ -241,6 +254,25 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, "node_modules/chalk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", @@ -508,6 +540,14 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -954,6 +994,14 @@ "node": ">=6" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1075,6 +1123,14 @@ "node": ">=0.10.0" } }, + "node_modules/p-timeout": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", + "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", + "engines": { + "node": ">=10" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -1230,11 +1286,27 @@ } ] }, + "node_modules/safe-compare": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz", + "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==", + "dependencies": { + "buffer-alloc": "^1.2.0" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sandwich-stream": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sandwich-stream/-/sandwich-stream-2.0.2.tgz", + "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -1361,6 +1433,73 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "node_modules/telegraf": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.9.1.tgz", + "integrity": "sha512-MukWpKvAZ6/HpT3yHXz+jwUf2HsPa9TcsqPLQjJ+kHNGUS2PLgaNX690ExdWmWPuxjVjC4wNHmZ9JetO3C/tVA==", + "dependencies": { + "abort-controller": "^3.0.0", + "debug": "^4.3.3", + "mri": "^1.2.0", + "node-fetch": "^2.6.7", + "p-timeout": "^4.1.0", + "safe-compare": "^1.1.4", + "sandwich-stream": "^2.0.2", + "typegram": "^3.11.0" + }, + "bin": { + "telegraf": "lib/cli.mjs" + }, + "engines": { + "node": "^12.20.0 || >=14.13.1" + } + }, + "node_modules/telegraf/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/telegraf/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/telegraf/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/telegraf/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/telegram-keyboard": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/telegram-keyboard/-/telegram-keyboard-2.3.2.tgz", + "integrity": "sha512-Ngl580+n+wREeaxdVOyHGm1cU3TeNBMXjsvxA4XmJ2Gik7eNIsMyzfEUNMflnBZH0F+iMxV3iH5ZwMrFHQIIwg==", + "engines": { + "node": ">=14" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -1412,6 +1551,11 @@ "node": ">=8" } }, + "node_modules/typegram": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/typegram/-/typegram-3.11.0.tgz", + "integrity": "sha512-4p6u+AFognlsDgBue8Hla2jO7Ax+UQXcLa27LC7xDdAeR9LTe+Cr4vJrYpoO1wgj/BFWgXTeboaH/+1YgWyfpA==" + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -1628,6 +1772,14 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "acorn": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", @@ -1724,6 +1876,25 @@ "ieee754": "^1.2.1" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, "chalk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", @@ -1914,6 +2085,11 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -2240,6 +2416,11 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2323,6 +2504,11 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, + "p-timeout": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", + "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==" + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -2425,11 +2611,24 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safe-compare": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz", + "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==", + "requires": { + "buffer-alloc": "^1.2.0" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sandwich-stream": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sandwich-stream/-/sandwich-stream-2.0.2.tgz", + "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==" + }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -2526,6 +2725,55 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "telegraf": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.9.1.tgz", + "integrity": "sha512-MukWpKvAZ6/HpT3yHXz+jwUf2HsPa9TcsqPLQjJ+kHNGUS2PLgaNX690ExdWmWPuxjVjC4wNHmZ9JetO3C/tVA==", + "requires": { + "abort-controller": "^3.0.0", + "debug": "^4.3.3", + "mri": "^1.2.0", + "node-fetch": "^2.6.7", + "p-timeout": "^4.1.0", + "safe-compare": "^1.1.4", + "sandwich-stream": "^2.0.2", + "typegram": "^3.11.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "telegram-keyboard": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/telegram-keyboard/-/telegram-keyboard-2.3.2.tgz", + "integrity": "sha512-Ngl580+n+wREeaxdVOyHGm1cU3TeNBMXjsvxA4XmJ2Gik7eNIsMyzfEUNMflnBZH0F+iMxV3iH5ZwMrFHQIIwg==" + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -2565,6 +2813,11 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" }, + "typegram": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/typegram/-/typegram-3.11.0.tgz", + "integrity": "sha512-4p6u+AFognlsDgBue8Hla2jO7Ax+UQXcLa27LC7xDdAeR9LTe+Cr4vJrYpoO1wgj/BFWgXTeboaH/+1YgWyfpA==" + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", diff --git a/package.json b/package.json index 1628585..1c11517 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "funpayserver", - "version": "0.3.1", + "version": "0.4.0", "description": "CLI app for auto-managing your FunPay account", "main": "src/index.js", "dependencies": { @@ -11,7 +11,9 @@ "inquirer": "^9.1.0", "jsdom": "^19.0.0", "node-fetch": "^3.2.1", - "project-version": "^2.0.0" + "project-version": "^2.0.0", + "telegraf": "^4.9.1", + "telegram-keyboard": "^2.3.2" }, "type": "module", "scripts": { diff --git a/src/activity.js b/src/activity.js index 74b49e7..d539d37 100644 --- a/src/activity.js +++ b/src/activity.js @@ -15,7 +15,7 @@ async function enableGoodsStateCheck() { async function checkGoodsState() { try { - log(`Проверяем состояние товаров на наличие изменений...`, 'c'); + //log(`Проверяем состояние товаров на наличие изменений...`, 'c'); const goodsNow = await getActiveProducts(global.appData.id); const goodsBackup = goodsState; diff --git a/src/chat.js b/src/chat.js index f37ee41..8ea843e 100644 --- a/src/chat.js +++ b/src/chat.js @@ -47,7 +47,7 @@ async function autoResponse() { } log(`Команда: ${c.yellowBright('!автовыдача')} для пользователя ${c.yellowBright(chat.userName)}:`); - let issueResult = await issueGood('', goodName, chat.node); + let issueResult = await issueGood(chat.node, chat.userName, goodName, 'node'); if(!issueResult) { await sendMessage(chat.node, `Товара "${goodName}" нет в списке автовыдачи`); @@ -92,7 +92,7 @@ async function getMessages(senderId) { } async function getLastMessageId(senderId) { - let lastMessageId = 1000000000; + let lastMessageId = -1; try { let chat = await getMessages(senderId); if(!chat) return lastMessageId; @@ -128,10 +128,12 @@ async function sendMessage(node, message, customNode = false) { "x-requested-with": "XMLHttpRequest" }; - let lastMessageId = 1000000000; if(customNode) { - lastMessageId = await getLastMessageId(node); - node = `users-${global.appData.id}-${node}`; + if(node > global.appData.id) { + node = `users-${global.appData.id}-${node}`; + } else { + node = `users-${node}-${global.appData.id}`; + } } let reqMessage = message; @@ -143,7 +145,7 @@ async function sendMessage(node, message, customNode = false) { "action": "chat_message", "data": { "node": node, - "last_message": lastMessageId, + "last_message": -1, "content": reqMessage } }; diff --git a/src/fetch.js b/src/fetch.js index 016ecda..6fcf150 100644 --- a/src/fetch.js +++ b/src/fetch.js @@ -55,6 +55,7 @@ export default async function fetch_(url, options, delay = 0, retries = 20) { return res; } catch (err) { - log(`Error while fetch: ${err}`); + log(`Ошибка при запросе (нет доступа к интернету / funpay): ${err}`); + //return await fetch_(url, options, delay + 200, retries - 5); } } \ No newline at end of file diff --git a/src/index.js b/src/index.js index fb944e0..7a10229 100644 --- a/src/index.js +++ b/src/index.js @@ -9,11 +9,14 @@ import { updateCategoriesData } from './categories.js'; import { getUserData, enableUserDataUpdate, countTradeProfit } from './account.js'; import Runner from './runner.js'; +import TelegramBot from './telegram.js'; import { enableAutoResponse, autoResponse } from './chat.js'; import { checkForNewOrders, enableAutoIssue } from './sales.js'; import { checkGoodsState, enableGoodsStateCheck } from './activity.js'; +global.startTime = new Date().getTime(); + // UncaughtException Handler process.on('uncaughtException', (e) => { console.error('Ошибка: необработанное исключение... Программа будет закрыта.'); @@ -80,6 +83,12 @@ if(settings.alwaysOnline == true || settings.autoIssue == true || settings.autoR await runner.start(); } +// Start telegram bot +if(settings.telegramBot == true) { + const bot = new TelegramBot(settings.telegramToken); + bot.run(); +} + // Callbacks function onNewMessage() { autoResponse(); diff --git a/src/runner.js b/src/runner.js index 3981c3d..b1bd2e5 100644 --- a/src/runner.js +++ b/src/runner.js @@ -1,8 +1,6 @@ import { log } from './log.js'; import { getConst } from './storage.js'; import { getRandomTag } from './activity.js'; -import { load } from './storage.js'; -import { parseDOM } from './DOMParser.js'; import fetch from './fetch.js'; const config = global.settings; @@ -15,11 +13,14 @@ class Runner { this.lastMessages = []; this.lastMessagesCount = 0; this.lastOrdersCount = 0; + + this.ordersTag = getRandomTag(); + this.messagesTag = getRandomTag(); } start() { setInterval(() => this.loop(), 6000); - log('Обработка событий запущена.', 'g'); + //log('Обработка событий запущена.', 'g'); } async loop() { @@ -37,14 +38,14 @@ class Runner { const orders_counters = { "type": "orders_counters", "id": `${appData.id}`, - "tag": `${getRandomTag()}`, + "tag": `${this.ordersTag}`, "data": false }; const chat_bookmarks = { "type": "chat_bookmarks", "id": `${appData.id}`, - "tag": `${getRandomTag()}`, + "tag": `${this.messagesTag}`, "data": false }; @@ -71,11 +72,13 @@ class Runner { for(let i = 0; i < resObjects.length; i++) { if(resObjects[i].type == "orders_counters") { - this.checkForNewOrders(resObjects[i].data); + this.ordersTag = resObjects[i].tag; + this.newOrderCallback(); } if(resObjects[i].type == "chat_bookmarks") { - this.checkForNewMessages(resObjects[i].data); + this.messagesTag = resObjects[i].tag; + this.newMessageCallback(); } } } catch (err) { @@ -83,48 +86,6 @@ class Runner { } } - checkForNewOrders(object) { - if(!object) return; - const seller = object.seller; - - if(seller != this.lastOrdersCount) { - this.lastOrdersCount = seller; - this.newOrderCallback(); - } - } - - checkForNewMessages(object) { - if(!object) return; - const counter = object.counter; - - if(counter != this.lastMessagesCount) { - this.lastMessagesCount = counter; - this.newMessageCallback(); - return; - } - - const html = object.html; - const doc = parseDOM(html); - const chats = doc.querySelectorAll(".contact-item"); - - let messages = []; - - for(let i = 0; i < chats.length; i++) { - const chat = chats[i]; - - let message = chat.querySelector('.contact-item-message').innerHTML; - messages.push(message); - } - - for(let i = 0; i < messages.length; i++) { - if(messages[i] != this.lastMessages[i]) { - this.lastMessages = messages.slice(); - this.newMessageCallback(); - return; - } - } - } - registerNewOrderCallback(callback) { this.newOrderCallback = callback; } diff --git a/src/sales.js b/src/sales.js index fc9ec97..e1910db 100644 --- a/src/sales.js +++ b/src/sales.js @@ -43,7 +43,7 @@ async function checkForNewOrders() { } log(`Новый заказ ${c.yellowBright(order.id)} от покупателя ${c.yellowBright(order.buyerName)} на сумму ${c.yellowBright(order.price)} ₽.`); - await issueGood(order.buyerName, order.name); + await issueGood(order.buyerId, order.buyerName, order.name, 'id'); } backupOrders = clone(orders.backupOrders); @@ -52,7 +52,7 @@ async function checkForNewOrders() { } } -async function issueGood(buyerName, goodName, chatNode = false) { +async function issueGood(buyerIdOrNode, buyerName, goodName, type = 'id') { let result = false; try { @@ -72,13 +72,11 @@ async function issueGood(buyerName, goodName, chatNode = false) { for(let j = 0; j < goods[i].nodes.length; j++) { const node = goods[i].nodes[j]; - if(node.sold == false) { - goods[i].nodes[j].sold = true; - await updateFile(goods, goodsfilePath); - message = node.message; - notInStock = false; - break; - } + goods[i].nodes.shift(); + await updateFile(goods, goodsfilePath); + message = node; + notInStock = false; + break; } if(notInStock) { @@ -90,16 +88,14 @@ async function issueGood(buyerName, goodName, chatNode = false) { } if(message != "") { - let node; + let node = buyerIdOrNode; + let customNode = false; - if(!chatNode) { - node = await getNodeByUserName(buyerName); - } else { - node = chatNode; - buyerName = chatNode; + if(type == 'id') { + customNode = true; } - result = await sendMessage(node, message); + result = await sendMessage(node, message, customNode); if(result) { log(`Товар "${c.yellowBright(goodName)}" выдан покупателю ${c.yellowBright(buyerName)} с сообщением:`); @@ -188,19 +184,24 @@ async function getNewOrders(lastOrders) { try { orders = await getOrders(); if(!orders || !orders[0]) { - log(`Список продаж пуст.`, 'r'); + log(`Ошибка получения новых заказов: список заказов пуст.`, 'r'); return; } - - const lastOrderId = lastOrders[0].id; - //log(`Last order id: ${lastOrderId}`); - + for(let i = 0; i < orders.length; i++) { - if(orders[i].id == lastOrderId || result.length >= 3) { - break; + if(result.length >= 3) break; + let contains = false; + + for(let j = 0; j < lastOrders.length; j++) { + if(orders[i].id == lastOrders[j].id) { + contains = true; + break; + } + } + + if(contains == false) { + result.push(Object.assign(orders[i])); } - - result.push(Object.assign(orders[i])); } } catch(err) { log(`Ошибка при получении новых заказов: ${err}`, 'r'); diff --git a/src/storage.js b/src/storage.js index 62015f7..c1dbc1a 100644 --- a/src/storage.js +++ b/src/storage.js @@ -47,6 +47,9 @@ async function loadSettings() { settings = { token: answers.token, + telegramBot: answers.telegramBot, + telegramToken: answers.telegramToken, + telegramUserName: '', alwaysOnline: answers.alwaysOnline, lotsRaise: answers.lotsRaise, goodsStateCheck: answers.goodsStateCheck, @@ -124,12 +127,31 @@ function checkToken(token) { return true; } +function checkTelegramToken(token) { + if(!token || token.length != 46) return false; + return true; +} + function getConst(name) { switch (name) { case 'api': return 'https://funpay.com'; + case 'autoIssueFilePath': return `${_dirname}/../${dataFolder}/autoIssueGoods.json`; + } +} + +function setConst(name, value) { + switch (name) { + case 'telegramUserName': + global.settings.telegramUserName = value; + fs.writeFileSync(`${_dirname}/../settings.json`, JSON.stringify(global.settings, null, 4)); + break; } } +async function loadAutoIssueFile() { + return await fs.readFile(`${_dirname}/../data/autoIssueGoods.json`, 'utf8'); +} + async function logToFile(msg) { try { if(!(await fs.exists(logPath))) { @@ -154,7 +176,6 @@ async function askSettings() { type: 'input', message: `Введите golden_key. Его можно получить из cookie с сайта FunPay при помощи расширения EditThisCookie:`, validate: function (input) { - // Declare function as asynchronous, and save the done callback const done = this.async(); if (!checkToken(input)) { @@ -163,11 +184,9 @@ async function askSettings() { } done(null, true); - } + } }); - console.log(`${c.green('Отлично! Токен принят.')}`); - const question2 = await inq.prompt({ name: 'autoSettings', type: 'list', @@ -175,10 +194,14 @@ async function askSettings() { choices: ['Оставить по умолчанию', 'Настроить'] }); + let telegramToken = ''; + if(question2.autoSettings == 'Оставить по умолчанию') { console.log(); return { token: question1.golden_key, + telegramBot: false, + telegramToken: telegramToken, alwaysOnline: true, lotsRaise: true, goodsStateCheck: true, @@ -187,12 +210,40 @@ async function askSettings() { } } + const question3 = await inq.prompt({ + name: 'telegramBot', + type: 'list', + message: `Включить управление программой через телеграм бота (понадобится токен бота)?`, + choices: ['Да', 'Нет'] + }); + + if(question3.telegramBot == 'Да') { + const question4 = await inq.prompt({ + name: 'telegramToken', + type: 'input', + message: `Введите токен Telegram бота, который вы получили от BotFather:`, + validate: function (input) { + const done = this.async(); + + if (!checkTelegramToken(input)) { + done('Невалидный токен.'); + return; + } + + done(null, true); + } + }); + + telegramToken = question4.telegramToken; + } + const answers = await inq.prompt([{ name: 'alwaysOnline', type: 'list', message: `Включить функцию вечного онлайна?`, choices: ['Да', 'Нет'] - },{ + }, + { name: 'lotsRaise', type: 'list', message: `Включить функцию автоматического поднятия предложений?`, @@ -219,15 +270,17 @@ async function askSettings() { const askSettings = { token: question1.golden_key, + telegramBot: (question3.telegramBot == 'Да') ? true : false, + telegramToken: telegramToken, alwaysOnline: (answers.alwaysOnline == 'Да') ? true : false, lotsRaise: (answers.lotsRaise == 'Да') ? true : false, - goodsStateCheck: (answers.goodsStateCheck == 'Да') ? true : false, - autoIssue: (answers.autoIssue == 'Да') ? true : false, - autoResponse: (answers.autoResponse == 'Да') ? true : false, + goodsStateCheck: (answers.goodsStateCheck == 'Да') ? true : false, + autoIssue: (answers.autoIssue == 'Да') ? true : false, + autoResponse: (answers.autoResponse == 'Да') ? true : false } console.log(); return askSettings; } -export { updateFile, initStorage, load, loadSettings, logToFile, getConst }; \ No newline at end of file +export { updateFile, initStorage, load, loadSettings, logToFile, getConst, setConst, loadAutoIssueFile }; \ No newline at end of file diff --git a/src/telegram.js b/src/telegram.js new file mode 100644 index 0000000..af535db --- /dev/null +++ b/src/telegram.js @@ -0,0 +1,327 @@ +import c from 'chalk'; +import { Telegraf } from 'telegraf'; +import { Keyboard } from 'telegram-keyboard'; +import { setConst, load, updateFile, getConst } from './storage.js'; +import { log } from './log.js'; + +class TelegramBot { + constructor(token) { + this.bot = new Telegraf(token); + + process.once('SIGINT', () => this.bot.stop('SIGINT')); + process.once('SIGTERM', () => this.bot.stop('SIGTERM')); + } + + async run() { + this.setupListeners(); + await this.setupBot(); + + this.bot.launch(); + log(`Управление через telegram бота ${c.yellowBright(this.botInfo.username)} успешно запущено.`, 'g'); + } + + async setupBot() { + this.botInfo = await this.bot.telegram.getMe(); + this.bot.options.username = this.botInfo.username; + + this.mainKeyboard = this.getMainKeyboard(); + this.editGoodsKeyboard = this.getEditGoodsKeyboard(); + this.selectIssueTypeKeyboard = this.getSelectIssueTypeKeyboard(); + this.backKeyboard = this.getBackKeyboard(); + + this.waitingForLotDelete = true; + this.waitingForLotName = false; + this.waitingForLotContent = false; + this.lotType = ''; + this.lotName = ''; + this.lotContent = ''; + this.products = []; + } + + setupListeners() { + this.bot.on('text', (ctx) => this.onMessage(ctx)); + this.bot.on('inline_query', (ctx) => this.onInlineQuery(ctx)); + } + + async onMessage(ctx) { + try { + const msg = ctx.update.message.text; + + if(!this.isUserAuthed(ctx) && msg == global.settings.token) { + setConst('telegramUserName', ctx.update.message.from.username); + ctx.reply('Оп, всё, я взломал тебя 😈! Да ладно, шучу 🙃. Теперь ты авторизован и можешь управлять ботом.', this.mainKeyboard.reply()); + return; + } + + if(!this.isUserAuthed(ctx)) { + ctx.reply('Привет! 😄 Похоже, ты пишешь мне впервые. Пришли мне golden_key, который ты вводил при настройке бота, чтобы начать работу 😀.'); + return; + } + + if(msg == '🔥 Статус 🔥') { + this.replyStatus(ctx); + return; + } + + if(msg == '🚀 Редактировать автовыдачу 🚀') { + this.editAutoIssue(ctx); + return; + } + + if(msg == '❔ Инфо ❔') { + this.getInfo(ctx); + return; + } + + if(msg == '☑️ Добавить товар ☑️') { + this.addProduct(ctx); + return; + } + + if(msg == '📛 Удалить товар 📛') { + this.removeProduct(ctx); + return; + } + + if(msg == 'Инструкция (выдача одного и того же текста)') { + this.lotType = 'instruction'; + this.addProductName(ctx); + return; + } + + if(msg == 'Аккауты (выдача разных текстов по очереди)') { + this.lotType = 'accounts'; + this.addProductName(ctx); + return; + } + + if(msg == '📄 Получить файл автовыдачи 📄') { + await this.getAutoIssueFile(ctx); + return; + } + + if(msg == '🔙 Назад 🔙') { + await this.back(ctx); + return; + } + + if(this.waitingForLotName) { + await this.saveLotName(ctx); + return; + } + + if(this.waitingForLotContent) { + await this.saveLotContent(ctx); + return; + } + + if(this.waitingForLotDelete) { + await this.deleteLot(ctx); + return; + } + + this.waitingForLotName = false; + this.waitingForLotContent = false; + this.waitingForLotDelete = false; + + ctx.reply('Меню', this.mainKeyboard.reply()); + } catch (err) { + log(`Ошибка при обработке telegram сообщения: ${err}`, 'r'); + ctx.reply(`Воу! Я словил ошибку... Хз как так получилось, но вот всё, что мне известно: ${err}`, this.mainKeyboard.reply()); + } + } + + isUserAuthed(ctx) { + if(global.settings.telegramUserName == ctx.update.message.from.username) return true; + return false; + } + + getMainKeyboard() { + const keyboard = Keyboard.make([ + ['🔥 Статус 🔥'], + ['🚀 Редактировать автовыдачу 🚀'], + ['❔ Инфо ❔'] + ]); + + return keyboard; + } + + getEditGoodsKeyboard() { + const keyboard = Keyboard.make([ + ['☑️ Добавить товар ☑️', '📛 Удалить товар 📛'], + ['📄 Получить файл автовыдачи 📄'], + ['🔙 Назад 🔙'] + ]); + + return keyboard; + } + + getSelectIssueTypeKeyboard() { + const keyboard = Keyboard.make([ + ['Инструкция (выдача одного и того же текста)'], + ['Аккауты (выдача разных текстов по очереди)'], + ['🔙 Назад 🔙'] + ]); + + return keyboard; + } + + getBackKeyboard() { + const keyboard = Keyboard.make([ + ['🔙 Назад 🔙'] + ]); + + return keyboard; + } + + async replyStatus(ctx) { + const time = new Date().getTime(); + const difference = time - global.startTime; + const workTime = new Date(difference).toISOString().slice(11, 19); + + const autoIssue = (global.settings.autoIssue) ? 'Вкл' : 'Выкл'; + const alwaysOnline = (global.settings.alwaysOnline) ? 'Вкл' : 'Выкл'; + const lotsRaise = (global.settings.lotsRaise) ? 'Вкл' : 'Выкл'; + const goodsStateCheck = (global.settings.goodsStateCheck) ? 'Вкл' : 'Выкл'; + const autoResponse = (global.settings.autoResponse) ? 'Вкл' : 'Выкл'; + + const msg = `🔥 Статус 🔥\n\n🔑 Аккаунт: ${global.appData.userName}\n🕒 Время работы: ${workTime}\n⏲ Всегда онлайн: ${alwaysOnline}\n👾 Автоответ: ${autoResponse}\n🚀 Автовыдача: ${autoIssue}\n🏆 Автоподнятие предложений: ${lotsRaise}\n🔨 Автовосстановление предложений: ${goodsStateCheck}\n\n${global.settings.telegramUserName}`; + ctx.replyWithHTML(msg, this.mainKeyboard.reply()); + } + + async editAutoIssue(ctx) { + const goods = await load('data/autoIssueGoods.json'); + if(!goods) return; + let goodsStr = ''; + + for(let i = 0; i < goods.length; i++) { + goodsStr += `[${i + 1}] ${goods[i].name}\n`; + } + + let msg = `📄 Список товаров 📄\n\n${goodsStr}`; + ctx.replyWithHTML(msg, this.editGoodsKeyboard.reply()); + } + + getInfo(ctx) { + const msg = `❔ FunPayServer ❔\n\nFunPayServer - это бот для площадки funpay.com с открытым исходным кодом, разработанный NightStranger.\n\nБольшое спасибо всем, кто поддерживает данный проект ❤️. Он живёт благодаря вам.\n\nGitHub | Поддержать проект`; + ctx.replyWithHTML(msg); + } + + addProduct(ctx) { + ctx.replyWithHTML(`Выбери тип предложения`, this.selectIssueTypeKeyboard.reply()); + } + + addProductName(ctx) { + ctx.replyWithHTML(`Окей, отправь мне название предложения. Можешь просто скопирвать его из funpay. Эмодзи в названии поддерживаются.`); + this.waitingForLotName = true; + } + + removeProduct(ctx) { + ctx.replyWithHTML(`Введи номер товара, который нужно удалить из списка автовыдачи.`); + this.waitingForLotDelete = true; + } + + async back(ctx) { + this.waitingForLotName = false; + this.waitingForLotContent = false; + this.waitingForLotDelete = false; + + if(this.products.length > 0) { + let goods = await load('data/autoIssueGoods.json'); + + const product = { + "name": this.lotName, + "nodes": this.products + } + + goods.push(product); + await updateFile(goods, 'data/autoIssueGoods.json'); + this.products = []; + } + + ctx.reply('Меню', this.mainKeyboard.reply()); + } + + async saveLotName(ctx) { + const msg = ctx.update.message.text; + + this.waitingForLotName = false; + this.lotName = msg; + + let replyMessage = 'Понял-принял. Теперь отправь мне сообщение, которое будет выдано покупателю после оплаты.'; + if(this.lotType == 'accounts') { + replyMessage = 'Понял-принял. Теперь отправь мне сообщение, которое будет выдано покупателю после оплаты. Ты можешь отправить несколько сообщений. Каждое сообщение будет выдано после каждой покупки. Нажми "🔙 Назад 🔙" когда закончишь заполнять товар.'; + } + + ctx.reply(replyMessage, this.backKeyboard.reply()); + this.waitingForLotContent = true; + } + + async saveLotContent(ctx) { + const msg = ctx.update.message.text; + + this.lotContent = msg; + let keyboard = this.backKeyboard; + let goods = await load('data/autoIssueGoods.json'); + + if(this.lotType != 'accounts') { + this.waitingForLotContent = false; + keyboard = this.mainKeyboard; + + const product = { + "name": this.lotName, + "message": this.lotContent + } + + goods.push(product); + await updateFile(goods, 'data/autoIssueGoods.json'); + + this.lotName = ''; + this.lotContent = ''; + } else { + keyboard = this.backKeyboard; + + this.products.push(msg); + } + + ctx.reply(`Окей, сохранил товар.`, keyboard.reply()); + } + + async deleteLot(ctx) { + const msg = ctx.update.message.text; + this.waitingForLotDelete = false; + + let num = Number(msg); + if(isNaN(num)) { + ctx.reply(`Что-то это не похоже на число... Верну тебя в меню.`, this.mainKeyboard.reply()); + return; + } + + let goods = await load('data/autoIssueGoods.json'); + if(num > goods.length || num < 0) { + ctx.reply(`Такого id нет в списке автовыдачи. Верну тебя в меню.`, this.mainKeyboard.reply()); + return; + } + + let name = goods[num - 1].name; + goods.splice(num - 1, 1); + await updateFile(goods, 'data/autoIssueGoods.json'); + + ctx.reply(`Ок, удалил товар "${name}" из списка автовыдачи.`, this.mainKeyboard.reply()); + } + + async getAutoIssueFile(ctx) { + let contents = await getConst('autoIssueFilePath'); + + ctx.replyWithDocument({ + source: contents, + filename: 'autoIssueGoods.json' + }).catch(function(error) { log(error); }) + } + + async onInlineQuery(ctx) { + console.log(ctx); + } +} + +export default TelegramBot; \ No newline at end of file