Skip to content

Commit c03f540

Browse files
committed
Move to pirate-weather.net and implement rate limiting.
1 parent 412ff3e commit c03f540

File tree

5 files changed

+267
-8
lines changed

5 files changed

+267
-8
lines changed

enc.env

32 Bytes
Binary file not shown.

flake.nix

+10
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,15 @@
3535
specialArgs = { inherit self; };
3636
};
3737

38+
devShells.x86_64-linux.default = pkgs.mkShell {
39+
name = "ACMclock DevShell";
40+
41+
packages = with pkgs; [
42+
nodejs
43+
typescript
44+
typescript-language-server
45+
];
46+
};
47+
3848
};
3949
}

package-lock.json

+227
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
},
99
"files": [
1010
"./dist/*",
11-
"./views/*"
11+
"./views/*"
1212
],
1313
"scripts": {
1414
"clean": "rimraf ./dist/",
@@ -64,6 +64,7 @@
6464
"eslint-webpack-plugin": "^4.2.0",
6565
"file-loader": "^6.2.0",
6666
"node-fetch": "^2.7.0",
67+
"nodemon": "^3.1.9",
6768
"prettier": "^3.5.0",
6869
"rimraf": "^6.0.1",
6970
"sass-loader": "^16.0.4",

src/util/getWeather.ts

+28-7
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,33 @@ import dotenv from "dotenv";
22
import fetch from "node-fetch";
33
dotenv.config();
44

5-
function getWeather(weatherLatLong: string): Promise<{}> {
6-
return new Promise((resolve, reject): void => {
7-
const url = `https://api.darksky.net/forecast/${process.env.DARK_SKY_API_KEY}/${weatherLatLong}?exclude=minutely,hourly,daily,alerts,flags&units=si`;
8-
fetch(url).then((res): {} => res.json()).then((result: {}): void => resolve(result))
9-
.catch((err): void => reject(err));
10-
});
5+
let lastTime: number | null;
6+
let lastResponse: {};
7+
8+
// 15 minutes in millis
9+
const rateLimit: number = (15 * 60 * 1000);
10+
11+
async function getWeather(weatherLatLong: string): Promise<{}> {
12+
const now: number = Date.now();
13+
14+
let answer: {};
15+
if (lastTime == null || (now - lastTime >= rateLimit)) {
16+
lastTime = now;
17+
18+
const url = `https://api.pirateweather.net/forecast/${process.env.DARK_SKY_API_KEY}/${weatherLatLong}?exclude=minutely,hourly,daily,alerts,flags&units=si`;
19+
20+
let res = await fetch(url);
21+
let data = await res.json();
22+
23+
lastResponse = data;
24+
25+
answer = data;
26+
} else {
27+
// Return cached answer
28+
answer = lastResponse;
29+
}
30+
31+
return answer;
1132
}
1233

13-
export default getWeather;
34+
export default getWeather;

0 commit comments

Comments
 (0)