Skip to content

Commit

Permalink
add critical section locking,
Browse files Browse the repository at this point in the history
add basic error handling,
add room existence checking,
refactor code to use promises
  • Loading branch information
belotserkovtsev committed Dec 18, 2020
1 parent 1e12720 commit 7c2d7c4
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 30 deletions.
69 changes: 60 additions & 9 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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()
})

Expand All @@ -54,32 +82,49 @@ 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('🤖 <b>You joined your room. Room id is ' + ctx.from.id + '</b>',
Telegraf.Markup.keyboard([['Refresh', 'Start', 'Cancel']]).
oneTime().resize().extra())
.catch(e => {
console.log(e.message)
})
})

room.hears("Cancel", ctx => {
fs.unlinkSync(global.__basedir + '/roomdata/' + ctx.from.id + '.json')
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 => {
Expand All @@ -101,6 +146,9 @@ bot.hears("Join", ctx => {
.then(_ => {
ctx.scene.enter("enterRoom")
})
.catch(e => {
console.log(e.message)
})
})

bot.start(async ctx => {
Expand All @@ -111,4 +159,7 @@ bot.start(async ctx => {
oneTime().resize().extra())
});

bot.launch()
bot.launch()
.catch(e => {
console.log(e.message)
})
56 changes: 35 additions & 21 deletions model/room.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})

}
}

Expand Down
5 changes: 5 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"author": "belotserkovtsev",
"license": "ISC",
"dependencies": {
"async-lock": "^1.2.6",
"telegraf": "^3.38.0"
}
}

0 comments on commit 7c2d7c4

Please sign in to comment.