mirror of
https://github.com/lehanspb/tuya-mqtt.git
synced 2025-12-18 08:13:23 +00:00
tuyapi 5.1.x and protocol 3.3
Initial update to work with tuyapi 5.1.x and support for Tuya protocol ver 3.3 via device discovery.
This commit is contained in:
124
package-lock.json
generated
124
package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "tuya-api",
|
"name": "tuya-mqtt",
|
||||||
"version": "1.0.0",
|
"version": "2.0.1",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -65,11 +65,11 @@
|
|||||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
|
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
|
||||||
},
|
},
|
||||||
"commist": {
|
"commist": {
|
||||||
"version": "1.0.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/commist/-/commist-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz",
|
||||||
"integrity": "sha1-wMNSUBz29S6RJOPvicmAbiAi6+8=",
|
"integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"leven": "^1.0.0",
|
"leven": "^2.1.0",
|
||||||
"minimist": "^1.1.0"
|
"minimist": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -95,11 +95,12 @@
|
|||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||||
},
|
},
|
||||||
"d": {
|
"d": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
|
||||||
"integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
|
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"es5-ext": "^0.10.9"
|
"es5-ext": "^0.10.50",
|
||||||
|
"type": "^1.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
@@ -111,9 +112,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"duplexify": {
|
"duplexify": {
|
||||||
"version": "3.6.0",
|
"version": "3.7.1",
|
||||||
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
|
||||||
"integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
|
"integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"end-of-stream": "^1.0.0",
|
"end-of-stream": "^1.0.0",
|
||||||
"inherits": "^2.0.1",
|
"inherits": "^2.0.1",
|
||||||
@@ -130,13 +131,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"es5-ext": {
|
"es5-ext": {
|
||||||
"version": "0.10.46",
|
"version": "0.10.50",
|
||||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz",
|
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz",
|
||||||
"integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==",
|
"integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"es6-iterator": "~2.0.3",
|
"es6-iterator": "~2.0.3",
|
||||||
"es6-symbol": "~3.1.1",
|
"es6-symbol": "~3.1.1",
|
||||||
"next-tick": "1"
|
"next-tick": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"es6-iterator": {
|
"es6-iterator": {
|
||||||
@@ -203,9 +204,9 @@
|
|||||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
|
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
|
||||||
},
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.1.3",
|
"version": "7.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
|
||||||
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
|
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"fs.realpath": "^1.0.0",
|
"fs.realpath": "^1.0.0",
|
||||||
"inflight": "^1.0.4",
|
"inflight": "^1.0.4",
|
||||||
@@ -319,23 +320,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||||
},
|
},
|
||||||
"json-stable-stringify": {
|
"json-stable-stringify-without-jsonify": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
||||||
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
|
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
|
||||||
"requires": {
|
|
||||||
"jsonify": "~0.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"jsonify": {
|
|
||||||
"version": "0.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
|
|
||||||
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
|
|
||||||
},
|
},
|
||||||
"leven": {
|
"leven": {
|
||||||
"version": "1.0.2",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
|
||||||
"integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM="
|
"integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA="
|
||||||
},
|
},
|
||||||
"minimatch": {
|
"minimatch": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
@@ -372,9 +365,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mqtt-packet": {
|
"mqtt-packet": {
|
||||||
"version": "5.6.0",
|
"version": "5.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-5.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-5.6.1.tgz",
|
||||||
"integrity": "sha512-QECe2ivqcR1LRsPobRsjenEKAC3i1a5gmm+jNKJLrsiq9PaSQ18LlKFuxvhGxWkvGEPadWv6rKd31O4ICqS1Xw==",
|
"integrity": "sha512-eaF9rO2uFrIYEHomJxziuKTDkbWW5psLBaIGCazQSKqYsTaB3n4SpvJ1PexKaDBiPnMLPIFWBIiTYT3IfEJfww==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"bl": "^1.2.1",
|
"bl": "^1.2.1",
|
||||||
"inherits": "^2.0.3",
|
"inherits": "^2.0.3",
|
||||||
@@ -383,9 +376,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
},
|
},
|
||||||
"next-tick": {
|
"next-tick": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
@@ -423,9 +416,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"p-timeout": {
|
"p-timeout": {
|
||||||
"version": "3.0.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.1.0.tgz",
|
||||||
"integrity": "sha512-HKUsVzU+2A+CcItUxgZ4Q1th5Hh2DHtSsh7gLTMkrL8Ki4Ss736nFp+yqb9M/ZKSKb5il0IXeLzBmUqD3k3mzQ==",
|
"integrity": "sha512-C27DYI+tCroT8J8cTEyySGydl2B7FlxrGNF5/wmMbl1V+jeehUCzEE/BVgzRebdm2K3ZitKOKx8YbdFumDyYmw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"p-finally": "^1.0.0"
|
"p-finally": "^1.0.0"
|
||||||
}
|
}
|
||||||
@@ -531,18 +524,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"through2": {
|
"through2": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
|
||||||
"integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
|
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"readable-stream": "^2.1.5",
|
"readable-stream": "~2.3.6",
|
||||||
"xtend": "~4.0.1"
|
"xtend": "~4.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"through2-filter": {
|
"through2-filter": {
|
||||||
"version": "2.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
|
||||||
"integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
|
"integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"through2": "~2.0.0",
|
"through2": "~2.0.0",
|
||||||
"xtend": "~4.0.0"
|
"xtend": "~4.0.0"
|
||||||
@@ -558,13 +551,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tuyapi": {
|
"tuyapi": {
|
||||||
"version": "4.0.4",
|
"version": "5.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/tuyapi/-/tuyapi-4.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/tuyapi/-/tuyapi-5.1.1.tgz",
|
||||||
"integrity": "sha512-0gU6um3Imj3jHNm1cUuP1mXJdf0Z7H+kjhqlQfxuqUwwaB4hAmENatF6mmRhpF6NDzq181rXxU89hJpmw37Lmg==",
|
"integrity": "sha512-CHcyGPDtOMNt4sUUxKSm1KbaciqrMCIswTTLbqh90UFBeEyDHIwhFR70fyNuF3ez4KwbTI2UjfqjQb7dAUCAVw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"debug": "4.1.1",
|
"debug": "4.1.1",
|
||||||
"p-retry": "4.1.0",
|
"p-retry": "4.1.0",
|
||||||
"p-timeout": "3.0.0"
|
"p-timeout": "3.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": {
|
"debug": {
|
||||||
@@ -577,6 +570,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"type": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw=="
|
||||||
|
},
|
||||||
"typedarray": {
|
"typedarray": {
|
||||||
"version": "0.0.6",
|
"version": "0.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
||||||
@@ -593,12 +591,12 @@
|
|||||||
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
|
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
|
||||||
},
|
},
|
||||||
"unique-stream": {
|
"unique-stream": {
|
||||||
"version": "2.2.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
|
||||||
"integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
|
"integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"json-stable-stringify": "^1.0.0",
|
"json-stable-stringify-without-jsonify": "^1.0.1",
|
||||||
"through2-filter": "^2.0.0"
|
"through2-filter": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"util-deprecate": {
|
"util-deprecate": {
|
||||||
@@ -607,14 +605,14 @@
|
|||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||||
},
|
},
|
||||||
"websocket-stream": {
|
"websocket-stream": {
|
||||||
"version": "5.1.2",
|
"version": "5.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.0.tgz",
|
||||||
"integrity": "sha512-lchLOk435iDWs0jNuL+hiU14i3ERSrMA0IKSiJh7z6X/i4XNsutBZrtqu2CPOZuA4G/zabiqVAos0vW+S7GEVw==",
|
"integrity": "sha512-EXy/zXb9kNHI07TIMz1oIUIrPZxQRA8aeJ5XYg5ihV8K4kD1DuA+FY6R96HfdIHzlSzS8HiISAfrm+vVQkZBug==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"duplexify": "^3.5.1",
|
"duplexify": "^3.5.1",
|
||||||
"inherits": "^2.0.1",
|
"inherits": "^2.0.1",
|
||||||
"readable-stream": "^2.3.3",
|
"readable-stream": "^2.3.3",
|
||||||
"safe-buffer": "^5.1.1",
|
"safe-buffer": "^5.1.2",
|
||||||
"ws": "^3.2.0",
|
"ws": "^3.2.0",
|
||||||
"xtend": "^4.0.0"
|
"xtend": "^4.0.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,10 +16,10 @@
|
|||||||
"color-convert": "^1.9.3",
|
"color-convert": "^1.9.3",
|
||||||
"debug": "^3.2.6",
|
"debug": "^3.2.6",
|
||||||
"mqtt": "^2.18.8",
|
"mqtt": "^2.18.8",
|
||||||
"tuyapi": "^4.0.4"
|
"tuyapi": "^5.1.1"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git://github.com/TheAgentK/tuya-mqtt.git"
|
"url": "git://github.com/TheAgentK/tuya-mqtt.git"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ const debugColor = require('debug')('TuyAPI:device:color');
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
const Parser = require('tuyapi/lib/message-parser');
|
const MessageParser = require('tuyapi/lib/message-parser').MessageParser;
|
||||||
|
const Parser = new MessageParser()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends default TuyAPI-Class to add some more error handlers
|
* Extends default TuyAPI-Class to add some more error handlers
|
||||||
@@ -318,4 +319,4 @@ var TuyaDevice = (function () {
|
|||||||
return TuyaDevice;
|
return TuyaDevice;
|
||||||
}());
|
}());
|
||||||
|
|
||||||
module.exports = TuyaDevice;
|
module.exports = TuyaDevice;
|
||||||
|
|||||||
18
tuya-mqtt.js
18
tuya-mqtt.js
@@ -177,7 +177,9 @@ mqtt_client.on('message', function (topic, message) {
|
|||||||
message: message,
|
message: message,
|
||||||
options: options
|
options: options
|
||||||
}));
|
}));
|
||||||
|
if (options.ip == "discover") {
|
||||||
|
delete options.ip
|
||||||
|
}
|
||||||
var device = new TuyaDevice(options);
|
var device = new TuyaDevice(options);
|
||||||
device.then(function (params) {
|
device.then(function (params) {
|
||||||
var device = params.device;
|
var device = params.device;
|
||||||
@@ -226,7 +228,11 @@ function publishStatus(device, status) {
|
|||||||
var tuyaKey = device.options.key;
|
var tuyaKey = device.options.key;
|
||||||
var tuyaIP = device.options.ip;
|
var tuyaIP = device.options.ip;
|
||||||
|
|
||||||
if (typeof tuyaID != "undefined" && typeof tuyaKey != "undefined" && typeof tuyaIP != "undefined") {
|
if (typeof tuyaIP == "undefined") {
|
||||||
|
tuyaIP = "discover"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof tuyaID != "undefined" && typeof tuyaKey != "undefined") {
|
||||||
var topic = CONFIG.topic;
|
var topic = CONFIG.topic;
|
||||||
if (typeof type != "undefined") {
|
if (typeof type != "undefined") {
|
||||||
topic += type + "/";
|
topic += type + "/";
|
||||||
@@ -264,7 +270,11 @@ function publishDPS(device, dps) {
|
|||||||
var tuyaKey = device.options.key;
|
var tuyaKey = device.options.key;
|
||||||
var tuyaIP = device.options.ip;
|
var tuyaIP = device.options.ip;
|
||||||
|
|
||||||
if (typeof tuyaID != "undefined" && typeof tuyaKey != "undefined" && typeof tuyaIP != "undefined") {
|
if (typeof tuyaIP == "undefined") {
|
||||||
|
tuyaIP = "discover"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof tuyaID != "undefined" && typeof tuyaKey != "undefined") {
|
||||||
var baseTopic = CONFIG.topic;
|
var baseTopic = CONFIG.topic;
|
||||||
if (typeof type != "undefined") {
|
if (typeof type != "undefined") {
|
||||||
baseTopic += type + "/";
|
baseTopic += type + "/";
|
||||||
@@ -355,4 +365,4 @@ var tester = new MQTT_Tester();
|
|||||||
function onExit() {
|
function onExit() {
|
||||||
TuyaDevice.disconnectAll();
|
TuyaDevice.disconnectAll();
|
||||||
if (tester) tester.destroy();
|
if (tester) tester.destroy();
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user