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 } }