UntisBot/src/index.ts

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}`));