{"id":298630,"date":"2020-02-13T15:00:16","date_gmt":"2020-02-13T15:00:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=298630"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-02-13T15:00:16","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=298630","title":{"rendered":"\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0438\u0433\u0440\u044b \u0437\u0430 3 \u0432\u0435\u0447\u0435\u0440\u0430?"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/488152\/\">\n<p>\u0418 \u0441\u043d\u043e\u0432\u0430 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u0427\u0430\u0441\u0442\u043e \u043b\u0438 \u0432\u0430\u043c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u0438 \u0438\u0434\u0435\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043c\u0435\u0448\u0430\u043b\u0438 \u0432\u0430\u043c \u0441\u043f\u0430\u0442\u044c? \u0422\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u043e, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u0432\u043e\u043b\u043d\u0443\u0435\u0448\u044c\u0441\u044f, \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0448\u044c \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0448\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u0435\u0449\u0430\u043c\u0438. \u0423 \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u0433\u043e\u0434. \u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u0434\u0435\u0438 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0441\u0430\u043c\u0438 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043c\u0443 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043f\u043e\u043b\u044c\u0437\u0443 \u0438\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u0438, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0436\u0435 \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043c\u0435\u043d\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0430\u0436 \u043a\u0443\u0448\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443. \u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0438\u0434\u0435\u0439 \u0437\u0430 \u043f\u0430\u0440\u0443 \u0432\u0435\u0447\u0435\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043d\u0435 \u043f\u043e\u043c\u0435\u0440\u0435\u0442\u044c \u0441 \u0433\u043e\u043b\u043e\u0434\u0443. \u0410 \u0432\u0435\u0434\u044c \u0441\u0430\u043c\u0430 \u0438\u0434\u0435\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0432\u0443\u0447\u0430\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0430\u043c\u0431\u0438\u0446\u0438\u043e\u0437\u043d\u043e \u2014 <strong>PvP \u0438\u0433\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0433\u0440\u043e\u043a\u0438 \u0441\u043e\u0440\u0435\u0432\u043d\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043e\u0442\u0432\u0435\u0447\u0430\u044f \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b.<\/strong><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/6t\/lx\/nv\/6tlxnvshyavyiioz_ofsltrkwae.jpeg\"><\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u0431\u044b\u043b \u0437\u0430\u043d\u044f\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c &quot;\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 Botlify&quot;, \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/487340\/\">\u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a> \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u041d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u0442\u0432\u043b\u0435\u0447\u044c\u0441\u044f \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u043d\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430, \u0430 \u0434\u043b\u044f \u0438\u0433\u0440. \u0427\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u043b\u0435\u0442 \u0441 14-15 \u044f \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0438\u0433\u0440\u0430\u044e \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0435 \u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438\u0433\u0440\u044b, \u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u043e\u0442 \u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<h3 id=\"ideya\">\u0418\u0434\u0435\u044f<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u043b\u0438\u0441\u0442\u044b\u0432\u0430\u044f \u043b\u0435\u043d\u0442\u0443 \u043d\u0435\u0431\u0435\u0437\u044b\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u0433\u0440\u0443, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0432 \u0434\u0430\u043b\u0435\u043a\u043e\u043c 2013 \u0433\u043e\u0434\u0443. \u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u044f, \u0443 \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0431\u044b\u043b\u0430 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0438\u0433\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u0441\u043e\u0431\u043e\u0439 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0448\u043e\u0443 &quot;100 \u043a 1&quot;. \u041a \u043c\u043e\u0435\u043c\u0443 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044e, \u044f \u0443\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u0438\u043e\u043d\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0430 \u0432\u043e\u0442 \u0432 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u043e\u043d\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430. \u042f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043a\u0440\u0443\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432, \u0432\u0435\u0434\u044c \u0441\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u0433\u0440\u044b \u043f\u043e \u043c\u043e\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0447\u0430\u0442-\u0431\u043e\u0442\u0430. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u044b\u043b \u0431\u0435\u0441\u0446\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Telegram API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u043c\u043d\u043e\u0433\u0438\u043c \u0438\u0437 \u0432\u0430\u0441 \u0437\u043d\u0430\u043a\u043e\u043c\u043e: \u0437\u0430\u0432\u043e\u0434\u0438\u0448\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0435\u0442-\u043f\u0440\u043e\u0434\u0436\u0435\u043a\u0442, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u0440\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u043f\u044b\u0442\u0430\u0435\u0448\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438(\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 1% \u2014 <strong>YAGNI<\/strong>), \u043a\u0443\u0447\u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0438\u0447 \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043a\u0430\u043a \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0440\u0435\u043b\u0438\u0437. \u0418\u0442\u043e\u0433\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0442\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u0434\u0432\u043e\u0440\u043a\u0430\u0445 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u0432 \u0441\u0432\u0435\u0442. \u042f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0438 \u0443 \u043c\u0435\u043d\u044f \u0431\u0435\u0437 \u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0434\u043e\u0431\u0440\u0430\u044f \u0441\u043e\u0442\u043d\u044f \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u044f \u0447\u0435\u0442\u043a\u043e \u0440\u0435\u0448\u0438\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0435\u0434\u043b\u0430\u0439\u043d \u0438 \u0434\u0430\u043b \u0441\u0435\u0431\u0435 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 <em>\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 3 \u0432\u0435\u0447\u0435\u0440\u0430<\/em>. \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0434\u043e\u043b\u044c\u0448\u0435 \u2014 \u0440\u043e\u0441\u043a\u043e\u0448\u044c, \u0432\u0435\u0434\u044c \u0443 \u043c\u0435\u043d\u044f \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0435\u0441\u0442\u044c \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0440\u0432\u0430 \u0437\u0430\u0434\u0430\u0447. \u0418\u0442\u0430\u043a, \u044f \u0445\u043e\u0447\u0443 \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432: &quot;\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u044b \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0430 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u0432\u0435\u0447\u043d\u043e \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, <strong>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u0434\u0435\u0434\u043b\u0430\u0439\u043d<\/strong>&quot;. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0432 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0443, \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u044b\u043b\u043e \u0441\u043e \u043c\u043d\u043e\u0439. \u0412\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435, \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0435, \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u0435 \u0432\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u2014 \u044d\u0442\u043e \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u043c\u043e\u0437\u0433 \u0437\u0430\u0433\u043e\u043d\u044f\u0435\u0442 \u0432\u0430\u0441 \u0432 \u043b\u043e\u0432\u0443\u0448\u043a\u0443. <strong>\u041b\u0443\u0447\u0448\u0435 \u0443\u043f\u0430\u0441\u0442\u044c \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0432 10 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0435\u043c \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0438, \u043d\u043e \u0442\u0430\u043a \u0438 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0432\u0448\u0435\u0435 \u0441\u0432\u0435\u0442.<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c \u0447\u0435\u0441\u0442\u043d\u043e, \u044f \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u043c\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u0438\u043e\u043d\u043d\u043e\u0439 \u0438\u0433\u0440\u044b, \u043f\u043e \u0441\u0443\u0442\u0438 \u044f \u0434\u0435\u043b\u0430\u043b \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e \u0430\u0434\u0430\u043f\u0446\u0438\u0438 \u0438 \u0445\u043e\u0442\u0435\u043b \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Telegram.<\/p>\n<p>  <\/p>\n<h3 id=\"shag-1-pravila\">\u0428\u0430\u0433 1. \u041f\u0440\u0430\u0432\u0438\u043b\u0430<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440\u044b, \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u0441\u044b\u0433\u0440\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0430\u0440\u0442\u0438\u0439 \u0441 \u0434\u0440\u0443\u0437\u044c\u044f\u043c\u0438. \u0411\u0435\u0437 Telegram \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u041f\u041e. \u041e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0438\u0433\u0440\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0435\u0440\u0442\u043e\u0432\u0441\u043a\u0438 \u043b\u0435\u0433\u043a\u043e. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432 \u0438\u0433\u0440 \u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0438\u0433\u0440\u044b \u044f \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0430\u0432\u0438\u043b:<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0440\u0442\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 <strong>3 \u0440\u0430\u0443\u043d\u0434\u043e\u0432<\/strong>. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0443\u043d\u0434\u0430 \u0438\u0433\u0440\u043e\u043a\u0438 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0437 \u0431\u0430\u0437\u044b \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432. \u041e\u0442\u0432\u0435\u0442\u0438\u0432 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0431\u0430\u043b\u043b\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0445\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u043a\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 <strong>\u0440\u0430\u0443\u043d\u0434 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 6 \u0445\u043e\u0434\u043e\u0432<\/strong>, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043f\u043e 3 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043e\u0434\u0438\u043d \u0432\u043e\u043f\u0440\u043e\u0441.<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u2014 8 \u0431\u0430\u043b\u043b\u043e\u0432<\/li>\n<li>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u2014 5 \u0431\u0430\u043b\u043b\u043e\u0432<\/li>\n<li>\u0422\u0440\u0435\u0442\u0438\u0439 \u2014 3 \u0431\u0430\u043b\u043b\u0430<\/li>\n<li>\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u2014 2 \u0431\u0430\u043b\u043b\u0430<\/li>\n<li>\u041f\u044f\u0442\u044b\u0439 \u2014 1 \u0431\u0430\u043b\u043b<\/li>\n<li>\u0428\u0435\u0441\u0442\u043e\u0439 \u2014 1 \u0431\u0430\u043b\u043b<\/li>\n<li>\u0412\u0441\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u2014 0 \u0431\u0430\u043b\u043b\u043e\u0432<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0441\u0443\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0447\u043a\u043e\u0432. \u0427\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0432\u044b \u0434\u0430\u0435\u0442\u0435 \u2014 \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0447\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0430\u0435\u0442\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430 \u043d\u0435\u0433\u043e 1 &quot;\u0433\u043e\u043b\u043e\u0441&quot;. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0435\u0449\u0435 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0434\u0430\u0432\u0430\u043b \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0441 \u043e\u0434\u043d\u0438\u043c &quot;\u0433\u043e\u043b\u043e\u0441\u043e\u043c&quot;. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443 \u043e\u0442\u0432\u0435\u0442\u0430 \u0433\u043e\u043b\u043e\u0441\u043e\u0432 \u2014 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0432\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430 \u043d\u0435 \u0437\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u043b\u0430\u0441\u044c, \u0430 \u0438\u0433\u0440\u043e\u043a\u0438 \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <strong>\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0442\u0432\u0435\u0442 \u0432 20 \u0441\u0435\u043a\u0443\u043d\u0434.<\/strong> \u041d\u0435 \u0443\u0441\u043f\u0435\u043b? \u0425\u043e\u0434 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u043a\u0443, \u0430 \u0442\u0435\u0431\u0435 \u043d\u0430\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0442\u0435\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 0 \u0431\u0430\u043b\u043b\u043e\u0432. \u041f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e 3 \u0440\u0430\u0443\u043d\u0434\u0430 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0447\u043a\u0438 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043a\u0430\u0437\u0430\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u0432\u043e\u0435\u0439 \u0436\u0435\u043d\u0435 \u0438 \u0441\u043f\u0440\u043e\u0441\u0438\u043b, \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u043b\u0438 \u043e\u043d\u0438, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0443\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0441\u044b\u0433\u0440\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0442\u0438\u0439 &quot;\u043d\u0430 \u0441\u043b\u043e\u0432\u0430\u0445&quot;, \u0432\u044b\u0431\u0438\u0440\u0430\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0431\u0430\u0437\u044b \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435(\u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f \u0436\u0443\u043b\u044c\u043d\u0438\u0447\u0430\u043b, \u0432\u0435\u0434\u044c \u0432\u0438\u0434\u0435\u043b \u0435\u0449\u0435 \u0438 \u043e\u0442\u0432\u0435\u0442\u044b). \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0436\u0435\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435, \u044f \u0441\u0435\u043b \u043a\u043e\u0434\u0438\u0442\u044c<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ai\/0h\/mm\/ai0hmmnxcggfv6gp1w685b5jsq0.jpeg\" alt=\"\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0422\u0412-\u0448\u043e\u0443\"><\/p>\n<p>  <\/p>\n<h3 id=\"shag-2-abstrakcii\">\u0428\u0430\u0433 2. \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u044f \u043b\u044e\u0431\u043b\u044e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u043c\u0438 \u043c\u043d\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430 \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c. \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u0430\u0432\u0438\u043b \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043c, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 &quot;\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438&quot;:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0418\u0433\u0440\u043e\u043a(Player) \u2014 \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 id \u0438\u0433\u0440\u043e\u043a\u0430, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0433\u043e \u0438\u0433\u0440, \u043f\u043e\u0431\u0435\u0434, \u043f\u043e\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u0438\u043d\u0444\u0443, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0432\u0437\u044f\u0442\u044b\u043c \u0438\u0433\u0440\u043e\u043a\u043e\u043c.<\/li>\n<li>\u0418\u0433\u0440\u0430(Game) \u2014 \u0445\u0440\u0430\u043d\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0438, \u0441\u0442\u0430\u0442\u0443\u0441 \u0438\u0433\u0440\u044b, \u043a\u0442\u043e \u0441 \u043a\u0435\u043c \u0438\u0433\u0440\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0443\u043d\u0434, \u0443 \u043a\u043e\u0433\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u043a\u043e\u0432 \u0438 \u0442.\u043f.<\/li>\n<li>\u0420\u0430\u0443\u043d\u0434(Round) \u2014 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435, \u043a\u0430\u043a\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u0447\u0435\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0434.<\/li>\n<li>\u0412\u043e\u043f\u0440\u043e\u0441(Question) \u2014 \u0442\u0443\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442<\/li>\n<li>\u041e\u0442\u0432\u0435\u0442(Answer) \u2014 \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u0431\u0435\u0437 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043c\u044b \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043b\u0438. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430 \u0431\u044b\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0438\u0433\u0440\u0443, \u044f \u0440\u0435\u0448\u0438\u043b \u0442\u0430\u043a\u0436\u0435 \u043e\u0437\u0430\u0434\u0430\u0447\u0438\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u043c \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u043c \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044e \u0438\u0433\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0432\u0435\u0434\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0445\u043e\u0442\u044f\u0442 \u0431\u044b\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u043c, \u043b\u044e\u0431\u044f\u0442 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0431\u0430\u043b\u043b\u044b, \u043e\u0447\u043a\u0438, \u0433\u043e\u043b\u043e\u0441\u0430, \u043a\u0430\u0440\u043c\u0443(\u0434\u0430, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0425\u0430\u0431\u0440?), \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u2014 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441.<\/p>\n<p>  <\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u043b\u044f \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u044f \u0437\u0430\u0434\u0430\u043b \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: &quot;\u0427\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442?&quot;. \u042f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430<\/li>\n<li>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0440\u0435\u0439\u0442\u0438\u043d\u0433<\/li>\n<li>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0422\u041e\u041f \u0438\u0433\u0440\u043e\u043a\u043e\u0432<\/li>\n<li>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0441\u044f \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u043e\u0432\u043e\u0439 \u0438\u0433\u0440\u044b \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u043e\u043c<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u0443\u044e \u0438\u0433\u0440\u0443 \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0441 \u0434\u0440\u0443\u0437\u044c\u044f\u043c\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f\u0432\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043c\u0435\u043d\u044e \u0438 \u0442\u0443\u0442 \u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0435\u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0438 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043f\u043e\u0434\u043c\u0435\u043d\u044e, \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432 \u0438\u0433\u0440\u0430\u0445 \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u043e\u043c, \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u044b, \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0433\u0440\u044b. \u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u0437\u0430\u043c\u044b\u0441\u043b\u0443 \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a:<br \/>  \u041f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \/start \u0431\u043e\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e. \u0414\u0430\u043b\u0435\u0435, \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0431\u0440\u0430\u0435\u0442 \u0438\u0433\u0440\u0443 \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u043e\u043c \u0438 \u0435\u043c\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043d\u0430\u0439\u0434\u0435\u043c \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u2014 \u0441\u043e\u043e\u0431\u0449\u0438\u043c. \u0420\u0430\u0437 \u0432 N-\u0441\u0435\u043a\u0443\u043d\u0434 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0430\u0440\u044b \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u043e\u0441\u044c\u0431\u043e\u0439 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u043c\u0430\u0442\u0447. \u041a\u043e\u0433\u0434\u0430 \u043c\u0430\u0442\u0447 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d \u043e\u0431\u043e\u0438\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438 \u2014 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0438\u0445 \u043e \u0441\u043a\u043e\u0440\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0430\u0440\u0442\u0438\u0438 \u0438 \u0434\u0430\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 &quot;\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0433\u0440\u044b&quot;. \u041f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0438\u0433\u0440\u0443 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u0433\u0440\u043e\u0432\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c.<\/p>\n<p>  <\/p>\n<h3 id=\"poehali\">\u041f\u043e\u0435\u0445\u0430\u043b\u0438!<\/h3>\n<p>  <\/p>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u0432\u0441\u0435 \u0447\u0442\u043e \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0437\u0432\u0443\u0447\u0438\u0442 \u0447\u0435\u0440\u0442\u043e\u0432\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e. \u0412 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b, \u0447\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u2014 \u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0442\u044b \u0437\u043d\u0430\u0435\u0448\u044c \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e. \u041f\u043e\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0435\u043a\u0435\u043d\u0434\u0430 \u044f \u0432\u0437\u044f\u043b \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u043d\u0435 <strong>NodeJS c TypeScript<\/strong> \u0438 \u043d\u0430\u0447\u0430\u043b \u043a\u043e\u043b\u0431\u0430\u0441\u0438\u0442\u044c. \u0411\u0435\u0437 \u0447\u0435\u0433\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0438\u0433\u0440\u0430? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0431\u0435\u0437 \u0438\u0433\u0440\u043e\u043a\u0430. 10 \u043c\u0438\u043d\u0443\u0442 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0434\u0430 \u0438 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface Player {     id: string; \/\/ \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u0433\u0440\u043e\u043a\u0430     rating: number;  \/\/ \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438\u0433\u0440\u043e\u043a\u0430     username: string; \/\/ \u0438\u043c\u044f \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f     games: number; \/\/ \u043a-\u0432\u043e \u0438\u0433\u0440 \u0432\u0441\u0435\u0433\u043e     wins: number; \/\/ \u043a-\u0432\u043e \u043f\u043e\u0431\u0435\u0434     losses: number; \/\/ \u043a-\u0432\u043e \u043f\u043e\u0440\u0430\u0436\u0435\u043d\u0438\u0439     createdAt: number; \/\/ timestamp &quot;\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot; \u0438\u0433\u0440\u043e\u043a\u0430     lastGame: number|null; \/\/ timestamp \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u044b\u0433\u0440\u0430\u043d\u043e\u0439 \u0438\u0433\u0440\u044b }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u044f\u0445 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438, \u043d\u0438 \u043e\u0441\u043e\u0431\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0438 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u044f \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b. \u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0421\u0423\u0411\u0414 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 &quot;\u0442\u044f\u0436\u0435\u043b\u044b\u0435&quot; \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 MySQL, Postgres \u0438\u043b\u0438 MongoDB \u043c\u043d\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u043d\u0443\u0436\u043d\u044b. \u042f \u0440\u0435\u0448\u0438\u043b \u0442\u0440\u044f\u0445\u043d\u0443\u0442\u044c \u0441\u0442\u0430\u0440\u0438\u043d\u043e\u0439 \u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c <strong>Redis<\/strong>. \u042f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u0430\u043a \u043a\u044d\u0448, \u0438\u043b\u0438 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0438 \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a key-value \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u0443\u0434\u0430 JSON. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043e\u0442\u043a\u0440\u044b\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438 \u0442\u0443\u0442 \u043c\u0435\u043d\u044f \u043e\u0437\u0430\u0440\u0438\u043b\u043e, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e Redis \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043c\u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u043c\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041c\u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Redis \u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0433\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 &quot;\u043f\u043e\u0434\u0447\u0438\u0449\u0430\u0442\u044c&quot; \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u043d\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 &quot;\u043e\u0447\u043a\u043e\u0432&quot;(scores), pub\/sub, \u0430 \u043f\u0440\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b Redis \u044f \u0434\u0443\u043c\u0430\u044e, \u0432\u044b \u0432\u0441\u0435 \u0438 \u0442\u0430\u043a \u0437\u043d\u0430\u0435\u0442\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0431\u0440\u0430\u0432 \u0421\u0423\u0411\u0414, \u044f \u0431\u044b\u0441\u0442\u0440\u0435\u043d\u044c\u043a\u043e \u043d\u0430\u043a\u0438\u0434\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0411\u0414, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043e\u0442\u0442\u0443\u0434\u0430, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 winGame \u0438 looseGame, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u0420\u0435\u0439\u0442\u0438\u043d\u0433 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u0435\u0449\u0435 \u0434\u043e \u0438\u0433\u0440\u044b, \u0432\u0435\u0434\u044c Redis \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 <strong>sorted set<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0432\u0435\u0441(<strong>score<\/strong>). \u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0432\u0435\u0441\u043e\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d. \u0422\u043e \u0435\u0441\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0432 \u043c\u043e\u0435\u0439 \u0438\u0433\u0440\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e sorted set \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f id \u0432\u0441\u0435\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0430 \u0432\u0435\u0441(score) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0443 \u0438\u0433\u0440\u043e\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0440\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438. \u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0433\u0440\u0430\u043b\u0438 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438, \u0430 \u043c\u0435\u043d\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441 \u043c\u0435\u043d\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u043c\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0430? \u041c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0438 \u044f \u043f\u043e\u0448\u0435\u043b \u0432 \u0433\u0443\u0433\u043b \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0432 \u0434\u0443\u0445\u0435 &quot;Rating system&quot;. \u0422\u0443\u0442 \u0436\u0435 \u043c\u043d\u0435 \u0432\u044b\u043f\u0430\u043b\u0430 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u0443\u044e \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u0430\u0445 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <strong>ELO Rating.<\/strong> \u0415\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u044f \u043d\u0435 \u0432\u043d\u0438\u043a\u0430\u043b \u0432 \u0434\u0435\u0442\u0430\u043b\u0438 \u043e\u0441\u043e\u0431\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e, \u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u043d\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442. \u0418\u0434\u0435\u043c \u043d\u0430 <a href=\"http:\/\/npmjs.com\" rel=\"nofollow\">npmjs.com<\/a> \u0438 \u0432\u0432\u043e\u0434\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 elo-rating \u0438 \u0442\u0443\u0442 \u0436\u0435 <strong>\u0411\u0418\u041d\u0413\u041e!<\/strong> <a href=\"https:\/\/www.npmjs.com\/package\/elo-rating\" rel=\"nofollow\">https:\/\/www.npmjs.com\/package\/elo-rating<\/a>. \u041f\u0443\u0441\u0442\u044c \u043b\u0438\u0431\u0430 \u0438 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f, \u043d\u043e \u0437\u0430\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0412\u0437\u044f\u043b, \u043f\u0430\u0440\u0443 \u0440\u0430\u0437 \u0432\u044b\u0437\u0432\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0430 \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0438\u0433\u0440\u044b \u2014 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0432\u043d\u0435\u0434\u0440\u0438\u043b. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0438\u0433\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u0442\u044c \u0438 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043e\u0442\u043b\u0438\u0447\u043d\u043e! \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0435\u0441\u044c &quot;\u0441\u0435\u0440\u0432\u0438\u0441&quot; player.service.ts \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0430\u0434\u043c\u0438\u043d\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043f\u0438\u0441\u043a\u0430, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 &quot;\u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c&quot; \u0438 &quot;\u043f\u0440\u043e\u0438\u0433\u0440\u0430\u0442\u044c&quot; \u0443\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432 130 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0435\u043c \u043e\u043d \u0437\u0430\u043d\u044f\u0442 \u2014 \u0432\u043e\u0442 \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u044f \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043d\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0433\u043b\u044f\u0434\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 Player \u043b\u0435\u0433\u043a\u043e \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043f\u0430\u0440\u0443-\u0442\u0440\u043e\u0439\u043a\u0443 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface IPlayerService {   createPlayer(id: string, name?: string): Promise&lt;boolean&gt;;   getPlayerName(id: string): Promise&lt;string&gt;;   countPlayers(): Promise&lt;number&gt;;   getRatingPosition(id: string): Promise&lt;number&gt;;   getTopPlayerIds(): Promise&lt;string[]&gt;;   getTopPlayerScores(): Promise&lt;{id: string, value: number}[]&gt;;   listPlayers(): Promise&lt;Player[]&gt;;   getPlayerRating(id: string): Promise&lt;number&gt;;   getPlayerScores(id: string): Promise&lt;number&gt;;   getPlayerScorePosition(id: string): Promise&lt;number&gt;;   getPlayerGames(id: string): Promise&lt;number&gt;;   getPlayerWins(id: string): Promise&lt;number&gt;;   winGame(id: string, newRating: number): Promise&lt;boolean&gt;;   looseGame(id: string, newRating: number): Promise&lt;boolean&gt;;   setSession(id: string, data: any): Promise&lt;void&gt;;   getSession(id: string): Promise&lt;any&gt;; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b, \u0447\u0442\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c \u043c\u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442, \u0437\u0430\u0432\u0430\u0440\u0438\u043b \u0447\u0430\u0448\u0435\u0447\u043a\u0443 &quot;\u043a\u0430\u0440\u043a\u0430\u0434\u044d&quot; \u0441 \u0441\u0430\u0445\u0430\u0440\u043e\u0447\u043a\u043e\u043c \u0438 \u043d\u0430\u0447\u0430\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0431\u0435, \u043a\u0430\u043a \u044f \u0441\u043a\u043e\u0440\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e \u0438\u0433\u0440\u0443 \u0438 \u0431\u0443\u0434\u0443 \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u043d\u0435\u0435 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0436\u0435\u043d\u043e\u0439. \u0421 \u044d\u0442\u0438\u043c\u0438 \u043c\u044b\u0441\u043b\u044f\u043c\u0438 \u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441\u043f\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<h3 id=\"vtoroy-vecher\">\u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0447\u0435\u0440<\/h3>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u0435\u043d\u044c \u0432 \u043c\u043e\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0432\u044b\u0434\u0430\u043b\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u0443\u0440\u043d\u044b\u043c, \u0430 \u044f \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u043e\u0433 \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u2014 \u043c\u044b\u0441\u043b\u0438 \u0431\u044b\u043b\u0438 \u043e\u0431 \u0438\u0433\u0440\u0435. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0418 \u0432\u043e\u0442, \u0434\u043e\u0436\u0434\u0430\u0432\u0448\u0438\u0441\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0434\u043d\u044f, \u044f \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043e\u0442\u043a\u0440\u044b\u043b \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430, \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u043b\u0441\u044f \u043f\u043e \u0432\u0447\u0435\u0440\u0430\u0448\u043d\u0438\u043c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c \u0438 \u043d\u0430\u043c\u0435\u0442\u0438\u043b \u0442\u0430\u043a\u043e\u0439 \u043f\u043b\u0430\u043d:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438\\\u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438<\/li>\n<li>\u0417\u0430\u043f\u0438\u043b\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441<\/li>\n<li>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0430\u0442\u044c \u043c\u0430\u0442\u0447\u043c\u0435\u0439\u043a\u0438\u043d\u0433<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u0432 \u0438\u0433\u0440\u0435 \u0438\u043c\u0435\u044e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0412\u0441\u0435-\u0442\u0430\u043a\u0438, \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0438\u0433\u0440\u044b \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0438\u0445. \u0412\u043e\u043f\u0440\u043e\u0441 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438 \u0434\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f(\u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439).<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface Question {   id: string;   message: string;   createdAt: number; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u044f \u0440\u0435\u0448\u0438\u043b \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 key-value, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u2014 ID, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f JSON-\u0441\u0442\u0440\u043e\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044f \u0437\u0430\u0432\u0435\u043b \u0441\u0435\u0431\u0435 <strong>\u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a(set)<\/strong> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f ID \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c. \u041a\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b? \u042f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e ID<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0438 \u0431\u0435\u0437 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u043e \u0434\u0430\u0436\u0435 \u0441 \u043d\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0447\u0435\u0440\u0442\u043e\u0432\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u0442 \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">class QuestionService {    \/**    * Get redis key of question by id    * @param id    *\/   public static getQuestionKey(id: string) {     return `questions:${id}`;   }    \/**    * Get redis key of questions list    *\/   public static getQuestionsListKey() {     return 'questions';   }    \/**    * Return question object    * @param id    *\/   async getQuestion(id: string) {     return JSON.parse(       await this.redisService.getClient().get(QuestionService.getQuestionKey(id))     );   }    \/**    * Add new question to the store    * @param question    *\/   async addQuestion(message: string): Promise&lt;string&gt; {     const data =  {       id: randomStringGenerator(),       createdAt: Date.now(),       message,     };     await this.redisService.getClient()       .set(QuestionService.getQuestionKey(data.id), JSON.stringify(data));     await this.redisService.getClient()       .sadd(QuestionService.getQuestionsListKey(), data.id);     return data.id;   }    \/**    * Return ID of the random question    *\/   async getRandomQuestionId(): Promise&lt;string&gt; {     return this.redisService.getClient()       .srandmember(QuestionService.getQuestionsListKey());   }    \/**    * Return random question    *\/   async getRandomQuestion() {     const id = await this.getRandomQuestionId(gameId);     return this.getQuestion(id);   }  }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0434\u0430\u043b \u043d\u0430 \u043e\u0442\u043a\u0443\u043f Redis. \u0423\u0432\u0435\u0440\u0435\u043d, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0412\u0430\u0441 \u043d\u0430\u0439\u0434\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u043d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u0438\u043c \u043c\u043d\u0435 \u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0434\u0432\u0438\u043d\u0435\u043c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435, \u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0437\u0430\u0434\u0430\u0447\u0438\u0442\u044c\u0441\u044f \u2014 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0430\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0438. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0443 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u0440\u0435\u0439\u0442\u0438\u043d\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u043a\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0438\u0433\u0440\u043e\u043a. \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0436\u0435\u0441\u0442\u043a\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u043d\u043d\u043e\u043c\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0443. \u0422\u0430\u043a\u0436\u0435, \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043b\u0438 \u043e\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u0432\u0435\u0434\u044c \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0431\u0438\u0434\u043d\u043e, \u0435\u0441\u043b\u0438 \u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0430 \u0438\u0437-\u0437\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0442\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043f\u043e \u043f\u0440\u0430\u0432\u0443 \u043e\u0447\u043a\u0438, \u043d\u043e \u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u0431\u044b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0444\u043e\u0440\u043c. \u0422\u0443\u0442 \u0436\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u0441\u043f\u043b\u044b\u043b \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0416\u0430\u043a\u043a\u0430\u0440\u0430, \u043f\u043e\u0448\u0435\u043b \u0433\u0443\u0433\u043b\u0438\u0442\u044c \u043a\u0430\u043a \u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0438\u043b\u0438\u0442\u044c \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0438, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0432 \u043e\u0434\u0435\u0440\u043d\u0443\u043b \u0441\u0435\u0431\u044f. \u0412\u0441\u0435 \u0432\u0435\u0434\u044c \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043e \u043c\u0435\u043d\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u0443\u0433\u043b\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0443. \u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 5 \u043c\u0438\u043d\u0443\u0442 \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u0432\u044b\u0431\u043e\u0440 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/aceakash\/string-similarity\" rel=\"nofollow\">https:\/\/github.com\/aceakash\/string-similarity<\/a> \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043d\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0435 \u0421\u0451\u0440\u0435\u043d\u0441\u0435\u043d\u0430. \u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u0432\u0435\u043b\u043a\u0430\u043c \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D1%8D%D1%84%D1%84%D0%B8%D1%86%D0%B8%D0%B5%D0%BD%D1%82_%D0%A1%D1%91%D1%80%D0%B5%D0%BD%D1%81%D0%B5%D0%BD%D0%B0\" rel=\"nofollow\">\u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044e<\/a>. \u041f\u043e\u0438\u0433\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435, \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u044b\u043a\u0430 \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u0430 0.75 \u043c\u043d\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0445\u043e\u0442\u044c \u0438\u043d\u043e\u0433\u0434\u0430 \u0438 \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0435\u043a\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438 \u0444\u043e\u0440\u043c\u044b \u0441\u043b\u043e\u0432. \u041d\u043e \u0432\u0441\u0435 \u0436\u0435 \u2014 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <strong>\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440(sorted set)<\/strong> \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0430\u043c\u043e\u043c QuestionService, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0442\u0443\u0434\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0422\u041e\u041f-\u043e\u0442\u0432\u0435\u0442\u043e\u0432(\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0430\u043b\u043b\u044b), \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0443\u0436\u0435 \u0442\u0430\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0447\u043a\u043e\u0432, \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430 \u044d\u0442\u043e\u0442 \u043e\u0442\u0432\u0435\u0442 \u0438 \u0442.\u043f.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u0430\u0436\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0430\u043b\u043b\u044b \u0437\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0438\u0433\u0440\u044b. \u0410 \u043f\u043e\u0442\u043e\u043c\u0443, \u043e\u0442\u0432\u0435\u0442\u044b \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u044b \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0438\u0433\u0440\u043e\u0439. \u0412 \u0438\u0442\u043e\u0433\u0435, \u043c\u043e\u0439 QuestionService \u043f\u043e\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0415\u0449\u0435 \u043a\u043e\u0434<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">private turnScores: number[] = [8, 5, 3, 2, 1, 1];  \/**  * Get key of list of the answers  * @param questionId  *\/ public static getAnswersKey(questionId: string): string {   return `answers:${questionId}`; }  async addAnswer(questionId: string, answer: string): Promise&lt;string&gt; {   return this.redisService.getClient()     .zincrby(QuestionService.getAnswersKey(questionId), 1, answer); }  \/**  * Get all answers for the given question  * @param questionId  *\/ async getQuestionAnswers(questionId: string): Promise&lt;string[]&gt; {   return this.redisService.getClient()     .zrevrange(QuestionService.getAnswersKey(questionId), 0, -1); }  \/**  * Top 6 answers  * @param questionId  *\/ async getTopAnswers(gameId: string, questionId: string): Promise&lt;string[]&gt; {   const copiedAnswers = await this.redisService.getClient()     .get(`answers:game:${gameId}:q:${questionId}`);   if (!copiedAnswers) {     const ans = await this.redisService.getClient()       .zrevrange(QuestionService.getAnswersKey(questionId), 0, 5);     await this.redisService.getClient()       .set(`answers:game:${gameId}:q:${questionId}`, JSON.stringify(ans));     return ans;   }   return JSON.parse(copiedAnswers); }  \/**  * Find if answer already exists and return it if found  * null if answer doesnt exist  * @param questionId  * @param answer  *\/ async existingAnswer(questionId: string, answer: string): Promise&lt;string | null&gt; {   const answers = await this.getQuestionAnswers(questionId);   const matches = stringSimilarity.findBestMatch(answer, answers);   return matches.bestMatch.rating &gt;= 0.75     ?      matches.bestMatch.target     :     null; }  \/**  * Existing answer scores  * @param questionId  * @param answer  *\/ async getExistingAnswerScore(   gameId: string, questionId: string, answer: string ): Promise&lt;number&gt; {     const topAnswers = await this.getTopAnswers(gameId, questionId);     const matches = stringSimilarity.findBestMatch(answer, topAnswers);     return matches.bestMatch.rating &gt;= 0.75       ?       this.turnScores[matches.bestMatchIndex]       :       0; }  \/**  * Submit the new answer. Updates answer counter, save if doesn't exist, return answer score  * @param questionId  * @param answer  *\/ async submitAnswer(gameId: string, questionId: string, answer: string): Promise&lt;number&gt; {   answer = answer.toLowerCase();   const existingAnswer = await this.existingAnswer(questionId, answer);   if (!existingAnswer) {     await this.addAnswer(questionId, answer);     return 0;   } else {     await this.addAnswer(questionId, existingAnswer);     return this.getExistingAnswerScore(gameId, questionId, existingAnswer);   } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u0443\u0441\u043a\u0430, \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f: \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u043e\u0442\u0432\u0435\u0442 \u043a \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0443\u0436\u0435 \u0442\u0430\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u0438, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0431\u0430\u0437\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c 0 \u043e\u0447\u043a\u043e\u0432 \u0437\u0430 \u043d\u0435\u0433\u043e. \u0415\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c &quot;\u0433\u043e\u043b\u043e\u0441&quot; \u0437\u0430 \u043e\u0442\u0432\u0435\u0442, \u0434\u0435\u043b\u0430\u044f \u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u044f \u0432 \u043e\u0431\u0449\u0435\u043c \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0435 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441. \u0414\u0430\u043b\u044c\u0448\u0435, \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0443\u0437\u043d\u0430\u0442\u044c, \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0443 \u043e\u0447\u043a\u0438 \u0437\u0430 \u044d\u0442\u043e\u0442 \u043e\u0442\u0432\u0435\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0442\u0435, \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0421\u0451\u0440\u0435\u043d\u0441\u0435\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u2265 0.75 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u0433\u0440\u043e\u043a\u0430. \u0427\u0442\u043e\u0431\u044b &quot;\u0431\u0430\u043b\u043b\u044b&quot; \u0437\u0430 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b, \u044f \u0440\u0435\u0448\u0438\u043b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0422\u041e\u041f-\u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438\u0437 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0438\u0433\u0440\u044b. \u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u044d\u0442\u043e \u0432 getTopAnswers? \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044f \u0431\u044b\u043b \u043f\u044c\u044f\u043d \u2014 \u043d\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0442\u0430\u043a \ud83d\ude09 \u0421\u043e \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0432\u0435\u0441\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u043d\u044f\u043b \u0443 \u043c\u0435\u043d\u044f &lt; 300 \u0441\u0442\u0440\u043e\u043a \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0432\u0430\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043d\u043e \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u043b\u043b\u043e\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a \u0437\u0430 \u043e\u0442\u0432\u0435\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0438\u0433\u0440\u044b(\u0442\u043e\u0447\u043d\u0435\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e gameId, \u0432\u0435\u0434\u044c \u0438\u0433\u0440\u044b \u0435\u0449\u0435 \u0438 \u0432 \u043f\u043e\u043c\u0438\u043d\u0435 \u043d\u0435\u0442).<\/p>\n<p>  <\/p>\n<p>\u0423\u0436\u0435 \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435, \u043a\u0430\u043a \u043d\u0430 \u0432\u0430\u0448\u0438\u0445 \u0433\u043b\u0430\u0437\u0430\u0445 \u0438\u0433\u0440\u0430 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u0442 \u043e\u0447\u0435\u0440\u0442\u0430\u043d\u0438\u044f? \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0438, \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044d\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u0438 \u0434\u0430\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u043b\u043b\u043e\u0432 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u043d\u0442\u043d\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u043a\u0443 \u0437\u0430 \u043e\u0442\u0432\u0435\u0442. \u041f\u043e\u0440\u0430 \u0431\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0438\u0433\u0440\u043e\u0432\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443, \u043d\u0435 \u0442\u0430\u043a \u043b\u0438?<\/p>\n<p>  <\/p>\n<h3 id=\"igra\">\u0418\u0433\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435, \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0440\u0442\u0438\u044f(\u0438\u0433\u0440\u0430) \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0438 \u0445\u043e\u0434\u043e\u0432. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0433\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c 2 \u0438\u0433\u0440\u043e\u043a\u0430 \u2014 player1 \u0438 player2 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0423 \u0438\u0433\u0440\u044b \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u0421\u0430\u043c\u0443 \u0438\u0433\u0440\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0430 \u0441\u0442\u0430\u0442\u0443\u0441 &quot;\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432&quot; \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u044b \u0438\u0433\u0440\u043e\u043a\u0438 \u0443\u0441\u043f\u0435\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b\u0438 \u0441\u0432\u043e\u0435 \u0443\u0447\u0430\u0441\u0442\u0438\u0435. \u041a\u043e\u0433\u0434\u0430 \u043e\u0431\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b\u0438 \u2014 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">enum GameStatus {   WaitingForPlayers,   Active,   Finished, }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0433\u0440\u044b \u044f \u0440\u0435\u0448\u0438\u043b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a <em>key-value<\/em>, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447 \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 = ID, \u0430 value = JSON.stringify(data). \u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043d\u0435\u0437\u0430\u0442\u0435\u0439\u043b\u0438\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u0433\u0440\u044b<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface Game {     id: string;     player1: string;     player2: string;     joined: string[];     status: GameStatus;     round?: number;     winner?: string;     createdAt: number;     updatedAt?: number; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0433\u0440\u043e\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434 \u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0445\u043e\u0434\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441(\u043f\u043e\u043c\u043d\u0438\u0442\u0435? 1 \u0440\u0430\u0443\u043d\u0434 \u2014 1 \u0432\u043e\u043f\u0440\u043e\u0441), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0438\u0433\u0440\u043e\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface GameRound {     index: number;     question: string;     currentPlayer: string;     turn: number;     answers: UserAnswer[];     updatedAt?: number; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a <em>game.service.ts<\/em> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u044b, \u0441\u0442\u0430\u0440\u0442 \u0438\u0433\u0440\u044b, \u0441\u043c\u0435\u043d\u0430 \u0440\u0430\u0443\u043d\u0434\u043e\u0432, \u0441\u043c\u0435\u043d\u0430 \u0445\u043e\u0434\u043e\u0432, \u043d\u0430\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u043b\u043e\u0432 \u0437\u0430 \u043e\u0442\u0432\u0435\u0442\u044b \u0438 \u043f\u043e\u0434\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0442\u043e\u0433\u043e\u0432. \u0412 \u0438\u0433\u0440\u0435 \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043a\u0430\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043e \u0441\u043c\u0435\u043d\u0435 \u0445\u043e\u0434\u0430 \u0438\u043b\u0438 \u043a\u043e\u043d\u0446\u0435 \u0438\u0433\u0440\u044b. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Redis pub\/sub. \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u043b\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0445\u043e\u0434\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0435\u0440\u044b, \u043d\u043e \u043c\u044b \u0442\u0443\u0442 \u043d\u0435 \u0441\u0442\u0440\u043e\u0438\u043c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0438 \u0442\u0430\u043a \u0441\u043e\u0439\u0434\u0435\u0442.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u0443\u0441\u043e\u043a GameService<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">class GameService {    \/\/ \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u0430\u0441 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f   public static CHANNEL_G_CREATED = 'game-created';   public static CHANNEL_G_STARTED = 'game-started';   public static CHANNEL_G_ENDED = 'game-ended';   public static CHANNEL_G_NEXT_ROUND = 'game-next-round';   public static CHANNEL_G_NEXT_TURN = 'game-next-turn';   public static CHANNEL_G_ANSWER_SUBMIT = 'game-next-turn';    private defaultRounds: number; \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0443\u043d\u0434\u043e\u0432   private defaultTurns: number; \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0445\u043e\u0434\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435    private timers: any = {}; \/\/ \u0442\u0430\u0439\u043c\u0435\u0440\u044b. \u0414\u0430-\u0434\u0430, any - \u0437\u043b\u043e      \/\/ \u0412\u043d\u0435\u0434\u0440\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043d\u0430\u0448\u0430 \u0438\u0433\u0440\u0430 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c     \/\/ \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0438 \u0445\u043e\u0434\u043e\u0432 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430   constructor(     private readonly redisService: RedisService,     private readonly playerService: PlayerService,     private readonly questionService: QuestionService,     @Inject('EventPublisher') private readonly eventPublisher,   ) {     this.defaultRounds = config.game.defaultRounds;     this.defaultTurns = config.game.defaultTurns;   }    \/**    * Get redis key of game    * @param id string identifier of game    *\/   public static getGameKey(id: string) {     return `game:${id}`;   }    \/**    * Get game object by id    * @param gameId    *\/   async getGame(gameId: string): Promise&lt;Game&gt; {     const game = await this.redisService.getClient()       .get(GameService.getGameKey(gameId));     if (!game) {       throw new Error(`Game ${gameId} not found`);     }     return JSON.parse(game);   }    \/**    * Save the game state to database    * @param game    *\/   async saveGame(game: Game) {     return this.redisService.getClient().set(       GameService.getGameKey(game.id),       JSON.stringify(game)     );   }    \/**    * Save round    * @param gameId    * @param round    *\/   async saveRound(gameId: string, round: GameRound) {     return this.redisService.getClient().set(       GameService.getRoundKey(gameId, round.index),       JSON.stringify(round)     );   }    \/**    * Initialize default game structure, generate id    * and save new game to the storage    *    * @param player1    * @param player2    *\/   async initGame(player1: string, player2: string): Promise&lt;Game&gt; {     const game: Game = {       id: randomStringGenerator(),       player1,       player2,       joined: [],       status: GameStatus.WaitingForPlayers,       createdAt: Date.now(),     };     await this.saveGame(game);     this.eventPublisher.emit(       GameService.CHANNEL_G_CREATED, JSON.stringify(game)     );     return game;   }    \/**    * When the game is created and is in the  &quot;Waiting for players&quot; state    * users can approve participation    * @param playerId    * @param gameId    *\/   async joinGame(playerId: string, gameId: string) {     const game: Game = await this.getGame(gameId);     if (!game) throw new Error('Game not found err')     if (isUndefined(game.joined.find(element =&gt; element === playerId))) {       game.joined.push(playerId);       game.updatedAt = Date.now();       await this.saveGame(game);     }     if (game.joined.length === 2) return this.startGame(game);   }    \/**    * Start the game    * @param game    *\/   async startGame(game: Game) {     game.round = 0;     game.updatedAt = Date.now();     game.status = GameStatus.Active;     this.eventPublisher.emit(       GameService.CHANNEL_G_STARTED, JSON.stringify(game)     );     await this.questionService.pickQuestionsForGame(game.id);     await this.nextRound(game);   }    \/**    * Start the next round    * @param game    *\/   async nextRound(game: Game) {     clearTimeout(this.timers[game.id]);     if (game.round &gt;= this.defaultRounds) {       return this.endGame(game);     }     game.round++;     const round: GameRound = {       index: game.round,       question: await this.questionService.getRandomQuestionId(game.id),       currentPlayer: game.player1,       turn: 1,       answers: [],     };     await this.saveGame(game);     await this.saveRound(game.id, round);      \/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0443\u043d\u0434 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0445\u043e\u0434     \/\/ \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0432\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u0432 20 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e \u0438\u0441\u0442\u0438\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u0440\u043e\u0433\u043e     \/\/ \u0438\u0433\u0440\u043e\u043a\u0443 \u0437\u0430\u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e 0 \u0431\u0430\u043b\u043b\u043e\u0432     this.timers[game.id] = setTimeout(async () =&gt; {       await this.submitAnswer(round.currentPlayer, game.id, '');     }, 20000);     await this.eventPublisher.emit(       GameService.CHANNEL_G_NEXT_ROUND,       JSON.stringify({game, round})     );   }    \/**    * Switch round to next turn    * @param game    * @param round    *\/   async nextTurn(game: Game, round: GameRound) {     clearTimeout(this.timers[game.id]);     if (round.turn &gt;= this.defaultTurns) {       return this.nextRound(game);     }     round.turn++;     round.currentPlayer = this.anotherPlayer(round.currentPlayer, game);     round.updatedAt = Date.now();     await this.eventPublisher.emit(       GameService.CHANNEL_G_NEXT_TURN,       JSON.stringify({game, round})     );     this.timers[game.id] = setTimeout(async () =&gt; {       await this.submitAnswer(round.currentPlayer, game.id, '');     }, 20000);     return this.saveRound(game.id, round);   }    async answerExistInRound(round: GameRound, answer: string) {     const existingKey = round.answers.find(       rAnswer =&gt; stringSimilarity.compareTwoStrings(answer, rAnswer.value) &gt;= 0.85     );     return !isUndefined(existingKey);   }    async submitAnswer(playerId: string, gameId: string, answer: string) {     const game = await this.getGame(gameId);     const round = await this.getCurrentRound(gameId);     if (playerId !== round.currentPlayer) {       throw new Error('Its not your turn');     }     if (answer.length === 0) {       round.updatedAt = Date.now();       this.eventPublisher.emit(         GameService.CHANNEL_G_ANSWER_SUBMIT,         JSON.stringify({game, answer, score: 0, playerId})       );       return this.nextTurn(game, round);     }     if (await this.answerExistInRound(round, answer)) {       throw new Error('\u0422\u0430\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u0443\u0436\u0435 \u0431\u044b\u043b \u0432 \u044d\u0442\u043e\u043c  \u0440\u0430\u0443\u043d\u0434\u0435');     }     round.answers.push({ value: answer, playerId, turn: round.turn });     const score = await this.questionService.submitAnswer(       gameId, round.question, answer     );     if (score &gt; 0) {       await this.addGameScore(gameId, playerId, score);     }     round.updatedAt = Date.now();     this.eventPublisher.emit(       GameService.CHANNEL_G_ANSWER_SUBMIT,       JSON.stringify({game, answer, score, playerId})     );     return this.nextTurn(game, round);   }    \/**    * Adds game score in specified game for specified player    * @param gameId    * @param playerId    * @param score    *\/   async addGameScore(gameId: string, playerId: string, score: number) {     await this.redisService.getClient()       .zincrby(`game:${gameId}:player:scores`, score, playerId);   }    async endGame(game: Game) {     clearTimeout(this.timers[game.id]);     game.updatedAt = Date.now();     game.status = GameStatus.Finished;     game.updatedAt = Date.now();     \/\/ \u043e\u043f\u0440\u0435\u0434\u0438\u043b\u0438\u043c\u043c \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044f     const places = await this.redisService.getClient()       .zrevrange(`game:${game.id}:player:scores`, 0, -1);     game.winner = places[0];     \/\/ \u0420\u0435\u0439\u0442\u0438\u043d\u0433\u0438 \u0414\u041e \u0438\u0433\u0440\u044b     const winnerRating: number = await this.playerService.getPlayerRating(game.winner);     const looserRating: number = await this.playerService.getPlayerRating(places[1]);     \/\/ \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u043d\u043e\u0432\u044b\u0435 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0438     const newRatings = rating.calculate(winnerRating, looserRating);     await this.playerService.winGame(game.winner, newRatings.playerRating);      await this.playerService.looseGame(places[1], newRatings.opponentRating);     await this.redisService.getClient().expire(GameService.getGameKey(game.id), 600)     this.eventPublisher.emit(GameService.CHANNEL_G_ENDED, JSON.stringify(game));     return game;   } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0443\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u043e\u043a\u0438 \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u0438\u0433\u0440\u0435. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u043c \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043c\u044b \u0443\u0436\u0435 \u0440\u0435\u0448\u0438\u043b\u0438, \u0430 \u043c\u0430\u0442\u0447\u043c\u0435\u0439\u043a\u0438\u043d\u0433 \u044f \u0445\u043e\u0442\u0435\u043b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u2014 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0443\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u0430. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u0435, \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u044b \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0437\u043a\u0438\u043c \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u043c. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 Redis \u0441 \u0435\u0433\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438(sorted sets). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432 \u043f\u0430\u0440\u0443 \u0441\u0442\u0440\u043e\u043a\u0443(\u043c\u043e\u0436\u043d\u043e \u0438 \u0432 \u043e\u0434\u043d\u0443 \u0432 \u0443\u0449\u0435\u0440\u0431 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0442\u0443\u0442 \u043b\u0438\u0448\u043d\u044f\u044f, \u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0438\u0442\u0435 \u043c\u043d\u0435 \u044d\u0442\u043e). \u041f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0438\u0433\u0440\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u044b \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f. \u0421\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0443 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0438\u0433\u0440\u0443. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0430\u0442\u0447\u043c\u0435\u0439\u043a\u0438\u043d\u0433 \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u044f \u0437\u0430\u0441\u0443\u043d\u0443\u043b \u0435\u0433\u043e \u043f\u0440\u044f\u043c\u043e \u0432 <em>game.service.ts<\/em>, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0442\u0443\u0434\u0430 \u043d\u0435\u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">async addPlayerToMatchmakingList(id: string) {   const playerRating = await this.playerService.getPlayerRating(id);   return this.redisService.getClient().zadd('matchmaking-1-1', playerRating, id); }  async removePlayerFromMatchmakingList(id: string) {   return this.redisService.getClient().zrem('matchmaking-1-1', id); }  async getMatchmakingListData() {   return this.redisService.getClient().zrange('matchmaking-1-1', 0, -1); }  async matchPlayers(): Promise&lt;Game&gt; {   const players = await this.redisService.getClient()         .zrevrange('matchmaking-1-1', 0, -1);   while (players.length &gt; 0) {      const pair = players.splice(0, 2);      if (pair.length === 2) {        return this.coinflip()           ?          this.initGame(pair[0], pair[1])          :          this.initGame(pair[1], pair[0]);      }   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0440\u0443\u0442\u043e, \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0435\u0441\u0442\u044c, \u0438\u0433\u0440\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0438\u0433\u0440\u0435. \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u043d\u0435 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0438 \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u0435\u0441\u044c \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442. \u041c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e \u043a\u0443\u0441\u043e\u0447\u043a\u0430\u043c \u0438 \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e-\u0442\u043e \u044f \u043c\u043e\u0433 \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0432, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0431\u043e\u0439 \u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441\u043f\u0430\u0442\u044c. \u0412\u0435\u0447\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u043d\u044f \u043e\u0431\u0435\u0449\u0430\u043b \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c, \u0432\u0435\u0434\u044c \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u044b.<\/p>\n<p>  <\/p>\n<h3 id=\"polzovatelskiy-interfeys\">\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>  <\/p>\n<p>\u0427\u0430\u0442-\u0431\u043e\u0442 \u2014 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u042f \u0431\u0435\u0437\u0443\u043c\u043d\u043e \u0440\u0430\u0434 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043e\u0432 \u0442\u0443\u0442 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0442\u0430\u0442\u044c, \u043f\u0438\u0441\u0430\u0442\u044c css \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 JS-\u043a\u043e\u0434 \u2014 \u0437\u0430 \u043d\u0430\u0441 \u044d\u0442\u043e \u0432\u0441\u0435 \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Telegram. \u0410 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0433\u0443 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0438\u0445 \u0442\u0440\u0443\u0434\u0430. \u041a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0447\u0442\u0435\u043d\u0438\u044f API \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u043e \u0443\u043b\u043e\u0432\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438\u0433\u0440\u044b \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c, \u044f \u043e\u0437\u0430\u0434\u0430\u0447\u0438\u043b\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438, \u0432\u0435\u0434\u044c \u043d\u0430\u0448 \u0431\u0443\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043a\u0430\u043a-\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0443\u0434\u0430 \u043e\u043d \u043f\u043e\u043f\u0430\u043b \u0438 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u0443 &quot;100 \u043a 1&quot;, AndreyDegtyaruk!<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0438\u0433\u0440\u0435 \u0442\u0435\u0431\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0442\u0438\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0432\u044b\u044f\u0441\u043d\u044f\u044f, \u0447\u044c\u044f \u0436\u0435 \u0438\u043d\u0442\u0443\u0438\u0446\u0438\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0430 \u043b\u0443\u0447\u0448\u0435! \u0418\u0433\u0440\u0430\u0439 \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u0432\u043e\u0438\u0445 \u0434\u0440\u0443\u0437\u0435\u0439, \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430. \u0412\u0432\u0435\u0434\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \/help \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0433\u0440\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445<\/p><\/blockquote>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043b\u0443\u0447\u0448\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u043b\u0438 \u0441\u0443\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0438 \u0431\u044b\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0438\u0433\u0440\u043e\u043a\u0430\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u043a\u0441\u0442:<\/p>\n<p>  <\/p>\n<blockquote><p>\u0412 \u0438\u0433\u0440\u0435 &quot;100 \u043a 1&quot; \u0412\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0441\u0440\u0430\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438 \u0432 \u0443\u043c\u0435\u043d\u0438\u0438 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0435\u0442! \u0412\u0430\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u0435 \u043e\u0442\u0432\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0438<br \/>  \u041a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0440\u0442\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 3 \u0440\u0430\u0443\u043d\u0434\u043e\u0432. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0443\u043d\u0434\u0430 \u0438\u0433\u0440\u043e\u043a\u0438 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u044b \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432. \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0431\u0430\u043b\u043b\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043d\u0438\u0436\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0445\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u043a\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0443\u043d\u0434 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 6 \u0445\u043e\u0434\u043e\u0432, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043f\u043e 3 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043e\u0434\u0438\u043d \u0432\u043e\u043f\u0440\u043e\u0441<br \/>  \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0437\u0430 \u043e\u0442\u0432\u0435\u0442\u044b  <\/p>\n<ol>\n<li>\u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u2014 8 \u0431\u0430\u043b\u043b\u043e\u0432<\/li>\n<li>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u2014 5 \u0431\u0430\u043b\u043b\u043e\u0432<\/li>\n<li>\u0422\u0440\u0435\u0442\u0438\u0439 \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u2014 3 \u0431\u0430\u043b\u043b\u0430<\/li>\n<li>\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u2014 2 \u0431\u0430\u043b\u043b\u0430.<\/li>\n<li>\u041f\u044f\u0442\u044b\u0439 \u2014 1 \u0431\u0430\u043b\u043b.<\/li>\n<li>\u0428\u0435\u0441\u0442\u043e\u0439 \u2014 1 \u0431\u0430\u043b\u043b.<\/li>\n<li>\u0412\u0441\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u2014 0 \u0431\u0430\u043b\u043b\u043e\u0432<\/li>\n<\/ol>\n<p>  \u0422\u043e\u0440\u043e\u043f\u0438\u0441\u044c! \u0412\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0430\u0437\u0434\u0443\u043c\u044c\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e! \u0423 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e 20 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u043e\u0442\u0432\u0435\u0442. \u041d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c? \u0412\u0430\u043c \u0437\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f 0 \u0431\u0430\u043b\u043b\u043e\u0432 \u0438 \u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u043e\u043a\u0443. \u041f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 3 \u0440\u0430\u0443\u043d\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044f \u0438 \u043d\u0430\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043e\u0447\u043a\u043e\u0432, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0412\u0430\u0448\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/p><\/blockquote>\n<p>\u041f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0432 \u043d\u0430\u0434 \u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438, \u044f \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0430\u0442-\u0431\u043e\u0442\u044b \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u043e\u0432(\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u043e\u0442\u0443, \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b). \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 2 \u043f\u043e\u0434\u0445\u043e\u0434\u0430: pull \u0438 push. Pull \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b &quot;\u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c&quot; Telegram \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 API Telegram \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 getUpdates. Push \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0441\u0430\u043c \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0430\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u2014 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 webhook. \u0412\u0435\u0431\u0445\u0443\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043c\u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0438\u0434\u0435\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u043e &quot;\u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c&quot; \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0417\u043d\u0430\u0447\u0438\u0442, \u0432\u0435\u0431\u0445\u0443\u043a\u0430\u043c \u0431\u044b\u0442\u044c!<\/p>\n<p>  <\/p>\n<p>\u041e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u0432 \u0438 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 SDK \u044f \u0432\u044b\u0431\u0440\u0430\u043b <a href=\"https:\/\/telegraf.js.org\" rel=\"nofollow\">Telegraf<\/a>, \u0438\u0431\u043e \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0435\u0433\u043e \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043c\u043e\u0438\u0445 \u043d\u0443\u0436\u0434 \u2014 \u0443\u0434\u043e\u0431\u043d\u044b\u0435, \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b. \u0414\u0430 \u0435\u0449\u0435 \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u0442\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e\u043c, \u043a\u0430\u043a &quot;\u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c&quot; \u0431\u043e\u0442\u0430 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c API key \u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u044d\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0434\u0435\u043b\u0443. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u0442\u0430\u043c\u0438 \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u2014 <em>bot.service.ts<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0437\u044f\u0442\u044c \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0441\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 Telegram. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u043e\u0439 \u0431\u043e\u0442. \u041f\u043e\u0447\u0438\u0442\u0430\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u0440\u0438\u0441\u043e\u0432\u0430\u0432 \u043d\u0430 \u043b\u0438\u0441\u0442\u043e\u0447\u043a\u0435 \u0441\u0445\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:<\/p>\n<p>  <\/p>\n<ul>\n<li>\/start \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e(\u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0435\u0433\u043e inline, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, custom keyboard \u0431\u044b\u043b \u0431\u044b \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u0430\u0447\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c)<\/li>\n<li>\/help \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0433\u0440\u044b \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e<\/li>\n<li>\/player_info \u2014 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0433\u0440\u043e\u043a\u0435(\u043f\u043e\u0431\u0435\u0434\u044b, \u043f\u043e\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0440\u0435\u0439\u0442\u0438\u043d\u0433) \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e<\/li>\n<li>\/global_rating \u2014 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e<\/li>\n<li>\/go \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043b\u0438\u0441\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0433\u0440<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u041f\u043e\u0442\u043e\u043c\u0443, \u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044f \u0432\u044b\u043d\u0435\u0441 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">    getMainMenuKeyboard() {         return {           inline_keyboard: [             [             {                     text: ' \u0418\u0433\u0440\u0430 \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u043e\u043c',                 callback_data: JSON.stringify({type: 'go'})             }              ],              [             {                 text: ' \u0420\u0435\u0439\u0442\u0438\u043d\u0433 \u0438\u0433\u0440\u043e\u043a\u043e\u0432',                 callback_data: JSON.stringify({type: 'player-rating'})             }              ],              [             {                 text: ' \u041f\u0440\u0430\u0432\u0438\u043b\u0430',                 callback_data: JSON.stringify({type: 'rules'})             }               ],              [             {                 text: ' \u041c\u043e\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430',                 callback_data: JSON.stringify({type: 'stats'})             }              ],           ],         };       }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <em>callback_data.<\/em> Telegram \u043f\u0440\u0438\u0448\u043b\u0435\u0442 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u0430 \u044f, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043c\u043e\u0433\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u0437\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430\u0436\u0430\u043b\u0438 \u0438 \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u0438\u0445 \u0432\u043e\u0442 \u043a\u043e\u043b\u043b\u0431\u0435\u043a\u043e\u0432 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0432\u0435\u0441\u0438\u043b switch\/case statement \u043f\u043e \u043f\u043e\u043b\u044e type, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434. \u0414\u0430\u043b\u0435\u0435 \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0435\u0430\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b start \u0438 help, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u0438 \u0443\u0437\u043d\u0430\u0442\u044c \u0434\u043e\u0439\u0434\u0435\u0442 \u043b\u0438 \u0434\u043e \u043c\u0435\u043d\u044f \u0432\u0435\u0431\u0445\u0443\u043a, \u0437\u0430\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c. \u0422\u0443\u0442 \u0436\u0435 \u044f \u0443\u0437\u043d\u0430\u043b, \u0447\u0442\u043e Telegram \u0448\u043b\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e https, \u0434\u0430 \u0435\u0449\u0435 \u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u043e\u043c\u0435\u043d \u043c\u043d\u0435 \u0431\u044b \u043d\u0435 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u043b. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u043b \u0434\u043d\u044f \u044f \u0432\u0437\u044f\u043b \u043d\u0435\u0431\u0435\u0437\u044b\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 <strong><a href=\"https:\/\/ngrok.com\" rel=\"nofollow\">Ngrok<\/a><\/strong> \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u0440\u0435\u0431\u0435\u043d\u043e\u043a.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">    async commandStart(ctx) {       let name = `${escapeHtml(ctx.from.first_name)}`;       name += ctx.from.last_name ? escapeHtml(ctx.from.last_name) : '';       await this.playerService.createPlayer(ctx.from.id.toString(10), name);       await this.bot.telegram.sendMessage(ctx.from.id, messages.start(name), {         parse_mode: 'HTML',         reply_markup: this.getMainMenuKeyboard(),       });     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0441\u0442\u0430\u0440\u0442 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u044e \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e \u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043e\u0439. \u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0438 \u0443 \u043c\u0435\u043d\u044f \u043e\u0442\u043b\u0435\u0433\u043b\u043e \u043e\u0442 \u0441\u0435\u0440\u0434\u0446\u0430. \u0412\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0442\u0440\u0443\u0434 \u0431\u044b\u043b \u043d\u0435 \u043d\u0430\u043f\u0440\u0430\u0441\u0435\u043d \u0438, \u0441\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b. \u0414\u0430\u043b\u044c\u0448\u0435, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0434\u0435\u043b\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0438. \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e \u043c\u0430\u0442\u0447\u043c\u0435\u0439\u043a\u0438\u043d\u0433\u0430, \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 Redis pub\/sub. \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u0431\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u044b, \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0442\u0447\u0430, \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u0430(\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u043d \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u043a\u043e\u0432 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b). \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0441\u0443\u043d\u0443\u043b \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0432\u043e\u0439 main.ts, \u043d\u043e \u0432\u0441\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e, \u0447\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435. \u041f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0443\u043a\u0438 \u0442\u0430\u043a \u0438 \u043d\u0435 \u0434\u043e\u0448\u043b\u0438. \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 &quot;\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c&quot; \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">    const redisClient = app.get('EventSubscriber');     redisClient.on(GameService.CHANNEL_G_CREATED, async (data) =&gt; {       try {         await botService.sendGameCreated(JSON.parse(data));       } catch (error) {         console.log('Error in CHANNEL_G_CREATED');         console.log(error);       }     });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 BotService.sendGameCreated, \u043a\u0430\u043a \u043d\u0435 \u0442\u0440\u0443\u0434\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u043e\u0438\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043f\u0430\u0440\u0443 \u0438 \u043f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0438\u0433\u0440\u0435.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u043e \u0434\u043e\u0448\u043b\u043e \u0434\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u044b(\u0438 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0437\u0436\u0435), \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0431\u043e\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0433\u0440\u044b, \u0438\u043b\u0438 \u0432 \u043c\u0435\u043d\u044e. \u0410 \u0435\u0441\u043b\u0438 \u0432 \u043c\u0435\u043d\u044e, \u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u043c? \u042f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u0432\u044b\u0440\u044f\u043b \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c Stages \u0438 Scenes, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Telegraf, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u041d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0437\u0430 30 \u043c\u0438\u043d\u0443\u0442 \u043c\u043d\u0435 \u0442\u0430\u043a \u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0442\u0430\u0440\u044b\u043c\u0438 \u0434\u043e\u0431\u0440\u044b\u043c\u0438 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0432 Redis.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0431\u043e\u0442\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430, \u0431\u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043f\u0440\u0438\u0441\u043b\u0430\u0432\u0448\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0430\u043a\u0442\u0432\u043d\u043e\u0439 \u0438\u0433\u0440\u0435. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0435\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0434 \u0438, \u0435\u0441\u043b\u0438 \u0445\u043e\u0434 \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u2014 \u0437\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442(\u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e). \u0415\u0441\u043b\u0438 \u0436\u0435 \u0445\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u2014 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0434 \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435 \u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">this.bot.on('text', async (ctx: any) =&gt; {   ctx.message.text = escapeHtml(ctx.message.text);   ctx.message.text = ctx.message.text.toLowerCase();   try {     const state = await this.playerService.getSession(ctx.from.id.toString());     if (!state.currentGame) {       return ctx.reply(         '\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0433\u0440\u0443.          \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \/help, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434'         );     }     await this.gameIncomingMessage(ctx, state);   } catch (error) {     console.log('Error during processing TEXT message');     console.log(error);   } }); this.bot.on('message', async ctx =&gt; {     ctx.reply('\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f'); });<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0431\u043e\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0434\u0435\u043b\u0430\u0432 Telegram-\u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u0439, \u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0431\u043e\u0442\u0430 \u0436\u0435\u043d\u0435 \u0438 \u043f\u0430\u0440\u043e\u0447\u043a\u0435 \u0434\u0440\u0443\u0437\u0435\u0439. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0431\u0430\u0433\u0438. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u0437\u0430\u0431\u0430\u0432\u0438\u043b\u043e \u0442\u043e, \u0447\u0442\u043e \u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0432 \u0438\u043c\u0435\u043d\u0438 \u0431\u044b\u043b\u043e \u043d\u0435\u0447\u0442\u043e \u0432\u0440\u043e &lt;\/\u043c\u0438\u0448\u0430&gt;, \u0430 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e parseMode HTML, \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u043d\u0430\u0447\u0430\u043b \u043c\u043d\u0435 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443: &quot;\u041d\u0435 \u043c\u043e\u0433\u0443 \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c html&quot; \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0412\u0421\u0415\u041c \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0438 \u0434\u043e\u0445\u043e\u0434\u0438\u0442\u044c. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043e\u0442 \u0438\u0433\u0440 \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u0430\u043c\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u044f, \u043d\u043e \u0438 \u043c\u043e\u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0434\u0430\u0436\u0435 \u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c \u0438\u043c \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0434\u0440\u0443\u0437\u044c\u044f\u043c\u0438 \u0438 \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 localhost \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u043e 50 \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u042f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b \u044d\u0442\u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0443\u0434\u0430\u0447\u043d\u044b\u043c, \u0443\u0431\u0438\u043b NodeJS \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u043a \u0441\u0432\u043e\u0438\u043c \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u043c \u0434\u0435\u043b\u0430\u043c. \u0418\u0434\u0435\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442 \u0437\u0440\u0435\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e \u0438 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0443\u0434\u043e\u0441\u0443\u0436\u0438\u043b\u0441\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u043e\u0442\u0430 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043e\u0434\u043d\u0430\u043a\u043e, \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0435\u0431\u044f \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u042f \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043c\u043e\u0439 \u043f\u043e\u0441\u0442 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0442 \u043a\u043e\u0433\u043e-\u0442\u043e \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0432\u043e\u0438\u0445 \u0438\u0434\u0435\u0439, \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0442-\u043f\u0440\u043e\u0434\u0436\u0435\u043a\u0442\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0439 \u0438 \u0434\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0434\u043e \u0440\u0435\u043b\u0438\u0437\u0430, \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043e\u0442 \u0438\u0434\u0435\u0438 \u0434\u043e \u0440\u0435\u0430\u043b\u0438\u0430\u0437\u0430\u0446\u0438\u0438, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0445\u043e\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u044f \u043e\u0442 \u0447\u0442\u0435\u043d\u0438\u044f. \u042f \u043f\u043e\u0447\u0442\u0438 \u0443\u0432\u0435\u0440\u0435\u043d \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u043e\u0442 \u043d\u0435 \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u0412\u0441\u0435-\u0442\u0430\u043a\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u044b, subscriber \u043f\u0440\u044f\u043c\u043e \u0432 main, \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0442.\u0434 \u0438 \u0442.\u043f. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u0438\u0449\u0438\u0442\u0435 \u0431\u043e\u0442\u0430 <a href=\"https:\/\/t.me\/QuizMatchGameBot\" rel=\"nofollow\">@QuizMatchGameBot<\/a>. \u0412\u0441\u0435\u043c \u043c\u0438\u0440!<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/488152\/\"> https:\/\/habr.com\/ru\/post\/488152\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/488152\/\">\n<p>\u0418 \u0441\u043d\u043e\u0432\u0430 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u0427\u0430\u0441\u0442\u043e \u043b\u0438 \u0432\u0430\u043c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u0438 \u0438\u0434\u0435\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043c\u0435\u0448\u0430\u043b\u0438 \u0432\u0430\u043c \u0441\u043f\u0430\u0442\u044c? \u0422\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u043e, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u0432\u043e\u043b\u043d\u0443\u0435\u0448\u044c\u0441\u044f, \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0448\u044c \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0448\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u0435\u0449\u0430\u043c\u0438. \u0423 \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u0433\u043e\u0434. \u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u0434\u0435\u0438 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0441\u0430\u043c\u0438 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043c\u0443 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043f\u043e\u043b\u044c\u0437\u0443 \u0438\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u0438, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0436\u0435 \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043c\u0435\u043d\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0430\u0436 \u043a\u0443\u0448\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443. \u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0438\u0434\u0435\u0439 \u0437\u0430 \u043f\u0430\u0440\u0443 \u0432\u0435\u0447\u0435\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043d\u0435 \u043f\u043e\u043c\u0435\u0440\u0435\u0442\u044c \u0441 \u0433\u043e\u043b\u043e\u0434\u0443. \u0410 \u0432\u0435\u0434\u044c \u0441\u0430\u043c\u0430 \u0438\u0434\u0435\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0432\u0443\u0447\u0430\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0430\u043c\u0431\u0438\u0446\u0438\u043e\u0437\u043d\u043e \u2014 <strong>PvP \u0438\u0433\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0433\u0440\u043e\u043a\u0438 \u0441\u043e\u0440\u0435\u0432\u043d\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043e\u0442\u0432\u0435\u0447\u0430\u044f \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b.<\/strong><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/6t\/lx\/nv\/6tlxnvshyavyiioz_ofsltrkwae.jpeg\"><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-298630","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/298630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=298630"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/298630\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=298630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=298630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=298630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}