diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000..de44917 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,18 @@ +--- +engines: + duplication: + enabled: true + config: + languages: + - javascript + eslint: + enabled: true + +ratings: + paths: + - "**.inc" + - "**.js" + - "**.jsx" + - "**.module" + +exclude_paths: ['eadocs'] diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..96212a3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +**/*{.,-}min.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..9faa375 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,213 @@ +ecmaFeatures: + modules: true + jsx: true + +env: + amd: true + browser: true + es6: true + jquery: true + node: true + +# http://eslint.org/docs/rules/ +rules: + # Possible Errors + comma-dangle: [2, never] + no-cond-assign: 2 + no-console: 0 + no-constant-condition: 2 + no-control-regex: 2 + no-debugger: 2 + no-dupe-args: 2 + no-dupe-keys: 2 + no-duplicate-case: 2 + no-empty: 2 + no-empty-character-class: 2 + no-ex-assign: 2 + no-extra-boolean-cast: 2 + no-extra-parens: 0 + no-extra-semi: 2 + no-func-assign: 2 + no-inner-declarations: [2, functions] + no-invalid-regexp: 2 + no-irregular-whitespace: 2 + no-negated-in-lhs: 2 + no-obj-calls: 2 + no-regex-spaces: 2 + no-sparse-arrays: 2 + no-unexpected-multiline: 2 + no-unreachable: 2 + use-isnan: 2 + valid-jsdoc: 0 + valid-typeof: 2 + + # Best Practices + accessor-pairs: 2 + block-scoped-var: 0 + complexity: [2, 6] + consistent-return: 0 + curly: 0 + default-case: 0 + dot-location: 0 + dot-notation: 0 + eqeqeq: 2 + guard-for-in: 2 + no-alert: 2 + no-caller: 2 + no-case-declarations: 2 + no-div-regex: 2 + no-else-return: 0 + no-empty-label: 2 + no-empty-pattern: 2 + no-eq-null: 2 + no-eval: 2 + no-extend-native: 2 + no-extra-bind: 2 + no-fallthrough: 2 + no-floating-decimal: 0 + no-implicit-coercion: 0 + no-implied-eval: 2 + no-invalid-this: 0 + no-iterator: 2 + no-labels: 0 + no-lone-blocks: 2 + no-loop-func: 2 + no-magic-number: 0 + no-multi-spaces: 0 + no-multi-str: 0 + no-native-reassign: 2 + no-new-func: 2 + no-new-wrappers: 2 + no-new: 2 + no-octal-escape: 2 + no-octal: 2 + no-proto: 2 + no-redeclare: 2 + no-return-assign: 2 + no-script-url: 2 + no-self-compare: 2 + no-sequences: 0 + no-throw-literal: 0 + no-unused-expressions: 2 + no-useless-call: 2 + no-useless-concat: 2 + no-void: 2 + no-warning-comments: 0 + no-with: 2 + radix: 2 + vars-on-top: 0 + wrap-iife: 2 + yoda: 0 + + # Strict + strict: 0 + + # Variables + init-declarations: 0 + no-catch-shadow: 2 + no-delete-var: 2 + no-label-var: 2 + no-shadow-restricted-names: 2 + no-shadow: 0 + no-undef-init: 2 + no-undef: 0 + no-undefined: 0 + no-unused-vars: 0 + no-use-before-define: 0 + + # Node.js and CommonJS + callback-return: 2 + global-require: 2 + handle-callback-err: 2 + no-mixed-requires: 0 + no-new-require: 0 + no-path-concat: 2 + no-process-exit: 2 + no-restricted-modules: 0 + no-sync: 0 + + # Stylistic Issues + array-bracket-spacing: 0 + block-spacing: 0 + brace-style: 0 + camelcase: 0 + comma-spacing: 0 + comma-style: 0 + computed-property-spacing: 0 + consistent-this: 0 + eol-last: 0 + func-names: 0 + func-style: 0 + id-length: 0 + id-match: 0 + indent: 0 + jsx-quotes: 0 + key-spacing: 0 + linebreak-style: 0 + lines-around-comment: 0 + max-depth: 0 + max-len: 0 + max-nested-callbacks: 0 + max-params: 0 + max-statements: [2, 30] + new-cap: 0 + new-parens: 0 + newline-after-var: 0 + no-array-constructor: 0 + no-bitwise: 0 + no-continue: 0 + no-inline-comments: 0 + no-lonely-if: 0 + no-mixed-spaces-and-tabs: 0 + no-multiple-empty-lines: 0 + no-negated-condition: 0 + no-nested-ternary: 0 + no-new-object: 0 + no-plusplus: 0 + no-restricted-syntax: 0 + no-spaced-func: 0 + no-ternary: 0 + no-trailing-spaces: 0 + no-underscore-dangle: 0 + no-unneeded-ternary: 0 + object-curly-spacing: 0 + one-var: 0 + operator-assignment: 0 + operator-linebreak: 0 + padded-blocks: 0 + quote-props: 0 + quotes: 0 + require-jsdoc: 0 + semi-spacing: 0 + semi: 0 + sort-vars: 0 + space-after-keywords: 0 + space-before-blocks: 0 + space-before-function-paren: 0 + space-before-keywords: 0 + space-in-parens: 0 + space-infix-ops: 0 + space-return-throw-case: 0 + space-unary-ops: 0 + spaced-comment: 0 + wrap-regex: 0 + + # ECMAScript 6 + arrow-body-style: 0 + arrow-parens: 0 + arrow-spacing: 0 + constructor-super: 0 + generator-star-spacing: 0 + no-arrow-condition: 0 + no-class-assign: 0 + no-const-assign: 0 + no-dupe-class-members: 0 + no-this-before-super: 0 + no-var: 0 + object-shorthand: 0 + prefer-arrow-callback: 0 + prefer-const: 0 + prefer-reflect: 0 + prefer-spread: 0 + prefer-template: 0 + require-yield: 0 diff --git a/README.md b/README.md index 5a58f28..59bac6b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Code Climate](https://codeclimate.com/github/dfk7677/BattleCon/badges/gpa.svg)](https://codeclimate.com/github/dfk7677/BattleCon) + ![BattleCon - BATTLEFIELD layer on node.js](https://raw.github.com/dcodeIO/BattleCon/master/BattleCon.png) ======================================== BattleCon is a Battlefield / Frostbite engine RCON layer built on top of nothing less than the excellent node.js diff --git a/eadocs/BF4/BF4 PC Base Game Maps and Modes.pdf b/eadocs/BF4/BF4 PC Base Game Maps and Modes.pdf deleted file mode 100644 index f900e5c..0000000 Binary files a/eadocs/BF4/BF4 PC Base Game Maps and Modes.pdf and /dev/null differ diff --git a/eadocs/BF4/BF4 PC Base Game Maps.csv b/eadocs/BF4/BF4 PC Base Game Maps.csv deleted file mode 100644 index ccb6621..0000000 --- a/eadocs/BF4/BF4 PC Base Game Maps.csv +++ /dev/null @@ -1,11 +0,0 @@ -Engine name;Human-readable name;Game modes -MP_Abandoned;Zavod 311;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_Damage;Lancang Dam;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_Flooded;Flood Zone;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_Journey;Golmud Railway;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_Naval;Paracel Storm;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_Prison;Operation Locker;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_Resort;Hainan Resort;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_Siege;Siege of Shanghai;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_TheDish;Rogue Transmission;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 -MP_Tremors;Dawnbreaker;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0 diff --git a/eadocs/BF4/BF4 PC Base Game Modes.csv b/eadocs/BF4/BF4 PC Game Modes.csv similarity index 52% rename from eadocs/BF4/BF4 PC Base Game Modes.csv rename to eadocs/BF4/BF4 PC Game Modes.csv index fbb4544..c0effe7 100644 --- a/eadocs/BF4/BF4 PC Base Game Modes.csv +++ b/eadocs/BF4/BF4 PC Game Modes.csv @@ -1,9 +1,16 @@ -Engine Name;Human-Readable Name;Intended max player count -ConquestLarge0;Conquest;64 -ConquestSmall0;Conquest;32 -Domination0;Domination;20 -Elimination0;Defuse;10 -Obliteration;Obliteration;32 -RushLarge0;Rush;32 -SquadDeathMatch0;Squad Deathmatch;16 -TeamDeathMatch0;Team Deathmatch;24 +Engine Name;Human-Readable Name;Intended max player count +ConquestLarge0;Conquest;64 +ConquestSmall0;Conquest;32 +Domination0;Domination;20 +Elimination0;Defuse;10 +Obliteration;Obliteration;32 +RushLarge0;Rush;32 +SquadDeathMatch0;Squad Deathmatch;16 +TeamDeathMatch0;Team Deathmatch;24 +AirSuperiority0;Air Superiority;24 +CaptureTheflag0;Capture the flag;32 +CarrierAssaultSmall0;CarrierAssault;32 +CarrierAssaultLarge0;CarrierAssault;64 +SquadObliteration0;Squad Obliteration;10 +GunMaster0;Gun Master;20 +GunMaster1;Gun Master;20 diff --git a/eadocs/BF4/BF4 PC Maps and Game Modes.pdf b/eadocs/BF4/BF4 PC Maps and Game Modes.pdf new file mode 100644 index 0000000..033f43a Binary files /dev/null and b/eadocs/BF4/BF4 PC Maps and Game Modes.pdf differ diff --git a/eadocs/BF4/BF4 PC Maps.csv b/eadocs/BF4/BF4 PC Maps.csv new file mode 100644 index 0000000..ea55e70 --- /dev/null +++ b/eadocs/BF4/BF4 PC Maps.csv @@ -0,0 +1,33 @@ +Engine name;Human-readable name;Game modes,,,,,,,,,,,, +MP_Abandoned;Zavod 311;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,SquadObliteration0,GunMaster0,,, +MP_Damage;Lancang Dam;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,,GunMaster0,,, +MP_Flooded;Flood Zone;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,,GunMaster0,,, +MP_Journey;Golmud Railway;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,SquadObliteration0,GunMaster0,,, +MP_Naval;Paracel Storm;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,SquadObliteration0,GunMaster0,,, +MP_Prison;Operation Locker;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,SquadObliteration0,GunMaster0,,, +MP_Resort;Hainan Resort;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,SquadObliteration0,GunMaster0,,, +MP_Siege;Siege of Shanghai;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,SquadObliteration0,GunMaster0,,, +MP_TheDish;Rogue Transmission;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,,GunMaster0,,, +MP_Tremors;Dawnbreaker;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,SquadObliteration0,GunMaster0,,, +XP1_001;Silk Road;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,AirSuperiority0,,,, +XP1_002;Altai Range;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,AirSuperiority0,,,, +XP1_003;Guilin Peaks;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,AirSuperiority0,,,, +XP1_004;Dragon Pass;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,AirSuperiority0,,,, +XP0_Caspian;Caspian Border 2014;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CaptureTheflag0,,,, +XP0_Firestorm;Firestorm 2014;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CaptureTheflag0,,,, +XP0_Metro;Operation Metro 2014;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CaptureTheflag0,,,, +XP0_Oman;Gulf of Oman 2014;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CaptureTheflag0,,,, +XP2_001;Lost Islands;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CarrierAssaultLarge/Small0,,,, +XP2_002;Nansha Strike;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CarrierAssaultLarge/Small0,,,, +XP2_003;Wave Breaker;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CarrierAssaultLarge/Small0,,,, +XP2_004;Operation Mortar;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CarrierAssaultLarge/Small0,,,, +XP3_MarketPl;Pearl Market;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,Chainlink0,CaptureTheFlag0,,, +XP3_Prpganda;Propaganda;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,Chainlink0,CaptureTheFlag0,,, +XP3_UrbanGdn;Lumpini Garden;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,Chainlink0,CaptureTheFlag0,,, +XP3_WtrFront;Sunken Dragon;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,Chainlink0,CaptureTheFlag0,,, +XP4_Arctic;Operation Whiteout;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CaptureTheFlag0,,,, +XP4_SubBase;Hammerhead;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CaptureTheFlag0,,,, +XP4_Titan;Hangar 21;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CaptureTheFlag0,,,, +XP4_WalkerFactory;Giants of Karelia;ConquestLarge0,ConquestSmall0,Domination0,Elimination0,Obliteration,RushLarge0,SquadDeathMatch0,TeamDeathMatch0,CaptureTheFlag0,,,, +XP5_Night_01;Zavod:Graveyard Shift;ConquestLarge0,ConquestSmall0,Domination0,Obliteration,RushLarge0,TeamDeathMatch0,GunMaster0,GunMaster1,,,,, +XP6_CMP;Operation Outbreak;ConquestLarge0,ConquestSmall0,Domination0,Obliteration,RushLarge0,TeamDeathMatch0,TeamDeathMatch1,SquadDeathMatch0,SquadDeathMatch1,CaptureTheFlag0,Chainlink0,GunMaster0,GunMaster1 diff --git a/eadocs/BF4/BF4 PC Server Administration.pdf b/eadocs/BF4/BF4 PC Server Administration.pdf index a5b95d9..0ab0371 100644 Binary files a/eadocs/BF4/BF4 PC Server Administration.pdf and b/eadocs/BF4/BF4 PC Server Administration.pdf differ diff --git a/eadocs/BF4/BF4 PC Server Remote Administration Protocol.pdf b/eadocs/BF4/BF4 PC Server Remote Administration Protocol.pdf index 3f5b8d2..d4edd6b 100644 Binary files a/eadocs/BF4/BF4 PC Server Remote Administration Protocol.pdf and b/eadocs/BF4/BF4 PC Server Remote Administration Protocol.pdf differ diff --git a/eadocs/BF4/Default Values.pdf b/eadocs/BF4/Default Values.pdf new file mode 100644 index 0000000..b5d0a50 Binary files /dev/null and b/eadocs/BF4/Default Values.pdf differ diff --git a/eadocs/BF4/R53 Document Changes.pdf b/eadocs/BF4/R53 Document Changes.pdf new file mode 100644 index 0000000..cd400d6 Binary files /dev/null and b/eadocs/BF4/R53 Document Changes.pdf differ diff --git a/eadocs/BF4/R6 Document Changes.pdf b/eadocs/BF4/R6 Document Changes.pdf deleted file mode 100644 index 550e2b0..0000000 Binary files a/eadocs/BF4/R6 Document Changes.pdf and /dev/null differ diff --git a/src/BattleCon.js b/src/BattleCon.js index 8018a14..4c1aa48 100644 --- a/src/BattleCon.js +++ b/src/BattleCon.js @@ -24,6 +24,7 @@ var events = require("events"), * @param {string} host Hostname or IP * @param {number} port Port * @param {string} pass RCON password + * @param {number} server id (multiple server connections) * @constructor * @extends events.EventEmitter */ @@ -34,6 +35,7 @@ var BattleCon = function(host, port, pass) { this.host = host; this.port = port; this.pass = pass; + this.timeout_interval; // Connection state this.loggedIn = false; @@ -41,6 +43,7 @@ var BattleCon = function(host, port, pass) { this.id = 0x3fffffff; this.buf = new Buffer(0); this.cbs = {}; + }; // Event | Meaning @@ -83,33 +86,63 @@ BattleCon.prototype.use = function(gameModule, options) { * @param {function(Error)=} callback Callback */ BattleCon.prototype.connect = function(callback) { - if (this.sock !== null) return; + if (this.sock !== null) + { + // console.log('socket exists') + return; + } this.sock = new net.Socket(); + //setting a timeout of 20s to close socket if server doesn't respond + this.sock.setTimeout(20000, function() { + console.log('Timeout reached'); + this.sock.end(); + this.sock.destroy(); + + }.bind(this)); + var cbCalled = false; this.sock.on("error", function(err) { if (!this.loggedIn && callback && !cbCalled) { cbCalled = true; callback(err); } - this.emit("error", err); + this.emit("error",err); }.bind(this)); + this.sock.on("close", function() { + //emitting server ID on close() this.emit("close"); this.sock = null; + clearInterval(this.timeout_interval); + }.bind(this)); + this.sock.connect(this.port, this.host, function() { this.emit("connect"); this.sock.on("data", this._gather.bind(this)); - if (this.login) this.login(callback); + if (this.login) {this.login(callback);} + //pinging server every 10s so that the 20s timeout doesn't happen because of server being idle. + clearInterval(this.timeout_interval); + this.timeout_interval = setInterval( function () { + this.exec('version'); + //console.log('Pinging Server'); + }.bind(this), 10000); + }.bind(this)); + + }; + + /** * Disconnects from the server. */ BattleCon.prototype.disconnect = function() { if (this.sock !== null) { - this.sock.end(); + this.sock.end(); + + } }; @@ -129,7 +162,7 @@ BattleCon.prototype._gather = function(chunk) { try { this._process(Message.decode(data)); } catch (err) { - this.emit("error", err); + this.emit("error",err); } } while (true); }; @@ -141,7 +174,7 @@ BattleCon.prototype._gather = function(chunk) { */ BattleCon.prototype._process = function(msg) { if (msg.data.length == 0) { - this.emit("error", "empty message received"); + this.emit("error","Empty message received"); return; } if (msg.isFromServer()) { @@ -189,7 +222,7 @@ BattleCon.tabulate = function(res, offset) { if (!offset) offset = 0; var nColumns = parseInt(res[offset], 10), columns = []; - for (var i=offset+1; i<=nColumns; i++) { + for (var i=offset+1; i<=nColumns+offset; i++) { columns.push(res[i]); } var nRows = parseInt(res[i], 10), diff --git a/src/games/BF.js b/src/games/BF.js index d55ef91..0d00a4f 100644 --- a/src/games/BF.js +++ b/src/games/BF.js @@ -18,56 +18,66 @@ * Loads the BF (common) module. * @param {!BattleCon} bc */ -module.exports = function(bc) { +"use strict"; + +module.exports = (bc) => { // Extends core bc.use("core"); // Parse events - bc.on("event", function(msg) { - switch (msg.data[0]) { - case "player.onJoin": + bc.on("event", (msg) => { + + let msgMap = { + 'player.onJoin' : () => { bc.emit("player.join", /* name */ msg.data[1], /* uid */ msg.data[2]); - break; - case "player.onAuthenticated": + }, + 'player.onAuthenticated' : () => { bc.emit("player.authenticated", /* name */ msg.data[1]); - break; - case "player.onLeave": + }, + 'player.onLeave' : () => { bc.emit("player.leave", /* name */ msg.data[1], /* info */ bc.tabulate(msg.data, 2)[0]); - break; - case "player.onSpawn": + }, + 'player.onSpawn' : () => { bc.emit("player.spawn", /* name */ msg.data[1], /* team */ parseInt(msg[2], 10)); - break; - case "player.onSquadChange": + }, + 'player.onSquadChange' : () => { bc.emit("player.squadChange", /* name */ msg.data[1], /* team */ parseInt(msg.data[2], 10), /* squad */ parseInt(msg.data[3], 10)); - break; - case "player.onTeamChange": + }, + 'player.onTeamChange' : () => { bc.emit("player.teamChange", /* name */ msg.data[1], /* team */ parseInt(msg.data[2], 10), /* squad */ parseInt(msg.data[3], 10)); - break; - case "player.onKill": + }, + 'player.onKill' : () => { bc.emit("player.kill", /* killer */ msg.data[1], /* victim */ msg.data[2], /* weapon */ msg.data[3], /* headshot */ msg.data[4] === "true"); - break; - case "player.onChat": + }, + 'player.onChat' : () => { bc.emit("player.chat", /* name */ msg.data[1], /* text */ msg.data[2], /* player subset */ msg.data.slice(3)); - break; - case "server.onLevelLoaded": + }, + 'server.onLevelLoaded' : () => { bc.emit("server.levelLoaded", /* name */ msg.data[1], /* mode name */ msg.data[2], /* round no. */ parseInt(msg.data[3], 10), /* of total rounds */ parseInt(msg.data[4], 10)); - break; - case "server.onRoundOver": + }, + 'server.onRoundOver' : () => { bc.emit("server.roundOver", /* winning team */ parseInt(msg.data[1], 10)); - break; - case "server.onRoundOverPlayers": + }, + 'server.onRoundOverPlayers' : () => { bc.emit("server.roundOverPlayers", /* players */ bc.tabulate(msg.data, 1)); - break; - case "server.onRoundOverTeamScores": + }, + 'server.onRoundOverTeamScores' : () => { var n = parseInt(msg.data[1], 10), // # scores scores = []; for (var i=2; i<2+n; i++) { scores.push(parseFloat(msg.data[i])); } bc.emit("server.roundOverTeamScores", /* scores array */ scores, /* target score */ parseInt(msg.data[i], 10)); - break; + } + + }; + if(typeof msgMap[msg.data[0]]==='function') { + msgMap[msg.data[0]](); } + }); + + }; diff --git a/src/games/core.js b/src/games/core.js index cc79b61..b5ef5b2 100644 --- a/src/games/core.js +++ b/src/games/core.js @@ -43,7 +43,9 @@ module.exports = function(bc) { bc.on("login", function() { // Enable events - bc.eventsEnabled(true, function(err, enabled) {}); + bc.eventsEnabled(true, function(err, enabled) { + if (err) return; + }); // Get list of available commands / vars bc.help(function(err, msg) { @@ -99,19 +101,26 @@ module.exports = function(bc) { enabled = null; } if (typeof enabled !== 'boolean') { // Just query + execEventsEnabled(bc, callback); + /* bc.exec(["admin.eventsEnabled"], function(err, res) { if (err) { callback(err); return; } callback(null, res[0] === "true"); + + }); + */ } else { // Set and query bc.exec(["admin.eventsEnabled", enabled ? "true" : "false"], function(err, res) { if (err) { callback(err); return; } + execEventsEnabled(bc, callback); + /* bc.exec(["admin.eventsEnabled"], function(err, res) { if (err) { callback(err); @@ -119,6 +128,7 @@ module.exports = function(bc) { } callback(null, res[0] === "true"); }); + */ }); } }; @@ -162,28 +172,35 @@ module.exports = function(bc) { * @param {function(Error)=} callback Callback */ bc.login = function(callback) { - this.exec(["login.hashed"], function(err, res) { + this.exec(["login.hashed"], (err, res) => { + hashError(this,err,callback); + /* if (err) { this.sock.end(); this.emit("error", err); - if (callback) callback(err); - return; + if (callback) return callback(err); + return callback(); } + */ var md = crypto.createHash("md5"); md.update(res[0], "hex"); md.update(this.pass, "utf8"); - this.exec(["login.hashed", md.digest("hex").toUpperCase()], function(err) { + this.exec(["login.hashed", md.digest("hex").toUpperCase()], (err) => { + hashError(this,err,callback); + /* if (err) { this.sock.end(); this.emit("error", err); - if (callback) callback(err); - return; + if (callback) return callback(err); + return false; } + */ + this.loggedIn = true; this.emit("login"); - if (callback) callback(null); - }.bind(this)); - }.bind(this)); + if (callback) return callback(null); + }); + }); }; /** @@ -193,10 +210,10 @@ module.exports = function(bc) { bc.logout = function(callback) { this.exec(["logout"], function(err) { if (err) { - if (callback) callback(err); - return; + if (callback) return callback(err); + return callback(); } - if (callback) callback(null); + if (callback) return callback(null); }); }; @@ -207,10 +224,30 @@ module.exports = function(bc) { bc.quit = function(callback) { bc.exec(["quit"], function(err, res) { if (err) { - if (callback) callback(err); - return; + if (callback) return callback(err); + return callback(); } - if (callback) callback(null); + if (callback) return callback(null); }); }; }; + + +function execEventsEnabled (bc, cb) { + bc.exec(["admin.eventsEnabled"], function(err, res) { + if (err) { + cb(err); + return; + } + cb(null, res[0] === "true"); + }); +} + +function hashError (th, error, cb) { + if (error) { + th.sock.end(); + th.emit("error", error); + if (cb) return cb(err); + return false; + } +}