-
Notifications
You must be signed in to change notification settings - Fork 1
/
FindMyBusStop.js
143 lines (116 loc) · 3.73 KB
/
FindMyBusStop.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
const inputs = require('./config/core/inputs');
const BusStop = require('./models/BusStop');
const axios = require('axios');
const findBusPrompt = require('prompt');
const addStopToJson = require('prompt');
const fs = require('fs');
console.log("[NCTBuses][FindMyBusStop]");
let line = null;
let searchFor = "";
let direction = "";
let stops = null;
findBusPrompt.start();
findBusPrompt.get(inputs.findMyBusStop, (error, result) => {
if (error) {
console.log(error);
return 1;
}
line = result.line;
searchFor = result.stop;
direction = result.direction;
console.log('Command line received results...');
console.log(`Line: ${result.line}`);
console.log(`Stop: ${result.stop}`);
console.log(`Direction: ${result.direction}`);
if(result.line === "" || result.direction === "") {
console.log("Error: No values supplied. Please try again.");
return 1;
}
getLineStops(result.line, result.direction);
});
const getLineStops = (line, direction) => {
axios.get(`https://nctx.arcticapi.com/network/operators/NCT/lines/${line}/waypoints?direction=${direction.toLowerCase()}`)
.then((response) => {
if(response.data.length <= 0) {
throw new Error("Unable to find stops on route provided. Please try again.");
}
stops = response.data['_embedded']['naptan:stop'];
})
.then(() => {
findStop();
})
.catch((error) => {
console.log(`An error occurred: ${error.message}`);
})
};
const findStop = () => {
const searchArray = [
searchFor.toLowerCase(), // all lowercase
searchFor.toUpperCase(), // ALL UPPERCASE
searchFor.replace(/^\w/, c => c.toUpperCase()) // Capitalise first letter
];
const results = stops.filter(stop => {
let found = false;
searchArray.forEach((query, index) => {
if(stop.commonName.search(query) !== -1) {
found = true
}
});
return found;
});
if(results && results.length > 0) {
processMatches(results);
return;
}
console.log("Error: No stops found. Please try again.");
};
const processMatches = (matches) => {
let formattedMatch = [];
matches.forEach((match, index) => {
formattedMatch.push(new BusStop(match));
});
console.log('Results:');
console.table(formattedMatch);
if(formattedMatch.length === 1) {
addStopToFavouritesPrompt(formattedMatch);
}
};
const addStopToFavouritesPrompt = (matches) => {
addStopToJson.start();
addStopToJson.get(inputs.addStopToFavourites, (error, result) => {
if (error) {
console.log(error);
return 1;
}
const answer = result.addToFavourites.toLowerCase();
if(answer === "yes" || answer === "y" || answer === "ye") {
return addStopToFavourites(matches);
}
});
};
const addStopToFavourites = (matches) => {
fs.readFile('./config/config.json', (error, data) => {
if (error) {
console.error("Error: Could not write to file. Error message - ", error);
return;
}
let json = JSON.parse(data);
json[direction] = {
...json[direction],
[line]: {
name: matches[0].name,
code: matches[0].code
}
};
writeToFile(json);
})
};
const writeToFile = (data) => {
fs.writeFile('./config/config.json', JSON.stringify(data), (error) => {
if (error) {
console.error("Error: Could not write to file. Error message - ", error);
return;
}
console.log("Successfully saved stop to config.");
});
};