oira666_tg 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +17 -0
- package/.eslintignore:Zone.Identifier +0 -0
- package/.eslintrc.js +160 -0
- package/.eslintrc.js:Zone.Identifier +0 -0
- package/apply_middlewares.js +2 -0
- package/apply_middlewares_cron +0 -0
- package/apply_middlewares_cron.js +47 -0
- package/index.js +7 -3
- package/middleware/auth.js +7 -3
- package/middleware/message_info.js +1 -1
- package/middleware/translator.js +9 -0
- package/options.js +7 -7
- package/package.json +7 -1
- package/source/classes/MessageInfoManager.js +1 -1
- package/source/classes/WaitMessage.js +122 -0
- package/source/classes/WaitMessage.js:Zone.Identifier +0 -0
- package/utils/translator.js +21 -0
- package/utils/wait_messages.js +119 -0
package/.eslintignore
ADDED
|
File without changes
|
package/.eslintrc.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
extends: 'airbnb-base',
|
|
3
|
+
env: {
|
|
4
|
+
mocha: true,
|
|
5
|
+
node: true,
|
|
6
|
+
es2020: true,
|
|
7
|
+
},
|
|
8
|
+
parserOptions: {
|
|
9
|
+
ecmaVersion: 2020,
|
|
10
|
+
sourceType: 'module',
|
|
11
|
+
},
|
|
12
|
+
rules: {
|
|
13
|
+
'accessor-pairs': 'error',
|
|
14
|
+
'arrow-parens': ['error', 'as-needed', { requireForBlockBody: true }],
|
|
15
|
+
'arrow-spacing': ['error', { before: true, after: true }],
|
|
16
|
+
'brace-style': ['error', 'stroustrup', { allowSingleLine: true }], // !!! 'brace-style': ['error', '1tbs', { 'allowSingleLine': true }]
|
|
17
|
+
camelcase: 'off', // !!! +++
|
|
18
|
+
'class-methods-use-this': 'off',
|
|
19
|
+
'comma-dangle': ['warn', {
|
|
20
|
+
arrays: 'always-multiline',
|
|
21
|
+
objects: 'always-multiline',
|
|
22
|
+
imports: 'always-multiline',
|
|
23
|
+
exports: 'always-multiline',
|
|
24
|
+
functions: 'never',
|
|
25
|
+
}],
|
|
26
|
+
'comma-spacing': ['error', { before: false, after: true }],
|
|
27
|
+
'comma-style': ['warn', 'last'], // !!! 'comma-style': ['error', 'last'],
|
|
28
|
+
'constructor-super': 'error',
|
|
29
|
+
curly: ['error', 'multi-line'],
|
|
30
|
+
'dot-location': ['error', 'property'],
|
|
31
|
+
'eol-last': 'error',
|
|
32
|
+
eqeqeq: ['warn', 'always', { null: 'ignore' }], // !!! 'eqeqeq': ['error', 'always', { 'null': 'ignore' }],
|
|
33
|
+
'func-call-spacing': ['error', 'never'],
|
|
34
|
+
'func-names': 'off', // +++ ['error', 'as-needed']
|
|
35
|
+
'generator-star-spacing': ['error', { before: true, after: true }],
|
|
36
|
+
'global-require': 'warn',
|
|
37
|
+
'guard-for-in': 'off',
|
|
38
|
+
'handle-callback-err': ['error', '^(err|error)$'],
|
|
39
|
+
'implicit-arrow-linebreak': 'off',
|
|
40
|
+
'import/prefer-default-export': 'off', // !!! +++
|
|
41
|
+
'import/extensions': 'off',
|
|
42
|
+
indent: ['error', 2, { SwitchCase: 1 }], // !!! +++
|
|
43
|
+
'linebreak-style': ['error', 'unix'], // !!! +++
|
|
44
|
+
'max-len': ['warn', { code: 180, ignoreComments: true, ignoreStrings: true }], // !!! +++
|
|
45
|
+
'new-cap': ['error', { newIsCap: true, capIsNew: false }],
|
|
46
|
+
'new-parens': 'error',
|
|
47
|
+
'no-array-constructor': 'error',
|
|
48
|
+
'no-await-in-loop': 'off',
|
|
49
|
+
'no-caller': 'error',
|
|
50
|
+
'no-class-assign': 'error',
|
|
51
|
+
'no-compare-neg-zero': 'error',
|
|
52
|
+
'no-const-assign': 'error',
|
|
53
|
+
'no-constant-condition': ['error', { checkLoops: false }],
|
|
54
|
+
'no-continue': 'off',
|
|
55
|
+
'no-control-regex': 'error',
|
|
56
|
+
'no-debugger': 'error',
|
|
57
|
+
'no-delete-var': 'error',
|
|
58
|
+
'no-dupe-args': 'error',
|
|
59
|
+
'no-dupe-class-members': 'error',
|
|
60
|
+
'no-dupe-keys': 'error',
|
|
61
|
+
'no-duplicate-case': 'error',
|
|
62
|
+
'no-empty-character-class': 'error',
|
|
63
|
+
'no-empty-pattern': 'error',
|
|
64
|
+
'no-eval': 'error',
|
|
65
|
+
'no-ex-assign': 'error',
|
|
66
|
+
'no-extend-native': 'error',
|
|
67
|
+
'no-extra-bind': 'error',
|
|
68
|
+
'no-extra-boolean-cast': 'error',
|
|
69
|
+
'no-extra-parens': ['error', 'functions'],
|
|
70
|
+
'no-fallthrough': 'error',
|
|
71
|
+
'no-floating-decimal': 'error',
|
|
72
|
+
'no-func-assign': 'error',
|
|
73
|
+
'no-global-assign': 'error',
|
|
74
|
+
'no-implied-eval': 'error',
|
|
75
|
+
'no-inner-declarations': ['error', 'functions'],
|
|
76
|
+
'no-invalid-regexp': 'error',
|
|
77
|
+
'no-irregular-whitespace': 'error',
|
|
78
|
+
'no-iterator': 'error',
|
|
79
|
+
'no-label-var': 'error',
|
|
80
|
+
'no-labels': ['error', { allowLoop: false, allowSwitch: false }],
|
|
81
|
+
'no-lone-blocks': 'error',
|
|
82
|
+
'no-loop-func': 'off',
|
|
83
|
+
'no-mixed-operators': ['error', {
|
|
84
|
+
groups: [
|
|
85
|
+
['==', '!=', '===', '!==', '>', '>=', '<', '<='],
|
|
86
|
+
['&&', '||'],
|
|
87
|
+
['in', 'instanceof'],
|
|
88
|
+
],
|
|
89
|
+
allowSamePrecedence: true,
|
|
90
|
+
}],
|
|
91
|
+
'no-mixed-spaces-and-tabs': 'error',
|
|
92
|
+
'no-multi-spaces': 'error',
|
|
93
|
+
'no-multi-str': 'error',
|
|
94
|
+
'no-multiple-empty-lines': ['error', { max: 2, maxEOF: 1 }], // !!! 'no-multiple-empty-lines': ['error', { 'max': 1, 'maxEOF': 0 }],
|
|
95
|
+
'no-negated-in-lhs': 'error',
|
|
96
|
+
'no-new': 'error',
|
|
97
|
+
'no-new-func': 'error',
|
|
98
|
+
'no-new-object': 'error',
|
|
99
|
+
'no-new-require': 'error',
|
|
100
|
+
'no-new-symbol': 'error',
|
|
101
|
+
'no-new-wrappers': 'error',
|
|
102
|
+
'no-obj-calls': 'error',
|
|
103
|
+
'no-octal': 'error',
|
|
104
|
+
'no-octal-escape': 'error',
|
|
105
|
+
'no-param-reassign': 'warn',
|
|
106
|
+
'no-path-concat': 'error',
|
|
107
|
+
'no-plusplus': ['error', { allowForLoopAfterthoughts: true }],
|
|
108
|
+
'no-proto': 'error',
|
|
109
|
+
'no-redeclare': 'error',
|
|
110
|
+
'no-regex-spaces': 'error',
|
|
111
|
+
'no-restricted-globals': ['warn', 'event', 'fdescribe'],
|
|
112
|
+
'no-restricted-syntax': 'off',
|
|
113
|
+
'no-return-assign': ['error', 'except-parens'],
|
|
114
|
+
'no-return-await': 'error',
|
|
115
|
+
'no-self-assign': 'error',
|
|
116
|
+
'no-self-compare': 'error',
|
|
117
|
+
'no-sequences': 'error',
|
|
118
|
+
'no-shadow': 'warn', // !!! +++
|
|
119
|
+
'no-shadow-restricted-names': 'error',
|
|
120
|
+
'no-sparse-arrays': 'error',
|
|
121
|
+
'no-tabs': 'error',
|
|
122
|
+
'no-template-curly-in-string': 'error',
|
|
123
|
+
'no-this-before-super': 'error',
|
|
124
|
+
'no-throw-literal': 'error',
|
|
125
|
+
'no-trailing-spaces': ['error', { ignoreComments: true }], // !!! +++
|
|
126
|
+
'no-undef': 'error',
|
|
127
|
+
'no-undef-init': 'error',
|
|
128
|
+
'no-underscore-dangle': 'off', // !!! +++
|
|
129
|
+
'no-unexpected-multiline': 'error',
|
|
130
|
+
'no-unmodified-loop-condition': 'error',
|
|
131
|
+
'no-unneeded-ternary': ['error', { defaultAssignment: false }],
|
|
132
|
+
'no-unreachable': 'error',
|
|
133
|
+
'no-unsafe-finally': 'error',
|
|
134
|
+
'no-unsafe-negation': 'error',
|
|
135
|
+
'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true, allowTaggedTemplates: true }],
|
|
136
|
+
'no-unused-vars': ['error', { vars: 'all', args: 'none', ignoreRestSiblings: true }],
|
|
137
|
+
'no-use-before-define': ['error', { functions: false, classes: false, variables: false }],
|
|
138
|
+
'no-useless-call': 'error',
|
|
139
|
+
'no-useless-computed-key': 'error',
|
|
140
|
+
'no-useless-constructor': 'error',
|
|
141
|
+
'no-useless-escape': 'error',
|
|
142
|
+
'no-useless-rename': 'error',
|
|
143
|
+
'no-useless-return': 'error',
|
|
144
|
+
'no-whitespace-before-property': 'error',
|
|
145
|
+
'no-with': 'error',
|
|
146
|
+
'object-curly-newline': ['error', { multiline: true }], // !!! +++
|
|
147
|
+
'object-curly-spacing': ['error', 'always'], // !!! +++
|
|
148
|
+
'object-property-newline': ['error', { allowMultiplePropertiesPerLine: true }],
|
|
149
|
+
'object-shorthand': 'error',
|
|
150
|
+
'prefer-const': 'warn',
|
|
151
|
+
// 'operator-linebreak': ['error', 'after', { 'overrides': { '?': 'before', ':': 'before' } }],
|
|
152
|
+
'prefer-rest-params': 'error', // !!! +++
|
|
153
|
+
'require-jsdoc': 'off', // !!! +++
|
|
154
|
+
// 'semi': ['off', 'always'], // !!! +++
|
|
155
|
+
'valid-jsdoc': 'off', // !!! +++
|
|
156
|
+
'one-var': 'off', // !!! +++
|
|
157
|
+
'one-var-declaration-per-line': ['error', 'initializations'], //+++
|
|
158
|
+
'no-console': ['warn', { allow: ['log', 'warn', 'error'] }], //+++
|
|
159
|
+
},
|
|
160
|
+
};
|
|
File without changes
|
package/apply_middlewares.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const session = require('./middleware/session');
|
|
2
2
|
const message_info = require('./middleware/message_info');
|
|
3
3
|
const auth = require('./middleware/auth');
|
|
4
|
+
const translator = require('./middleware/translator');
|
|
4
5
|
|
|
5
6
|
const keyboard = require('./middleware/keyboard');
|
|
6
7
|
const {
|
|
@@ -26,6 +27,7 @@ const apply_middlewares = (bot, options) => {
|
|
|
26
27
|
bot.use(session);
|
|
27
28
|
bot.use(auth);
|
|
28
29
|
bot.use(keyboard);
|
|
30
|
+
bot.use(translator);
|
|
29
31
|
|
|
30
32
|
// Порядок имеет значение
|
|
31
33
|
// Применяется только первый найденный обработчик,
|
|
File without changes
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const translator = require('./middleware/translator');
|
|
2
|
+
const session = require('./middleware/session');
|
|
3
|
+
const auth = require('./middleware/auth');
|
|
4
|
+
const message_info = require('./middleware/message_info');
|
|
5
|
+
const keyboard = require('./middleware/keyboard');
|
|
6
|
+
|
|
7
|
+
const { error_handler } = require('./middleware/error_handler');
|
|
8
|
+
|
|
9
|
+
const apply_middlewares_cron = async (bot, callback, from_id, chat_id) => {
|
|
10
|
+
const ctx = {};
|
|
11
|
+
ctx.project_section = 'cron';
|
|
12
|
+
|
|
13
|
+
if (from_id) ctx.from = { id: from_id };
|
|
14
|
+
if (chat_id) ctx.chat = { id: chat_id };
|
|
15
|
+
if (from_id && !chat_id) ctx.chat = { id: from_id };
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
ctx.telegram = bot.telegram;
|
|
19
|
+
ctx.session = {};
|
|
20
|
+
|
|
21
|
+
const middlewares = [
|
|
22
|
+
session,
|
|
23
|
+
auth,
|
|
24
|
+
keyboard,
|
|
25
|
+
translator,
|
|
26
|
+
message_info,
|
|
27
|
+
callback,
|
|
28
|
+
];
|
|
29
|
+
await _run_middlewares(ctx, middlewares);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
error_handler(err, ctx);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return ctx;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const _run_middlewares = async (ctx, middlewares, index = 0) => {
|
|
39
|
+
const next = async () => {
|
|
40
|
+
if (!middlewares[index + 1]) return;
|
|
41
|
+
await _run_middlewares(ctx, middlewares, index + 1);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
await middlewares[index](ctx, next);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
module.exports.apply_middlewares_cron = apply_middlewares_cron;
|
package/index.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
const { apply_middlewares } = require('./apply_middlewares');
|
|
2
|
+
const { apply_middlewares_cron } = require('./apply_middlewares_cron');
|
|
2
3
|
const { redirect_handler, apply_handler_to_cron_task } = require('./middleware/apply_handler');
|
|
3
4
|
const { find_in_handlers } = require('./utils/find_in_handlers');
|
|
4
5
|
const { send_empty_message } = require('./utils/send_empty_message');
|
|
5
6
|
const { error_handler, notifyAdmins, error_403_handler, sendErrorToUser } = require('./middleware/error_handler');
|
|
6
7
|
|
|
7
|
-
const { TelegramSession } = require('
|
|
8
|
-
const { User } = require('
|
|
9
|
-
const { MessageInfoManager } = require('
|
|
8
|
+
const { TelegramSession } = require('./source/classes/TelegramSession');
|
|
9
|
+
const { User } = require('./source/classes/User');
|
|
10
|
+
const { MessageInfoManager } = require('./source/classes/MessageInfoManager');
|
|
11
|
+
const { WaitMessage } = require('./source/classes/WaitMessage');
|
|
10
12
|
|
|
11
13
|
// apply middlwares
|
|
12
14
|
module.exports.apply_middlewares = apply_middlewares;
|
|
15
|
+
module.exports.apply_middlewares_cron = apply_middlewares_cron;
|
|
13
16
|
|
|
14
17
|
// handle handlers
|
|
15
18
|
module.exports.redirect_handler = redirect_handler;
|
|
@@ -27,3 +30,4 @@ module.exports.sendErrorToUser = sendErrorToUser;
|
|
|
27
30
|
module.exports.TelegramSession = TelegramSession;
|
|
28
31
|
module.exports.User = User;
|
|
29
32
|
module.exports.MessageInfoManager = MessageInfoManager;
|
|
33
|
+
module.exports.WaitMessage = WaitMessage;
|
package/middleware/auth.js
CHANGED
|
@@ -8,15 +8,19 @@ module.exports = async (ctx, next) => {
|
|
|
8
8
|
}
|
|
9
9
|
const user = new User(ctx.from.id);
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
if (ctx.project_section !== 'cron') {
|
|
12
|
+
await user.update(ctx.from, { isTelegtramUserObject: true });
|
|
13
|
+
}
|
|
12
14
|
await user.load();
|
|
13
15
|
|
|
14
16
|
if (!user.id) {
|
|
15
17
|
await user.insert(ctx.from);
|
|
16
18
|
}
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
if (ctx.project_section !== 'cron') {
|
|
21
|
+
await user.updateChats(ctx.from?.id, ctx.chat?.id);
|
|
22
|
+
}
|
|
19
23
|
|
|
20
24
|
ctx.user = user;
|
|
21
25
|
await next();
|
|
22
|
-
}
|
|
26
|
+
};
|
package/options.js
CHANGED
|
@@ -18,17 +18,17 @@ const _options = { ..._default_options };
|
|
|
18
18
|
const set_options = (options = {}) => {
|
|
19
19
|
const errors = [];
|
|
20
20
|
|
|
21
|
-
for (
|
|
22
|
-
|
|
21
|
+
for (const key in _default_options) {
|
|
22
|
+
if (options[key] !== undefined) {
|
|
23
23
|
_options[key] = options[key];
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
26
|
_options[key] = _default_options[key];
|
|
27
|
-
|
|
27
|
+
}
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
if (_options[key] === 'required') {
|
|
30
30
|
errors.push(`Option ${key} is required`);
|
|
31
|
-
|
|
31
|
+
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
if (errors.length) throw new Error(errors.join('\n'));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oira666_tg",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "tg framework for oira666",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -11,5 +11,11 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"lodash": "^4.17.21",
|
|
13
13
|
"moment": "^2.30.1"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"eslint": "^8.57.0",
|
|
17
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
|
18
|
+
"eslint-plugin-import": "^2.29.1",
|
|
19
|
+
"nodemon": "^3.1.0"
|
|
14
20
|
}
|
|
15
21
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const { error_handler } = require('../../middleware/error_handler');
|
|
2
|
+
const { getWaitMessage, getWaitMessagesCount } = require('../../utils/wait_messages');
|
|
3
|
+
|
|
4
|
+
const TIMEOUT = 3000;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* const wait = new WaitMessage(ctx);
|
|
8
|
+
* await wait.send(text[optional]);
|
|
9
|
+
* Отправляет сообщение о ожидании с текстом "Немного терпения..." по-умолчаию
|
|
10
|
+
* Каждые TIMEOUT секнуд меняет сообщение на рандомное сообщение об ожидании
|
|
11
|
+
*
|
|
12
|
+
* await wait.remove();
|
|
13
|
+
* Удаляет сообщение и очищает таймер
|
|
14
|
+
*
|
|
15
|
+
* wait.clear();
|
|
16
|
+
* очищает таймер без удаления
|
|
17
|
+
*/
|
|
18
|
+
class WaitMessage {
|
|
19
|
+
constructor(ctx) {
|
|
20
|
+
this.ctx = ctx;
|
|
21
|
+
this.message = null;
|
|
22
|
+
this.timerId = null;
|
|
23
|
+
this.messageIndex = 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async send(text) {
|
|
27
|
+
const { ctx } = this;
|
|
28
|
+
const _refresh_wait_message = this._refresh_wait_message.bind(this);
|
|
29
|
+
|
|
30
|
+
if (ctx.chat?.id) {
|
|
31
|
+
this.message = await ctx.telegram.sendMessage(
|
|
32
|
+
ctx.chat.id,
|
|
33
|
+
text || getWaitMessage(),
|
|
34
|
+
{ parse_mode: 'HTML' }
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
else if (ctx.inlineMessageId) {
|
|
38
|
+
this.message = await ctx.telegram.editMessageText(
|
|
39
|
+
undefined,
|
|
40
|
+
undefined,
|
|
41
|
+
ctx.inlineMessageId,
|
|
42
|
+
text || getWaitMessage(),
|
|
43
|
+
{ parse_mode: 'HTML' }
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
this.timerId = setTimeout(_refresh_wait_message, TIMEOUT);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async _refresh_wait_message() {
|
|
52
|
+
const { ctx, message } = this;
|
|
53
|
+
const _refresh_wait_message = this._refresh_wait_message.bind(this);
|
|
54
|
+
const _randomIndex = this._randomIndex.bind(this);
|
|
55
|
+
const stop = this.stop.bind(this);
|
|
56
|
+
try {
|
|
57
|
+
if (!message?.message_id && !ctx.inlineMessageId) {
|
|
58
|
+
stop();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (ctx.chat?.id) {
|
|
63
|
+
await ctx.telegram.editMessageText(
|
|
64
|
+
ctx.chat.id,
|
|
65
|
+
message.message_id,
|
|
66
|
+
undefined,
|
|
67
|
+
getWaitMessage(_randomIndex()),
|
|
68
|
+
{ parse_mode: 'HTML' }
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
else if (ctx.inlineMessageId) {
|
|
72
|
+
await ctx.telegram.editMessageText(
|
|
73
|
+
undefined,
|
|
74
|
+
undefined,
|
|
75
|
+
ctx.inlineMessageId,
|
|
76
|
+
getWaitMessage(_randomIndex()),
|
|
77
|
+
{ parse_mode: 'HTML' }
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this.timerId = setTimeout(_refresh_wait_message, TIMEOUT);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
stop();
|
|
85
|
+
error_handler(err, ctx, true);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
stop() {
|
|
90
|
+
if (!this.timerId) return;
|
|
91
|
+
clearTimeout(this.timerId);
|
|
92
|
+
this.timerId = null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async remove() {
|
|
96
|
+
const { ctx, message } = this;
|
|
97
|
+
const stop = this.stop.bind(this);
|
|
98
|
+
stop();
|
|
99
|
+
|
|
100
|
+
if (!message?.message_id || !ctx.chat?.id) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
await ctx.telegram.deleteMessage(
|
|
105
|
+
ctx.chat.id,
|
|
106
|
+
message.message_id
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
_randomIndex() {
|
|
111
|
+
const { ctx, messageIndex } = this;
|
|
112
|
+
const length = getWaitMessagesCount();
|
|
113
|
+
const _r = Math.floor(Math.random() * length);
|
|
114
|
+
if (_r === messageIndex) {
|
|
115
|
+
return this._randomIndex();
|
|
116
|
+
}
|
|
117
|
+
this.messageIndex = _r;
|
|
118
|
+
return _r;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
module.exports.WaitMessage = WaitMessage;
|
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Hypothetical translate function
|
|
2
|
+
// You need to replace this with your actual translation function or library
|
|
3
|
+
const translate = (lang, text) => {
|
|
4
|
+
// Implement translation logic here
|
|
5
|
+
return text;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const createTranslator = (ctx, lang = 'en') => {
|
|
9
|
+
const t = (strings, ...values) => {
|
|
10
|
+
let result = '';
|
|
11
|
+
for (let i = 0; i < strings.length; i++) {
|
|
12
|
+
result += translate(lang, strings[i]) + (values[i] || '');
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// Store the translator in the context
|
|
18
|
+
ctx.t = t;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
module.exports.createTranslator = createTranslator;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const _wait_messages = [
|
|
2
|
+
'Немного терпения...',
|
|
3
|
+
'Твой запрос обрабатывается... и да, я тоже предпочитаю кофе!',
|
|
4
|
+
'Настройка сверхсекретного спутника для получения твоего ответа...',
|
|
5
|
+
'Обрабатываем... Может, пора для очередного кофе-брейка?',
|
|
6
|
+
'Твой запрос в очереди. Перед тобой только пара космических кораблей!',
|
|
7
|
+
'Использую квантовый компьютер... только не скажи никому!',
|
|
8
|
+
'Твой запрос на конфиденциальной встрече с нашими лучшими умами...',
|
|
9
|
+
'Анализирую... Надеюсь, ты не против немного искусственного интеллекта?',
|
|
10
|
+
'Твой запрос в процессе. Держу пари, мой процессор быстрее твоего!',
|
|
11
|
+
'Делаю всё возможное, чтобы найти ответ. И даже невозможное!',
|
|
12
|
+
'Обрабатываю запрос, пока мой кофе не остыл...',
|
|
13
|
+
'Твой запрос в погоне за последними данными. Не могли бы они не бегать так быстро?',
|
|
14
|
+
'Связываюсь с секретным агентом для получения ответа... Шучу, это просто сервер!',
|
|
15
|
+
'Расшифровываю коды... и нет, это не шпионский детектив!',
|
|
16
|
+
'Проверяю данные. Кстати, а ты проверил свою почту?',
|
|
17
|
+
'Твой запрос на кратком кофе-брейке, сейчас вернется...',
|
|
18
|
+
'Исследую космические базы данных. Нет, не те, что в космосе!',
|
|
19
|
+
'Обрабатываю... Может, устроим соревнование: кто быстрее, я или пицца, которую ты заказал?',
|
|
20
|
+
'Ищу ответ в киберпространстве. Уверен, он где-то здесь...',
|
|
21
|
+
'Твой запрос в пути. Надеюсь, он не заблудился!',
|
|
22
|
+
'Подключаюсь к Интернету вещей, чтобы найти твой ответ. Кстати, твой холодильник просит добавить молока!',
|
|
23
|
+
'Твой запрос на секретной миссии. Цель: найти ответ как можно быстрее!',
|
|
24
|
+
'Обрабатываю запрос с помощью алгоритмов, которые даже я не полностью понимаю...',
|
|
25
|
+
'Ищу ответ... и пока что нашел только дополнительные вопросы!',
|
|
26
|
+
'Твой запрос на консультации с виртуальным помощником. Да, у меня тоже есть помощник!',
|
|
27
|
+
'Анализирую, но обещаю: без бумажной волокиты!',
|
|
28
|
+
'Твой запрос играет в квантовые шахматы, пока я ищу ответ...',
|
|
29
|
+
'Подключаюсь к альтернативным источникам. Нет, не к магии, к облачным серверам!',
|
|
30
|
+
'Ищу ответ... Хм, а ты уверен, что он не под диваном?',
|
|
31
|
+
'Обрабатываю запрос. Пожалуйста, не моргай, это может замедлить процесс!',
|
|
32
|
+
'Твой запрос встречается с главным сервером. Надеюсь, они поладят!',
|
|
33
|
+
'Работаю над твоим запросом. Пожалуйста, поддержи меня аплодисментами!',
|
|
34
|
+
'Ищу ответ в космических просторах интернета. Не волнуйся, я не потеряюсь!',
|
|
35
|
+
'Твой запрос на межгалактической конференции. Обещаю, он скоро вернется!',
|
|
36
|
+
'Обрабатываю... А ты знал, что компьютеры тоже любят шутки?',
|
|
37
|
+
'Твой запрос на тайной встрече с волшебниками данных. Да, у нас тут свои Гарри Поттеры!',
|
|
38
|
+
'Ожидай, я связываюсь с кибер-волшебниками для ускорения процесса!',
|
|
39
|
+
'Разгадываю загадки вселенной... Ну или хотя бы загадки твоего запроса!',
|
|
40
|
+
'Твой запрос на переговорах с архивными данными. Они такие строптивые!',
|
|
41
|
+
'Ищу ответ в забытых серверах. Надеюсь, они не забыли пароль...',
|
|
42
|
+
'Твой запрос на краткосрочном курорте. Подожди немного, скоро он вернется отдохнувшим!',
|
|
43
|
+
'Исследую алгоритмы. И нет, это не волшебные заклинания, хотя иногда похоже!',
|
|
44
|
+
'Твой запрос сейчас на бизнес-ланче с данными. Скоро вернется!',
|
|
45
|
+
'Обрабатываю... А знаешь, что мои байты тоже любят перекусить?',
|
|
46
|
+
'Твой запрос проходит стажировку в центре обработки данных. Учится быстро!',
|
|
47
|
+
'Исследую территорию Интернета. Надеюсь, там нет драконов...',
|
|
48
|
+
'Твой запрос на свидании с алгоритмом. Они так мило общаются!',
|
|
49
|
+
'Запускаю ракету ответов. Обратный отсчет начался!',
|
|
50
|
+
'Твой запрос на курсах повышения квалификации. Скоро станет умнее!',
|
|
51
|
+
'Анализирую данные... Как насчет небольшой паузы на чай?',
|
|
52
|
+
'Твой запрос сейчас в тренажерном зале, наращивает мощность!',
|
|
53
|
+
'Обрабатываю... Ты не видел моих виртуальных очков?',
|
|
54
|
+
'Твой запрос на уроке танцев с серверами. Они прекрасно ведут!',
|
|
55
|
+
'Проверяю информацию. А ты проверил погоду на завтра?',
|
|
56
|
+
'Твой запрос в поисках сокровищ в данных. Он скоро вернется с золотом!',
|
|
57
|
+
'Идет загрузка ответа... Надеюсь, у тебя еще есть попкорн!',
|
|
58
|
+
'Твой запрос в гонке с черепахами. Пока он впереди!',
|
|
59
|
+
'Обрабатываю... Кстати, а как твои дела?',
|
|
60
|
+
'Твой запрос сейчас в космической миссии. Обещаю, без пришельцев!',
|
|
61
|
+
'Ищу ответ среди звезд... Надеюсь, не заблудиться!',
|
|
62
|
+
'Твой запрос на важной бизнес-встрече. Он уже почти закончил!',
|
|
63
|
+
'Изучаю киберпространство. Нет, это не новый фильм фантастики!',
|
|
64
|
+
'Твой запрос на медитации, собирает мысли...',
|
|
65
|
+
'Разгадываю лабиринты серверов. Где же выход?',
|
|
66
|
+
'Твой запрос сейчас на шопинге. Ищет лучшие данные!',
|
|
67
|
+
'Обрабатываю... Не хочешь сыграть в крестики-нолики?',
|
|
68
|
+
'Твой запрос на квесте. Помогает ему старый мудрый архив!',
|
|
69
|
+
'Твой запрос решает головоломку. Как только соберет, так сразу придет!',
|
|
70
|
+
"Анализирую... Может, пока поиграем в 'угадай мелодию'?",
|
|
71
|
+
'Ищу ответ в галактической библиотеке. Там так много книг!',
|
|
72
|
+
'Твой запрос сейчас в спа-салоне данных. Отдыхает и собирается с мыслями!',
|
|
73
|
+
'Решаю кроссворды вместе с твоим запросом. Он уже почти готов!',
|
|
74
|
+
'Твой запрос на экскурсии по фабрике данных. Узнает много нового!',
|
|
75
|
+
'Обрабатываю... А ты слышал последние новости о киберпространстве?',
|
|
76
|
+
'Твой запрос в путешествии по цифровому миру. Скоро вернется с ответами!',
|
|
77
|
+
'Твой запрос на ужине с главным сервером. Обещали быстро поговорить!',
|
|
78
|
+
'Исследую просторы веба. Надеюсь, не заблудиться в виртуальных улочках!',
|
|
79
|
+
'Твой запрос на мастер-классе по обработке данных. Учится у лучших!',
|
|
80
|
+
'Обрабатываю... Интересно, а сервера тоже устают?',
|
|
81
|
+
'Твой запрос сейчас в библиотеке. Читает много умных книг!',
|
|
82
|
+
'Исследую лабиринты Интернета. О, вот интересный поворот!',
|
|
83
|
+
'Твой запрос на встрече с виртуальными умниками. Скоро вернется!',
|
|
84
|
+
'Проверяю данные. Ты проверил, закрыл ли дверь?',
|
|
85
|
+
'Твой запрос на концерте данных. Они играют симфонию ответов!',
|
|
86
|
+
'Обрабатываю... Не хочешь пока посчитать овец?',
|
|
87
|
+
'Твой запрос в гостях у старых дисков. Обмениваются опытом!',
|
|
88
|
+
'Ищу ответ в море информации. Надеюсь, не утону!',
|
|
89
|
+
'Твой запрос на собеседовании. Уверен, он произведет впечатление!',
|
|
90
|
+
'Разгадываю коды ответа. Это как детектив, только в киберпространстве!',
|
|
91
|
+
'Твой запрос в поисках затерянного сокровища ответов. Скоро найдет!',
|
|
92
|
+
'Обрабатываю... А знаешь, что компьютеры тоже мечтают?',
|
|
93
|
+
'Твой запрос на кофе-паузе с данными. Обсуждают последние новости!',
|
|
94
|
+
'Твой запрос на занятии йогой с данными. Готовится к новому вызову!',
|
|
95
|
+
'Твой запрос прогуливается по облачным серверам. Как только найдет ответ, вернется!',
|
|
96
|
+
'Твой запрос читает старинные манускрипты данных. Набирается мудрости!',
|
|
97
|
+
'Твой запрос на свидании с бигдатой. Они прекрасно ладят!',
|
|
98
|
+
'Твой запрос разгадывает коды с Шерлоком Сервером. Ответ будет скоро!',
|
|
99
|
+
'Твой запрос отправился на поиски цифрового сокровища. Обещаю, он скоро вернется!',
|
|
100
|
+
'Твой запрос проводит время с мудрым старым сервером. Получает важные знания!',
|
|
101
|
+
'Твой запрос сейчас исследует неизведанные уголки интернета. Будь уверен, он вернется с ответом!',
|
|
102
|
+
'Твой запрос наслаждается кибер-чаем с данными. Пожалуйста, подожди немного!',
|
|
103
|
+
'Твой запрос сейчас на виртуальной экскурсии. Скоро он вернется с полезной информацией!',
|
|
104
|
+
'Твой запрос изучает древние коды. Он почти разгадал загадку!',
|
|
105
|
+
'Твой запрос сейчас на важной встрече с базой данных. Он скоро вернется!',
|
|
106
|
+
'Твой запрос на обеде с цифровыми гуру. Обещаю, ответ будет скоро!',
|
|
107
|
+
'Твой запрос на тренировке с цифровыми экспертами. Скоро он вернется еще умнее!',
|
|
108
|
+
'Твой запрос сейчас учится у мастеров обработки данных. Подожди чуть-чуть!',
|
|
109
|
+
];
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
module.exports.getWaitMessagesCount = () => _wait_messages.length;
|
|
113
|
+
|
|
114
|
+
module.exports.getWaitMessage = (index) => {
|
|
115
|
+
if (index && _wait_messages[index]) {
|
|
116
|
+
return _wait_messages[index];
|
|
117
|
+
}
|
|
118
|
+
return _wait_messages[0];
|
|
119
|
+
};
|