This commit is contained in:
wy 2025-03-12 13:37:21 +08:00
commit 5ec428a75c
3 changed files with 185 additions and 0 deletions

29
README.md Normal file
View File

@ -0,0 +1,29 @@
## Run
```bash
npm install
node index.js
```
## Setup
data/config.json
```json
[
{
"apikey": "",
"email": "your@email.address",
"uid": "your uid"
}
]
```
.env file
```
PORT=20123
TIMEOUT=60000
SMTP_HOST=
SMTP_PORT=
SMTP_SECURE=
SMTP_SENDER=
SMTP_PASS=
```

139
index.js Normal file
View File

@ -0,0 +1,139 @@
import express from 'express'
import * as fs from "node:fs";
import nodemailer from "nodemailer";
import * as dotenv from "dotenv";
dotenv.config()
const app = express()
const PORT = parseInt(process.env.PORT) || 20123
const TIMEOUT = parseInt(process.env.TIMEOUT) || 60000
const SMTP_HOST = process.env.SMTP_HOST
const SMTP_PORT = parseInt(process.env.SMTP_PORT)
const SMTP_SECURE = process.env.SMTP_SECURE === 'true'
const SMTP_SENDER = process.env.SMTP_SENDER
const SMTP_PASS = process.env.SMTP_PASS
console.log(process.env)
let stat = null
app.get('/', (req, res) => {
res.send(JSON.stringify(stat))
})
const configJson = fs.readFileSync('./data/config.json', 'utf8');
const configs = JSON.parse(configJson);
console.log('Read config successfully.');
const fetchData = (uid, key) => fetch(`https://api.torn.com/user/${uid}?selections=cooldowns,bars,travel&key=${key}`)
const transporter = nodemailer.createTransport({
host: SMTP_HOST,
port: SMTP_PORT,
secure: SMTP_SECURE, // true for port 465, false for other ports
auth: {
user: SMTP_SENDER,
pass: SMTP_PASS,
},
});
if (configs.length > 0) {
for (const config of configs) {
if (!config['apikey'] || typeof config['apikey'] !== 'string') {
throw new Error('配置文件apikey无效')
}
if (!config['email'] || typeof config['email'] !== 'string') {
throw new Error('配置文件email无效')
}
if (!config['uid'] || typeof config['uid'] !== 'string' || (config['uid'] | 0) === 0) {
throw new Error('配置文件uid无效')
}
const apikey = config['apikey']
const email = config['email']
const uid = config['uid']
// transporter.sendMail({
// from: `"Torn通知" <${SMTP_SENDER}>`, // sender address
// to: email, // list of receivers
// subject: "Torn通知测试", // Subject line
// text: "这是一封测试邮件 - Wuhu Mail Notify Project", // plain text body
// // html: "<b>Hello world?</b>", // html body
// }).catch(console.error);
const timeout = async () => {
try {
const apiData = await (await fetchData(uid, apikey)).json();
const date = new Date(); // ms
const timestamp = date.getTime() //ms
const serverTime = apiData?.server_time * 1000; // ms
const timeDiff = parseInt((timestamp - serverTime) / 1000 + ''); // sec
const drugCd = apiData?.cooldowns?.drug
const energyFull = apiData?.energy?.fulltime
const nerveFull = apiData?.nerve?.fulltime
const travelTimeLeft = apiData?.travel?.time_left
// cd
if (drugCd && typeof drugCd === 'number' && drugCd - timeDiff < 60 && drugCd - timeDiff > 0) {
transporter.sendMail({
from: `"Torn通知" <${SMTP_SENDER}>`, // sender address
to: email, // list of receivers
subject: "到饭点了", // Subject line
text: "药CD即将结束 - Wuhu Mail Notify Project", // plain text body
// html: "<b>Hello world?</b>", // html body
}).catch(console.error);
} else {
console.log(`[${uid}]毒CD未到通知时间 ( 还需 ${drugCd - timeDiff}s ),跳过`)
}
// 体力满
if (energyFull && typeof energyFull === 'number' && energyFull - timeDiff < 60 && energyFull - timeDiff > 0) {
transporter.sendMail({
from: `"Torn通知" <${SMTP_SENDER}>`,
to: email,
subject: "体力已满",
text: "角色体力已满 - Wuhu Mail Notify Project",
}).catch(console.error);
} else {
console.log(`[${uid}]体力未满 ( 还需 ${energyFull - timeDiff}s ),跳过`)
}
// 精神满
if (nerveFull && typeof nerveFull === 'number' && nerveFull - timeDiff < 60 && nerveFull - timeDiff > 0) {
transporter.sendMail({
from: `"Torn通知" <${SMTP_SENDER}>`,
to: email,
subject: "精神已满",
text: "角色精神已满 - Wuhu Mail Notify Project",
}).catch(console.error);
} else {
console.log(`[${uid}]精神未满 ( 还需 ${nerveFull - timeDiff}s ),跳过`)
}
// 飞机落地
if (travelTimeLeft && typeof travelTimeLeft === 'number' && travelTimeLeft - timeDiff < 60 && travelTimeLeft - timeDiff > 0) {
transporter.sendMail({
from: `"Torn通知" <${SMTP_SENDER}>`,
to: email,
subject: "飞行结束",
text: "角色即将落地 - Wuhu Mail Notify Project",
}).catch(console.error);
} else {
console.log(`[${uid}]飞机未到通知时间 ( 还需 ${travelTimeLeft - timeDiff}s ),跳过`)
}
} catch (e) {
console.error(e)
stat = {
stack: e.stack,
msg: e.message,
ts: Date.now(),
}
}
setTimeout(timeout, TIMEOUT)
}
timeout().catch(console.error)
}
} else {
throw new Error('配置文件列表为空')
}
app.listen(PORT, () => {
console.log(`App listening on port ${PORT}`)
})

17
package.json Normal file
View File

@ -0,0 +1,17 @@
{
"name": "wuhu-mail-notify",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"serve": "node index.js"
},
"private": true,
"devDependencies": {
"dotenv": "^16.4.7",
"express": "^4.21.2",
"nodemailer": "^6.10.0"
}
}