Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict';
- let WebSocketClient = require('websocket').client;
- let levers = {
- "01": "noVal",
- "02": "noVal",
- "03": "noVal",
- "12": "noVal",
- "13": "noVal",
- "23": "noVal"
- };
- let singleLever = {
- "0": true,
- "1": true,
- "2": true,
- "3": true
- };
- let allLeversAreSame = false;
- let firedPower = false;
- let client = new WebSocketClient();
- client.on('connectFailed', function (error) {
- console.log('Connect Error: ' + error.toString());
- });
- client.on('connect', function (connection) {
- connection.on('error', function (error) {
- console.log("Connection Error: " + error.toString());
- });
- connection.on('close', function () {
- console.log('echo-protocol Connection Closed');
- });
- connection.on('message', function (message) {
- var msgParsed = JSON.parse(message.utf8Data);
- console.log(message.utf8Data);
- let receivedPull = msgParsed.stateId && [0, 1, 2, 3].includes(msgParsed.pulled);
- let receviedAnswer = msgParsed.stateId && msgParsed.action;
- if (msgParsed.newState == "poweredOff") {
- console.log('SUCCESS!');
- connection.close();
- }
- if (receivedPull && !allLeversAreSame) {
- let leversArray = [0, 1, 2, 3];
- leversArray.splice(leversArray.indexOf(msgParsed.pulled), 1);
- changeStateOfPairs(msgParsed.pulled);
- populatingLeversObj(msgParsed.stateId);
- }
- else if (receivedPull && allLeversAreSame) {
- singleLever[msgParsed.pulled] = !singleLever[msgParsed.pulled];
- let countOfTurnedOffLevers = 0;
- for (let property in singleLever) {
- if (singleLever.hasOwnProperty(property)) {
- if (singleLever[property] == false) {
- countOfTurnedOffLevers++;
- }
- }
- }
- if (countOfTurnedOffLevers == 4) {
- let shutdownMessage = {"action": "powerOff", "stateId": msgParsed.stateId};
- connection.send(JSON.stringify(shutdownMessage));
- }
- }
- if (receviedAnswer) {
- levers[String(msgParsed.lever1) + String(msgParsed.lever2)] = msgParsed.same;
- }
- checkIfAllLeversAreSame(msgParsed.stateId);
- });
- /* отправляет Websocket запрос на сервер для проверки состояний пары рычагов */
- function sendCheckMessage(stateId, lever1, lever2) {
- if (connection.connected) {
- let checkMessage = {"action": "check", "lever1": lever1, "lever2": lever2, "stateId": stateId};
- console.log('sent: ' + JSON.stringify(checkMessage));
- connection.send(JSON.stringify(checkMessage));
- }
- }
- /* Каждый раз при получения информации о том, какой рычаг был "дернут", необходимо поменять
- * значения всех необходимых пар
- * */
- function changeStateOfPairs(leverPulled) {
- for (let property in levers) {
- if (levers.hasOwnProperty(property)) {
- if (property.includes(leverPulled))
- if (levers[property] != 'noVal') levers[property] = !levers[property];
- }
- }
- }
- /* Функция заполняет объект levers, который содержит значения true\false для всех возможных пар рычагов,
- * работает только до тех пор, пока есть пары рычагов, информация о которых неизвестна
- * */
- function populatingLeversObj(stateId) {
- let lever1ToSend;
- let lever2ToSend;
- for (let property in levers) {
- if (levers.hasOwnProperty(property)) {
- if (levers[property] == 'noVal') {
- lever1ToSend = property.charAt(0);
- lever2ToSend = property.charAt(1);
- }
- }
- }
- if (lever1ToSend && lever2ToSend) sendCheckMessage(stateId, lever1ToSend, lever2ToSend);
- }
- /* проверяет все ли пары рычагов находятся в true, если да, то пытаться вырубить машину */
- function checkIfAllLeversAreSame(stateId) {
- for (let property in levers) {
- if (levers.hasOwnProperty(property)) {
- if (levers[property] == false || levers[property] == 'noVal') {
- return;
- }
- }
- }
- if (!firedPower) {
- console.log('EVERYTHING IS TRUE, INITIATE SHUTDOWN!');
- firedPower = true;
- let shutdownMessage = {"action": "powerOff", "stateId": stateId};
- connection.send(JSON.stringify(shutdownMessage));
- allLeversAreSame = true;
- }
- }
- });
- client.connect('ws://nuclear.t.javascript.ninja', 'echo-protocol');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement