diff --git a/app.js b/app.js index 41a361a..73152ac 100644 --- a/app.js +++ b/app.js @@ -2,9 +2,11 @@ const Telegraf = require('telegraf'); const Stage = require('telegraf/stage'); const session = require('telegraf/session'); const BaseScene = require('telegraf/scenes/base'); +const AsyncLock = require('async-lock'); const fs = require('fs'); const Room = require('./model/room'); global.__basedir = __dirname; +global.__lock = new AsyncLock(); const bot = new Telegraf(process.env.TOKEN); @@ -30,17 +32,43 @@ bot.telegram.getMe().then((botInfo) => { bot.options.username = botInfo.username }); -enterNameJoinRoom.on("message", ctx => { - Room.join(ctx.chat.id, ctx.session.roomCodeToJoin, ctx.message.text) - ctx.reply("Joined successfully. Wait for your message", Telegraf.Markup.keyboard([['Join', 'Create']]). +enterNameJoinRoom.hears("Cancel", ctx => { + ctx.reply("Canceled", Telegraf.Markup.keyboard([['Join', 'Create']]). oneTime().resize().extra()) - ctx.session.roomCodeToJoin = null //fix that shit + .catch(e => { + console.log(e.message) + }) ctx.scene.leave() }) +enterNameJoinRoom.on("message", ctx => { + Room.join(ctx.chat.id, ctx.session.roomCodeToJoin, ctx.message.text) + .then(res => { + if(res) { + ctx.session.roomCodeToJoin = null //fix that shit + ctx.reply("Joined successfully. Turn notifications on - the bot will send you " + + "your partner as soon as secret santa begins", Telegraf.Markup.keyboard([['Join', 'Create']]). + oneTime().resize().extra()) + ctx.scene.leave() + } else { + ctx.session.roomCodeToJoin = null + ctx.reply("There is no such room", Telegraf.Markup.keyboard([['Join', 'Create']]). + oneTime().resize().extra()) + ctx.scene.leave() + } + }) + .catch(e => { + console.log(e.message) + }) + +}) + createRoom.hears("Cancel", ctx => { ctx.reply("Canceled", Telegraf.Markup.keyboard([['Join', 'Create']]). oneTime().resize().extra()) + .catch(e => { + console.log(e.message) + }) ctx.scene.leave() }) @@ -54,20 +82,28 @@ enterRoom.hears("Cancel", ctx => { ctx.reply("Canceled", Telegraf.Markup.keyboard([['Join', 'Create']]). oneTime().resize().extra()) + .catch(e => { + console.log(e.message) + }) }) enterRoom.on("message", ctx => { ctx.session.roomCodeToJoin = ctx.message.text - ctx.scene.enter("enterNameJoinRoom") - .then(_ => { - ctx.reply("Enter name") + ctx.reply("Enter name").then(_ => { + ctx.scene.enter("enterNameJoinRoom") }) + .catch(e => { + console.log(e.message) + }) }) room.enter(ctx => { ctx.replyWithHTML('🤖 You joined your room. Room id is ' + ctx.from.id + '', Telegraf.Markup.keyboard([['Refresh', 'Start', 'Cancel']]). oneTime().resize().extra()) + .catch(e => { + console.log(e.message) + }) }) room.hears("Cancel", ctx => { @@ -75,11 +111,20 @@ room.hears("Cancel", ctx => { ctx.reply("Room was deleted", Telegraf.Markup.keyboard([['Join', 'Create']]). oneTime().resize().extra()) - ctx.scene.leave() + .then(_ => { + ctx.scene.leave() + }) + .catch(e => { + console.log(e.message) + }) }) room.hears("Start", ctx => { ctx.session.room.start(bot) + .catch(e => { + ctx.reply("Something went wrong. Try again later") + console.log(e.message) + }) }) bot.hears("Create", ctx => { @@ -101,6 +146,9 @@ bot.hears("Join", ctx => { .then(_ => { ctx.scene.enter("enterRoom") }) + .catch(e => { + console.log(e.message) + }) }) bot.start(async ctx => { @@ -111,4 +159,7 @@ bot.start(async ctx => { oneTime().resize().extra()) }); -bot.launch() \ No newline at end of file +bot.launch() +.catch(e => { + console.log(e.message) +}) \ No newline at end of file diff --git a/model/room.js b/model/room.js index d2f4a0b..2c17da5 100644 --- a/model/room.js +++ b/model/room.js @@ -21,33 +21,47 @@ class Room { } static join(chatId, roomId, name) { - if(fs.existsSync(global.__basedir + '/roomdata/' + roomId + '.json')){ + return new Promise((resolve, reject) => { + if(fs.existsSync(global.__basedir + '/roomdata/' + roomId + '.json')) { + __lock.acquire('join', () =>{ + let objectData = JSON.parse(fs.readFileSync(global.__basedir + '/roomdata/' + roomId + '.json')); + objectData.participants.push([name, chatId]) - let objectData = JSON.parse(fs.readFileSync(global.__basedir + '/roomdata/' + roomId + '.json')); - objectData.participants.push([name, chatId]) + let jsonData = JSON.stringify(objectData, null, 2); + fs.writeFileSync(global.__basedir + '/roomdata/' + roomId + '.json', jsonData); + return resolve(true) + }) + } else { + return resolve(false) + } + }) - let jsonData = JSON.stringify(objectData, null, 2); - fs.writeFileSync(global.__basedir + '/roomdata/' + roomId + '.json', jsonData); - } } start(bot) { - let participants = JSON.parse(fs.readFileSync(global.__basedir + '/roomdata/' + this.owner + '.json')).participants - let bag = [...participants] - - for(let i = 0; i < participants.length; i++) { - const indexOfPartner = Math.floor(Math.random() * bag.length) - // console.log(indexOfPartner) - let partner = bag[indexOfPartner]; - if (partner[0] === participants[i][0]) { - i-=1 - } else { - //send message and remove - console.log("pair for " + participants[i][0] + " is " + bag[indexOfPartner][0]) - bot.telegram.sendMessage(participants[i][1], "Your partner is " + bag[indexOfPartner][0]) - bag.splice(indexOfPartner, 1); + return new Promise((resolve, reject) => { + let participants = JSON.parse( + fs.readFileSync(global.__basedir + '/roomdata/' + this.owner + '.json') + ).participants + + let bag = [...participants] + + for(let i = 0; i < participants.length; i++) { + const indexOfPartner = Math.floor(Math.random() * bag.length) + // console.log(indexOfPartner) + let partner = bag[indexOfPartner]; + if (partner[0] === participants[i][0]) { + i-=1 + } else { + //send message and remove + // console.log("pair for " + participants[i][0] + " is " + bag[indexOfPartner][0]) + bot.telegram.sendMessage(participants[i][1], "You are preparing present for " + bag[indexOfPartner][0]) + bag.splice(indexOfPartner, 1); + } } - } + resolve(true) + }) + } } diff --git a/package-lock.json b/package-lock.json index d3adf8b..278cdf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "async-lock": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.2.6.tgz", + "integrity": "sha512-gobUp/bRWL/uJsxi4ZK7NM770s5d2Tx5Hl7uxFIcN6yTz1Kvy2RCSKEvzhLsjAAnYaNa8lDvcjy9ybM6lXFjIg==" + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", diff --git a/package.json b/package.json index 97c1fa2..4bf65d2 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "author": "belotserkovtsev", "license": "ISC", "dependencies": { + "async-lock": "^1.2.6", "telegraf": "^3.38.0" } }