89 lines
3.3 KiB
JavaScript
89 lines
3.3 KiB
JavaScript
require('dotenv').config();
|
|
const DelugeRPC = require('deluge-rpc');
|
|
const Enmap = require('enmap');
|
|
const { WebhookClient,
|
|
MessageEmbed } = require('discord.js');
|
|
const deluge = new DelugeRPC(process.env.URL, process.env.PASS);
|
|
const db = new Enmap({ name: 'db' });
|
|
const webhook = new WebhookClient(process.env.WH_ID, process.env.WH_TOKEN, { disableMentions: 'everyone' });
|
|
|
|
const update = async () => {
|
|
try {
|
|
const { torrents } = await deluge.getTorrentRecord();
|
|
if (!torrents) return;
|
|
|
|
Object.entries(torrents).forEach((data) => {
|
|
let [ hash, torrent ] = data;
|
|
let update = (status) => sendUpdate(status, hash, torrent, db.get(hash)?.state);
|
|
|
|
if (!db.get(hash)) {
|
|
update('added');
|
|
db.set(hash, torrent);
|
|
return;
|
|
} else {
|
|
let oldState = db.get(hash)?.state,
|
|
newState = torrent.state;
|
|
|
|
if (oldState == newState) return;
|
|
switch(true) {
|
|
case newState == 'Completed':
|
|
update('completed'); break;
|
|
case newState == 'Seeding':
|
|
update('seeding'); break;
|
|
case newState == 'Paused':
|
|
update('paused'); break;
|
|
case oldState == 'Paused' && (newState == 'Seeding' || newState == 'Downloading'):
|
|
update('unpaused'); break;
|
|
case newState == 'Moving':
|
|
update('moving'); break;
|
|
default:
|
|
update('changed');
|
|
}
|
|
db.set(hash, torrent);
|
|
}
|
|
});
|
|
db.forEach((torrent, hash) => {
|
|
if (Object.keys(torrents).indexOf(hash) == -1) {
|
|
sendUpdate('removed', hash, torrent, 'None');
|
|
db.delete(hash);
|
|
}
|
|
});
|
|
} catch(e) {
|
|
console.error(e);
|
|
webhook.send(new MessageEmbed().setDescription(''+error).setColor('ff0000')).catch();
|
|
}
|
|
}
|
|
update();
|
|
setInterval(update, 1000);
|
|
|
|
/**
|
|
*
|
|
* @param {'added'|'changed'|'paused'|'unpaused'|'seeding'|'completed','removed'|'moving'} update
|
|
* @param {string} hash
|
|
* @param {DelugeRPC.DelugeTorrentRecord} torrent
|
|
*/
|
|
let sendUpdate = (update, hash, torrent, oldState) => {
|
|
console.log(`${update} : ${hash} (${torrent.state})`);
|
|
|
|
let embed = new MessageEmbed()
|
|
.setAuthor(torrent.name)
|
|
.setTitle(updateFriendlyNames[update] || update)
|
|
.addField('Seeds / Peers', `${torrent.total_seeds} / ${torrent.total_peers}`, true)
|
|
.addField('Progress', `${Math.round(torrent.progress * 10) / 10}%`, true)
|
|
.addField('Ratio', Math.round(torrent.ratio * 100) / 100, true)
|
|
.addField('Change', `${oldState} -> ${torrent.state}`, false)
|
|
.addField('Hash', hash, false)
|
|
.setColor(0x4983c6);
|
|
webhook.send(embed);
|
|
}
|
|
|
|
let updateFriendlyNames = {
|
|
added: 'Torrent added',
|
|
paused: 'Torrent paused',
|
|
unpaused: 'Torrent unpaused',
|
|
seeding: 'Torrent started seeding',
|
|
completed: 'Torrent completed',
|
|
changed: 'Torrent updated',
|
|
removed: 'Torrent removed',
|
|
moving: 'Moving'
|
|
} |