diff --git a/src/commands/wiki.ts b/src/commands/wiki.ts index 5c1ea9c..4dcd039 100644 --- a/src/commands/wiki.ts +++ b/src/commands/wiki.ts @@ -1,5 +1,5 @@ import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from "discord.js"; -import { MediaWikiClient } from '../mediawiki'; +import { MediaWikiClient, SectionObject } from '../mediawiki'; const pageSources = { 'cittadeldank': { @@ -30,7 +30,7 @@ const data = new SlashCommandBuilder() async function fetchPageFromSite(siteId: string, pageName: string) { const { name: siteName, url: siteUrl } = pageSources[siteId]; - const mwClient = new MediaWikiClient(siteUrl); + const mwClient = new MediaWikiClient(siteUrl, siteName); const pageData = await mwClient.getPage(pageName); return pageData; } @@ -41,6 +41,8 @@ async function execute (interaction: ChatInputCommandInteraction) { let siteChoice = interaction.options.getString('source') ?? 'auto'; const pageName = interaction.options.getString('p'); let pageData = null; + + if (siteChoice === 'auto') { for (let site of pageSourcesAuto) { pageData = await fetchPageFromSite(site, pageName); @@ -50,15 +52,20 @@ async function execute (interaction: ChatInputCommandInteraction) { pageData = await fetchPageFromSite(siteChoice, pageName); } + if (pageData) { const pageEmbed = new EmbedBuilder() .setTitle(pageData.title) .setURL(pageData.url) - .setDescription(pageData.content) + .setDescription(pageData.summary) .setFooter({ text: `Informazioni da ${pageData.origin}` }); + if (pageData.image) { + pageEmbed.setThumbnail(pageData.image); + } + await interaction.followUp({ embeds: [pageEmbed] }); diff --git a/src/mediawiki.ts b/src/mediawiki.ts index c415ea4..1125222 100644 --- a/src/mediawiki.ts +++ b/src/mediawiki.ts @@ -1,6 +1,21 @@ import wiki from 'wikijs'; +// fix for wiki().page().content() because wrong typing +function strToObjArr(s: string | object[]): object[] { + if (typeof s === 'string') { + let obj = JSON.parse(s); + if (obj instanceof Array) return obj; + else return [obj]; + } else { + return s; + } +} + +export type SectionObject = {title: string, content: string}; + +type WithPageId = {pageId: any}; + export class MediaWikiClient { apiUrl: string siteName: string | null @@ -10,20 +25,35 @@ export class MediaWikiClient { this.siteName = siteName; } - async getPage(title: string) { + async getPage(title: string, detail: boolean = false) { const wikiClient = wiki({ apiUrl: this.apiUrl, origin: null }); const page = await wikiClient.page(title); + const pageId = page.raw.pageid; const pageUrl = page.url(); - const content = await page.content(); + const pageSummary = await page.summary(); + const pageImageThumb = pageId? (await this.getPageThumbnailUrl(pageId) ?? null): null; + let pageDetail: object[] = []; + if (detail){ + pageDetail = strToObjArr(await page.content()); + } return { url: pageUrl, title, - content: content.length > 4000? content.slice(0, 3999) + '\u2026': content, + summary: pageSummary.length > 4000? pageSummary.slice(0, 3999) + '\u2026': pageSummary, + detail: detail? pageDetail.map((x: SectionObject) => ({title: x.title, content: (x.content?.slice(0, 1000))})).filter((x: SectionObject) => x.content.length > 0).slice(0, 20): null, + image: pageImageThumb, origin: this.siteName } } + + async getPageThumbnailUrl(pageId: number): Promise { + const respRaw = await fetch (`${this.apiUrl}?format=json&action=query&redirects=1&pageids=${encodeURIComponent(pageId)}&piprop=thumbnail&prop=pageimages`); + const respJson = await respRaw.json(); + const thumbnailUrl = (respJson?.query?.pages || [])[pageId]?.thumbnail?.source; + return thumbnailUrl; + } } \ No newline at end of file