@tom2012/po 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/bin/po.js +84 -0
  2. package/package.json +13 -0
package/bin/po.js ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+
3
+ const https = require("https");
4
+ const { program } = require("commander");
5
+
6
+ program
7
+ .requiredOption("-k, --key <key>", "Bark Key")
8
+ .option("-w, --work <minutes>", "工作时长(分钟)", "30")
9
+ .option("-r, --rest <minutes>", "休息时长(分钟)", "5")
10
+ .parse();
11
+
12
+ const opts = program.opts();
13
+ const BARK_KEY = opts.key;
14
+ const WORK_MIN = parseInt(opts.work, 10);
15
+ const REST_MIN = parseInt(opts.rest, 10);
16
+
17
+ function bark(title, body) {
18
+ return new Promise((resolve) => {
19
+ const url = `https://api.day.app/${BARK_KEY}/${encodeURIComponent(title)}/${encodeURIComponent(body)}?sound=minuet`;
20
+ https
21
+ .get(url, (res) => {
22
+ res.resume();
23
+ if (res.statusCode === 200) {
24
+ console.log(`[✓] ${title} - ${body}`);
25
+ } else {
26
+ console.log(`[✗] 发送失败: ${res.statusCode}`);
27
+ }
28
+ resolve();
29
+ })
30
+ .on("error", (e) => {
31
+ console.log(`[✗] 发送异常: ${e.message}`);
32
+ resolve();
33
+ });
34
+ });
35
+ }
36
+
37
+ function sleep(minutes) {
38
+ const total = minutes * 60;
39
+ return new Promise((resolve) => {
40
+ const timer = setInterval(() => {
41
+ const left = Math.ceil((end - Date.now()) / 1000);
42
+ const m = Math.floor(left / 60);
43
+ const s = left % 60;
44
+ process.stdout.write(`\r 剩余 ${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")} `);
45
+ if (left <= 0) {
46
+ clearInterval(timer);
47
+ process.stdout.write("\r" + " ".repeat(20) + "\r");
48
+ resolve();
49
+ }
50
+ }, 1000);
51
+ const end = Date.now() + total * 1000;
52
+ });
53
+ }
54
+
55
+ async function shutdown() {
56
+ console.log("\n停止中...");
57
+ await bark("番茄钟", "番茄钟已结束");
58
+ process.exit(0);
59
+ }
60
+
61
+ process.on("SIGTERM", shutdown);
62
+ process.on("SIGINT", shutdown);
63
+
64
+ async function main() {
65
+ await bark("番茄钟", "番茄钟已启动");
66
+ console.log(`番茄钟: 工作 ${WORK_MIN} 分钟 / 休息 ${REST_MIN} 分钟\n`);
67
+
68
+ let cycle = 1;
69
+ while (true) {
70
+ console.log(`--- 第 ${cycle} 轮 ---`);
71
+
72
+ console.log(`⏱ 工作中 (${WORK_MIN} 分钟)...`);
73
+ await sleep(WORK_MIN);
74
+ await bark("起立", "站起来活动一下吧!");
75
+
76
+ console.log(`⏱ 休息中 (${REST_MIN} 分钟)...`);
77
+ await sleep(REST_MIN);
78
+ await bark("坐下", "可以坐下继续工作了。");
79
+
80
+ cycle++;
81
+ }
82
+ }
83
+
84
+ main();
package/package.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "@tom2012/po",
3
+ "version": "1.0.0",
4
+ "description": "番茄钟 CLI,通过 Bark 推送站立/坐下提醒",
5
+ "bin": {
6
+ "po": "./bin/po.js"
7
+ },
8
+ "keywords": ["pomodoro", "bark", "cli", "timer", "standing-desk"],
9
+ "license": "MIT",
10
+ "dependencies": {
11
+ "commander": "^13.0.0"
12
+ }
13
+ }