diff --git a/chapter3/public/field.js b/chapter3/public/field.js index 5730943..3be7ac6 100644 --- a/chapter3/public/field.js +++ b/chapter3/public/field.js @@ -363,11 +363,28 @@ }; const byName = () => { const q = m.inner.querySelector("#rq").value.trim().toLowerCase(); - const hit = App.init.citizens.find((c) => c.name.toLowerCase() === q); - out.innerHTML = hit - ? "" - : '

— Записів не знайдено. Перевірте написання.

'; - if (hit) draw([hit]); + + if (!q) { + out.innerHTML = '

— Введіть ім\'я або прізвище.

'; + return; + } + + // Розбиваємо введений запит на слова + const words = q.split(/\s+/); + + // Фільтруємо: кожне введене слово має збігатися з початком якогось слова в імені громадянина + const hits = App.init.citizens.filter((c) => { + const nameWords = c.name.toLowerCase().split(/\s+/); + return words.every((w) => nameWords.some((nw) => nw.startsWith(w))); + }); + + if (!hits.length) { + out.innerHTML = '

— Записів не знайдено. Спробуйте інший початок.

'; + return; + } + + out.innerHTML = ""; + draw(hits); }; const byFilter = () => { const v = (id) => m.inner.querySelector(id).value; diff --git a/chapter3/server.js b/chapter3/server.js index 3c4f57f..2791ccd 100644 --- a/chapter3/server.js +++ b/chapter3/server.js @@ -4,6 +4,7 @@ const http = require('http'); const fs = require('fs'); const path = require('path'); const os = require('os'); +const crypto = require('crypto'); const { WebSocketServer } = require('ws'); const { generateCase, checkAccusation, md5 } = require('./casegen'); const { unitBuilding } = require('./casegen/district'); @@ -39,8 +40,9 @@ function seedRand(seed) { function getSession(code) { if (sessions[code]) return sessions[code]; - const cs = generateCase(code); - const rng = seedRand([...code].reduce((a, c) => a * 31 + c.charCodeAt(0), 0)); // детермінований rand + const hashedCode = crypto.createHash('sha512').update(code).digest('hex'); + const cs = generateCase(hashedCode); + const rng = seedRand([...hashedCode].reduce((a, c) => a * 31 + c.charCodeAt(0), 0)); const stn = cs.district.buildings.find(b => b.id === 'station'); const s = { code, cs,