201 lines
6.5 KiB
JavaScript
201 lines
6.5 KiB
JavaScript
/**
|
|
* @param context {WebtaskContext}
|
|
*/
|
|
module.exports = function(context, cb) {
|
|
|
|
const axios = require('axios');
|
|
const TelegramBot = require('node-telegram-bot-api');
|
|
const bot = new TelegramBot(context.secrets.bot_token);
|
|
//bot.setWebHook('https://wt-fb95a52ccc1baaa2f9876a683e6b1325-0.sandbox.auth0-extend.com/tages100');
|
|
|
|
/*
|
|
start - Willkommens Nachticht
|
|
news - Aktuelles Tagesschau in 100 Sekunden Video
|
|
list - Auflistung Ihrer Abos
|
|
add - Hinzufügen eines täglichen News Abos
|
|
remove - Löscht ein Abo
|
|
*/
|
|
|
|
bot.on('message', function onMessage(msg) {
|
|
// console.log('message', msg);
|
|
|
|
if (msg.text.match(/\/news/g) !== null) {
|
|
return sendLatestVideo(msg.chat.id);
|
|
} else if (msg.text.match(/\/list/g) !== null) {
|
|
return listAbo(msg.chat.id);
|
|
} else if (msg.text.match(/\/add/g) !== null) {
|
|
return addAbo(msg.chat.id, msg.text);
|
|
} else if (msg.text.match(/\/remove/g) !== null) {
|
|
return removeAbo(msg.chat.id, msg.text);
|
|
} else if (msg.text.match(/\/start/g) !== null) {
|
|
return help(msg.chat.id);
|
|
} else if (msg.text.match(/\/help/g) !== null) {
|
|
return help(msg.chat.id);
|
|
}
|
|
return bot.sendMessage(msg.chat.id, 'Ich konnte Ihre Eingabe nicht verarbeiten. Mit dem Befehl /help können Sie sich alle Befehle anzeigen lassen.');
|
|
|
|
});
|
|
|
|
function sendLatestVideo(chatId) {
|
|
axios.get('http://www.tagesschau.de/100sekunden/index.html').then(function (response) {
|
|
// parse src url from html
|
|
response.data.replace(/\"/g, `\\`);
|
|
// const regex = /download.media.tagesschau.de\/video\/\d{4}\/\d{4}\/TV-\d{8}-\d{4}-\d{4}.\w{4,}.h264.mp4/g;
|
|
// sm m l xl
|
|
const regex = /download.media.tagesschau.de\/video\/\d{4}\/\d{4}\/TV-\d{8}-\d{4}-\d{4}.websm.h264.mp4/g;
|
|
const found = response.data.match(regex);
|
|
// console.log(found[0]);
|
|
|
|
// build datestrings
|
|
const a = found[0].split('TV-')[1].split('-');
|
|
const date = a[0].slice(6) + "." + a[0].slice(4, 6) + "." + a[0].slice(0, 4);
|
|
const time = a[1].slice(0, 2) + ":" + a[1].slice(-2);
|
|
|
|
// send video
|
|
bot.sendVideo(chatId, 'https://' + found[0], {
|
|
supports_streaming: true,
|
|
caption: `Tagesschau in 100 Sekunden vom ${date} um ${time}.`
|
|
});
|
|
// bot.sendMessage(chatId, `Tagesschau in 100 Sekunden vom ${date} um ${time}. https://${found[0]}`);
|
|
});
|
|
}
|
|
|
|
// function startAbo(chatId, text) {
|
|
// let time = text.slice(9).replace(':', '').trim();
|
|
// time = time.slice(0, 2)+':'+time.slice(-2);
|
|
// addAbo(chatId, time);
|
|
// }
|
|
|
|
function help(chatId) {
|
|
const msg = `
|
|
Willkommen beim Tagesschau in 100 Sekunden Telegram Bot.
|
|
|
|
Dieser Bot kann Ihnen zu gewünschten Uhrzeiten 🕒 oder auf Abruf mit aktuellen und kompakten Nachrichten 📰 versorgen.
|
|
|
|
Befehle:
|
|
|
|
/news - Aktuelles Tagesschau in 100 Sekunden Video
|
|
/list - Auflistung Ihrer Abonnements
|
|
/add - Hinzufügen eines täglichen News Abos, z.B. "/add 1800"
|
|
/remove - Löscht ein Abo, z.B. "/remove 1800"
|
|
/help - Diese Nachricht
|
|
|
|
Die Uhrzeiten für die Abonnements sind in dem Format HHMM anzugeben.
|
|
|
|
Dieses Angebot ist inoffiziell und steht nicht mit der Tagesschau in Verbindung.
|
|
`;
|
|
bot.sendMessage(chatId, msg)
|
|
}
|
|
|
|
function listAbo(chatId) {
|
|
context.storage.get(function (error, data) {
|
|
if (error || data === undefined) {
|
|
bot.sendMessage(chatId, 'Ihre Abonements konnten leider nicht abgerufen werden.');
|
|
return cb(error);
|
|
};
|
|
console.log('storage list', data)
|
|
const abos = data.filter(d => d.chatId === chatId)[0];
|
|
bot.sendMessage(chatId, 'Ihre Abonements: '+abos.times.join(', '));
|
|
});
|
|
}
|
|
|
|
function addAbo(chatId, time) {
|
|
time = time.slice(4).trim();
|
|
context.storage.get(function (error, data) {
|
|
if (error) {
|
|
bot.sendMessage(chatId, 'Ihre Abonements konnten leider nicht abgerufen werden.');
|
|
return cb(error);
|
|
};
|
|
if (data === undefined) {
|
|
data = [];
|
|
}
|
|
console.log('storage add', data)
|
|
// set new abo
|
|
const chatAbos = data.filter(e => e.chatId === chatId)[0];
|
|
if (chatAbos) {
|
|
if (chatAbos.times.indexOf(time) === -1) {
|
|
chatAbos.times.push(time);
|
|
bot.sendMessage(chatId, `Neues Abo um ${time}.`);
|
|
} else {
|
|
bot.sendMessage(chatId, 'Sie haben schon ein Abo für diese Uhrzeit.');
|
|
}
|
|
} else {
|
|
data.push({
|
|
chatId: chatId,
|
|
times: ['1800']
|
|
});
|
|
}
|
|
// save
|
|
saveStorage(data);
|
|
});
|
|
}
|
|
|
|
function removeAbo(chatId, time) {
|
|
time = time.slice(7).trim();
|
|
context.storage.get(function (error, data) {
|
|
if (error) {
|
|
bot.sendMessage(chatId, 'Ihr Abonement konnte nicht gelöscht werden.');
|
|
return cb(error);
|
|
};
|
|
if (data === undefined) {
|
|
return;
|
|
}
|
|
console.log('storage remove', data)
|
|
// remove abo
|
|
const chatAbos = data.filter(e => e.chatId === chatId)[0];
|
|
if (chatAbos) {
|
|
if (chatAbos.times.indexOf(time) !== -1) {
|
|
chatAbos.times.splice(chatAbos.times.indexOf(time), 1);
|
|
bot.sendMessage(chatId, `Ihr Abo um ${time} wurde gelöscht.`);
|
|
} else {
|
|
bot.sendMessage(chatId, `Es wurde kein Abo um ${time} gefunden.`);
|
|
}
|
|
}
|
|
// save
|
|
saveStorage(data);
|
|
});
|
|
}
|
|
|
|
function saveStorage(data) {
|
|
// var attempts = 3;
|
|
context.storage.set(data, function set_cb(error) {
|
|
if (error) {
|
|
if (error.code === 409 && attempts--) {
|
|
// resolve conflict and re-attempt set
|
|
bot.sendMessage(context.secrets.metg, 'Es gab einen Storage Konflikt.')
|
|
// data.counter = Math.max(data.counter, error.conflict.counter) + 1;
|
|
// return context.storage.set(data, set_cb);
|
|
}
|
|
return cb(error);
|
|
}
|
|
// ...
|
|
});
|
|
}
|
|
|
|
function checkAbos() {
|
|
// time
|
|
const moment = require('moment-timezone');
|
|
moment.locale('de');
|
|
const serverTime = moment().tz("Europe/Berlin").format('LT').replace(':','');
|
|
// storage
|
|
context.storage.get(function (error, data) {
|
|
if (error || data === undefined) {
|
|
return cb(error);
|
|
};
|
|
console.log('storage check',serverTime, data);
|
|
for (let i = 0; i < data.length; i++) {
|
|
if (data[i].times.indexOf(serverTime) !== -1) {
|
|
sendLatestVideo(data[i].chatId);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// handle webtask calls
|
|
if(context.body.update_id) {
|
|
bot.processUpdate(context.body);
|
|
} else {
|
|
checkAbos();
|
|
}
|
|
cb(null, null);
|
|
};
|