-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
165 lines (142 loc) · 5.93 KB
/
index.js
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
163
164
165
const firebase = require('firebase-admin');
const Telegraf = require('telegraf');
const {Markup} = Telegraf;
const secrets = require(process.env.SECRET_FILE || './secrets.json');
const app = new Telegraf(secrets.telegram);
firebase.initializeApp({
credential: firebase.credential.cert(secrets.firebase),
databaseURL: 'https://piter-united-8b948.firebaseio.com',
});
let data = [];
let community = [];
let users = {};
const usersRef = firebase.database().ref('users');
usersRef.on('value', (snapshot) => {
users = snapshot.val() || {};
});
let votes = [];
const votesRef = firebase.database().ref('votes');
votesRef.on('value', (snapshot) => {
votes = snapshot.val() || [];
});
app.use((res, next) => {
const user = res.from;
if (!users[user.id]) {
firebase.database().ref(`users/${user.id}`).set(user);
res.user = user;
} else {
res.user = users[user.id];
}
next();
});
firebase.database().ref(`${secrets.table}/data`)
.on('value', (snapshot) => {
data = snapshot.val().filter(v => v);
community = data.map(v => v.community);
});
const mainReply = Markup.inlineKeyboard([
[Markup.callbackButton('Сообщества', 'community')],
[Markup.callbackButton('Схема размещения сообществ', 'schema')],
]).resize().extra();
function start(user, reply) {
const name = `${user.first_name} ${user.last_name}`;
const text = `Привет ${name}! Я бот IT Global MeetUp. Я могу поделиться с тобой программой сообществ.
А еще тут ты сможешь голосовать за доклады которые прослушал.
`;
return reply(text, mainReply);
}
app.command('start', ({user, reply}) => start(user, reply));
app.command('help', ({reply}) => reply('Всегда рад помочь!', mainReply));
app.hears('помощь', ({reply}) => reply('Всегда рад помочь!', mainReply));
app.hears('меню', ({reply, user}) => start(user, reply));
function communityList(reply) {
const menuItems = community.map((c, i) => [Markup.callbackButton(c, `community::${i}`)]);
const menu = Markup.inlineKeyboard(menuItems).resize().extra();
return reply('Сообщества', menu);
}
app.action('community', ({reply}) => communityList(reply));
app.hears('сообщества', ({reply}) => communityList(reply));
app.hears('программа', ({reply}) => communityList(reply));
app.action('schema', ({replyWithPhoto}) => replyWithPhoto('http://lorempixel.com/400/200/cats/'));
app.hears('схема размещения сообществ', ({replyWithPhoto}) => replyWithPhoto('http://lorempixel.com/400/200/cats/'));
app.hears('схема', ({replyWithPhoto}) => replyWithPhoto('http://lorempixel.com/400/200/cats/'));
function showCommunity(reply, id) {
if (!data[id]) {
return reply('Простите но такого сообщества у меня нет :(');
}
const c = data[id];
const menuItems = [];
c.program.forEach((s, i) => {
menuItems.push([Markup.callbackButton(`${s.time}${s.speaker ? ` - ${s.speaker}` : ''}${s.subject ? ` - ${s.subject}` : ''}`, `speaker::${id}::${i}`)]);
});
const menu = Markup.inlineKeyboard(menuItems).extra();
return reply(`*${c.community}*`, menu);
}
function showSpeaker(reply, id, sid) {
if (!data[id]) {
return reply('Простите но такого сообщества у меня нет :(');
}
const c = data[id];
if (!c.program[sid]) {
return reply('Простите но такого доклада у меня нет :(');
}
const s = c.program[sid];
// const menuItems = [
// Markup.callbackButton('💩', `vote::${id}::${sid}::1`),
// Markup.callbackButton('👎', `vote::${id}::${sid}::2`),
// Markup.callbackButton('👌', `vote::${id}::${sid}::3`),
// Markup.callbackButton('👍', `vote::${id}::${sid}::4`),
// Markup.callbackButton('❤️', `vote::${id}::${sid}::5`),
// ];
// const menu = Markup.inlineKeyboard(menuItems).extra();
return reply(`${s.time} - ${s.speaker} ${(s.company) ? `(${s.company})` : ''}${s.subject ? `\n*${s.subject}*\n` : ''}${s.description ? s.description : ''}`); // , menu);
}
function voteForSpeaker(reply, user, id, sid, vote) {
if (!data[id]) {
return reply('Простите но такого сообщества у меня нет :(');
}
const {program} = data[id];
if (!program[sid]) {
return reply('Простите но такого доклада у меня нет :(');
}
const {speaker} = program[sid];
const vId = `${id}::${sid}`;
if (user.votes && user.votes.find(v => v === vId)) {
return reply('Вы уже голосовали за данный доклад');
}
if (!user.votes) {
user.votes = [];
}
user.votes.push(vId);
votes.push({speaker, vote});
firebase.database().ref(`users/${user.id}`).set(user);
firebase.database().ref('votes').set(votes);
return reply('Спасибо за Ваш голос!');
}
app.action(/.+/, ({replyWithMarkdown, match, user}) => {
const [cmd, id, sid, vote] = match[0].split('::');
if (cmd === 'community') {
return showCommunity(replyWithMarkdown, id);
} else if (cmd === 'speaker') {
return showSpeaker(replyWithMarkdown, id, sid);
} else if (cmd === 'vote') {
return voteForSpeaker(replyWithMarkdown, user, id, sid, vote);
}
return replyWithMarkdown('Простите я не знаю данной команды :(');
});
app.command('ping', ({reply}) => reply('pong'));
app.command('status', ({reply}) => {
const speakers = [];
votes.forEach(({speaker, vote}) => {
let s = speakers.find(v => v.speaker === speaker);
if (s) {
s = Object.assign(s, {count: s.count + 1, vote: s.vote + vote});
} else {
speakers.push({speaker, count: 1, vote});
}
});
reply(`Всего пользователей: ${Object.keys(users).length}
Всего голосов: ${votes.length}
${votes.length ? speakers.map(v => `${v.speaker}: ${v.vote} (${v.count})\n`) : ''}`);
});
app.startPolling();