· 6 years ago · Jan 09, 2020, 12:34 PM
1let text = "Извините, но мы отключили неофициальные беседы. Подробнее тут -- https://vk.com/wall-184140850_195"
2const { VK, Keyboard } = require('vk-io')
3const low = require('lowdb')
4const FileSync = require('lowdb/adapters/FileSync');
5const adapter = new FileSync('db.json');
6const file = low(adapter);
7const request = require("request")
8
9key = 'a3eaeuakkae[a8Ya]8ae1a3}aJqaeuakja]aa]ea82aeaFeqYq6a8Fa64F88Y*jF*9Y&8aWkF&7'
10merchant_id = 170184521
11
12
13vkcoin = {
14 api: {
15 sendPayment: async function (to, amount){
16 request.post({
17 url: 'https://uc.simbrex.com/api/merchant/transfer.php',
18 method: 'POST',
19 form: {
20 merchant_id,
21 key,
22 to,
23 sum: amount,
24 code:228
25 }
26
27 })
28 },
29 getHistory: async function(){
30 await request({
31 method:"POST",
32 url:"https://uc.simbrex.com/api/merchant/getHistory.php",
33 form: {
34 merchant_id,
35 key,
36 count:10
37 }
38 }, (a, d, h) => {
39 try{ h = JSON.parse(h)
40 let db = file.get('logs').value()
41 if(h.history) h.history.forEach(s => {
42
43 if(s.id == 1 && !db.find(f => f.id == s.data[1] && s.time == f.time)){
44 console.log(s)
45 a = db.length
46 db = db.slice(a-50, a)
47 db.push({time: s.time, id: s.data[1]})
48 k({payload: s.code, amount: s['data'][0], from_id: s['data'][1]})
49 }
50 })
51 file.update('logs', l => l = db).write()
52 }catch(e){console.log("Праизашол эррор", e)}
53 })
54 }
55 }
56}
57
58function pp(){
59 setInterval(() => {
60 vkcoin.api.getHistory()
61 let date = +new Date()
62 let db = file.value()
63 if (Math.floor(date/1000/60/60/24)>db.sd.date){
64 db.sd.date = Math.floor(date/1000/60/60/24)
65 vk.api.messages.send({
66 peer_id: db.rooms.find(r => r.payload == 1).id,
67 message: "Итак, ставка дня сегодня: " + db.sd.amount + " UC, которую сделал @id"+db.sd.id+".\n\nНа баланс были отправлены 3% от ставки!"
68 })
69 vkcoin.api.sendPayment(db.sd.id, db.sd.amount/100*3)
70 db.sd = {
71 id:0,
72 amount:0,
73 date: date/1000/60/60/24
74 }
75 file.update(db).write()
76 }
77 }, 2000)
78}
79setTimeout(() => {
80 pp()
81 console.log(true)
82 }, 20000)
83
84
85
86file.defaults({
87 rooms: [],
88 admins: [540953148, 488640781],
89 logs:[],
90 sd:{
91 date:1,
92 id:0,
93 amount:0
94 }
95}).write()
96
97
98// Работа с VK API. Отправка сообщений в чаты.
99function send (chat_id, mes){
100 vk.api.messages.send({
101 peer_id: chat_id,
102 message: mes
103 })
104}
105let adminMode = false
106
107// Подключаем VK API
108const vk = new VK({
109 token: '3032fe3829f6dd915ddf779ef56bda913319d4110f8b8da50ec00e5defdedaf8db2b4965cb46866ee9f8a',
110 apiMode: 'parallel',
111 pollingGroupId: 170184521
112})
113
114vk.updates.startPolling();
115vk.updates.on('message', async(context, next) => {
116 let message = context.text
117 user = context.senderId
118 console.log(message)
119 if (!message) return;
120 let db = file.value()
121
122 if(adminMode && user != db.admins[0] ) return;
123
124 // Если сообщение из беседы
125 if (context.peerType == "chat") {
126 if (message.startsWith("!reg")){
127 let owner = await vk.api.messages.getConversationMembers({peer_id: context.peerId})
128 owner = owner.items.find(o => o.is_owner).member_id
129 if( owner != user && !db.admins.includes(user)) return;
130 if ( !db.rooms.find(room => room.id == context.peerId) ){
131 let arg = message.split(/ +/g)[1]
132 let payload
133 try{
134 payload = db.rooms.reverse()[0].payload
135 } catch(e) {
136 payload = 0
137 }
138 db.rooms.push({
139 id: context.peerId,
140 game: 1,
141 type: arg,
142 payload: payload+1,
143 players: [],
144 min: 0.1,
145 max: 100000,
146 timer: 1000*60,
147 cash_timer:1000*60,
148 num: 1,
149 bonus: 0,
150 mega:0
151 })
152 context.send("Комната зарегистрирована! Вот ссылка для пополнения:\nvk.com/app7037638#pay_"+merchant_id+"_0_"+(payload+1))
153 } else {
154 context.send("Ошибка! Данная комната уже зарегистрирована!")
155 }
156 }
157 if (!db.rooms.find(room => room.id == context.peerId)) return;
158
159 if (db.rooms.find(room => room.id == context.peerId).bl) return;
160 if(!db.users) db.users = [];
161 if (!db.users.find(u => u.id == user)){
162 db.users.push({
163 id: user,
164 games: 0,
165 win: 0,
166 dep: 0
167 })
168 }
169 if (message == "!bl") {
170 if (db.admins.includes(context.senderId)){
171 db.rooms.find(r => r.id == context.peerId).bl = true
172 }
173 }
174 if (message == "!run"){
175 context.send({
176 message: "Клавиатура открыта",
177 keyboard: Keyboard.keyboard([ [ Keyboard.textButton({
178 label: "? Банк",
179 color: Keyboard.PRIMARY_COLOR
180 }), Keyboard.textButton({
181 label: "? Внести",
182 color: Keyboard.POSITIVE_COLOR
183 }) ],
184 [Keyboard.textButton({
185 label: "? Профиль",
186 color: Keyboard.NEGATIVE_COLOR
187 }),
188 Keyboard.textButton({
189 label: "? Ставка дня"
190 }) ] ])
191 })
192 } else if (message.includes("? Внести") ){
193 context.send("|?| Ссылка для перевода: vk.com/app7037638#pay_"+merchant_id+"_0_"+db.rooms.find(room => room.id == context.peerId).payload+"\n|⚠| Минимальная сумма пополнения " + db.rooms.find(r => r.id == context.peerId).min +" UniCoins\n" + (db.rooms.find(r => r.id == context.peerId).max < 100000 ? "Максимальная сумма ставок не больше " + db.rooms.find(r => r.id == context.peerId).max + " UniCoins" : "") )
194 } else if (message.includes("? Профиль")){
195 let userName = await vk.api.users.get({
196 user_ids: user
197 })
198 userName = userName[0].first_name + " " + userName[0].last_name
199 let toSend = "|?| " + userName + "\n"
200 let dbu = db.users.find(u => u.id == user)
201 toSend += "|⌚| Игр сыграно: " + dbu.games + "\n"
202 toSend += "|?| Всего поставлено: " + dbu.dep + "\n"
203 toSend += "|?| Выиграно: " + dbu.win
204 context.send(toSend)
205 } else if (message.includes("? Ставка дня")){
206 function time(t){
207 let tt = (db.sd.date+1)*24*1000*60*60 - t
208 if (tt > 1000*60*60) return Math.floor(tt/1000/60/60) + " ч."
209 else if (tt > 1000*60) return Math.floor(tt/1000/60) + " мин"
210 else return Math.floor(tt/1000) + " сек"
211 }
212 context.send("Пока ставка дня принадлежит https://vk.com/id" + db.sd.id + "\nОна составляет "+db.sd.amount+" UC.\nЧерез "+time(+new Date()) + " ему будет отправлено 3% от ставки")
213 } else if (message.includes("? Банк")){
214 let total = 0
215 let names = []
216 let ids = []
217 let amounts = []
218 let amounts2 = []
219 let status = ""
220 let isC = 1
221 if (db.rooms.find(room => room.id == context.peerId).num%200 == 0){
222 status = "(МЕГА +"+ db.rooms.find(room => room.id == context.peerId).mega +" UniCoins"
223 } else if (db.rooms.find(room => room.id == context.peerId).num%10 == 0){
224 status = "(бонусный +"+ db.rooms.find(room => room.id == context.peerId).bonus +" UniCoins)"
225 } else {
226 status = "\nИгр до бонус-раунда: " + ( Math.ceil(db.rooms.find(room => room.id == context.peerId).num/10)*10 - db.rooms.find(room => room.id == context.peerId).num)+ "\nИгр до мега-раунда: " + (Math.ceil(db.rooms.find(room => room.id == context.peerId).num/200)*200 - db.rooms.find(room => room.id == context.peerId).num)
227 isC = 0
228 }
229 if(isC) isC = "|?| ";
230 else isC = "|⭕| ";
231 rom = db.rooms.find(r => r.id == context.peerId)
232 db.rooms.find(room => room.id == context.peerId).players.sort(function(n1, n2){
233 return n1.amount > n2.amount ? -1 : 1
234 }).forEach(p => {
235 total += p.amount
236 ids.push(p.id)
237 if(!rom.type.includes("invise")) amounts2.push( Math.floor(p.amount*1000)/1000 ); else amounts2.push("?");
238 amounts.push(Math.floor(p.amount*1000)/1000)
239 names.push(p.name)
240 })
241 let bank = Math.floor(1000*total)/1000
242 if (rom.type.includes("invise")) bank = "?";
243 let to_send = isC + "Раунд №" + db.rooms.find(r => r.id == context.peerId).num + " " + status + "\n|?| Сейчас в банке " + bank + " UC\n\n"
244 for (let i = 0; i < ids.length; i++){
245 let sh = (amounts[i]/total*100).toFixed(2)
246 if(db.rooms.find(r => r.id == context.peerId).type.includes("invise")) sh = "?"
247 to_send += names[i] + ": " + amounts2[i] + " UC (" + sh + "%)"
248 to_send += "\n"
249 }
250 let time = db.rooms.find(room => room.id == context.peerId).cash_timer
251
252 // Это костыль, в котором я сам путаюсь. Лучше не лезь сюда.
253 if (total == 0){
254 to_send = isC + "Раунд №" + db.rooms.find(r => r.id == context.peerId).num + ` ${status}` + "\n|?| Сейчас в банке 0 UC\n\n|❌| Пока переводов не было"
255 }
256 let min = Math.floor(time/1000/60)
257 let sec = (Math.floor(time/1000) - Math.floor(time/1000/60)*60 )
258 if(min<10) min = "0"+min;
259 if(sec<10) sec = "0"+sec
260 context.send(to_send + "\n\n|⌚| Осталось " + min + ":" + sec)
261
262 } else if (message == "!банк" ){
263 context.send("Банк для бонус-уровня составляет " + db.rooms.find(r => r.id == context.peerId).bonus+ "\nДля мега-уровня " + db.rooms.find(r => r.id == context.peerId).mega)
264 } else if (message == "!бонус"){
265 let u = db.users.find(uu => uu.id == user)
266
267 if (!u.bonus){
268 u.bonus = {
269 lastTime: 1,
270 games: 0
271 }
272 }
273 if (toDays( +new Date() ) == u.bonus.lastTime && u.bonus.games < 0) return context.send("Вы сегодня уже получили бонус");
274 if (u.bonus.lastTime < toDays( +new Date() )) u.bonus.games = 0;
275 if (u.bonus.games < 0) u.bonus.games = 0
276 if (u.bonus.lastTime < toDays( +new Date() ) || u.bonus.games < 4) return context.send("Что бы получить бонус от 1 до 5 UC, необходимо сыграть минимум 5 игры в официальной беседе. Вы не можете получить сегодня бонус, так как в официальной беседе сыграно " + u.bonus.games + "/4 игр");
277 u.bonus.lastTime = toDays(+new Date())
278 u.bonus.games = -100000
279 let rand = Math.floor(Math.random()*5+1)
280 vkcoin.api.sendPayment(user, rand)
281 context.send("Выдан бонус " + rand + " UC")
282 } else if (message == '!помощь'){
283 try {
284 await vk.api.messages.send({
285 peer_id: user,
286 message: "ОСНОВНЫЕ КОМАНДЫ\n\n!бонус\n получите ежедневный бонус от 1 до 50 UC\n!банк\n информация об объеме бонуса на бонус- и мега-раунды\n\n!КОМАНДЫ ДЛЯ НАСТРОЙКИ БОТА\n\n!reg\n команда для регистрации комнаты (что бы бот отвечал в Вашей беседе)\n!run\n запуск клавиатуры\n!min [arg]\n устанавливает минимальную ставку\n!settime N [room_type]\n устанавливает время N секунд для room_type. room_type — если не указан, то для обычных раундов; bonus; mega\n!time N\n устанавливает время для текущего раунда в N секунд\n!com N\n устанавливает % комиссии, который будет идти создателю беседы (следует учитывать 2% в мега раунды, 1% в бонус раунды, 2% создателю бота)\n!roomtype\n устанавливает тип комнаты"
287 })
288 context.send("Отправлено в личные сообщения")
289 } catch(e) {
290 context.send("Я не могу написать вам в личные сообщения. Либо у меня нет с вами диалога, либо выдан запрет на отправку сообщений")
291 }
292 } else {
293 let command = message.toLowerCase().split(/ +/)[0]
294 if (! ["!min", "!max", "!time", "!settime", "!com", "!help", "!roomtype"].includes(command)) return;
295 let owner = await vk.api.messages.getConversationMembers({peer_id: context.peerId})
296 owner = owner.items.find(u => u.is_owner).member_id
297 if (!db.admins.includes(context.senderId) && (owner != context.senderId)) return;
298 let args = message.toLowerCase().split(/ +/).slice(1)
299 let room = db.rooms.find(r => r.id == context.peerId)
300 function kek(){
301 return room.players.length > 0 ? false : true
302 }
303 if (command == "!settime"){
304 let type = "обычных раундов"
305 if (!itn(args[0], 0, 86400)) return context.send("Аргумент должен быть целым числом от 0 до 86400");
306 args[0] = Number(args[0])
307 if (!args[1]){
308 room.time = Math.floor(args[0])*1000
309 }
310 else if(args[1] == "bonus"){
311 room.bonusTime = Math.floor(args[0])*1000
312 type ="бонус раундов"
313 }else if(args[1] == "mega"){
314 room.megaTime = Math.floor(args[0])*1000
315 type = "мега раундов"
316 }else{
317 return context.send("Ошибка! Неверный аргумент <тип раунда>")
318 }
319 context.send("Время для " + type + " теперь " + Math.floor(args[0]) + " сек")
320 } else if (command == "!time") {
321 if (!kek()) return context.send("Изменение данного параметра возможно только тогда, когда нет ставок");
322 if (!itn(args[0], 0, 7200)) return context.send("Аргумент должен быть целым числом от 0 до 7200");
323 room.cash_timer = Math.floor(args[0])*1000
324 context.send("Завершение текущего раунда теперь через " + Math.floor(args[0]) + " сек")
325 } else if (command == "!com") {
326 if (!kek()) return context.send("Изменение данного параметра возможно только тогда, когда нет ставок");
327 if (!itn(args[0], 0, 7)) return context.send("Аргумент должен быть целым числом от 0 до 7");
328 room.com = Math.floor(args[0])/100
329 context.send("Теперь комиссия, которая отходит создателю беседы, равна " + Math.floor(args[0]) +", Так же стоит учитывать, что к этому надо прибавить 2%, отходящие в МЕГА-раунды, 1%, отходящий в бонус-раунды и 2%, отходящие создателю бота (итого " + (Math.floor(args[0]) + 5) + "%)")
330 } else if (command == "!min") {
331 if (!kek()) return context.send("Изменение данного параметра возможно только тогда, когда нет ставок");
332 if (!itn(Math.floor(args[0]*10), 1, 2000000)) return context.send("Аргумент должен быть числом от 0.1 до 200000");
333 room.max = Math.floor(args[0]*10)/10
334 context.send("Минимальный размер ставки теперь " + (Math.floor(args[0]*10)/10) + " UC")
335 } else if (command == "!max") {
336 if (!kek()) return context.send("Изменение данного параметра возможно только тогда, когда нет ставок");
337 if (!itn(Math.floor(args[0]*10), 1, 20000)) return context.send("Аргумент должен быть числом от 0.1 до 2000");
338 room.max = Math.floor(args[0]*10)/10
339 context.send("Минимальный размер ставки теперь " + (Math.floor(args[0]*10)/10) + " UC")
340 } else if (command == "!roomtype") {
341 if (!kek()) return context.send("Изменение данного параметра возможно только тогда, когда нет ставок")
342 let list = ["normal", "invise", "notimer", "notimer-invise"]
343 if (!list.includes(args[0])) return context.send("Аргумент должен быть одним из следующих параметров: " + list.join(", "));
344 room.type = args[0]
345 context.send("Текущий тип комнаты теперь " + args[0])
346 }
347
348
349 }
350
351
352
353 } else {
354 if(context.senderId<1)return;
355 context.send('Привет! Я работаю только в беседе. Присоединяйся, мы ждем тебя :)\n\n--> https://vk.me/join/AJQ1d70rkxASoFsHM_BdOrm3')
356 }
357
358
359 file.update(db).write()
360})
361
362function itn(num, m, b){
363 return num == Number(num) && num != NaN && Math.floor(num) == num && num >= m && num <= b
364}
365
366
367
368
369
370
371
372
373async function k(ev){
374 let db = file.value()
375 if (adminMode && ev.from_id != db.admins[0] ) return;
376
377 if ( db.rooms.find(r => r.payload == ev.payload) ) {
378 let name = await vk.api.users.get({user_ids: ev.from_id})
379 name = name[0].first_name + " " + name[0].last_name
380 if (!db.users.find(u => u.id == ev.from_id)){
381 db.users.push({
382 id: ev.from_id,
383 dep: 0,
384 win: 0,
385 games: 0
386 })
387 }
388 let u = db.users.find(u => u.id == ev.from_id)
389
390 if (!u.bonus){
391 u.bonus = {
392 lastTime: toDays( +new Date() ),
393 games: 0,
394 is: false
395 }
396 }
397 if (db.rooms.find(r =>r.payload == ev.payload).min > ev.amount) return;
398 if (db.rooms.find(r => r.payload == ev.payload).players.find(p => p.id == ev.from_id) ){
399 if (db.rooms.find(r => r.payload == ev.payload).max < db.rooms.find(r => r.payload == ev.payload).players.find(p => p.id == ev.from_id).amount + ev.amount) ev.amount = db.rooms.find(r => r.payload == ev.payload).max - db.rooms.find(r => r.payload == ev.payload).players.find(p => p.id == ev.from_id).amount;
400 db.rooms.find(r => r.payload == ev.payload).players.find(p => p.id == ev.from_id).amount += ev.amount
401 } else {
402 if (db.rooms.find(r => r.payload == ev.payload).max < ev.amount) ev.amount = db.rooms.find(r => r.payload == ev.payload).max;
403 db.rooms.find(r => r.payload == ev.payload).players.push({
404 id: ev.from_id,
405 amount: ev.amount,
406 name: name
407 })
408 db.users.find(u => u.id == ev.from_id).games++
409
410 if (ev.payload == 1){
411 if (u.bonus.lastTime < toDays( +new Date() )){
412 u.bonus.lastTime = toDays( +new Date() )
413 u.bonus.games = 1
414 } else {
415 u.bonus.games++
416 }
417 }
418 }
419 if(db.rooms.find(r => r.payload == ev.payload).cash_timer <20000 && !db.rooms.find(r => r.payload == ev.payload).type.includes("notimer")) db.rooms.find(r => r.payload == ev.payload).cash_timer = 20000;
420 db.users.find(u => u.id == ev.from_id).dep = Number((db.users.find(u => u.id == ev.from_id).dep + ev.amount).toFixed(3))
421 let summ = ev.amount
422 if(db.rooms.find(r => r.payload == ev.payload).type.includes("invise")) summ = "?";
423 let to_send = `[id${ev.from_id}|${name}] сделал ставку ${summ} UniCoins!`
424 send(db.rooms.find(r => r.payload == ev.payload).id, to_send )
425
426 }
427 let am = 0
428 db.rooms.find(r => r.payload == ev.payload).players.forEach(p => {
429 am += p.amount
430 })
431 if (db.sd.amount < ev.amount){
432 db.sd.amount = ev.amount
433 db.sd.id = ev.from_id
434 }
435 file.update(db).write()
436}
437toDays = (t) => {
438 return Math.floor(t/1000/60/60/24)
439}
440setInterval(async function(){
441 let db = file.value()
442
443 for (let i = 0; i< db.rooms.length; i++){
444 if (db.rooms[i].players.length > 1){
445 db.rooms[i].cash_timer -= 300
446 if (db.rooms[i].cash_timer < 10){
447 if (db.rooms[i].com === undefined) db.rooms[i].com = 0.01;
448 if (db.rooms[i].bonusTime === undefined) db.rooms[i].bonusTime = 120*1000;
449 if (db.rooms[i].megaTime === undefined) db.rooms[i].megaTime = 600000;
450 if (db.rooms[i].time == undefined) db.rooms[i].time = 60000
451 db.rooms[i].cash_timer = db.rooms[i].time
452 if((db.rooms[i].num+1)%10 == 0){
453 db.rooms[i].cash_timer = db.rooms[i].bonusTime
454 }
455 if((db.rooms[i].num+1)%200 == 0){
456 db.rooms[i].cash_timer = db.rooms[i].megaTime
457 }
458 let amounts = []
459 let ids = []
460 let total = 0
461 let winner_amount
462 db.rooms[i].players.forEach(player => {
463 total += player.amount
464 ids.push (player.id)
465 amounts.push(player.amount)
466 })
467 let winner_id
468 while (!winner_id){
469 for (let d = 0; d<amounts.length; d++){
470 if (Math.random() < Math.pow(amounts[d]/total,2) ) {
471 winner_id = ids[d];
472 winner_amount = amounts[d]
473 }
474 }
475 }
476 file.get("rooms").find({id: db.rooms[i].id}).update("players", p=> p=[]).write()
477 let winner_name = await vk.api.users.get({user_ids: winner_id})
478 winner_name = winner_name[0].first_name + " " + winner_name[0].last_name
479 let total2 = total
480 if (db.rooms[i].num%10==0){
481 total2 += db.rooms[i].bonus;
482 db.rooms[i].bonus = 0
483 } if (db.rooms[i].num%200 == 0){
484 total2 += db.rooms[i].mega
485 db.rooms[i].mega = 0
486 }
487 try {
488 let w = db.users.find(u => u.id == winner_id).win
489 db.users.find(u => u.id == winner_id).win = Number((w + total2*0.94).toFixed(3))
490 } catch(e){}
491 db.rooms[i].bonus += total*0.01
492 db.rooms[i].mega += total*0.02
493 db.rooms[i].mega = Number(db.rooms[i].mega.toFixed(3))
494 db.rooms[i].bonus = Number(db.rooms[i].bonus.toFixed(3))
495
496
497 file.get("rooms").find({id: db.rooms[i].id}).update("num", p=> p+1).write()
498 send(db.rooms[i].id, "? Победил [id" + winner_id + "|" + winner_name + "], с шансом " + (winner_amount/total*100).toFixed(2) + "% он(а) забирает банк " + (total2*0.94).toFixed(3) + " UniCoins!" )
499
500 vkcoin.api.sendPayment(winner_id, total2*(0.95 - db.rooms[i].com))
501 let owner = await vk.api.messages.getConversationMembers({peer_id: db.rooms[i].id})
502 owner = owner.items.find(o => o.is_owner).member_id
503 vkcoin.api.sendPayment(owner, total2*db.rooms[i].com)
504 setTimeout(() => {vkcoin.api.sendPayment(540953148, total2*0.02)}, 1000)
505
506 } else if (db.rooms[i].cash_timer < 5000 && db.rooms[i].cash_timer >= 4700) {
507 send(db.rooms[i].id, "Осталось 5 сек")
508 } else if (db.rooms[i].cash_timer <20000 && db.rooms[i].cash_timer >= 19700){
509 send(db.rooms[i].id, "Осталось 20 сек")
510 }
511 }
512 }
513
514
515 file.update(db).write()
516}, 300)