67 lines
2.5 KiB
JavaScript
67 lines
2.5 KiB
JavaScript
require("dotenv").config();
|
|
const express = require('express');
|
|
const sqlite3 = require('sqlite3').verbose();
|
|
|
|
const app = express();
|
|
const port = process.env.SERVER_PORT || 3000;
|
|
|
|
const db = new sqlite3.Database('astrocom.db', (err) => {
|
|
if (err) {
|
|
console.error('Error connecting to database:', err);
|
|
} else {
|
|
console.log('Connected to SQLite database');
|
|
}
|
|
});
|
|
const bypass = false
|
|
// Create 'routes' table
|
|
// We need to store server address, port, secret, block_start and block_length. Then make a query that takes in an arbitrary number, and returns a row if that number between block start and block start + block length.
|
|
db.run('CREATE TABLE IF NOT EXISTS routes (server TEXT NOT NULL, port INTEGER NOT NULL DEFAULT 4569, auth TEST NOT NULL DEFAULT astrocom, secret TEXT NOT NULL, block_start INTEGER UNIQUE NOT NULL, block_length INTEGER NOT NULL DEFAULT 9999, apiKey TEXT NOT NULL)');
|
|
|
|
// Query to get a route
|
|
app.get('/api/v1/route/:apiKey/:ani/:number', (req, res) => {
|
|
const apiKey = req.params.apiKey;
|
|
const number = Number(req.params.number);
|
|
const ani = Number(req.params.ani);
|
|
console.log(`${apiKey}:${req.params.ani}:${number}`);
|
|
db.get("SELECT * FROM routes WHERE apiKey = ? AND block_start <= ? AND block_start + block_length >= ?", [apiKey, ani, ani], (err, row) => {
|
|
// If no row or error, return 401
|
|
if (err || !row) {
|
|
console.error(err);
|
|
console.log(row)
|
|
res.status(401).send(`${process.env.MSG_ROUTE_ADDRESS}/401`)
|
|
return;
|
|
}
|
|
db.get('SELECT * FROM routes WHERE block_start <= ? AND block_start + block_length >= ?', [number, number], (err, row) => {
|
|
if (err) {
|
|
console.error('Error getting route:', err);
|
|
res.status(500).send(`${process.env.MSG_ROUTE_ADDRESS}/500`)
|
|
} else if (row) {
|
|
// Check if the ANI is within the block range
|
|
// If it is, return `local`
|
|
if (!bypass && (req.params.ani >= row.block_start && req.params.ani <= row.block_start + row.block_length)) {
|
|
console.log("sent local")
|
|
res.status(200).send('local');
|
|
} else {
|
|
console.log("sent remote")
|
|
res.status(200).send(`IAX2/${row.auth}:${row.secret}@${row.server}:${row.port}/${number}`);
|
|
}
|
|
} else {
|
|
console.log("boowomp")
|
|
res.status(404).send(`${process.env.MSG_ROUTE_ADDRESS}/404`);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
// Middleware for parsing JSON bodies
|
|
app.use(express.json());
|
|
|
|
// Basic route
|
|
app.get('/api/v1/call', (req, res) => {
|
|
res.json({ message: 'Welcome to the API' });
|
|
});
|
|
|
|
// Start server
|
|
app.listen(port, () => {
|
|
console.log(`Server is running on port ${port}`);
|
|
}); |