sakobo/src/commands/wiki.ts

81 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-01-17 10:28:24 +01:00
import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from "discord.js";
2025-01-17 13:46:15 +01:00
import { MediaWikiClient, SectionObject } from '../mediawiki';
2025-01-17 10:28:24 +01:00
const pageSources = {
'cittadeldank': {
url: 'https://wiki.cittadeldank.it',
name: 'Città del Dank'
}
}
const pageSourcesAuto = [
'cittadeldank'
];
const data = new SlashCommandBuilder()
.setName('wiki')
.setDescription('Mostra la pagina wiki di un argomento')
.addStringOption(o => o.setName('p')
.setDescription('Il nome della pagina')
.setRequired(true)
)
.addStringOption(o => o.setName('source')
.setDescription('Dove guardare')
.addChoices([
{name: 'Città del Dank', value: 'cittadeldank'},
{name: 'Automatico', value: 'auto'}
])
.setRequired(false)
);
2025-01-17 11:22:08 +01:00
async function fetchPageFromSite(siteId: string, pageName: string) {
const { name: siteName, url: siteUrl } = pageSources[siteId];
2025-01-17 13:46:15 +01:00
const mwClient = new MediaWikiClient(siteUrl, siteName);
2025-01-17 11:22:08 +01:00
const pageData = await mwClient.getPage(pageName);
return pageData;
}
2025-01-17 10:28:24 +01:00
async function execute (interaction: ChatInputCommandInteraction) {
await interaction.deferReply();
2025-01-17 11:22:08 +01:00
let siteChoice = interaction.options.getString('source') ?? 'auto';
const pageName = interaction.options.getString('p');
let pageData = null;
2025-01-17 13:46:15 +01:00
2025-01-17 11:22:08 +01:00
if (siteChoice === 'auto') {
for (let site of pageSourcesAuto) {
pageData = await fetchPageFromSite(site, pageName);
if (pageData) break;
}
} else {
pageData = await fetchPageFromSite(siteChoice, pageName);
}
2025-01-17 13:46:15 +01:00
2025-01-17 11:22:08 +01:00
if (pageData) {
const pageEmbed = new EmbedBuilder()
2025-01-17 10:28:24 +01:00
.setTitle(pageData.title)
.setURL(pageData.url)
2025-01-17 13:46:15 +01:00
.setDescription(pageData.summary)
2025-01-17 10:28:24 +01:00
.setFooter({
2025-01-17 11:22:08 +01:00
text: `Informazioni da ${pageData.origin}`
2025-01-17 10:28:24 +01:00
});
2025-01-17 13:46:15 +01:00
if (pageData.image) {
pageEmbed.setThumbnail(pageData.image);
}
2025-01-17 11:22:08 +01:00
await interaction.followUp({
embeds: [pageEmbed]
});
} else {
await interaction.followUp({
content: `Pagina **${pageName}** non trovata`
});
}
2025-01-17 10:55:17 +01:00
}
export default { data, execute };