You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
3.5 KiB

11 months ago
  1. const { v4 } = require("uuid");
  2. const prisma = require("../utils/prisma");
  3. const CMD_REGEX = new RegExp(/[^a-zA-Z0-9_-]/g);
  4. const SlashCommandPresets = {
  5. formatCommand: function (command = "") {
  6. if (!command || command.length < 2) return `/${v4().split("-")[0]}`;
  7. let adjustedCmd = command.toLowerCase(); // force lowercase
  8. if (!adjustedCmd.startsWith("/")) adjustedCmd = `/${adjustedCmd}`; // Fix if no preceding / is found.
  9. return `/${adjustedCmd.slice(1).toLowerCase().replace(CMD_REGEX, "-")}`; // replace any invalid chars with '-'
  10. },
  11. get: async function (clause = {}) {
  12. try {
  13. const preset = await prisma.slash_command_presets.findFirst({
  14. where: clause,
  15. });
  16. return preset || null;
  17. } catch (error) {
  18. console.error(error.message);
  19. return null;
  20. }
  21. },
  22. where: async function (clause = {}, limit) {
  23. try {
  24. const presets = await prisma.slash_command_presets.findMany({
  25. where: clause,
  26. take: limit || undefined,
  27. });
  28. return presets;
  29. } catch (error) {
  30. console.error(error.message);
  31. return [];
  32. }
  33. },
  34. // Command + userId must be unique combination.
  35. create: async function (userId = null, presetData = {}) {
  36. try {
  37. const existingPreset = await this.get({
  38. userId: userId ? Number(userId) : null,
  39. command: String(presetData.command),
  40. });
  41. if (existingPreset) {
  42. console.log(
  43. "SlashCommandPresets.create - preset already exists - will not create"
  44. );
  45. return existingPreset;
  46. }
  47. const preset = await prisma.slash_command_presets.create({
  48. data: {
  49. ...presetData,
  50. // This field (uid) is either the user_id or 0 (for non-multi-user mode).
  51. // the UID field enforces the @@unique(userId, command) constraint since
  52. // the real relational field (userId) cannot be non-null so this 'dummy' field gives us something
  53. // to constrain against within the context of prisma and sqlite that works.
  54. uid: userId ? Number(userId) : 0,
  55. userId: userId ? Number(userId) : null,
  56. },
  57. });
  58. return preset;
  59. } catch (error) {
  60. console.error("Failed to create preset", error.message);
  61. return null;
  62. }
  63. },
  64. getUserPresets: async function (userId = null) {
  65. try {
  66. return (
  67. await prisma.slash_command_presets.findMany({
  68. where: { userId: !!userId ? Number(userId) : null },
  69. orderBy: { createdAt: "asc" },
  70. })
  71. )?.map((preset) => ({
  72. id: preset.id,
  73. command: preset.command,
  74. prompt: preset.prompt,
  75. description: preset.description,
  76. }));
  77. } catch (error) {
  78. console.error("Failed to get user presets", error.message);
  79. return [];
  80. }
  81. },
  82. update: async function (presetId = null, presetData = {}) {
  83. try {
  84. const preset = await prisma.slash_command_presets.update({
  85. where: { id: Number(presetId) },
  86. data: presetData,
  87. });
  88. return preset;
  89. } catch (error) {
  90. console.error("Failed to update preset", error.message);
  91. return null;
  92. }
  93. },
  94. delete: async function (presetId = null) {
  95. try {
  96. await prisma.slash_command_presets.delete({
  97. where: { id: Number(presetId) },
  98. });
  99. return true;
  100. } catch (error) {
  101. console.error("Failed to delete preset", error.message);
  102. return false;
  103. }
  104. },
  105. };
  106. module.exports.SlashCommandPresets = SlashCommandPresets;