-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.js
More file actions
162 lines (146 loc) · 4.95 KB
/
Copy pathbot.js
File metadata and controls
162 lines (146 loc) · 4.95 KB
1
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
const { driver } = require('@rocket.chat/sdk');
const { TelegramBot } = require('node-telegram-bot-api');
require('dotenv').config();
const HOST = process.env.ROCKETCHAT_URL;
const USER = process.env.USER_NAME;
const PASS = process.env.USER_PASS;
const TOKEN = process.env.TELEGRAM_TOKEN;
const SSL = true;
const ROOM = '';
const MAX_ATTEMPTS = 10;
const LIFETIME = 5 * 60 * 1000;
const sessions = new Map();
let myId;
function genCode() {
return Math.floor(100000000000 + Math.random() * 900000000).toString();
}
function genTag() {
const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
return letters[Math.floor(Math.random() * 26)] + letters[Math.floor(Math.random() * 26)];
}
async function connRc() {
try {
await driver.connect({ host: HOST, useSsl: SSL });
myId = await driver.login({ username: USER, password: PASS });
return true;
} catch (e) {
return false;
}
}
async function sendRc(text, tag) {
if (!myId) {
const ok = await connRc();
if (!ok) throw new Error('нет связи с рокетом');
}
const msg = tag ? `[${tag}] ${text}` : text;
await driver.sendToRoom(msg, ROOM);
}
function getSess(chatId) {
const s = sessions.get(chatId);
if (!s) return null;
if (Date.now() - s.started > LIFETIME) {
s.status = 'expired';
sessions.set(chatId, s);
return s;
}
return s;
}
async function newSess(chatId) {
const code = genCode();
const tag = genTag();
const sess = {
code,
tag,
attempts: 0,
started: Date.now(),
status: 'waiting'
};
sessions.set(chatId, sess);
await sendRc('---');
await sendRc(code);
await sendRc('код работает до 5 минут и бот тг примет до 10 попыток', tag);
await sendRc('---');
return sess;
}
async function handleCode(chatId, text, bot) {
const s = getSess(chatId);
if (!s) {
await bot.sendMessage(chatId, 'нет активной сессии. /numbers для начала.');
return;
}
if (s.status === 'completed') {
await bot.sendMessage(chatId, 'ты уже подтвердил код, больше нельзя.');
return;
}
if (s.status === 'expired') {
await bot.sendMessage(chatId, 'время истекло. жми /numbers заново.');
return;
}
if (s.attempts >= MAX_ATTEMPTS) {
s.status = 'expired';
sessions.set(chatId, s);
await bot.sendMessage(chatId, 'все 10 попыток сожрал. /numbers для нового.');
return;
}
const input = text.trim();
if (input === s.code) {
s.status = 'completed';
sessions.set(chatId, s);
await bot.sendMessage(chatId, 'верный код! доступ подтверждён к... (пока не знаю к каким каналам, списочек от дорогих мортиботоводов не помешал бы)');
} else {
s.attempts += 1;
const rem = MAX_ATTEMPTS - s.attempts;
sessions.set(chatId, s);
if (rem > 0) {
await bot.sendMessage(chatId, `неверно, осталось ${rem} попыток.`);
} else {
s.status = 'expired';
sessions.set(chatId, s);
await bot.sendMessage(chatId, 'попытки кончились. /numbers для нового.');
}
}
}
const bot = new TelegramBot(TOKEN, { polling: true });
bot.onText(/\/numbers/, async (msg) => {
const chatId = msg.chat.id;
const existing = getSess(chatId);
if (existing && existing.status === 'completed') {
await bot.sendMessage(chatId, 'ты уже успешно верифицировался, больше нельзя.');
return;
}
if (existing && existing.status === 'waiting') {
await bot.sendMessage(chatId, 'у тебя уже активный код, введи его или подожди 5 минут.');
return;
}
try {
const sess = await newSess(chatId);
await bot.sendMessage(chatId, `код с тегом [${sess.tag}] улетел в рокет (комната ${ROOM}).\nу тебя 10 попыток и 5 минут, введи его сюда.`);
} catch (e) {
await bot.sendMessage(chatId, 'что-то с рокетом, попробуй позже или пиши в issues.');
}
});
bot.on('message', async (msg) => {
const chatId = msg.chat.id;
const text = msg.text;
if (!text || text.startsWith('/')) return;
const s = getSess(chatId);
if (!s || s.status !== 'waiting') return;
await handleCode(chatId, text, bot);
});
bot.onText(/\/cancel/, async (msg) => {
const chatId = msg.chat.id;
if (sessions.has(chatId)) {
sessions.delete(chatId);
await bot.sendMessage(chatId, 'сессия отменена.');
} else {
await bot.sendMessage(chatId, 'нет активной сессии.');
}
});
(async () => {
await connRc();
})();
process.on('SIGINT', () => {
driver.disconnect();
bot.stopPolling();
process.exit(0);
});