rcg.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { Message } from "discord.js";
  2. import got from "got";
  3. import { logger } from "src/logging";
  4. import { Command, ICommandData, Plugin } from "src/model/plugin";
  5. import { tryDo } from "@shared/common/async_utils";
  6. const rcgRe = /<input id="rcg_image".+value="([^"]+)".*\/>/i;
  7. interface XkcdResponse {
  8. img: string;
  9. }
  10. @Plugin
  11. export class Rcg {
  12. async sendErrorMessage(msg: Message): Promise<void> {
  13. const xkcdResult = await tryDo(got.get<XkcdResponse>("https://xkcd.com/info.0.json", { responseType: "json" }));
  14. if(!xkcdResult.ok || !xkcdResult.result) {
  15. await msg.reply("sorry, I couldn't get any comics :(.");
  16. return;
  17. }
  18. await msg.reply("sorry, I couldn't get a random comic! Here is today's XKCD instead:", {
  19. files: [ xkcdResult.result.body.img ]
  20. });
  21. }
  22. @Command({
  23. type: "mention",
  24. pattern: "random comic",
  25. auth: false,
  26. documentation: {description: "Generates a comic just for you!", example: "random comic"}
  27. })
  28. async randomComic({ message }: ICommandData): Promise<void> {
  29. const result = await tryDo(got.get("http://explosm.net/rcg/view/?promo=false"));
  30. if (!result.ok) {
  31. logger.error("Failed to get RCG. Got error: %s", result.error);
  32. await this.sendErrorMessage(message);
  33. return;
  34. }
  35. const regexResult = rcgRe.exec(result.result.body);
  36. if(!regexResult) {
  37. logger.error("Could not find RCG from body. Got response body: %s", result.result.body);
  38. await this.sendErrorMessage(message);
  39. return;
  40. }
  41. const messagePostResult = await tryDo(message.reply("I find this very funny:", {
  42. files: [ regexResult[1].trim() ]
  43. }));
  44. if (!messagePostResult.ok) {
  45. logger.error("Failed to get RCG. Got error: %s", messagePostResult.error);
  46. await this.sendErrorMessage(message);
  47. }
  48. }
  49. }