diff --git a/client/package-lock.json b/client/package-lock.json index 43543f0..129b1f2 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,6 +1,6 @@ { "name": "rdio-scanner-client", - "version": "4.6.1", + "version": "4.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/client/package.json b/client/package.json index cfbb659..3c72585 100644 --- a/client/package.json +++ b/client/package.json @@ -33,5 +33,5 @@ "build": "ng build --base-href ./ --prod", "start": "ng serve" }, - "version": "4.6.1" + "version": "4.6.2" } diff --git a/docs/config.md b/docs/config.md index b6c37d9..90d374a 100644 --- a/docs/config.md +++ b/docs/config.md @@ -661,7 +661,7 @@ systems: { + **id** - Unit ID. + **label** - Unit label shown on the right side of six sixth row. -## Load a system from RadioReference.com +## Load a system from RadioReference.com or talkgroups from Trunk Recorder CSV file You may want to load your `server/config.json` with some systems from [RadioReference.com](https://radioreference.com/). diff --git a/docs/install-docker.md b/docs/install-docker.md index 93700a2..e3cfd40 100644 --- a/docs/install-docker.md +++ b/docs/install-docker.md @@ -72,7 +72,21 @@ File /app/data/trs_tg_7537.csv imported successfully into system 11 $ rm ~/.rdio-scanner/trs_tg_7537.csv ``` -# 5. Start Rdio Scanner +# 5. Load talkgroups from a Trunk Recorder CSV file (optional) + +``` bash +$ mv ~/Downloads/tgs.csv ~/.rdio-scanner + +$ docker run -it --rm chuot/rdio-scanner:latest load-tr +USAGE: load-tr + +$ docker run -it --rm --user $(id -u):$(id -g) --volume ~/.rdio-scanner:/app/data chuot/rdio-scanner:latest load-tr 12 tgs.csv +File /app/data/tgs.csv imported successfully into system 12 + +$ rm ~/.rdio-scanner/tgs.csv +``` + +# 6. Start Rdio Scanner By default, [Rdio Scanner](https://github.com/chuot/rdio-scanner) runs on port 3000. It is recommended to configure a **SSL certificate** and then to map port 3000 to port 443 using the `--publish 3000:443` option. diff --git a/docs/install-github.md b/docs/install-github.md index c414894..3cf219d 100644 --- a/docs/install-github.md +++ b/docs/install-github.md @@ -88,7 +88,17 @@ $ node server load-rrdb 11 ~/Downloads/trs_tg_7537.csv File /home/radio/Downloads/trs_tg_7537.csv imported successfully into system 11 ``` -# 5. Start Rdio Scanner +# 5. Load talkgroups from a Trunk Recorder CSV file (optional) + +``` bash +$ node server load-tr +USAGE: load-tr + +$ node server load-tr 12 ~/Downloads/tgs.csv +File /home/radio/Downloads/tgs.csv imported successfully into system 12 +``` + +# 6. Start Rdio Scanner ``` bash $ node run server diff --git a/package.json b/package.json index 93329f8..2e93dee 100644 --- a/package.json +++ b/package.json @@ -11,5 +11,5 @@ "start": "node run", "update": "node update" }, - "version": "4.6.1" + "version": "4.6.2" } diff --git a/server/index.js b/server/index.js index 3cff183..f5cbee2 100644 --- a/server/index.js +++ b/server/index.js @@ -213,6 +213,31 @@ class App { process.exit(); }); + } else if (cmd === 'load-tr') { + this.rdioScanner.once('ready', () => { + if (process.argv.length === 5) { + try { + const sysId = parseInt(process.argv[3], 10); + + const input = path.resolve(process.env.APP_DATA || __dirname, process.argv[4]); + + const msg = this.rdioScanner.utils.loadTR(sysId, input); + + console.log(msg); + + } catch (error) { + console.error(error.message); + } + + } else { + console.log(`USAGE: ${cmd} `); + } + + this.config.persist(); + + process.exit(); + }); + } else if (cmd === 'random-uuid') { this.rdioScanner.once('ready', () => { const count = parseInt(process.argv[3], 10) || 1; diff --git a/server/lib/rdio-scanner/utils.js b/server/lib/rdio-scanner/utils.js index c0b03d7..c1af59e 100644 --- a/server/lib/rdio-scanner/utils.js +++ b/server/lib/rdio-scanner/utils.js @@ -75,6 +75,52 @@ class Utils { return `File ${input} imported successfully into system ${sysId}`; } + loadTR(sysId, input) { + if (typeof sysId !== 'number' || sysId < 0) { + throw new Error(`Invalid system id ${JSON.stringify(sysId)}`); + } + + if (typeof input !== 'string' || !input.length) { + throw new Error(`Invalid filename ${JSON.stringify(input)}`); + } + + input = path.resolve(__dirname, input); + + if (!fs.existsSync(input)) { + throw new Error(`${input} file not found!`); + } + + const csv = fs.readFileSync(input, 'utf8').split(/[\n|\r|\r\n]/).map((csv) => csv.split(/,/)); + + const system = { + id: sysId, + label: path.parse(input).name, + talkgroups: [], + }; + + for (let line of csv) { + const id = parseInt(line[0], 10); + const label = line[3] || ''; + const name = line[4] || ''; + const tag = line[5] || ''; + const group = line[6] || ''; + + if (id > 0 && label.length && name.length && tag.length && group.length) { + system.talkgroups.push({ id, label, name, tag, group }); + } + } + + system.talkgroups.sort((a, b) => a.id - b.id); + + this.config.systems = this.config.systems.filter((system) => system.id !== sysId); + + this.config.systems.push(system); + + this.config.systems.sort((a, b) => a.id - b.id); + + return `File ${input} imported successfully into system ${sysId}`; + } + randomUUID(count = 1) { const uuids = []; diff --git a/server/package-lock.json b/server/package-lock.json index a5cd3ee..29cafba 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,6 +1,6 @@ { "name": "rdio-scanner-server", - "version": "4.6.1", + "version": "4.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/server/package.json b/server/package.json index 3d94d11..4f09ad9 100644 --- a/server/package.json +++ b/server/package.json @@ -39,5 +39,5 @@ "build": "webpack", "start": "nodemon" }, - "version": "4.6.1" + "version": "4.6.2" }