95 lines
3.1 KiB
TypeScript
95 lines
3.1 KiB
TypeScript
import * as dotenv from 'dotenv';
|
|
dotenv.config();
|
|
|
|
import Enmap from 'enmap';
|
|
import fs from 'fs';
|
|
import * as WebUntis from 'webuntis';
|
|
import User from './class/User';
|
|
import NotificationMessage from './class/NotificationMessage';
|
|
import ConnectionModule from './class/ConnectionModule';
|
|
|
|
const seenMessages = new Enmap({ name: "seenMessages" });
|
|
const knownLessons = new Enmap({ name: "knownLessons" });
|
|
|
|
const usersDB = new Enmap({ name: "users" }) as Enmap<string|number, User>;
|
|
const untisInstances = [] as Array<{ untis: WebUntis.default, user: User }>;
|
|
usersDB.forEach(user => untisInstances.push({
|
|
untis: new WebUntis.default(
|
|
user.creds.schoolName,
|
|
user.creds.username,
|
|
user.creds.password,
|
|
user.creds.baseURL
|
|
),
|
|
user: user
|
|
}));
|
|
|
|
// Periodically attempt to connect to untis and fetch timetable updates
|
|
let fetchUpdates = () => {
|
|
console.log(`Fetching ${untisInstances.length} users.`);
|
|
untisInstances.forEach(({ untis, user }) => {
|
|
try {
|
|
// Create database entries
|
|
if (!knownLessons.get(user.ID)) knownLessons.set(user.ID, {});
|
|
if (!seenMessages.get(user.ID)) seenMessages.set(user.ID, {});
|
|
|
|
untis.login()
|
|
.then(() => {
|
|
fs.readdirSync(`${__dirname}/modules`).filter(file => file.endsWith('.js')).forEach(file => {
|
|
require(`${__dirname}/modules/${file}`).run(untis, user);
|
|
});
|
|
|
|
setTimeout(() => untis.logout().then(() => console.log('Untis: Logged out')), 10000);
|
|
});
|
|
} catch(e) {
|
|
console.error(e);
|
|
try {
|
|
sendMessage(new NotificationMessage()
|
|
.setTitle('An error has occurred.')
|
|
.setBody(`\`\`\`js\n${e}\`\`\``)
|
|
.error(),
|
|
user);
|
|
} catch(e) {
|
|
console.error(e);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
fetchUpdates();
|
|
setInterval(fetchUpdates, 60000);
|
|
|
|
|
|
async function sendMessage(message: NotificationMessage, user: User) {
|
|
user.connections.forEach(async connection => {
|
|
let path = require('path').join(__dirname, 'connections', connection.type + '.js') as string;
|
|
if (fs.existsSync(path)) {
|
|
try {
|
|
require(path).run(message, connection);
|
|
} catch(e) {
|
|
console.warn(e);
|
|
}
|
|
} else {
|
|
console.log(`Unknown connection type: ${connection.type}`);
|
|
}
|
|
});
|
|
}
|
|
|
|
export default {
|
|
untisInstances,
|
|
usersDB,
|
|
sendEmbed: sendMessage,
|
|
db: {
|
|
seenMessages: seenMessages,
|
|
knownLessons: knownLessons
|
|
}
|
|
};
|
|
|
|
|
|
// Initialize clients in dist/connections/*
|
|
fs.readdirSync(`${__dirname}/connections`).filter(file => file.endsWith('.js')).forEach(file => {
|
|
(require(`${__dirname}/connections/${file}`) as ConnectionModule).init();
|
|
});
|
|
|
|
// Run tasks in dist/tasks/*
|
|
fs.readdirSync(`${__dirname}/tasks`).filter(file => file.endsWith('.js')).forEach(file =>
|
|
require(`${__dirname}/tasks/${file}`)); |