Added watchdog mode
This commit is contained in:
59
main.ts
59
main.ts
@@ -1,5 +1,5 @@
|
|||||||
import { Mwn } from 'npm:mwn'
|
import { Mwn, RecentChange } from 'npm:mwn'
|
||||||
import process from "node:process";
|
import process, { title } from "node:process";
|
||||||
import { parseSummary } from "./parse.ts";
|
import { parseSummary } from "./parse.ts";
|
||||||
import { bucketEvents, writeSection } from "./write.ts";
|
import { bucketEvents, writeSection } from "./write.ts";
|
||||||
|
|
||||||
@@ -38,24 +38,67 @@ async function fetchPages(pages: string[], bot: Mwn): Promise<VideoDescription[]
|
|||||||
return d.filter(v => v.status === "fulfilled").map(v => v.value)
|
return d.filter(v => v.status === "fulfilled").map(v => v.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sleep(ms: number): Promise<void> {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function watchdog(bot: Mwn, onChange: (paths: string[]) => Promise<void>) {
|
||||||
|
let last_change: string | undefined = undefined;
|
||||||
|
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
const { last_change: l, new_file_changes } = await queryChanges(bot, last_change);
|
||||||
|
last_change = l
|
||||||
|
if (new_file_changes.length > 0) {
|
||||||
|
console.log(new_file_changes.length, "changes")
|
||||||
|
await onChange(new_file_changes.map(v => v.title))
|
||||||
|
}
|
||||||
|
console.log(new Date(), "Heartbeat")
|
||||||
|
await sleep(30000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function queryChanges(bot: Mwn, last_change: string | undefined): Promise<{ last_change: string | undefined; new_file_changes: RecentChange[]; }> {
|
||||||
|
const d = await bot.request({
|
||||||
|
action: "query",
|
||||||
|
list: "recentchanges",
|
||||||
|
format: "json",
|
||||||
|
formatversion: 2,
|
||||||
|
rcprop: "title|timestamp|ids|user",
|
||||||
|
rctoponly: 1,
|
||||||
|
rcdir: 'older',
|
||||||
|
rcend: last_change || "2000-01-01T12:00:00Z",
|
||||||
|
});
|
||||||
|
|
||||||
|
const changes: RecentChange[] = d.query?.recentchanges;
|
||||||
|
|
||||||
|
const new_file_changes = changes
|
||||||
|
.filter(v => v.title.startsWith("File:WCS "))
|
||||||
|
.filter(v => last_change === undefined || new Date(v.timestamp) > new Date(last_change));
|
||||||
|
|
||||||
|
return { last_change: changes[0].timestamp, new_file_changes };
|
||||||
|
}
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
const bot = new Mwn({
|
const bot = new Mwn({
|
||||||
apiUrl: 'https://dancing.thasky.one/api.php',
|
apiUrl: process.env.URL || 'https://dancing.thasky.one/api.php',
|
||||||
username: process.env.BOTNAME,
|
username: process.env.BOTNAME,
|
||||||
password: process.env.BOTPW,
|
password: process.env.BOTPW,
|
||||||
userAgent: 'mwn bot',
|
userAgent: 'mwn bot',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const title = 'Video Descriptions (Automated)'
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await bot.login();
|
await bot.login();
|
||||||
// const relevantFiles = await getWorkshopVideos(bot)
|
await watchdog(bot, async (paths) => {
|
||||||
// const d = await fetchPages(relevantFiles, bot)
|
const relevantFiles = await getWorkshopVideos(bot)
|
||||||
// await Deno.writeTextFile("./descriptions.json", JSON.stringify(d));
|
const d = await fetchPages(relevantFiles, bot)
|
||||||
const d = JSON.parse(await Deno.readTextFile('./descriptions.json'));
|
|
||||||
const t = writeSection(bucketEvents(d))
|
const t = writeSection(bucketEvents(d))
|
||||||
const response = await bot.save('Video Description (Automated)', "{{TOC|limit=3}}\n\n" + t, 'Generated descriptions');
|
const response = await bot.save(title, "{{TOC|limit=3}}\n\n" + t, 'Triggered by changes to ' + paths.map(v => "[[" + v + "]]").join(", "));
|
||||||
console.log(response)
|
console.log(response)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error:', error);
|
console.error('Error:', error);
|
||||||
|
|||||||
12
write.ts
12
write.ts
@@ -10,11 +10,15 @@ Level: ${video.level}
|
|||||||
|
|
||||||
[[${video.path}|left|400px|thumb|${video.title}]]
|
[[${video.path}|left|400px|thumb|${video.title}]]
|
||||||
|
|
||||||
|
<div style="float:left">
|
||||||
==== Shown Patterns ====
|
==== Shown Patterns ====
|
||||||
${video.patterns}
|
${video.patterns}
|
||||||
|
|
||||||
==== Notes ====
|
==== Notes ====
|
||||||
${video.notes}`;
|
${video.notes}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br clear=all>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function writeSection(events: VideoDescription[][]): string {
|
export function writeSection(events: VideoDescription[][]): string {
|
||||||
@@ -26,7 +30,7 @@ export function writeSection(events: VideoDescription[][]): string {
|
|||||||
const event_date = event_name.match(/\d{2}|20\d{2}/) ? "" : new Date(token.date).getFullYear().toString()
|
const event_date = event_name.match(/\d{2}|20\d{2}/) ? "" : new Date(token.date).getFullYear().toString()
|
||||||
|
|
||||||
let r = `== ${event_name} ${event_date} ==\n`
|
let r = `== ${event_name} ${event_date} ==\n`
|
||||||
r += `${v.length} Videos\n`
|
r += `${v.length} Video${v.length <= 1 ? "" : "s"}\n`
|
||||||
r += v.map(video => singleVideoDescription(video)).join("\n\n")
|
r += v.map(video => singleVideoDescription(video)).join("\n\n")
|
||||||
return r
|
return r
|
||||||
}).join("\n\n\n")
|
}).join("\n\n\n")
|
||||||
@@ -46,7 +50,7 @@ export function bucketEvents(events: VideoDescription[]): VideoDescription[][] {
|
|||||||
Object.values(buckets)
|
Object.values(buckets)
|
||||||
.forEach(b =>
|
.forEach(b =>
|
||||||
b.sort((a, b) =>
|
b.sort((a, b) =>
|
||||||
new Date(b.date).getTime() - new Date(a.date).getTime()))
|
new Date(a.date).getTime() - new Date(b.date).getTime()))
|
||||||
|
|
||||||
return Object.values(buckets)
|
return Object.values(buckets).sort((a, b) => new Date(a[0].date).getTime() - new Date(b[0].date).getTime())
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user