Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.70 KB | None | 0 0
  1. const Discord = require("discord.js");
  2. const puppeteer = require('puppeteer');
  3. const wikiRegex = new RegExp("\\[\\[([^\\[\\]]*)\\]\\]", "gu");
  4. const urlRegex = new RegExp("\\w", "g");
  5.  
  6. const SimpleNodeLogger = require('simple-node-logger')
  7.  
  8.  
  9. errorLog = SimpleNodeLogger.createSimpleLogger({
  10. logFilePath: './logs/error.log',
  11. timestampFormat: 'YYYY-MM-DD HH:mm:ss'
  12. });
  13.  
  14. log = SimpleNodeLogger.createSimpleLogger({
  15. logFilePath: './logs/requests.log',
  16. timestampFormat: 'YYYY-MM-DD HH:mm:ss'
  17. });
  18.  
  19. errorLog.setLevel('error');
  20.  
  21. var config = require("./config.json");
  22.  
  23. var client = new Discord.Client({
  24. disableEveryone: true,
  25. disabledEvents: ["TYPING_START"]
  26. });
  27.  
  28. var browswer;
  29.  
  30. client.token = config.token;
  31.  
  32. client.login();
  33. console.log("Logged in");
  34.  
  35. //Setup our browswer
  36. (async () => {
  37. browser = await puppeteer.launch({
  38. ignoreHTTPSError: true,
  39. headless: true,
  40. handleSIGHUP: true,
  41. args: ['--no-sandbox']
  42. });
  43. })();
  44.  
  45. client.on("ready", () => {
  46. console.log(`Ready as ${client.user.username}`);
  47. });
  48.  
  49. client.on("message", (message) => {
  50. if (message.author.id == client.user.id) {
  51. //Disabled this check, as it causes it to not do a check if you post twice in a row.
  52. //return;
  53. }
  54. try {
  55. const server = message.guild.name;
  56.  
  57. let matches = wikiRegex.exec(message.cleanContent);
  58. if (matches != null && matches.length > 0) {
  59. for (let i = 1; i < matches.length; i++) {
  60. handleItem(titleCase(matches[i]), message.channel, server);
  61. }
  62. }
  63. } catch (error) {
  64. errorLog.error(`"${error.message}"`);
  65. }
  66. });
  67.  
  68. async function handleItem(name, channel, server) {
  69. let itemUrlPart = convertToUrlString(name);
  70. var url = config.wikiURL + itemUrlPart;
  71. let initalMessage = "Retrieving details from the Wiki for **" + name + "**";
  72. var messageId;
  73. await channel
  74. .send(initalMessage)
  75. .then(message => {
  76. //console.log(`Sent message: ${message.id} ${initialMessage}`);
  77. messageId = message.id;
  78. })
  79. .catch(error => {
  80. //console.log(error.message)
  81. errorLog.error(`"${error.message}" "${server}" "${name}"`);
  82. })
  83.  
  84. if (messageId != null) {
  85. await getImage(url, server)
  86. .then((result) => {
  87. if (result.success == false) {
  88. channel
  89. .fetchMessage(messageId)
  90. .then(message => {
  91. message.edit("Could not get details from the Wiki for **" + name + "**");
  92. })
  93. .catch(error => {
  94. errorLog.error(`"${error.message}" "${server}" "${name}"`);
  95. })
  96. } else {
  97. log.info(`"${server}" "${name}" "${url}"`);
  98. //need a way that lets us add an attachment message, currently I can only edit text to it
  99. let output = '<' + url + '>';
  100. //if no screenshot, just edit the original message
  101. if (result.screenshot == false) {
  102. channel
  103. .fetchMessage(messageId)
  104. .then(message => {
  105. message.edit(output);
  106. })
  107. .catch(error => {
  108. errorLog.error(`"Could not edit message ${messageId}" "${server}" "${name}"`);
  109. })
  110. } else {
  111. //otherwise delete the message and create a new one with the screenshot
  112. channel
  113. .fetchMessage(messageId)
  114. .then(message => {
  115. message.delete();
  116. })
  117. .catch(error => {
  118. errorLog.error(`"Could not delete message ${messageId}" "${server}" "${name}"`);
  119. })
  120. channel.send(output, { file: result.screenshot });
  121. }
  122. console.log('Found in the wiki and sent: ' + url);
  123. }
  124. })
  125. .catch(error => {
  126. errorLog.error(`"${error.message}" "${server}" "${name}"`);
  127. })
  128. }
  129. }
  130.  
  131. async function getImage(url, server) {
  132. //console.time('getPage')
  133. const page = await browser.newPage();
  134. //Disabling Javascript adds 100% increased performance
  135. await page.setJavaScriptEnabled(config.enableJavascript)
  136. var output = {
  137. screenshot: false,
  138. success: false
  139. }
  140.  
  141. //Set a tall page so the image isn't covered by popups
  142. await page.setViewport({ 'width': config.width, 'height': config.height });
  143.  
  144. try {
  145. //played around with a few different waitUntils. This one seemed the quickest.
  146. //If you don't disable Javascript on the PoE Wiki site, removing this parameter makes it hang
  147. await page.goto(url, { waitUntil: 'load' });
  148. } catch (error) {
  149. errorLog.error(`"${error.message}" "${server}" "${url}"`);
  150. }
  151.  
  152. var invalidPage = await page.$(config.wikiInvalidPage);
  153. //if we have a invalid page, lets exit
  154. if (invalidPage != null) {
  155. return output;
  156. }
  157.  
  158. var infoBox = await page.$('.infocard');
  159. if (infoBox != null) {
  160. try {
  161. output.screenshot = await infoBox.screenshot();
  162. output.success = true;
  163. } catch (error) {
  164. output.success = true;
  165. }
  166. return output;
  167. }
  168.  
  169. //if we have a div for the item, screenshot it.
  170. //If not, just return the page without the screenshot
  171. const div = await page.$(config.wikiDiv);
  172. if (div != null) {
  173. try {
  174. output.screenshot = await div.screenshot();
  175. output.success = true;
  176. } catch (error) {
  177. output.success = true;
  178. }
  179. } else {
  180. output.success = true;
  181. }
  182.  
  183. await page.close();
  184. //console.timeEnd('getPage')
  185. return output;
  186.  
  187. }
  188.  
  189. function convertToUrlString(name) {
  190. return name.replace(new RegExp(" ", "g"), "_");
  191. }
  192.  
  193. function titleCase(str) {
  194. let excludedWords = ["of", "and", "the", "to", "at", "for"];
  195. let words = str.split(" ");
  196. for (var i in words) {
  197. if ((i == 0) || !(excludedWords.includes(words[i].toLowerCase()))) {
  198. words[i] = words[i][0].toUpperCase() + words[i].slice(1, words[i].length);
  199. } else {
  200. continue;
  201. }
  202. }
  203. return words.join(" ");
  204. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement