From eeeca86eab588f645fe53bd46b7c60b1e10f6b86 Mon Sep 17 00:00:00 2001 From: Anatoly Kopyl Date: Mon, 29 Mar 2021 20:34:37 +0300 Subject: [PATCH] =?UTF-8?q?:poop:=20=D0=92=D1=8B=D1=80=D0=B0=D0=B2=D0=BD?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B5=D1=80=D0=BE?= =?UTF-8?q?=D1=8F=D1=82=D0=BD=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=B5=D0=BA=20=D1=80=D0=B0=D0=B7=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BB=D1=8E=D0=B4=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/index.js | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/backend/index.js b/backend/index.js index f871e0b..1da2c0f 100644 --- a/backend/index.js +++ b/backend/index.js @@ -35,6 +35,36 @@ app.use(session({ client.connect() +// Выравнивание вероятности +let dropProb = {} // Объект хранящий вероятности с которой карта каждого участника отбрасывается +client.db(process.env.DB_NAME).collection('cards').aggregate([ + { + '$group': { + '_id': '$name', + 'count': { + '$sum': 1 + } + } + } +]).toArray().then((memeCount) => { + client.db(process.env.DB_NAME).collection('cards').countDocuments().then((totalCount) => { + let quota, quotaTimes + quota = totalCount/memeCount.length // Квота мемов на человека + console.log(totalCount + " мемов всего. Квота: " + quota) + memeCount.forEach((n) => { + // Во сколько раз превышена квота: + // (колич. человек в конфе * колич. мемов данного человека / мемов всего) + quotaTimes = memeCount.length*n.count/totalCount + if (quotaTimes > 1) { + dropProb[n._id] = 1 - (1/quotaTimes) + } else { + dropProb[n._id] = 0 + } + console.log(n._id + " ["+n.count+"]: " + dropProb[n._id]) + }) + }) +}) + app.post('/auth', async (req, res) => { if (req.session.loggedIn) { res.status(200).send("Logged in") @@ -57,8 +87,12 @@ app.post('/auth', async (req, res) => { app.get('/card', async (req, res) => { if (req.session.loggedIn) { try { - let card = await client.db(process.env.DB_NAME).collection('cards').aggregate([{ $sample: { size: 1 } }]).toArray() - card = card[0] + let card + // Тянем карты и отбрасываем их в соответствии с их вероятностью отбрасывания + do { + card = await client.db(process.env.DB_NAME).collection('cards').aggregate([{ $sample: { size: 1 } }]).toArray() + card = card[0] + } while (Math.random() < dropProb[card.name]) res.status(200).send(card) } catch (e) { console.log("Error: " + e)