main.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. const TOKEN = require("./token.js");
  2. const fs = require("fs");
  3. const path = require("path");
  4. const client = require("./client.js");
  5. const util = require("./util.js");
  6. global.gc = require("vm").runInNewContext("gc");
  7. const REACT_PROBABILITY = 0.6;
  8. function trigger(actions, ...params) {
  9. let actionDone = false;
  10. for (let i = 0; i < actions.length; i++) {
  11. const action = actions[i];
  12. actionDone |= action(...params, actionDone);
  13. }
  14. return actionDone;
  15. }
  16. let commands = {};
  17. let msgActions = [];
  18. let indirectMentionActions = [];
  19. let startActions = [];
  20. let directMessageActions = [];
  21. let postActions = [];
  22. client.on("ready", () => {
  23. console.log("Starting up NoctBot!");
  24. client.user.setActivity("@NoctBot help", {
  25. type: "PLAYING"
  26. });
  27. for (let i = 0; i < startActions.length; i++) {
  28. const action = startActions[i];
  29. action();
  30. }
  31. console.log("NoctBot is ready!");
  32. });
  33. client.on("message", m => {
  34. if (m.author.id == client.user.id)
  35. return;
  36. let content = m.cleanContent.trim();
  37. if (trigger(msgActions, m, content))
  38. return;
  39. if (m.mentions.users.size > 0 && m.mentions.users.first().id == client.user.id) {
  40. if (content.startsWith(`@${client.user.username}`)) {
  41. content = content.substring(`@${client.user.username}`.length).trim();
  42. let lowerCaseContent = content.toLowerCase();
  43. for (let c in commands) {
  44. if (lowerCaseContent.startsWith(c)) {
  45. commands[c](m, content);
  46. return;
  47. }
  48. }
  49. if (trigger(directMessageActions, m, lowerCaseContent))
  50. return;
  51. }
  52. if (trigger(indirectMentionActions, m))
  53. return;
  54. }
  55. trigger(postActions);
  56. });
  57. client.on("messageReactionAdd", (r, u) => {
  58. if (Math.random() <= REACT_PROBABILITY && !r.me)
  59. r.message.react(r.emoji);
  60. });
  61. function main() {
  62. let commandsPath = path.resolve(path.dirname(module.filename), "commands");
  63. let files = fs.readdirSync(commandsPath);
  64. for (let i = 0; i < files.length; i++) {
  65. const file = files[i];
  66. let ext = path.extname(file);
  67. if (ext != ".js")
  68. continue;
  69. let obj = require(path.resolve(commandsPath, file));
  70. if (obj.commands) {
  71. for (let command in obj.commands) {
  72. if (obj.commands.hasOwnProperty(command))
  73. commands[command] = obj.commands[command];
  74. }
  75. }
  76. if (obj.documentation) {
  77. for (let command in obj.documentation) {
  78. if (obj.documentation.hasOwnProperty(command))
  79. util.documentation[command] = obj.documentation[command];
  80. }
  81. }
  82. if (obj.onMessage)
  83. msgActions.push(obj.onMessage);
  84. if (obj.onIndirectMention)
  85. indirectMentionActions.push(obj.onIndirectMention);
  86. if (obj.onDirectMention)
  87. directMessageActions.push(obj.onDirectMention);
  88. if (obj.postMessage)
  89. postActions.push(obj.postMessage);
  90. if (obj.onStart)
  91. startActions.push(obj.onStart);
  92. }
  93. client.login(TOKEN);
  94. }
  95. main();