guide.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. const db = require("../db.js");
  2. const util = require("../util.js");
  3. const documentation = {
  4. "make guide <keywords> <NEWLINE> <content>": {
  5. auth: true,
  6. description: "Creates a new guide."
  7. },
  8. "delete guide <keywords>": {
  9. auth: true,
  10. description: "Deletes a guide."
  11. },
  12. "guides": {
  13. auth: false,
  14. description: "Lists all keywords that will trigger a guide."
  15. }
  16. };
  17. const commands = {
  18. "make guide": msg => {
  19. if (!util.isAuthorised(msg.member)) return;
  20. let content = msg.content.substring(msg.content.indexOf("make guide") + "make guide ".length);
  21. let guideName = content.substring(0, content.indexOf("\n")).trim();
  22. let guideContent = content.substring(content.indexOf("\n")).trim();
  23. let guide = db.get("guides").find({
  24. name: guideName
  25. });
  26. if (!guide.isUndefined().value()) {
  27. guide.assign({
  28. content: guideContent
  29. }).write();
  30. } else {
  31. db.get("guides")
  32. .push({
  33. name: guideName,
  34. content: guideContent
  35. })
  36. .write();
  37. }
  38. msg.channel.send(
  39. `${msg.author.toString()} Added/updated "${guideName}"!`
  40. );
  41. },
  42. "delete guide": (msg, s) => {
  43. if (!util.isAuthorised(msg.member)) return;
  44. let guideName = s.substring("delete guide ".length).trim();
  45. let val = db.get("guides").find({
  46. name: guideName
  47. });
  48. if (val.isUndefined().value()) {
  49. msg.channel.send(`${msg.author.toString()} No guide "${guideName}"!`);
  50. return;
  51. }
  52. db.get("guides")
  53. .remove({
  54. name: guideName
  55. })
  56. .write();
  57. msg.channel.send(
  58. `${msg.author.toString()} Removed guide "${guideName}"!`
  59. );
  60. },
  61. "guides": msg => {
  62. let guides = db
  63. .get("guides")
  64. .map(g => g.name)
  65. .reduce((p, c) => `${p}\n${c}`, "\n")
  66. .value();
  67. msg.channel.send(`${msg.author.toString()} Ping me with one of the following keywords for a guide related to the topic:\n\`\`\`${guides}\`\`\``);
  68. }
  69. };
  70. const onDirectMention = (msg, content, actionsDone) => {
  71. if (actionsDone)
  72. return false;
  73. if(msg.attachments.size > 0 || content.length == 0)
  74. return false;
  75. let parts = content.trim().split(" ");
  76. let guide = db
  77. .get("guides")
  78. .map(g => Object.assign({
  79. parts: g.name.toLowerCase().split(" ")
  80. }, g))
  81. .sortBy(g => g.parts.length)
  82. .maxBy(k => db._.intersection(parts, k.parts).length)
  83. .value();
  84. let hits =
  85. guide !== undefined &&
  86. db._.intersection(guide.name.toLowerCase().split(" "), parts).length > 0;
  87. if (hits) {
  88. msg.channel.send(guide.content);
  89. return true;
  90. }
  91. return false;
  92. };
  93. module.exports = {
  94. commands: commands,
  95. onDirectMention: onDirectMention,
  96. documentation: documentation
  97. };