import config from './config.json' assert {type: "json"};
import { MatrixClient, SimpleFsStorageProvider, AutojoinRoomsMixin } from "matrix-bot-sdk";
const storage = new SimpleFsStorageProvider("storage.json");
const client = new MatrixClient(config.homeserver, config.token, storage);
AutojoinRoomsMixin.setupOnClient(client);
client.start().then(() => console.log(`Client has started!`));
client.on("room.message", (room, event) => {
if (!event["content"] || event["sender"] === config.user) return;
let messageArray = event["content"]["body"].split(" ");
messageArray = messageArray.filter((str) => str !== '') //? remove empty strings
if (messageArray[0] == config.prefix) {
switch (messageArray[1]) {
case 's':
case '-Si':
case 'pkg':
case 'search':
let resultIndex = 0;
let pkgPromise = searchPkgs(messageArray);
//? last item in the command must the be the result index
if (Number.isInteger(parseInt(messageArray[messageArray.length - 1]))) {
resultIndex = parseInt(messageArray[messageArray.length - 1])
};
//? pkgResults is an array containing all search results
pkgPromise.then(pkgResults => {
if (pkgResults) {
// let messageHTML = `${pkgResults[resultIndex].pkgname} ${pkgResults[resultIndex].repo} ${pkgResults[resultIndex].licenses} ${pkgResults[resultIndex].pkgdesc}`
let messageHTML = `Package Name: ${pkgResults[resultIndex].pkgname}
Repository: ${pkgResults[resultIndex].repo}
Architecture: ${pkgResults[resultIndex].arch}
Version: ${pkgResults[resultIndex].pkgver}
Description: ${pkgResults[resultIndex].pkgdesc}
URL: ${pkgResults[resultIndex].url}
Build Date: ${pkgResults[resultIndex].build_date}
Last Update: ${pkgResults[resultIndex].last_update}
Flagged out of Date: ${pkgResults[resultIndex].flag_date}
Maintainer(s): ${pkgResults[resultIndex].maintainers}
Packager: ${pkgResults[resultIndex].packager}
License(s): ${pkgResults[resultIndex].licenses}`
client.sendHtmlNotice(room, messageHTML);
} else {
let messageHTML = `No package found.`
client.sendHtmlNotice(room, messageHTML);
}
}); //TODO: bot crashes if index is too large
break;
case 'aur': //TODO: search aur
break;
case 'h':
case 'help': //TODO: help menu
break;
default:
let messageHTML = `Invalid command.`
client.sendHtmlNotice(room, messageHTML);
}
}
})
/* search parameter values:
q,
name,
desc,
repo (Core, Core-Testing, Extra, Extra-Testing, Multilib, Multilib-Testing),
arch (any, x86_64),
maintainer,
packager,
flagged (Flagged, Not+Flagged)
*/
async function searchPkgs(messageArray) {
// console.log(messageArray)
let isFilterApplied = false;
let skipElement = false;
let searchURLPath = "https://archlinux.org/packages/search/json/?"
const filterValues = ['q', 'name', 'desc', 'repo', 'arch', 'maintainer', 'packager', 'flagged'];
// ? using 'for' instead of 'foreach' to be able to use 'break' and 'continue'
for (const element of messageArray) {
// ? if filter item is being searched with it's own filter, skip the next iteration; treating it as a search parameter and not a filter
// ? !a s q q repo Core
// ? ^ ^ ^ ^
// ? 1 2 1 2
// ? 1: filter, 2: search parameter (skipped)
if (skipElement) {
skipElement = false;
continue;
};
let nextElement = messageArray[messageArray.indexOf(element) + 1];
for (const filter of filterValues) {
if (element == filter) {
isFilterApplied = true;
if (!nextElement) break;
searchURLPath += '&' + filter + '=' + nextElement;
skipElement = true;
}
};
};
if (!isFilterApplied) {
searchURLPath += '&q=' + messageArray[2]
}
console.log(searchURLPath);
let response = await fetch(searchURLPath);
const dataJSON = await response.json();
if (!dataJSON.results.length) {
return null //? package does not exist
} else {
return dataJSON.results
}
}