Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b965a4f5a2 | ||
|
|
0d8dd8cd17 | ||
|
|
6ac432cadc | ||
|
|
dec6c7598b | ||
|
|
2de2e3cd9b | ||
|
|
5d0776a9b9 | ||
|
|
7bf843c851 | ||
|
|
3e3ea9263f | ||
|
|
bb5c3e9c8d | ||
|
|
94f32674cb | ||
|
|
e8eb52e00b | ||
|
|
4efa165949 | ||
|
|
4c3e4ef9a5 |
+10
-1
@@ -2,7 +2,7 @@
|
|||||||
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
|
||||||
|
|
||||||
[](https://discord.com/invite/26vT9wt3n3)
|
[](https://discord.com/invite/26vT9wt3n3)
|
||||||
[](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.2)
|
[](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.5)
|
||||||
[](https://github.com/sponsors/DJj123dj)
|
[](https://github.com/sponsors/DJj123dj)
|
||||||
[](.eggs/README.md)
|
[](.eggs/README.md)
|
||||||
|
|
||||||
@@ -20,6 +20,15 @@ It's recommended to provide at least `1GB` of **Memory/RAM** and `5GB` of **disk
|
|||||||
[**`openticket-egg-main.json` (Recommended)**](openticket-egg-main.json)
|
[**`openticket-egg-main.json` (Recommended)**](openticket-egg-main.json)
|
||||||
- This egg will use the `main` branch of Open Ticket.
|
- This egg will use the `main` branch of Open Ticket.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.0.5.json`**](openticket-egg-v4.0.5.json)
|
||||||
|
- This egg will always use Open Ticket `v4.0.5`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.0.4.json`**](openticket-egg-v4.0.4.json)
|
||||||
|
- This egg will always use Open Ticket `v4.0.4`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.0.3.json`**](openticket-egg-v4.0.3.json)
|
||||||
|
- This egg will always use Open Ticket `v4.0.3`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
[**`openticket-egg-v4.0.2.json`**](openticket-egg-v4.0.2.json)
|
[**`openticket-egg-v4.0.2.json`**](openticket-egg-v4.0.2.json)
|
||||||
- This egg will always use Open Ticket `v4.0.2`. Open Ticket updates will not have an effect on this egg.
|
- This egg will always use Open Ticket `v4.0.2`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
|
||||||
|
"meta": {
|
||||||
|
"version": "PTDL_v2",
|
||||||
|
"update_url": null
|
||||||
|
},
|
||||||
|
"exported_at": "2025-03-16T18:10:18+01:00",
|
||||||
|
"name": "Open Ticket (v4.0.3)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.3, the most advanced & customisable discord ticket bot that you will ever find! You can customise up to 300+ variables! This includes Html Transcripts, Advanced Plugins, Custom Embeds, Questions\/Modals, Stats & more!",
|
||||||
|
"features": null,
|
||||||
|
"docker_images": {
|
||||||
|
"ghcr.io\/parkervcp\/yolks:nodejs_20": "ghcr.io\/parkervcp\/yolks:nodejs_20"
|
||||||
|
},
|
||||||
|
"file_denylist": [],
|
||||||
|
"startup": "if [[ ! -z ${NODE_PACKAGES} ]]; then npm install ${NODE_PACKAGES}; fi; if [[ ! -z ${UNNODE_PACKAGES} ]]; then npm uninstall ${UNNODE_PACKAGES}; fi; if [ -f \/home\/container\/package.json ]; then npm install; fi; node \"\/home\/container\/index.js\" ${NODE_FLAGS};",
|
||||||
|
"config": {
|
||||||
|
"files": "{}",
|
||||||
|
"startup": "{\r\n \"done\": \"STARTUP INFO:\"\r\n}",
|
||||||
|
"logs": "{}",
|
||||||
|
"stop": "^C"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"installation": {
|
||||||
|
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.0.3)\r\n# Inspired by: Node.js Installation Script\r\n# \u00a9 DJdj Development\r\n\r\necho -e \"[OT INSTALLER] installing dependencies. please wait...\"\r\napt update\r\napt install -y git curl\r\n\r\necho -e \"[OT INSTALLER] updating npm. please wait...\"\r\nnpm install npm@latest --location=global\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\nBRANCH=\"v4.0.3\"\r\n\r\nif [ \"$(ls -A \/mnt\/server)\" ]; then\r\n echo -e \"[OT INSTALLER] \/mnt\/server directory is not empty.\"\r\n if [ -d .git ]; then\r\n echo -e \"[OT INSTALLER] .git directory exists\"\r\n if [ -f .git\/config ]; then\r\n echo -e \"[OT INSTALLER] loading info from git config\"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e \"[OT INSTALLER] files found with no git config\"\r\n echo -e \"[OT INSTALLER] closing out without touching things to not break anything\"\r\n exit 10\r\n fi\r\n fi\r\n\r\n if [ \"${ORIGIN}\" == \"https:\/\/github.com\/open-discord-bots\/open-ticket.git\" ]; then\r\n echo \"pulling latest from github\"\r\n git pull\r\n fi\r\nelse\r\n echo -e \"[OT INSTALLER] \/mnt\/server is empty.\"\r\n echo -e \"[OT INSTALLER] cloning files into repo.\"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e \"[OT INSTALLER] cloning default branch\"\r\n git clone https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n else\r\n echo -e \"[OT INSTALLER] cloning ${BRANCH}'\"\r\n git clone --single-branch --branch ${BRANCH} https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n fi\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing Open Ticket node.js packages.\"\r\nif [ -f \/mnt\/server\/package.json ]; then\r\n \/usr\/local\/bin\/npm install --omit=dev\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing custom node.js packages.\"\r\nif [[ ! -z ${NODE_PACKAGES} ]]; then\r\n \/usr\/local\/bin\/npm install ${NODE_PACKAGES}\r\nfi\r\n\r\necho -e \"[OT INSTALLER] install complete!\"\r\nexit 0",
|
||||||
|
"container": "node:latest",
|
||||||
|
"entrypoint": "bash"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"variables": [
|
||||||
|
{
|
||||||
|
"name": "Additional Npm Packages",
|
||||||
|
"description": "Specify additional npm packages used by Open Ticket plugins. Use spaces to separate.",
|
||||||
|
"env_variable": "NODE_PACKAGES",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Startup Flags",
|
||||||
|
"description": "Start the bot with additional Open Ticket flags. Separate using spaces.\r\nA full reference list can be found in the documentation.",
|
||||||
|
"env_variable": "NODE_FLAGS",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Uninstall Npm Packages",
|
||||||
|
"description": "A list of npm packages to uninstall. Separate by spaces.",
|
||||||
|
"env_variable": "UNNODE_PACKAGES",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
|
||||||
|
"meta": {
|
||||||
|
"version": "PTDL_v2",
|
||||||
|
"update_url": null
|
||||||
|
},
|
||||||
|
"exported_at": "2025-03-16T18:10:18+01:00",
|
||||||
|
"name": "Open Ticket (v4.0.4)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.4, the most advanced & customisable discord ticket bot that you will ever find! You can customise up to 300+ variables! This includes Html Transcripts, Advanced Plugins, Custom Embeds, Questions\/Modals, Stats & more!",
|
||||||
|
"features": null,
|
||||||
|
"docker_images": {
|
||||||
|
"ghcr.io\/parkervcp\/yolks:nodejs_20": "ghcr.io\/parkervcp\/yolks:nodejs_20"
|
||||||
|
},
|
||||||
|
"file_denylist": [],
|
||||||
|
"startup": "if [[ ! -z ${NODE_PACKAGES} ]]; then npm install ${NODE_PACKAGES}; fi; if [[ ! -z ${UNNODE_PACKAGES} ]]; then npm uninstall ${UNNODE_PACKAGES}; fi; if [ -f \/home\/container\/package.json ]; then npm install; fi; node \"\/home\/container\/index.js\" ${NODE_FLAGS};",
|
||||||
|
"config": {
|
||||||
|
"files": "{}",
|
||||||
|
"startup": "{\r\n \"done\": \"STARTUP INFO:\"\r\n}",
|
||||||
|
"logs": "{}",
|
||||||
|
"stop": "^C"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"installation": {
|
||||||
|
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.0.4)\r\n# Inspired by: Node.js Installation Script\r\n# \u00a9 DJdj Development\r\n\r\necho -e \"[OT INSTALLER] installing dependencies. please wait...\"\r\napt update\r\napt install -y git curl\r\n\r\necho -e \"[OT INSTALLER] updating npm. please wait...\"\r\nnpm install npm@latest --location=global\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\nBRANCH=\"v4.0.4\"\r\n\r\nif [ \"$(ls -A \/mnt\/server)\" ]; then\r\n echo -e \"[OT INSTALLER] \/mnt\/server directory is not empty.\"\r\n if [ -d .git ]; then\r\n echo -e \"[OT INSTALLER] .git directory exists\"\r\n if [ -f .git\/config ]; then\r\n echo -e \"[OT INSTALLER] loading info from git config\"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e \"[OT INSTALLER] files found with no git config\"\r\n echo -e \"[OT INSTALLER] closing out without touching things to not break anything\"\r\n exit 10\r\n fi\r\n fi\r\n\r\n if [ \"${ORIGIN}\" == \"https:\/\/github.com\/open-discord-bots\/open-ticket.git\" ]; then\r\n echo \"pulling latest from github\"\r\n git pull\r\n fi\r\nelse\r\n echo -e \"[OT INSTALLER] \/mnt\/server is empty.\"\r\n echo -e \"[OT INSTALLER] cloning files into repo.\"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e \"[OT INSTALLER] cloning default branch\"\r\n git clone https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n else\r\n echo -e \"[OT INSTALLER] cloning ${BRANCH}'\"\r\n git clone --single-branch --branch ${BRANCH} https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n fi\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing Open Ticket node.js packages.\"\r\nif [ -f \/mnt\/server\/package.json ]; then\r\n \/usr\/local\/bin\/npm install --omit=dev\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing custom node.js packages.\"\r\nif [[ ! -z ${NODE_PACKAGES} ]]; then\r\n \/usr\/local\/bin\/npm install ${NODE_PACKAGES}\r\nfi\r\n\r\necho -e \"[OT INSTALLER] install complete!\"\r\nexit 0",
|
||||||
|
"container": "node:latest",
|
||||||
|
"entrypoint": "bash"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"variables": [
|
||||||
|
{
|
||||||
|
"name": "Additional Npm Packages",
|
||||||
|
"description": "Specify additional npm packages used by Open Ticket plugins. Use spaces to separate.",
|
||||||
|
"env_variable": "NODE_PACKAGES",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Startup Flags",
|
||||||
|
"description": "Start the bot with additional Open Ticket flags. Separate using spaces.\r\nA full reference list can be found in the documentation.",
|
||||||
|
"env_variable": "NODE_FLAGS",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Uninstall Npm Packages",
|
||||||
|
"description": "A list of npm packages to uninstall. Separate by spaces.",
|
||||||
|
"env_variable": "UNNODE_PACKAGES",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
|
||||||
|
"meta": {
|
||||||
|
"version": "PTDL_v2",
|
||||||
|
"update_url": null
|
||||||
|
},
|
||||||
|
"exported_at": "2025-03-16T18:10:18+01:00",
|
||||||
|
"name": "Open Ticket (v4.0.5)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.5, the most advanced & customisable discord ticket bot that you will ever find! You can customise up to 300+ variables! This includes Html Transcripts, Advanced Plugins, Custom Embeds, Questions\/Modals, Stats & more!",
|
||||||
|
"features": null,
|
||||||
|
"docker_images": {
|
||||||
|
"ghcr.io\/parkervcp\/yolks:nodejs_20": "ghcr.io\/parkervcp\/yolks:nodejs_20"
|
||||||
|
},
|
||||||
|
"file_denylist": [],
|
||||||
|
"startup": "if [[ ! -z ${NODE_PACKAGES} ]]; then npm install ${NODE_PACKAGES}; fi; if [[ ! -z ${UNNODE_PACKAGES} ]]; then npm uninstall ${UNNODE_PACKAGES}; fi; if [ -f \/home\/container\/package.json ]; then npm install; fi; node \"\/home\/container\/index.js\" ${NODE_FLAGS};",
|
||||||
|
"config": {
|
||||||
|
"files": "{}",
|
||||||
|
"startup": "{\r\n \"done\": \"STARTUP INFO:\"\r\n}",
|
||||||
|
"logs": "{}",
|
||||||
|
"stop": "^C"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"installation": {
|
||||||
|
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.0.5)\r\n# Inspired by: Node.js Installation Script\r\n# \u00a9 DJdj Development\r\n\r\necho -e \"[OT INSTALLER] installing dependencies. please wait...\"\r\napt update\r\napt install -y git curl\r\n\r\necho -e \"[OT INSTALLER] updating npm. please wait...\"\r\nnpm install npm@latest --location=global\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\nBRANCH=\"v4.0.5\"\r\n\r\nif [ \"$(ls -A \/mnt\/server)\" ]; then\r\n echo -e \"[OT INSTALLER] \/mnt\/server directory is not empty.\"\r\n if [ -d .git ]; then\r\n echo -e \"[OT INSTALLER] .git directory exists\"\r\n if [ -f .git\/config ]; then\r\n echo -e \"[OT INSTALLER] loading info from git config\"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e \"[OT INSTALLER] files found with no git config\"\r\n echo -e \"[OT INSTALLER] closing out without touching things to not break anything\"\r\n exit 10\r\n fi\r\n fi\r\n\r\n if [ \"${ORIGIN}\" == \"https:\/\/github.com\/open-discord-bots\/open-ticket.git\" ]; then\r\n echo \"pulling latest from github\"\r\n git pull\r\n fi\r\nelse\r\n echo -e \"[OT INSTALLER] \/mnt\/server is empty.\"\r\n echo -e \"[OT INSTALLER] cloning files into repo.\"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e \"[OT INSTALLER] cloning default branch\"\r\n git clone https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n else\r\n echo -e \"[OT INSTALLER] cloning ${BRANCH}'\"\r\n git clone --single-branch --branch ${BRANCH} https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n fi\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing Open Ticket node.js packages.\"\r\nif [ -f \/mnt\/server\/package.json ]; then\r\n \/usr\/local\/bin\/npm install --omit=dev\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing custom node.js packages.\"\r\nif [[ ! -z ${NODE_PACKAGES} ]]; then\r\n \/usr\/local\/bin\/npm install ${NODE_PACKAGES}\r\nfi\r\n\r\necho -e \"[OT INSTALLER] install complete!\"\r\nexit 0",
|
||||||
|
"container": "node:latest",
|
||||||
|
"entrypoint": "bash"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"variables": [
|
||||||
|
{
|
||||||
|
"name": "Additional Npm Packages",
|
||||||
|
"description": "Specify additional npm packages used by Open Ticket plugins. Use spaces to separate.",
|
||||||
|
"env_variable": "NODE_PACKAGES",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Startup Flags",
|
||||||
|
"description": "Start the bot with additional Open Ticket flags. Separate using spaces.\r\nA full reference list can be found in the documentation.",
|
||||||
|
"env_variable": "NODE_FLAGS",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Uninstall Npm Packages",
|
||||||
|
"description": "A list of npm packages to uninstall. Separate by spaces.",
|
||||||
|
"env_variable": "UNNODE_PACKAGES",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Contributing Guidelines
|
# Contributing Guidelines
|
||||||
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
|
||||||
|
|
||||||
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.2) [](https://github.com/sponsors/DJj123dj)
|
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.5) [](https://github.com/sponsors/DJj123dj)
|
||||||
|
|
||||||
These are the Contributing Guidelines of Open Ticket!<br>
|
These are the Contributing Guidelines of Open Ticket!<br>
|
||||||
Here you can find everything you need to know about contributing to Open Ticket.<br>
|
Here you can find everything you need to know about contributing to Open Ticket.<br>
|
||||||
|
|||||||
+12
-10
@@ -1,7 +1,7 @@
|
|||||||
# Security Policy
|
# Security Policy
|
||||||
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
|
||||||
|
|
||||||
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.1) [](https://github.com/sponsors/DJj123dj)
|
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.4) [](https://github.com/sponsors/DJj123dj)
|
||||||
|
|
||||||
This is the Security Policy of Open Ticket!<br>
|
This is the Security Policy of Open Ticket!<br>
|
||||||
Here you can find a list of all supported & deprecated versions of the bot.<br>
|
Here you can find a list of all supported & deprecated versions of the bot.<br>
|
||||||
@@ -17,15 +17,17 @@ This list will be updated on every release.
|
|||||||
- 🟧 Deprecated **(docs)**
|
- 🟧 Deprecated **(docs)**
|
||||||
- ❌ Fully Deprecated
|
- ❌ Fully Deprecated
|
||||||
|
|
||||||
| Version | Supported | Notes |
|
| Version | Supported | Notes |
|
||||||
|------------|-----------|--------------------------------|
|
|------------|-----------|------------------------------------------|
|
||||||
| 4.1.0 | 🟦 | |
|
| 4.1.0 | 🟦 | |
|
||||||
| 4.0.2 | ✅ | |
|
| 4.0.5 | ✅ | |
|
||||||
| 4.0.1 | ✅ | |
|
| 4.0.4 | ✅ | |
|
||||||
| 4.0.0 | ✅ | |
|
| 4.0.3 | ✅ | Transcripts v2.0 (Offline August 2025) |
|
||||||
| 3.5.9 | 🚧 | Supported until May 2025 (LTS) |
|
| 4.0.2 | 🚧 | Major discord.js bug |
|
||||||
| 3.5.8 | 🟧 | Documentation Only |
|
| 4.0.1 | 🚧 | |
|
||||||
| < 3.5.8 | ❌ | |
|
| 4.0.0 | 🚧 | Supported until June 2025 (LTS) |
|
||||||
|
| 3.5.9 | 🟧 | Documentation Only |
|
||||||
|
| < 3.5.9 | ❌ | |
|
||||||
|
|
||||||
### 🕷️ Reporting Vulnerabilities
|
### 🕷️ Reporting Vulnerabilities
|
||||||
You can report vulnerabilities, errors & bugs using one of the following methods:
|
You can report vulnerabilities, errors & bugs using one of the following methods:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<br>Powered By<br>
|
<br>Powered By<br>
|
||||||
<img src="https://apis.dj-dj.be/cdn/opendiscord/logo.png" alt="Open Ticket" width="170px"><br>
|
<img src="https://apis.dj-dj.be/cdn/opendiscord/logo.png" alt="Open Ticket" width="170px"><br>
|
||||||
<a href="https://discord.com/invite/26vT9wt3n3"><img alt="Discord Invite Link" src="https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord"></img></a>
|
<a href="https://discord.com/invite/26vT9wt3n3"><img alt="Discord Invite Link" src="https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord"></img></a>
|
||||||
<a href="https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.2"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.0.2-brightgreen.svg?style=flat-square"></img></a>
|
<a href="https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.5"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.0.5-brightgreen.svg?style=flat-square"></img></a>
|
||||||
<a href="https://otdocs.dj-dj.be"><img alt="Open Ticket Documentation" src="https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm"></img></a>
|
<a href="https://otdocs.dj-dj.be"><img alt="Open Ticket Documentation" src="https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm"></img></a>
|
||||||
<a href="https://github.com/open-discord-bots/open-ticket/blob/main/LICENSE"><img alt="Open Ticket License" src="https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square"></img></a>
|
<a href="https://github.com/open-discord-bots/open-ticket/blob/main/LICENSE"><img alt="Open Ticket License" src="https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square"></img></a>
|
||||||
<a href="https://otdocs.dj-dj.be"><img alt="Open Ticket Stars" src="https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square"></img></a>
|
<a href="https://otdocs.dj-dj.be"><img alt="Open Ticket Stars" src="https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square"></img></a>
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
"_INFO":{
|
"_INFO":{
|
||||||
"support":"https://otdocs.dj-dj.be",
|
"support":"https://otdocs.dj-dj.be",
|
||||||
"discord":"https://discord.dj-dj.be",
|
"discord":"https://discord.dj-dj.be",
|
||||||
"version":"open-ticket-v4.0.2"
|
"version":"open-ticket-v4.0.5"
|
||||||
},
|
},
|
||||||
|
|
||||||
"token":"your bot token here! (or leave empty when using 'tokenFromENV')",
|
"token":"your bot token here! (or leave empty when using 'tokenFromENV')",
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@
|
|||||||
"image":"https://www.example.com/image.png (or leave empty)",
|
"image":"https://www.example.com/image.png (or leave empty)",
|
||||||
"thumbnail":"https://www.example.com/image.png (or leave empty)",
|
"thumbnail":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
|
||||||
"footer":"Open Ticket v4.0.2 (or leave empty)",
|
"footer":"Open Ticket v4.0.5 (or leave empty)",
|
||||||
"fields":[
|
"fields":[
|
||||||
{"name":"field name","value":"field value","inline":false}
|
{"name":"field name","value":"field value","inline":false}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
},
|
},
|
||||||
"favicon":{
|
"favicon":{
|
||||||
"enableCustomFavicon":false,
|
"enableCustomFavicon":false,
|
||||||
"imageUrl":"https://transcripts.dj-dj.be/favicon.png"
|
"imageUrl":"https://t.dj-dj.be/favicon.png"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,7 +14,7 @@ process.argv.push(...flags)
|
|||||||
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
|
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
|
||||||
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
|
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
|
||||||
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
|
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
|
||||||
v4.0.2 - Made by DJj123dj & Contributors
|
v4.0.5 - Made by DJj123dj & Contributors
|
||||||
|
|
||||||
Discord: https://discord.dj-dj.be
|
Discord: https://discord.dj-dj.be
|
||||||
Docs: https://otdocs.dj-dj.be
|
Docs: https://otdocs.dj-dj.be
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION": {
|
"_TRANSLATION": {
|
||||||
"otversion": "v4.0.2",
|
"otversion": "v4.0.5",
|
||||||
"translators": ["palestinian"],
|
"translators": ["palestinian"],
|
||||||
"lastedited": "06/12/2024",
|
"lastedited": "06/12/2024",
|
||||||
"language": "Arabic",
|
"language": "Arabic",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["guillee3"],
|
"translators":["guillee3"],
|
||||||
"lastedited":"21/08/2024",
|
"lastedited":"21/08/2024",
|
||||||
"language":"Catalan",
|
"language":"Catalan",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["DJj123dj"],
|
"translators":["DJj123dj"],
|
||||||
"lastedited":"21/08/2024",
|
"lastedited":"21/08/2024",
|
||||||
"language":"Custom",
|
"language":"Custom",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["spyeye_"],
|
"translators":["spyeye_"],
|
||||||
"lastedited":"21/08/2024",
|
"lastedited":"21/08/2024",
|
||||||
"language":"Czech",
|
"language":"Czech",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["the_gamer"],
|
"translators":["the_gamer"],
|
||||||
"lastedited":"26/09/2024",
|
"lastedited":"26/09/2024",
|
||||||
"language":"Danish",
|
"language":"Danish",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["DJj123dj"],
|
"translators":["DJj123dj"],
|
||||||
"lastedited":"21/08/2024",
|
"lastedited":"21/08/2024",
|
||||||
"language":"Dutch",
|
"language":"Dutch",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["DJj123dj"],
|
"translators":["DJj123dj"],
|
||||||
"lastedited":"21/08/2024",
|
"lastedited":"21/08/2024",
|
||||||
"language":"English",
|
"language":"English",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["iamnotmega","ChatGPT"],
|
"translators":["iamnotmega","ChatGPT"],
|
||||||
"lastedited":"21/10/2024",
|
"lastedited":"21/10/2024",
|
||||||
"language":"Estonian",
|
"language":"Estonian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["iamnotmega","ChatGPT"],
|
"translators":["iamnotmega","ChatGPT"],
|
||||||
"lastedited":"21/10/2024",
|
"lastedited":"21/10/2024",
|
||||||
"language":"Finnish",
|
"language":"Finnish",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["guillee3"],
|
"translators":["guillee3"],
|
||||||
"lastedited":"04/12/2024",
|
"lastedited":"04/12/2024",
|
||||||
"language":"French",
|
"language":"French",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["benzorich"],
|
"translators":["benzorich"],
|
||||||
"lastedited":"06/10/2024",
|
"lastedited":"06/10/2024",
|
||||||
"language":"German",
|
"language":"German",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["an_developer"],
|
"translators":["an_developer"],
|
||||||
"lastedited":"14/12/2024",
|
"lastedited":"14/12/2024",
|
||||||
"language":"Hindi",
|
"language":"Hindi",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["Kornel0706"],
|
"translators":["Kornel0706"],
|
||||||
"lastedited":"22/08/2024",
|
"lastedited":"22/08/2024",
|
||||||
"language":"Hungarian",
|
"language":"Hungarian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["erxg"],
|
"translators":["erxg"],
|
||||||
"lastedited":"25/08/2024",
|
"lastedited":"25/08/2024",
|
||||||
"language":"Indonesian",
|
"language":"Indonesian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["fraden1mvp."],
|
"translators":["fraden1mvp."],
|
||||||
"lastedited":"08/10/2024",
|
"lastedited":"08/10/2024",
|
||||||
"language":"Italian",
|
"language":"Italian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION": {
|
"_TRANSLATION": {
|
||||||
"otversion": "v4.0.2",
|
"otversion": "v4.0.5",
|
||||||
"translators": ["NoOneNook"],
|
"translators": ["NoOneNook"],
|
||||||
"lastedited": "25/03/2025",
|
"lastedited": "25/03/2025",
|
||||||
"language": "Latvian",
|
"language": "Latvian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["TsgIndrius"],
|
"translators":["TsgIndrius"],
|
||||||
"lastedited":"26/01/2025",
|
"lastedited":"26/01/2025",
|
||||||
"language":"Lithuanian",
|
"language":"Lithuanian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION": {
|
"_TRANSLATION": {
|
||||||
"otversion": "v4.0.2",
|
"otversion": "v4.0.5",
|
||||||
"translators": ["NoOneNook"],
|
"translators": ["NoOneNook"],
|
||||||
"lastedited": "25/03/2025",
|
"lastedited": "25/03/2025",
|
||||||
"language": "Norwegian",
|
"language": "Norwegian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["DanoGlez"],
|
"translators":["DanoGlez"],
|
||||||
"lastedited":"28/01/2025",
|
"lastedited":"28/01/2025",
|
||||||
"language":"Polish",
|
"language":"Polish",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["quiradon"],
|
"translators":["quiradon"],
|
||||||
"lastedited":"20/08/2024",
|
"lastedited":"20/08/2024",
|
||||||
"language":"Portuguese",
|
"language":"Portuguese",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["SankeDev"],
|
"translators":["SankeDev"],
|
||||||
"lastedited":"27/08/2024",
|
"lastedited":"27/08/2024",
|
||||||
"language":"Romanian",
|
"language":"Romanian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION": {
|
"_TRANSLATION": {
|
||||||
"otversion": "v4.0.2",
|
"otversion": "v4.0.5",
|
||||||
"translators": ["NoOneNook"],
|
"translators": ["NoOneNook"],
|
||||||
"lastedited": "25/03/2025",
|
"lastedited": "25/03/2025",
|
||||||
"language": "Russian",
|
"language": "Russian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["Redactado","Josuens"],
|
"translators":["Redactado","Josuens"],
|
||||||
"lastedited":"22/08/2024",
|
"lastedited":"22/08/2024",
|
||||||
"language":"Spanish",
|
"language":"Spanish",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION": {
|
"_TRANSLATION": {
|
||||||
"otversion": "v4.0.2",
|
"otversion": "v4.0.5",
|
||||||
"translators": ["NoOneNook"],
|
"translators": ["NoOneNook"],
|
||||||
"lastedited": "25/03/2025",
|
"lastedited": "25/03/2025",
|
||||||
"language": "Svenska",
|
"language": "Svenska",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["modshd"],
|
"translators":["modshd"],
|
||||||
"lastedited":"13/11/2024",
|
"lastedited":"13/11/2024",
|
||||||
"language":"Thai",
|
"language":"Thai",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION": {
|
"_TRANSLATION": {
|
||||||
"otversion": "v4.0.2",
|
"otversion": "v4.0.5",
|
||||||
"translators": ["palestinian"],
|
"translators": ["palestinian"],
|
||||||
"lastedited": "26/11/2024",
|
"lastedited": "26/11/2024",
|
||||||
"language": "Turkish",
|
"language": "Turkish",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["Anderskiy"],
|
"translators":["Anderskiy"],
|
||||||
"lastedited":"31/08/2024",
|
"lastedited":"31/08/2024",
|
||||||
"language":"Ukrainian",
|
"language":"Ukrainian",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_TRANSLATION":{
|
"_TRANSLATION":{
|
||||||
"otversion":"v4.0.2",
|
"otversion":"v4.0.5",
|
||||||
"translators":["ngocdiep2006"],
|
"translators":["ngocdiep2006"],
|
||||||
"lastedited":"07/04/2025",
|
"lastedited":"07/04/2025",
|
||||||
"language":"Vietnamese",
|
"language":"Vietnamese",
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "open-ticket",
|
"name": "open-ticket",
|
||||||
"author": "DJdj Development",
|
"author": "DJdj Development",
|
||||||
"version": "4.0.2",
|
"version": "4.0.5",
|
||||||
"description": "The most advanced open-source discord ticket bot with HTML transcripts, plugins, questions, claiming, pinning & more! Using discord.js v14 & JSON database! ",
|
"description": "The most advanced open-source discord ticket bot with HTML transcripts, plugins, questions, claiming, pinning & more! Using discord.js v14 & JSON database! ",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"ticket-bot",
|
"ticket-bot",
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
"@discordjs/rest": "^2.4.2",
|
"@discordjs/rest": "^2.4.2",
|
||||||
"@types/node": "^22.5.0",
|
"@types/node": "^22.5.0",
|
||||||
"ansis": "^2.3.0",
|
"ansis": "^2.3.0",
|
||||||
"discord.js": "^14.17.2",
|
"discord.js": "^14.19.1",
|
||||||
"formatted-json-stringify": "^1.1.0",
|
"formatted-json-stringify": "^1.1.0",
|
||||||
"typescript": "^5.5.4"
|
"typescript": "^5.5.4"
|
||||||
},
|
},
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
"#opendiscord": "./dist/src/index.js",
|
"#opendiscord": "./dist/src/index.js",
|
||||||
"#opendiscord-types": "./dist/src/core/api/api.js"
|
"#opendiscord-types": "./dist/src/core/api/api.js"
|
||||||
},
|
},
|
||||||
"funding":{
|
"funding": {
|
||||||
"type": "individual",
|
"type": "individual",
|
||||||
"url": "https://github.com/sponsors/DJj123dj"
|
"url": "https://github.com/sponsors/DJj123dj"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export const registerActions = async () => {
|
|||||||
const channelCategory = option.get("opendiscord:channel-category").value
|
const channelCategory = option.get("opendiscord:channel-category").value
|
||||||
const channelBackupCategory = option.get("opendiscord:channel-category-backup").value
|
const channelBackupCategory = option.get("opendiscord:channel-category-backup").value
|
||||||
const channelDescription = option.get("opendiscord:channel-description").value
|
const channelDescription = option.get("opendiscord:channel-description").value
|
||||||
const channelSuffix = opendiscord.options.suffix.getSuffixFromOption(option,user)
|
const channelSuffix = await opendiscord.options.suffix.getSuffixFromOption(option,user)
|
||||||
const channelName = channelPrefix+channelSuffix
|
const channelName = channelPrefix+channelSuffix
|
||||||
|
|
||||||
//handle category
|
//handle category
|
||||||
|
|||||||
@@ -38,7 +38,9 @@ export const registerActions = async () => {
|
|||||||
await opendiscord.events.get("onTranscriptInit").emit([opendiscord.transcripts,ticket,channel,user])
|
await opendiscord.events.get("onTranscriptInit").emit([opendiscord.transcripts,ticket,channel,user])
|
||||||
if (instance.compiler.init){
|
if (instance.compiler.init){
|
||||||
try{
|
try{
|
||||||
|
instance.initData = null
|
||||||
const result = await instance.compiler.init(ticket,channel,user)
|
const result = await instance.compiler.init(ticket,channel,user)
|
||||||
|
instance.initData = result.initData
|
||||||
if (result.success && result.pendingMessage && transcriptConfig.data.general.enableChannel){
|
if (result.success && result.pendingMessage && transcriptConfig.data.general.enableChannel){
|
||||||
//send init message to channel
|
//send init message to channel
|
||||||
const post = opendiscord.posts.get("opendiscord:transcripts")
|
const post = opendiscord.posts.get("opendiscord:transcripts")
|
||||||
@@ -49,7 +51,9 @@ export const registerActions = async () => {
|
|||||||
instance.pendingMessage = null
|
instance.pendingMessage = null
|
||||||
instance.errorReason = result.errorReason
|
instance.errorReason = result.errorReason
|
||||||
throw new api.ODSystemError("ODAction(ot:create-transcript) => Known Init Error => "+result.errorReason)
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Known Init Error => "+result.errorReason)
|
||||||
}else instance.pendingMessage = null
|
}else{
|
||||||
|
instance.pendingMessage = null
|
||||||
|
}
|
||||||
}catch(err){
|
}catch(err){
|
||||||
instance.success = false
|
instance.success = false
|
||||||
cancel()
|
cancel()
|
||||||
@@ -72,7 +76,7 @@ export const registerActions = async () => {
|
|||||||
await opendiscord.events.get("onTranscriptCompile").emit([opendiscord.transcripts,ticket,channel,user])
|
await opendiscord.events.get("onTranscriptCompile").emit([opendiscord.transcripts,ticket,channel,user])
|
||||||
if (instance.compiler.compile){
|
if (instance.compiler.compile){
|
||||||
try{
|
try{
|
||||||
const result = await instance.compiler.compile(ticket,channel,user)
|
const result = await instance.compiler.compile(ticket,channel,user,instance.initData)
|
||||||
if (!result.success){
|
if (!result.success){
|
||||||
instance.errorReason = result.errorReason
|
instance.errorReason = result.errorReason
|
||||||
throw new api.ODSystemError("ODAction(ot:create-transcript) => Known Compiler Error => "+result.errorReason)
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Known Compiler Error => "+result.errorReason)
|
||||||
|
|||||||
@@ -142,7 +142,8 @@ export const registerButtonResponders = async () => {
|
|||||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:ticket-questions").build("panel-button",{guild,channel,user,option}))
|
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:ticket-questions").build("panel-button",{guild,channel,user,option}))
|
||||||
}else{
|
}else{
|
||||||
//create ticket
|
//create ticket
|
||||||
await instance.defer("reply",true)
|
await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true)
|
||||||
|
|
||||||
const res = await opendiscord.actions.get("opendiscord:create-ticket").run("panel-button",{guild,user,answers:[],option})
|
const res = await opendiscord.actions.get("opendiscord:create-ticket").run("panel-button",{guild,user,answers:[],option})
|
||||||
if (!res.channel || !res.ticket){
|
if (!res.channel || !res.ticket){
|
||||||
//error
|
//error
|
||||||
@@ -196,7 +197,8 @@ export const registerDropdownResponders = async () => {
|
|||||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:ticket-questions").build("panel-dropdown",{guild,channel,user,option}))
|
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:ticket-questions").build("panel-dropdown",{guild,channel,user,option}))
|
||||||
}else{
|
}else{
|
||||||
//create ticket
|
//create ticket
|
||||||
await instance.defer("reply",true)
|
await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true)
|
||||||
|
|
||||||
const res = await opendiscord.actions.get("opendiscord:create-ticket").run("panel-dropdown",{guild,user,answers:[],option})
|
const res = await opendiscord.actions.get("opendiscord:create-ticket").run("panel-dropdown",{guild,user,answers:[],option})
|
||||||
if (!res.channel || !res.ticket){
|
if (!res.channel || !res.ticket){
|
||||||
//error
|
//error
|
||||||
@@ -264,7 +266,8 @@ export const registerModalResponders = async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
//create ticket
|
//create ticket
|
||||||
await instance.defer("reply",true)
|
await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true)
|
||||||
|
|
||||||
const res = await opendiscord.actions.get("opendiscord:create-ticket").run(originalSource,{guild,user,answers,option})
|
const res = await opendiscord.actions.get("opendiscord:create-ticket").run(originalSource,{guild,user,answers,option})
|
||||||
if (!res.channel || !res.ticket){
|
if (!res.channel || !res.ticket){
|
||||||
//error
|
//error
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export interface ODActionManagerIds_Default {
|
|||||||
"opendiscord:create-transcript":{
|
"opendiscord:create-transcript":{
|
||||||
source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",
|
source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",
|
||||||
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},
|
||||||
result:{compiler:ODTranscriptCompiler<any>, success:boolean, result:ODTranscriptCompilerCompileResult<any>, errorReason:string|null, pendingMessage:ODMessageBuildSentResult<true>|null, participants:{user:discord.User,role:"creator"|"participant"|"admin"}[]},
|
result:{compiler:ODTranscriptCompiler<any,object|null>, success:boolean, result:ODTranscriptCompilerCompileResult<any>, errorReason:string|null, pendingMessage:ODMessageBuildSentResult<true>|null, initData:object|null, participants:{user:discord.User,role:"creator"|"participant"|"admin"}[]},
|
||||||
workers:"opendiscord:select-compiler"|"opendiscord:init-transcript"|"opendiscord:compile-transcript"|"opendiscord:ready-transcript"|"opendiscord:logs"
|
workers:"opendiscord:select-compiler"|"opendiscord:init-transcript"|"opendiscord:compile-transcript"|"opendiscord:ready-transcript"|"opendiscord:logs"
|
||||||
},
|
},
|
||||||
"opendiscord:create-ticket":{
|
"opendiscord:create-ticket":{
|
||||||
|
|||||||
@@ -58,9 +58,9 @@ export interface ODButtonManagerIds_Default {
|
|||||||
"opendiscord:pin-ticket":{source:"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:pin-ticket"},
|
"opendiscord:pin-ticket":{source:"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:pin-ticket"},
|
||||||
"opendiscord:unpin-ticket":{source:"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:unpin-ticket"},
|
"opendiscord:unpin-ticket":{source:"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:unpin-ticket"},
|
||||||
|
|
||||||
"opendiscord:transcript-html-visit":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,result:ODTranscriptCompilerCompileResult<{url:string}>},workers:"opendiscord:transcript-html-visit"},
|
"opendiscord:transcript-html-visit":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string,availableUntil:Date},{auth:string}>,result:ODTranscriptCompilerCompileResult<{url:string,availableUntil:Date}>},workers:"opendiscord:transcript-html-visit"},
|
||||||
"opendiscord:transcript-error-retry":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,reason:string|null},workers:"opendiscord:transcript-error-retry"},
|
"opendiscord:transcript-error-retry":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any,object|null>,reason:string|null},workers:"opendiscord:transcript-error-retry"},
|
||||||
"opendiscord:transcript-error-continue":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,reason:string|null},workers:"opendiscord:transcript-error-continue"},
|
"opendiscord:transcript-error-continue":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any,object|null>,reason:string|null},workers:"opendiscord:transcript-error-continue"},
|
||||||
|
|
||||||
"opendiscord:clear-continue":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-continue"},
|
"opendiscord:clear-continue":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-continue"},
|
||||||
}
|
}
|
||||||
@@ -170,7 +170,7 @@ export class ODDropdown_Default<Source extends string, Params, WorkerIds extends
|
|||||||
* It's used to generate typescript declarations for this class.
|
* It's used to generate typescript declarations for this class.
|
||||||
*/
|
*/
|
||||||
export interface ODFileManagerIds_Default {
|
export interface ODFileManagerIds_Default {
|
||||||
"opendiscord:text-transcript":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,result:ODTranscriptCompilerCompileResult<any>},workers:"opendiscord:text-transcript"}
|
"opendiscord:text-transcript":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any,object|null>,result:ODTranscriptCompilerCompileResult<any>},workers:"opendiscord:text-transcript"}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**## ODFileManager_Default `default_class`
|
/**## ODFileManager_Default `default_class`
|
||||||
@@ -275,10 +275,10 @@ export interface ODEmbedManagerIds_Default {
|
|||||||
"opendiscord:blacklist-dm":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"opendiscord:blacklist-dm"},
|
"opendiscord:blacklist-dm":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"opendiscord:blacklist-dm"},
|
||||||
"opendiscord:blacklist-logs":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"opendiscord:blacklist-logs"},
|
"opendiscord:blacklist-logs":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"opendiscord:blacklist-logs"},
|
||||||
|
|
||||||
"opendiscord:transcript-text-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{contents:string}>,result:ODTranscriptCompilerCompileResult<{contents:string}>},workers:"opendiscord:transcript-text-ready"},
|
"opendiscord:transcript-text-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{contents:string},null>,result:ODTranscriptCompilerCompileResult<{contents:string}>},workers:"opendiscord:transcript-text-ready"},
|
||||||
"opendiscord:transcript-html-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,result:ODTranscriptCompilerCompileResult<{url:string}>},workers:"opendiscord:transcript-html-ready"},
|
"opendiscord:transcript-html-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string,availableUntil:Date},{auth:string}>,result:ODTranscriptCompilerCompileResult<{url:string,availableUntil:Date}>},workers:"opendiscord:transcript-html-ready"},
|
||||||
"opendiscord:transcript-html-progress":{source:"channel"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,remaining:number},workers:"opendiscord:transcript-html-progress"},
|
"opendiscord:transcript-html-progress":{source:"channel"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string,availableUntil:Date},{auth:string}>,remaining:number},workers:"opendiscord:transcript-html-progress"},
|
||||||
"opendiscord:transcript-error":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,reason:string|null},workers:"opendiscord:transcript-error"},
|
"opendiscord:transcript-error":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any,object|null>,reason:string|null},workers:"opendiscord:transcript-error"},
|
||||||
|
|
||||||
"opendiscord:reaction-role":{source:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:ODRoleUpdateResult[]},workers:"opendiscord:reaction-role"},
|
"opendiscord:reaction-role":{source:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:ODRoleUpdateResult[]},workers:"opendiscord:reaction-role"},
|
||||||
"opendiscord:clear-verify-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-verify-message"},
|
"opendiscord:clear-verify-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-verify-message"},
|
||||||
@@ -406,10 +406,10 @@ export interface ODMessageManagerIds_Default {
|
|||||||
"opendiscord:blacklist-dm":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"opendiscord:blacklist-dm"},
|
"opendiscord:blacklist-dm":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"opendiscord:blacklist-dm"},
|
||||||
"opendiscord:blacklist-logs":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"opendiscord:blacklist-logs"},
|
"opendiscord:blacklist-logs":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"opendiscord:blacklist-logs"},
|
||||||
|
|
||||||
"opendiscord:transcript-text-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{contents:string}>,result:ODTranscriptCompilerCompileResult<{contents:string}>},workers:"opendiscord:transcript-text-ready"},
|
"opendiscord:transcript-text-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{contents:string},null>,result:ODTranscriptCompilerCompileResult<{contents:string}>},workers:"opendiscord:transcript-text-ready"},
|
||||||
"opendiscord:transcript-html-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,result:ODTranscriptCompilerCompileResult<{url:string}>},workers:"opendiscord:transcript-html-ready"},
|
"opendiscord:transcript-html-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string,availableUntil:Date},{auth:string}>,result:ODTranscriptCompilerCompileResult<{url:string,availableUntil:Date}>},workers:"opendiscord:transcript-html-ready"},
|
||||||
"opendiscord:transcript-html-progress":{source:"channel"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,remaining:number},workers:"opendiscord:transcript-html-progress"},
|
"opendiscord:transcript-html-progress":{source:"channel"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string,availableUntil:Date},{auth:string}>,remaining:number},workers:"opendiscord:transcript-html-progress"},
|
||||||
"opendiscord:transcript-error":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,reason:string|null},workers:"opendiscord:transcript-error"},
|
"opendiscord:transcript-error":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any,object|null>,reason:string|null},workers:"opendiscord:transcript-error"},
|
||||||
|
|
||||||
"opendiscord:reaction-role":{source:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:ODRoleUpdateResult[]},workers:"opendiscord:reaction-role"},
|
"opendiscord:reaction-role":{source:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:ODRoleUpdateResult[]},workers:"opendiscord:reaction-role"},
|
||||||
"opendiscord:clear-verify-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-verify-message"},
|
"opendiscord:clear-verify-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-verify-message"},
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ export class ODMain {
|
|||||||
|
|
||||||
constructor(){
|
constructor(){
|
||||||
this.versions = new ODVersionManager_Default()
|
this.versions = new ODVersionManager_Default()
|
||||||
this.versions.add(ODVersion.fromString("opendiscord:version","v4.0.2"))
|
this.versions.add(ODVersion.fromString("opendiscord:version","v4.0.5"))
|
||||||
this.versions.add(ODVersion.fromString("opendiscord:api","v1.0.0"))
|
this.versions.add(ODVersion.fromString("opendiscord:api","v1.0.0"))
|
||||||
this.versions.add(ODVersion.fromString("opendiscord:transcripts","v2.0.0"))
|
this.versions.add(ODVersion.fromString("opendiscord:transcripts","v2.0.0"))
|
||||||
this.versions.add(ODVersion.fromString("opendiscord:livestatus","v2.0.0"))
|
this.versions.add(ODVersion.fromString("opendiscord:livestatus","v2.0.0"))
|
||||||
|
|||||||
@@ -648,8 +648,8 @@ export class ODHTTPGetRequest {
|
|||||||
this.throwOnError = throwOnError
|
this.throwOnError = throwOnError
|
||||||
const newConfig = config ?? {}
|
const newConfig = config ?? {}
|
||||||
newConfig.method = "GET"
|
newConfig.method = "GET"
|
||||||
if (newConfig.headers) Object.assign(newConfig.headers,{"User-Agent":"OpenDiscordBots-OpenTicket/4.0.2"})
|
if (newConfig.headers) Object.assign(newConfig.headers,{"User-Agent":"OpenDiscordBots-OpenTicket/4.0.5"})
|
||||||
else newConfig.headers = {"User-Agent":"OpenDiscordBots-OpenTicket/4.0.2"}
|
else newConfig.headers = {"User-Agent":"OpenDiscordBots-OpenTicket/4.0.5"}
|
||||||
this.config = newConfig
|
this.config = newConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -703,8 +703,8 @@ export class ODHTTPPostRequest {
|
|||||||
this.throwOnError = throwOnError
|
this.throwOnError = throwOnError
|
||||||
const newConfig = config ?? {}
|
const newConfig = config ?? {}
|
||||||
newConfig.method = "POST"
|
newConfig.method = "POST"
|
||||||
if (newConfig.headers) Object.assign(newConfig.headers,{"User-Agent":"OpenDiscordBots-OpenTicket/4.0.2"})
|
if (newConfig.headers) Object.assign(newConfig.headers,{"User-Agent":"OpenDiscordBots-OpenTicket/4.0.5"})
|
||||||
else newConfig.headers = {"User-Agent":"OpenDiscordBots-OpenTicket/4.0.2"}
|
else newConfig.headers = {"User-Agent":"OpenDiscordBots-OpenTicket/4.0.5"}
|
||||||
this.config = newConfig
|
this.config = newConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ export class ODQuickButton {
|
|||||||
/**The id of this button. */
|
/**The id of this button. */
|
||||||
id: ODId
|
id: ODId
|
||||||
/**The current data of this button */
|
/**The current data of this button */
|
||||||
data: ODButtonData = {
|
data: Partial<ODButtonData> = {
|
||||||
customId:"",
|
customId:"",
|
||||||
mode:"button",
|
mode:"button",
|
||||||
url:null,
|
url:null,
|
||||||
@@ -267,7 +267,7 @@ export class ODQuickButton {
|
|||||||
disabled:false
|
disabled:false
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(id:ODValidId,data:ODButtonData){
|
constructor(id:ODValidId,data:Partial<ODButtonData>){
|
||||||
this.id = new ODId(id)
|
this.id = new ODId(id)
|
||||||
this.data = data
|
this.data = data
|
||||||
}
|
}
|
||||||
@@ -277,7 +277,7 @@ export class ODQuickButton {
|
|||||||
try {
|
try {
|
||||||
//create the discord.js button
|
//create the discord.js button
|
||||||
const button = new discord.ButtonBuilder()
|
const button = new discord.ButtonBuilder()
|
||||||
if (this.data.mode == "button") button.setCustomId(this.data.customId)
|
if (this.data.mode == "button") button.setCustomId(this.data.customId ?? "od:unknown-button")
|
||||||
if (this.data.mode == "url") button.setStyle(discord.ButtonStyle.Link)
|
if (this.data.mode == "url") button.setStyle(discord.ButtonStyle.Link)
|
||||||
else if (this.data.color == "gray") button.setStyle(discord.ButtonStyle.Secondary)
|
else if (this.data.color == "gray") button.setStyle(discord.ButtonStyle.Secondary)
|
||||||
else if (this.data.color == "blue") button.setStyle(discord.ButtonStyle.Primary)
|
else if (this.data.color == "blue") button.setStyle(discord.ButtonStyle.Primary)
|
||||||
@@ -287,7 +287,7 @@ export class ODQuickButton {
|
|||||||
if (this.data.label) button.setLabel(this.data.label)
|
if (this.data.label) button.setLabel(this.data.label)
|
||||||
if (this.data.emoji) button.setEmoji(this.data.emoji)
|
if (this.data.emoji) button.setEmoji(this.data.emoji)
|
||||||
if (this.data.disabled) button.setDisabled(this.data.disabled)
|
if (this.data.disabled) button.setDisabled(this.data.disabled)
|
||||||
if (!this.data.emoji && !this.data.label) button.setLabel(this.data.customId)
|
if (!this.data.emoji && !this.data.label) button.setLabel(this.data.customId ?? "od:unknown-button")
|
||||||
|
|
||||||
return {id:this.id,component:button}
|
return {id:this.id,component:button}
|
||||||
}catch(err){
|
}catch(err){
|
||||||
@@ -564,7 +564,7 @@ export class ODQuickDropdown {
|
|||||||
/**The id of this dropdown. */
|
/**The id of this dropdown. */
|
||||||
id: ODId
|
id: ODId
|
||||||
/**The current data of this dropdown */
|
/**The current data of this dropdown */
|
||||||
data: ODDropdownData = {
|
data: Partial<ODDropdownData> = {
|
||||||
customId:"",
|
customId:"",
|
||||||
type:"string",
|
type:"string",
|
||||||
placeholder:null,
|
placeholder:null,
|
||||||
@@ -580,7 +580,7 @@ export class ODQuickDropdown {
|
|||||||
mentionables:[]
|
mentionables:[]
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(id:ODValidId,data:ODDropdownData){
|
constructor(id:ODValidId,data:Partial<ODDropdownData>){
|
||||||
this.id = new ODId(id)
|
this.id = new ODId(id)
|
||||||
this.data = data
|
this.data = data
|
||||||
}
|
}
|
||||||
@@ -590,8 +590,9 @@ export class ODQuickDropdown {
|
|||||||
try{
|
try{
|
||||||
//create the discord.js dropdown
|
//create the discord.js dropdown
|
||||||
if (this.data.type == "string"){
|
if (this.data.type == "string"){
|
||||||
|
if (!this.data.options) throw new ODSystemError("ODQuickDropdown:build(): "+this.id.value+" => Dropdown requires at least 1 option to be present.")
|
||||||
const dropdown = new discord.StringSelectMenuBuilder()
|
const dropdown = new discord.StringSelectMenuBuilder()
|
||||||
dropdown.setCustomId(this.data.customId)
|
dropdown.setCustomId(this.data.customId ?? "od:unknown-dropdown")
|
||||||
dropdown.setOptions(...this.data.options)
|
dropdown.setOptions(...this.data.options)
|
||||||
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
||||||
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
||||||
@@ -601,8 +602,9 @@ export class ODQuickDropdown {
|
|||||||
return {id:this.id,component:dropdown}
|
return {id:this.id,component:dropdown}
|
||||||
|
|
||||||
}else if (this.data.type == "user"){
|
}else if (this.data.type == "user"){
|
||||||
|
if (!this.data.users) throw new ODSystemError("ODQuickDropdown:build(): "+this.id.value+" => Dropdown requires at least 1 user option to be present.")
|
||||||
const dropdown = new discord.UserSelectMenuBuilder()
|
const dropdown = new discord.UserSelectMenuBuilder()
|
||||||
dropdown.setCustomId(this.data.customId)
|
dropdown.setCustomId(this.data.customId ?? "od:unknown-dropdown")
|
||||||
if (this.data.users.length > 0) dropdown.setDefaultUsers(...this.data.users.map((u) => u.id))
|
if (this.data.users.length > 0) dropdown.setDefaultUsers(...this.data.users.map((u) => u.id))
|
||||||
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
||||||
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
||||||
@@ -612,8 +614,9 @@ export class ODQuickDropdown {
|
|||||||
return {id:this.id,component:dropdown}
|
return {id:this.id,component:dropdown}
|
||||||
|
|
||||||
}else if (this.data.type == "role"){
|
}else if (this.data.type == "role"){
|
||||||
|
if (!this.data.roles) throw new ODSystemError("ODQuickDropdown:build(): "+this.id.value+" => Dropdown requires at least 1 role option to be present.")
|
||||||
const dropdown = new discord.RoleSelectMenuBuilder()
|
const dropdown = new discord.RoleSelectMenuBuilder()
|
||||||
dropdown.setCustomId(this.data.customId)
|
dropdown.setCustomId(this.data.customId ?? "od:unknown-dropdown")
|
||||||
if (this.data.roles.length > 0) dropdown.setDefaultRoles(...this.data.roles.map((r) => r.id))
|
if (this.data.roles.length > 0) dropdown.setDefaultRoles(...this.data.roles.map((r) => r.id))
|
||||||
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
||||||
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
||||||
@@ -623,8 +626,9 @@ export class ODQuickDropdown {
|
|||||||
return {id:this.id,component:dropdown}
|
return {id:this.id,component:dropdown}
|
||||||
|
|
||||||
}else if (this.data.type == "channel"){
|
}else if (this.data.type == "channel"){
|
||||||
|
if (!this.data.channels) throw new ODSystemError("ODQuickDropdown:build(): "+this.id.value+" => Dropdown requires at least 1 channel option to be present.")
|
||||||
const dropdown = new discord.ChannelSelectMenuBuilder()
|
const dropdown = new discord.ChannelSelectMenuBuilder()
|
||||||
dropdown.setCustomId(this.data.customId)
|
dropdown.setCustomId(this.data.customId ?? "od:unknown-dropdown")
|
||||||
if (this.data.channels.length > 0) dropdown.setDefaultChannels(...this.data.channels.map((c) => c.id))
|
if (this.data.channels.length > 0) dropdown.setDefaultChannels(...this.data.channels.map((c) => c.id))
|
||||||
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
||||||
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
||||||
@@ -634,6 +638,7 @@ export class ODQuickDropdown {
|
|||||||
return {id:this.id,component:dropdown}
|
return {id:this.id,component:dropdown}
|
||||||
|
|
||||||
}else if (this.data.type == "mentionable"){
|
}else if (this.data.type == "mentionable"){
|
||||||
|
if (!this.data.mentionables) throw new ODSystemError("ODQuickDropdown:build(): "+this.id.value+" => Dropdown requires at least 1 mentionable option to be present.")
|
||||||
const dropdown = new discord.MentionableSelectMenuBuilder()
|
const dropdown = new discord.MentionableSelectMenuBuilder()
|
||||||
|
|
||||||
const values: ({type:discord.SelectMenuDefaultValueType.User,id:string}|{type:discord.SelectMenuDefaultValueType.Role,id:string})[] = []
|
const values: ({type:discord.SelectMenuDefaultValueType.User,id:string}|{type:discord.SelectMenuDefaultValueType.Role,id:string})[] = []
|
||||||
@@ -645,7 +650,7 @@ export class ODQuickDropdown {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
dropdown.setCustomId(this.data.customId)
|
dropdown.setCustomId(this.data.customId ?? "od:unknown-dropdown")
|
||||||
if (this.data.mentionables.length > 0) dropdown.setDefaultValues(...values)
|
if (this.data.mentionables.length > 0) dropdown.setDefaultValues(...values)
|
||||||
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
|
||||||
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
|
||||||
@@ -799,14 +804,14 @@ export class ODQuickFile {
|
|||||||
/**The id of this file. */
|
/**The id of this file. */
|
||||||
id: ODId
|
id: ODId
|
||||||
/**The current data of this file */
|
/**The current data of this file */
|
||||||
data: ODFileData = {
|
data: Partial<ODFileData> = {
|
||||||
file:"",
|
file:"",
|
||||||
name:"file.txt",
|
name:"file.txt",
|
||||||
description:null,
|
description:null,
|
||||||
spoiler:false
|
spoiler:false
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(id:ODValidId,data:ODFileData){
|
constructor(id:ODValidId,data:Partial<ODFileData>){
|
||||||
this.id = new ODId(id)
|
this.id = new ODId(id)
|
||||||
this.data = data
|
this.data = data
|
||||||
}
|
}
|
||||||
@@ -815,7 +820,7 @@ export class ODQuickFile {
|
|||||||
async build(): Promise<ODFileBuildResult> {
|
async build(): Promise<ODFileBuildResult> {
|
||||||
try{
|
try{
|
||||||
//create the discord.js attachment
|
//create the discord.js attachment
|
||||||
const file = new discord.AttachmentBuilder(this.data.file)
|
const file = new discord.AttachmentBuilder(this.data.file ?? "<empty-file>")
|
||||||
file.setName(this.data.name ? this.data.name : "file.txt")
|
file.setName(this.data.name ? this.data.name : "file.txt")
|
||||||
if (this.data.description) file.setDescription(this.data.description)
|
if (this.data.description) file.setDescription(this.data.description)
|
||||||
if (this.data.spoiler) file.setSpoiler(this.data.spoiler)
|
if (this.data.spoiler) file.setSpoiler(this.data.spoiler)
|
||||||
@@ -1055,7 +1060,7 @@ export class ODQuickEmbed {
|
|||||||
/**The id of this embed. */
|
/**The id of this embed. */
|
||||||
id: ODId
|
id: ODId
|
||||||
/**The current data of this embed */
|
/**The current data of this embed */
|
||||||
data: ODEmbedData = {
|
data: Partial<ODEmbedData> = {
|
||||||
title:null,
|
title:null,
|
||||||
color:null,
|
color:null,
|
||||||
url:null,
|
url:null,
|
||||||
@@ -1071,7 +1076,7 @@ export class ODQuickEmbed {
|
|||||||
timestamp:null
|
timestamp:null
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(id:ODValidId,data:ODEmbedData){
|
constructor(id:ODValidId,data:Partial<ODEmbedData>){
|
||||||
this.id = new ODId(id)
|
this.id = new ODId(id)
|
||||||
this.data = data
|
this.data = data
|
||||||
}
|
}
|
||||||
@@ -1097,7 +1102,7 @@ export class ODQuickEmbed {
|
|||||||
if (this.data.image) embed.setImage(this.data.image)
|
if (this.data.image) embed.setImage(this.data.image)
|
||||||
if (this.data.thumbnail) embed.setThumbnail(this.data.thumbnail)
|
if (this.data.thumbnail) embed.setThumbnail(this.data.thumbnail)
|
||||||
if (this.data.timestamp) embed.setTimestamp(this.data.timestamp)
|
if (this.data.timestamp) embed.setTimestamp(this.data.timestamp)
|
||||||
if (this.data.fields.length > 0) embed.setFields(this.data.fields)
|
if (this.data.fields && this.data.fields.length > 0) embed.setFields(this.data.fields)
|
||||||
|
|
||||||
return {id:this.id,embed}
|
return {id:this.id,embed}
|
||||||
}catch(err){
|
}catch(err){
|
||||||
|
|||||||
@@ -611,6 +611,7 @@ export class ODButtonResponderInstance {
|
|||||||
getMessageComponent(type:"button"|"string-dropdown"|"user-dropdown"|"channel-dropdown"|"role-dropdown"|"mentionable-dropdown", id:string|RegExp): discord.ButtonComponent|discord.StringSelectMenuComponent|discord.RoleSelectMenuComponent|discord.ChannelSelectMenuComponent|discord.MentionableSelectMenuComponent|discord.UserSelectMenuComponent|null {
|
getMessageComponent(type:"button"|"string-dropdown"|"user-dropdown"|"channel-dropdown"|"role-dropdown"|"mentionable-dropdown", id:string|RegExp): discord.ButtonComponent|discord.StringSelectMenuComponent|discord.RoleSelectMenuComponent|discord.ChannelSelectMenuComponent|discord.MentionableSelectMenuComponent|discord.UserSelectMenuComponent|null {
|
||||||
let result: discord.ButtonComponent|discord.StringSelectMenuComponent|discord.RoleSelectMenuComponent|discord.ChannelSelectMenuComponent|discord.MentionableSelectMenuComponent|discord.UserSelectMenuComponent|null = null
|
let result: discord.ButtonComponent|discord.StringSelectMenuComponent|discord.RoleSelectMenuComponent|discord.ChannelSelectMenuComponent|discord.MentionableSelectMenuComponent|discord.UserSelectMenuComponent|null = null
|
||||||
this.message.components.forEach((row) => {
|
this.message.components.forEach((row) => {
|
||||||
|
if (row.type != discord.ComponentType.ActionRow) return
|
||||||
row.components.forEach((component) => {
|
row.components.forEach((component) => {
|
||||||
if (type == "button" && component.type == discord.ComponentType.Button && component.customId && ((typeof id == "string") ? component.customId == id : id.test(component.customId))) result = component
|
if (type == "button" && component.type == discord.ComponentType.Button && component.customId && ((typeof id == "string") ? component.customId == id : id.test(component.customId))) result = component
|
||||||
else if (type == "string-dropdown" && component.type == discord.ComponentType.StringSelect && component.customId && ((typeof id == "string") ? component.customId == id : id.test(component.customId))) result = component
|
else if (type == "string-dropdown" && component.type == discord.ComponentType.StringSelect && component.customId && ((typeof id == "string") ? component.customId == id : id.test(component.customId))) result = component
|
||||||
@@ -898,6 +899,7 @@ export class ODDropdownResponderInstance {
|
|||||||
getMessageComponent(type:"button"|"string-dropdown"|"user-dropdown"|"channel-dropdown"|"role-dropdown"|"mentionable-dropdown", id:string|RegExp): discord.ButtonComponent|discord.StringSelectMenuComponent|discord.RoleSelectMenuComponent|discord.ChannelSelectMenuComponent|discord.MentionableSelectMenuComponent|discord.UserSelectMenuComponent|null {
|
getMessageComponent(type:"button"|"string-dropdown"|"user-dropdown"|"channel-dropdown"|"role-dropdown"|"mentionable-dropdown", id:string|RegExp): discord.ButtonComponent|discord.StringSelectMenuComponent|discord.RoleSelectMenuComponent|discord.ChannelSelectMenuComponent|discord.MentionableSelectMenuComponent|discord.UserSelectMenuComponent|null {
|
||||||
let result: discord.ButtonComponent|discord.StringSelectMenuComponent|discord.RoleSelectMenuComponent|discord.ChannelSelectMenuComponent|discord.MentionableSelectMenuComponent|discord.UserSelectMenuComponent|null = null
|
let result: discord.ButtonComponent|discord.StringSelectMenuComponent|discord.RoleSelectMenuComponent|discord.ChannelSelectMenuComponent|discord.MentionableSelectMenuComponent|discord.UserSelectMenuComponent|null = null
|
||||||
this.message.components.forEach((row) => {
|
this.message.components.forEach((row) => {
|
||||||
|
if (row.type != discord.ComponentType.ActionRow) return
|
||||||
row.components.forEach((component) => {
|
row.components.forEach((component) => {
|
||||||
if (type == "button" && component.type == discord.ComponentType.Button && component.customId && ((typeof id == "string") ? component.customId == id : id.test(component.customId))) result = component
|
if (type == "button" && component.type == discord.ComponentType.Button && component.customId && ((typeof id == "string") ? component.customId == id : id.test(component.customId))) result = component
|
||||||
else if (type == "string-dropdown" && component.type == discord.ComponentType.StringSelect && component.customId && ((typeof id == "string") ? component.customId == id : id.test(component.customId))) result = component
|
else if (type == "string-dropdown" && component.type == discord.ComponentType.StringSelect && component.customId && ((typeof id == "string") ? component.customId == id : id.test(component.customId))) result = component
|
||||||
|
|||||||
@@ -350,10 +350,10 @@ export class ODOptionSuffixManager extends ODManager<ODOptionSuffix> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**Instantly get the suffix from an `ODTicketOption`. */
|
/**Instantly get the suffix from an `ODTicketOption`. */
|
||||||
getSuffixFromOption(option:ODTicketOption,user:discord.User): string|null {
|
async getSuffixFromOption(option:ODTicketOption,user:discord.User): Promise<string|null> {
|
||||||
const suffix = this.getAll().find((suffix) => suffix.option.id.value == option.id.value)
|
const suffix = this.getAll().find((suffix) => suffix.option.id.value == option.id.value)
|
||||||
if (!suffix) return null
|
if (!suffix) return null
|
||||||
return suffix.getSuffix(user)
|
return await suffix.getSuffix(user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,7 +374,7 @@ export class ODOptionSuffix extends ODManagerData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**Get the suffix for a new ticket. */
|
/**Get the suffix for a new ticket. */
|
||||||
getSuffix(user:discord.User): string {
|
async getSuffix(user:discord.User): Promise<string> {
|
||||||
throw new ODSystemError("Tried to use an unimplemented ODOptionSuffix!")
|
throw new ODSystemError("Tried to use an unimplemented ODOptionSuffix!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -387,7 +387,7 @@ export class ODOptionSuffix extends ODManagerData {
|
|||||||
* Use `getSuffix()` to get the new suffix!
|
* Use `getSuffix()` to get the new suffix!
|
||||||
*/
|
*/
|
||||||
export class ODOptionUserNameSuffix extends ODOptionSuffix {
|
export class ODOptionUserNameSuffix extends ODOptionSuffix {
|
||||||
getSuffix(user:discord.User): string {
|
async getSuffix(user:discord.User): Promise<string> {
|
||||||
return user.username
|
return user.username
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -400,7 +400,7 @@ export class ODOptionUserNameSuffix extends ODOptionSuffix {
|
|||||||
* Use `getSuffix()` to get the new suffix!
|
* Use `getSuffix()` to get the new suffix!
|
||||||
*/
|
*/
|
||||||
export class ODOptionUserIdSuffix extends ODOptionSuffix {
|
export class ODOptionUserIdSuffix extends ODOptionSuffix {
|
||||||
getSuffix(user:discord.User): string {
|
async getSuffix(user:discord.User): Promise<string> {
|
||||||
return user.id
|
return user.id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -426,11 +426,11 @@ export class ODOptionCounterDynamicSuffix extends ODOptionSuffix {
|
|||||||
async #init(){
|
async #init(){
|
||||||
if (!await this.database.exists("opendiscord:option-suffix-counter",this.option.id.value)) await this.database.set("opendiscord:option-suffix-counter",this.option.id.value,0)
|
if (!await this.database.exists("opendiscord:option-suffix-counter",this.option.id.value)) await this.database.set("opendiscord:option-suffix-counter",this.option.id.value,0)
|
||||||
}
|
}
|
||||||
getSuffix(user:discord.User): string {
|
async getSuffix(user:discord.User): Promise<string> {
|
||||||
const rawCurrentValue = this.database.get("opendiscord:option-suffix-counter",this.option.id.value)
|
const rawCurrentValue = await this.database.get("opendiscord:option-suffix-counter",this.option.id.value)
|
||||||
const currentValue = (typeof rawCurrentValue != "number") ? 0 : rawCurrentValue
|
const currentValue = (typeof rawCurrentValue != "number") ? 0 : rawCurrentValue
|
||||||
const newValue = currentValue+1
|
const newValue = currentValue+1
|
||||||
this.database.set("opendiscord:option-suffix-counter",this.option.id.value,newValue)
|
await this.database.set("opendiscord:option-suffix-counter",this.option.id.value,newValue)
|
||||||
return newValue.toString()
|
return newValue.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -456,12 +456,12 @@ export class ODOptionCounterFixedSuffix extends ODOptionSuffix {
|
|||||||
async #init(){
|
async #init(){
|
||||||
if (!await this.database.exists("opendiscord:option-suffix-counter",this.option.id.value)) await this.database.set("opendiscord:option-suffix-counter",this.option.id.value,0)
|
if (!await this.database.exists("opendiscord:option-suffix-counter",this.option.id.value)) await this.database.set("opendiscord:option-suffix-counter",this.option.id.value,0)
|
||||||
}
|
}
|
||||||
getSuffix(user:discord.User): string {
|
async getSuffix(user:discord.User): Promise<string> {
|
||||||
const rawCurrentValue = this.database.get("opendiscord:option-suffix-counter",this.option.id.value)
|
const rawCurrentValue = await this.database.get("opendiscord:option-suffix-counter",this.option.id.value)
|
||||||
const currentValue = (typeof rawCurrentValue != "number") ? 0 : rawCurrentValue
|
const currentValue = (typeof rawCurrentValue != "number") ? 0 : rawCurrentValue
|
||||||
const newValue = (currentValue >= 9999) ? 0 : currentValue+1
|
const newValue = (currentValue >= 9999) ? 0 : currentValue+1
|
||||||
|
|
||||||
this.database.set("opendiscord:option-suffix-counter",this.option.id.value,newValue)
|
await this.database.set("opendiscord:option-suffix-counter",this.option.id.value,newValue)
|
||||||
if (newValue.toString().length == 1) return "000"+newValue.toString()
|
if (newValue.toString().length == 1) return "000"+newValue.toString()
|
||||||
else if (newValue.toString().length == 2) return "00"+newValue.toString()
|
else if (newValue.toString().length == 2) return "00"+newValue.toString()
|
||||||
else if (newValue.toString().length == 3) return "0"+newValue.toString()
|
else if (newValue.toString().length == 3) return "0"+newValue.toString()
|
||||||
@@ -501,13 +501,13 @@ export class ODOptionRandomNumberSuffix extends ODOptionSuffix {
|
|||||||
if (history.includes(number)) return this.#generateUniqueValue(history)
|
if (history.includes(number)) return this.#generateUniqueValue(history)
|
||||||
else return number
|
else return number
|
||||||
}
|
}
|
||||||
getSuffix(user:discord.User): string {
|
async getSuffix(user:discord.User): Promise<string> {
|
||||||
const rawCurrentValues = this.database.get("opendiscord:option-suffix-history",this.option.id.value)
|
const rawCurrentValues = await this.database.get("opendiscord:option-suffix-history",this.option.id.value)
|
||||||
const currentValues = ((Array.isArray(rawCurrentValues)) ? rawCurrentValues : []) as string[]
|
const currentValues = ((Array.isArray(rawCurrentValues)) ? rawCurrentValues : []) as string[]
|
||||||
const newValue = this.#generateUniqueValue(currentValues)
|
const newValue = this.#generateUniqueValue(currentValues)
|
||||||
currentValues.push(newValue)
|
currentValues.push(newValue)
|
||||||
if (currentValues.length > 50) currentValues.shift()
|
if (currentValues.length > 50) currentValues.shift()
|
||||||
this.database.set("opendiscord:option-suffix-history",this.option.id.value,currentValues)
|
await this.database.set("opendiscord:option-suffix-history",this.option.id.value,currentValues)
|
||||||
return newValue
|
return newValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -539,13 +539,13 @@ export class ODOptionRandomHexSuffix extends ODOptionSuffix {
|
|||||||
if (history.includes(hex)) return this.#generateUniqueValue(history)
|
if (history.includes(hex)) return this.#generateUniqueValue(history)
|
||||||
else return hex
|
else return hex
|
||||||
}
|
}
|
||||||
getSuffix(user:discord.User): string {
|
async getSuffix(user:discord.User): Promise<string> {
|
||||||
const rawCurrentValues = this.database.get("opendiscord:option-suffix-history",this.option.id.value)
|
const rawCurrentValues = await this.database.get("opendiscord:option-suffix-history",this.option.id.value)
|
||||||
const currentValues = ((Array.isArray(rawCurrentValues)) ? rawCurrentValues : []) as string[]
|
const currentValues = ((Array.isArray(rawCurrentValues)) ? rawCurrentValues : []) as string[]
|
||||||
const newValue = this.#generateUniqueValue(currentValues)
|
const newValue = this.#generateUniqueValue(currentValues)
|
||||||
currentValues.push(newValue)
|
currentValues.push(newValue)
|
||||||
if (currentValues.length > 50) currentValues.shift()
|
if (currentValues.length > 50) currentValues.shift()
|
||||||
this.database.set("opendiscord:option-suffix-history",this.option.id.value,currentValues)
|
await this.database.set("opendiscord:option-suffix-history",this.option.id.value,currentValues)
|
||||||
return newValue
|
return newValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,7 @@ import * as discord from "discord.js"
|
|||||||
*
|
*
|
||||||
* The 2 default built-in transcript generators are: `opendiscord:html-compiler` & `opendiscord:text-compiler`.
|
* The 2 default built-in transcript generators are: `opendiscord:html-compiler` & `opendiscord:text-compiler`.
|
||||||
*/
|
*/
|
||||||
export class ODTranscriptManager extends ODManager<ODTranscriptCompiler<any>> {
|
export class ODTranscriptManager extends ODManager<ODTranscriptCompiler<any,null|object>> {
|
||||||
/**The manager responsible for collecting all messages in a channel. */
|
/**The manager responsible for collecting all messages in a channel. */
|
||||||
collector: ODTranscriptCollector
|
collector: ODTranscriptCollector
|
||||||
/**Alias for the client manager. */
|
/**Alias for the client manager. */
|
||||||
@@ -31,12 +31,12 @@ export class ODTranscriptManager extends ODManager<ODTranscriptCompiler<any>> {
|
|||||||
/**## ODTranscriptCompilerInitFunction `type`
|
/**## ODTranscriptCompilerInitFunction `type`
|
||||||
* This function will initiate/prepare the transcript system for an incoming transcript.
|
* This function will initiate/prepare the transcript system for an incoming transcript.
|
||||||
*/
|
*/
|
||||||
export type ODTranscriptCompilerInitFunction = (ticket:ODTicket, channel:discord.TextChannel, user:discord.User) => (ODTranscriptCompilerInitResult)|Promise<ODTranscriptCompilerInitResult>
|
export type ODTranscriptCompilerInitFunction<InitData extends object|null> = (ticket:ODTicket, channel:discord.TextChannel, user:discord.User) => (ODTranscriptCompilerInitResult<InitData>)|Promise<ODTranscriptCompilerInitResult<InitData>>
|
||||||
|
|
||||||
/**## ODTranscriptCompilerCompileFunction `type`
|
/**## ODTranscriptCompilerCompileFunction `type`
|
||||||
* This function will generate/compile the transcript itself.
|
* This function will generate/compile the transcript itself.
|
||||||
*/
|
*/
|
||||||
export type ODTranscriptCompilerCompileFunction<Data extends object> = (ticket:ODTicket, channel:discord.TextChannel, user:discord.User) => ODTranscriptCompilerCompileResult<Data>|Promise<ODTranscriptCompilerCompileResult<Data>>
|
export type ODTranscriptCompilerCompileFunction<Data extends object,InitData extends object|null> = (ticket:ODTicket, channel:discord.TextChannel, user:discord.User, initData:InitData) => ODTranscriptCompilerCompileResult<Data>|Promise<ODTranscriptCompilerCompileResult<Data>>
|
||||||
|
|
||||||
/**## ODTicketClearFilter `type`
|
/**## ODTicketClearFilter `type`
|
||||||
* This function will finish, clear-up & shut-down the transcript system. This will also initiate the sending of the messages to all recipients.
|
* This function will finish, clear-up & shut-down the transcript system. This will also initiate the sending of the messages to all recipients.
|
||||||
@@ -46,13 +46,15 @@ export type ODTranscriptCompilerReadyFunction<Data extends object> = (result:ODT
|
|||||||
/**## ODTranscriptCompilerInitResult `interface`
|
/**## ODTranscriptCompilerInitResult `interface`
|
||||||
* This is the result which is returned by the `init()` function.
|
* This is the result which is returned by the `init()` function.
|
||||||
*/
|
*/
|
||||||
export interface ODTranscriptCompilerInitResult {
|
export interface ODTranscriptCompilerInitResult<InitData extends object|null> {
|
||||||
/**Was the initialization successfull? */
|
/**Was the initialization successfull? */
|
||||||
success:boolean,
|
success:boolean,
|
||||||
/**When not successfull, what was the reason? This will also be shown to the user. */
|
/**When not successfull, what was the reason? This will also be shown to the user. */
|
||||||
errorReason:string|null,
|
errorReason:string|null,
|
||||||
/**An optional message which will be sent while the transcript is being generated. */
|
/**An optional message which will be sent while the transcript is being generated. */
|
||||||
pendingMessage:ODMessageBuildResult|null
|
pendingMessage:ODMessageBuildResult|null,
|
||||||
|
/**An optional object containing data from the init() function which can be used in the compiler. */
|
||||||
|
initData:InitData,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**## ODTranscriptCompilerCompileResult `interface`
|
/**## ODTranscriptCompilerCompileResult `interface`
|
||||||
@@ -98,15 +100,15 @@ export interface ODTranscriptCompilerReadyResult {
|
|||||||
*
|
*
|
||||||
* These functions should be defined when creating this compiler. Existing compilers already exist for html & text transcripts.
|
* These functions should be defined when creating this compiler. Existing compilers already exist for html & text transcripts.
|
||||||
*/
|
*/
|
||||||
export class ODTranscriptCompiler<Data extends object> extends ODManagerData {
|
export class ODTranscriptCompiler<Data extends object,InitData extends (object|null)> extends ODManagerData {
|
||||||
/*Initialise the system every time a transcript is created. Returns optional "pending" message to display while the transcript is being compiled. */
|
/*Initialise the system every time a transcript is created. Returns optional "pending" message to display while the transcript is being compiled. */
|
||||||
init: ODTranscriptCompilerInitFunction|null
|
init: ODTranscriptCompilerInitFunction<InitData>|null
|
||||||
/*Compile or create the transcript. Returns data to give to the ready() function for message creation. */
|
/*Compile or create the transcript. Returns data to give to the ready() function for message creation. */
|
||||||
compile: ODTranscriptCompilerCompileFunction<Data>|null
|
compile: ODTranscriptCompilerCompileFunction<Data,InitData>|null
|
||||||
/*Unload the system & create the final transcript message that will be sent. */
|
/*Unload the system & create the final transcript message that will be sent. */
|
||||||
ready: ODTranscriptCompilerReadyFunction<Data>|null
|
ready: ODTranscriptCompilerReadyFunction<Data>|null
|
||||||
|
|
||||||
constructor(id:ODValidId, init?:ODTranscriptCompilerInitFunction, compile?:ODTranscriptCompilerCompileFunction<Data>, ready?:ODTranscriptCompilerReadyFunction<Data>|null){
|
constructor(id:ODValidId, init?:ODTranscriptCompilerInitFunction<InitData>, compile?:ODTranscriptCompilerCompileFunction<Data,InitData>, ready?:ODTranscriptCompilerReadyFunction<Data>|null){
|
||||||
super(id)
|
super(id)
|
||||||
this.init = init ?? null
|
this.init = init ?? null
|
||||||
this.compile = compile ?? null
|
this.compile = compile ?? null
|
||||||
@@ -119,8 +121,8 @@ export class ODTranscriptCompiler<Data extends object> extends ODManagerData {
|
|||||||
* It's used to generate typescript declarations for this class.
|
* It's used to generate typescript declarations for this class.
|
||||||
*/
|
*/
|
||||||
export interface ODTranscriptCompilerIds {
|
export interface ODTranscriptCompilerIds {
|
||||||
"opendiscord:html-compiler":ODTranscriptCompiler<{url:string}>,
|
"opendiscord:html-compiler":ODTranscriptCompiler<{url:string,availableUntil:Date},{auth:string}>,
|
||||||
"opendiscord:text-compiler":ODTranscriptCompiler<{contents:string}>,
|
"opendiscord:text-compiler":ODTranscriptCompiler<{contents:string},null>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**## ODTranscriptManager_Default `default_class`
|
/**## ODTranscriptManager_Default `default_class`
|
||||||
@@ -131,16 +133,16 @@ export interface ODTranscriptCompilerIds {
|
|||||||
*/
|
*/
|
||||||
export class ODTranscriptManager_Default extends ODTranscriptManager {
|
export class ODTranscriptManager_Default extends ODTranscriptManager {
|
||||||
get<QuestionId extends keyof ODTranscriptCompilerIds>(id:QuestionId): ODTranscriptCompilerIds[QuestionId]
|
get<QuestionId extends keyof ODTranscriptCompilerIds>(id:QuestionId): ODTranscriptCompilerIds[QuestionId]
|
||||||
get(id:ODValidId): ODTranscriptCompiler<any>|null
|
get(id:ODValidId): ODTranscriptCompiler<any,null|object>|null
|
||||||
|
|
||||||
get(id:ODValidId): ODTranscriptCompiler<any>|null {
|
get(id:ODValidId): ODTranscriptCompiler<any,null|object>|null {
|
||||||
return super.get(id)
|
return super.get(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
remove<QuestionId extends keyof ODTranscriptCompilerIds>(id:QuestionId): ODTranscriptCompilerIds[QuestionId]
|
remove<QuestionId extends keyof ODTranscriptCompilerIds>(id:QuestionId): ODTranscriptCompilerIds[QuestionId]
|
||||||
remove(id:ODValidId): ODTranscriptCompiler<any>|null
|
remove(id:ODValidId): ODTranscriptCompiler<any,null|object>|null
|
||||||
|
|
||||||
remove(id:ODValidId): ODTranscriptCompiler<any>|null {
|
remove(id:ODValidId): ODTranscriptCompiler<any,null|object>|null {
|
||||||
return super.remove(id)
|
return super.remove(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,6 +259,7 @@ export class ODTranscriptCollector {
|
|||||||
const rows: ODTranscriptComponentRowData[] = []
|
const rows: ODTranscriptComponentRowData[] = []
|
||||||
msg.components.forEach((row) => {
|
msg.components.forEach((row) => {
|
||||||
const components: ODTranscriptComponentRowData["components"] = []
|
const components: ODTranscriptComponentRowData["components"] = []
|
||||||
|
if (row.type != discord.ComponentType.ActionRow) return
|
||||||
row.components.forEach((component) => {
|
row.components.forEach((component) => {
|
||||||
if (component.type == discord.ComponentType.Button){
|
if (component.type == discord.ComponentType.Button){
|
||||||
components.push({
|
components.push({
|
||||||
@@ -697,7 +700,7 @@ export interface ODTranscriptReactionData extends ODTranscriptEmojiData {
|
|||||||
* The structure of the data sent to the Open Ticket HTML Transcripts v2 API.
|
* The structure of the data sent to the Open Ticket HTML Transcripts v2 API.
|
||||||
*/
|
*/
|
||||||
export interface ODTranscriptHtmlV2Data {
|
export interface ODTranscriptHtmlV2Data {
|
||||||
version:"2",
|
version:"2.1",
|
||||||
otversion:string,
|
otversion:string,
|
||||||
language:string,
|
language:string,
|
||||||
style:{
|
style:{
|
||||||
@@ -733,25 +736,33 @@ export interface ODTranscriptHtmlV2Data {
|
|||||||
ticket:{
|
ticket:{
|
||||||
name:string,
|
name:string,
|
||||||
id:string,
|
id:string,
|
||||||
|
|
||||||
guildname:string,
|
guildname:string,
|
||||||
guildid:string,
|
guildid:string,
|
||||||
guildinvite:string|false,
|
guildinvite:string|false,
|
||||||
|
|
||||||
creatorname:string,
|
createdname:string|false,
|
||||||
creatorid:string,
|
createdid:string|false,
|
||||||
|
closedname:string|false,
|
||||||
|
closedid:string|false,
|
||||||
|
claimedname:string|false,
|
||||||
|
claimedid:string|false,
|
||||||
|
pinnedname:string|false,
|
||||||
|
pinnedid:string|false,
|
||||||
|
deletedname:string|false,
|
||||||
|
deletedid:string|false,
|
||||||
|
|
||||||
closedbyname:string,
|
createdpfp:string|false,
|
||||||
closedbyid:string,
|
closedpfp:string|false,
|
||||||
|
claimedpfp:string|false,
|
||||||
|
pinnedpfp:string|false,
|
||||||
|
deletedpfp:string|false,
|
||||||
|
|
||||||
claimedname:string,
|
createdtime:number|false,
|
||||||
claimedid:string,
|
closedtime:number|false,
|
||||||
|
claimedtime:number|false,
|
||||||
creatorpfp:string,
|
pinnedtime:number|false,
|
||||||
closedbypfp:string,
|
deletedtime:number|false,
|
||||||
claimedpfp:string,
|
|
||||||
|
|
||||||
closedtime:number,
|
|
||||||
openedtime:number,
|
|
||||||
|
|
||||||
components:{
|
components:{
|
||||||
messages:number,
|
messages:number,
|
||||||
@@ -915,22 +926,9 @@ export interface ODTranscriptHtmlV2Data {
|
|||||||
*/
|
*/
|
||||||
export interface ODTranscriptHtmlV2Response {
|
export interface ODTranscriptHtmlV2Response {
|
||||||
status:"success"|"error",
|
status:"success"|"error",
|
||||||
id:string,
|
type:"transcript",
|
||||||
|
url:string,
|
||||||
|
availableUntil:number, //UNIMPLEMENTED
|
||||||
time:number,
|
time:number,
|
||||||
estimated:{
|
id:string
|
||||||
lastdump: number,
|
|
||||||
processtime:number,
|
|
||||||
waittime:number
|
|
||||||
},
|
|
||||||
transcriptstatus:{
|
|
||||||
value:2,
|
|
||||||
data:{
|
|
||||||
fetchedmsgs:true,
|
|
||||||
uploaded:true,
|
|
||||||
inqueue:true,
|
|
||||||
processed:false,
|
|
||||||
waiting:false,
|
|
||||||
available:false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -13,5 +13,17 @@ export const migrations = [
|
|||||||
for (const panel of (await globalDatabase.getCategory("opendiscord:panel-update") ?? [])){
|
for (const panel of (await globalDatabase.getCategory("opendiscord:panel-update") ?? [])){
|
||||||
globalDatabase.set("opendiscord:panel-message",panel.key,panel.value)
|
globalDatabase.set("opendiscord:panel-message",panel.key,panel.value)
|
||||||
}
|
}
|
||||||
})
|
}),
|
||||||
|
|
||||||
|
//MIGRATE TO v4.0.2
|
||||||
|
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.2"),async () => {},async () => {}),
|
||||||
|
|
||||||
|
//MIGRATE TO v4.0.3
|
||||||
|
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.3"),async () => {},async () => {}),
|
||||||
|
|
||||||
|
//MIGRATE TO v4.0.4
|
||||||
|
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.4"),async () => {},async () => {}),
|
||||||
|
|
||||||
|
//MIGRATE TO v4.0.5
|
||||||
|
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.5"),async () => {},async () => {})
|
||||||
]
|
]
|
||||||
@@ -441,7 +441,7 @@ export const defaultPanelsStructure = new api.ODCheckerArrayStructure("opendisco
|
|||||||
{key:"id",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_UniqueId("opendiscord:panel-id","openticket","panel-ids",{regex:/^[A-Za-z0-9-éèçàêâôûî]+$/,minLength:3,maxLength:40})},
|
{key:"id",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_UniqueId("opendiscord:panel-id","openticket","panel-ids",{regex:/^[A-Za-z0-9-éèçàêâôûî]+$/,minLength:3,maxLength:40})},
|
||||||
{key:"name",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:panel-name",{minLength:3,maxLength:50})},
|
{key:"name",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:panel-name",{minLength:3,maxLength:50})},
|
||||||
{key:"dropdown",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:panel-dropdown",{})},
|
{key:"dropdown",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:panel-dropdown",{})},
|
||||||
{key:"options",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_UniqueIdArray("opendiscord:panel-options","openticket","option-ids","option-ids-used",{allowDoubles:false,maxLength:25})},
|
{key:"options",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_UniqueIdArray("opendiscord:panel-options","openticket","option-ids","option-ids-used",{allowDoubles:false,minLength:1,maxLength:25})},
|
||||||
|
|
||||||
//EMBED & TEXT
|
//EMBED & TEXT
|
||||||
{key:"text",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:panel-text",{maxLength:4096})},
|
{key:"text",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:panel-text",{maxLength:4096})},
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ const collector = opendiscord.transcripts.collector
|
|||||||
const messages = opendiscord.builders.messages
|
const messages = opendiscord.builders.messages
|
||||||
const transcriptConfig = opendiscord.configs.get("opendiscord:transcripts")
|
const transcriptConfig = opendiscord.configs.get("opendiscord:transcripts")
|
||||||
const textConfig = transcriptConfig.data.textTranscriptStyle
|
const textConfig = transcriptConfig.data.textTranscriptStyle
|
||||||
const htmlVersion = Buffer.from("b3BlbnRpY2tldFRSQU5TQ1JJUFQxMjM0","base64").toString("utf8")
|
const htmlVersion = Buffer.from("eW91LXNob3VsZG50LWJlLWxvb2tpbmctYXQtdGhpcy0tLWZvci1tb3JlLWluZm8tY29tbWEtc2VuZC1hLW1lc3NhZ2UtdG8tZGpqMTIzZGo=","base64").toString("utf8")
|
||||||
|
const htmlDomain = atob("dC5kai1kai5iZQ==")
|
||||||
|
|
||||||
export const replaceHtmlTranscriptMentions = async (text:string) => {
|
export const replaceHtmlTranscriptMentions = async (text:string) => {
|
||||||
const mainServer = opendiscord.client.mainServer
|
const mainServer = opendiscord.client.mainServer
|
||||||
@@ -34,17 +35,30 @@ export const replaceHtmlTranscriptMentions = async (text:string) => {
|
|||||||
return defaultroletext
|
return defaultroletext
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is used to authenticate with the HTML Transcript API.
|
||||||
|
* It is NOT the token of the bot but an internal AUTH TOKEN from the API.
|
||||||
|
*
|
||||||
|
* Questions? Visit our discord server: https://discord.dj-dj.be
|
||||||
|
*/
|
||||||
|
function transcriptAuth(_A:{salt:number,secret:string}){
|
||||||
|
const _B = Buffer.from(_A.secret,"hex");const _C = Math["floor"](new Date().getTime()/(30*1000)).toString();const _D = Buffer.from(_C);const _E = Buffer.alloc(_D["length"]);_D.forEach((v,i) => {_E[i] = v ^ _B[i % _B["length"]];});return btoa(JSON.stringify({salt:_A.salt,secret:_A.secret,token:_E.toString("hex")}))
|
||||||
|
}
|
||||||
|
|
||||||
export const loadAllTranscriptCompilers = async () => {
|
export const loadAllTranscriptCompilers = async () => {
|
||||||
class ODHTTPHtmlPostRequest extends api.ODHTTPPostRequest {
|
class ODHTTPHtmlPostRequest extends api.ODHTTPPostRequest {
|
||||||
constructor(domain:string, htmlFinal:api.ODTranscriptHtmlV2Data){
|
constructor(transcriptAuth:string,htmlFinal:api.ODTranscriptHtmlV2Data){
|
||||||
super("https://"+domain+"/transcripts/upload?auth="+htmlVersion+"&version=2",true,{
|
super("https://"+htmlDomain+"/api/v2/upload?auth="+htmlVersion+"&token="+transcriptAuth,true,{
|
||||||
body:JSON.stringify(htmlFinal)
|
body:JSON.stringify(htmlFinal),
|
||||||
|
headers:{
|
||||||
|
"Content-Type":"application/json"
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TEXT COMPILER
|
//TEXT COMPILER
|
||||||
opendiscord.transcripts.add(new api.ODTranscriptCompiler<{contents:string}>("opendiscord:text-compiler",undefined,async (ticket,channel,user) => {
|
opendiscord.transcripts.add(new api.ODTranscriptCompiler<{contents:string},null>("opendiscord:text-compiler",undefined,async (ticket,channel,user) => {
|
||||||
//COMPILE
|
//COMPILE
|
||||||
const rawMessages = await collector.collectAllMessages(ticket)
|
const rawMessages = await collector.collectAllMessages(ticket)
|
||||||
if (!rawMessages) return {ticket,channel,user,success:false,errorReason:"Unable to collect messages! Channel not found!",messages:null,data:null}
|
if (!rawMessages) return {ticket,channel,user,success:false,errorReason:"Unable to collect messages! Channel not found!",messages:null,data:null}
|
||||||
@@ -173,27 +187,51 @@ export const loadAllTranscriptCompilers = async () => {
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
//HTML COMPILER
|
//HTML COMPILER
|
||||||
opendiscord.transcripts.add(new api.ODTranscriptCompiler<{url:string}>("opendiscord:html-compiler",async (ticket,channel,user) => {
|
opendiscord.transcripts.add(new api.ODTranscriptCompiler<{url:string,availableUntil:Date},{auth:string}|null>("opendiscord:html-compiler",async (ticket,channel,user) => {
|
||||||
//INIT
|
//INIT
|
||||||
const req = new api.ODHTTPGetRequest("https://apis.dj-dj.be/transcripts/status.json",false)
|
const req = new api.ODHTTPGetRequest(atob("aHR0cHM6Ly90LmRqLWRqLmJlL2FwaS92Mi9pbml0"),false)
|
||||||
const res = await req.run()
|
const res = await req.run()
|
||||||
if (!res || res.status != 200 || !res.body){
|
//PENDING MESSAGE (not required anymore) => await messages.getSafe("opendiscord:transcript-html-progress").build("channel",{guild:channel.guild,channel,user,ticket,compiler:opendiscord.transcripts.get("opendiscord:html-compiler"),remaining:16000})
|
||||||
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
if (res.status == 200 && res.body){
|
||||||
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts INIT_COMMUNICATON error! (check otdebug.txt for details)"))
|
const data: {salt:number,secret:string} = JSON.parse(atob(res.body))
|
||||||
return {success:false,errorReason:"HTML Transcripts are currently unavailable!",pendingMessage:null}
|
return {success:true,errorReason:null,pendingMessage:null,initData:{auth:transcriptAuth(data)}}
|
||||||
}
|
}
|
||||||
try{
|
else{
|
||||||
const data = JSON.parse(res.body)
|
if (res.status == 503){
|
||||||
if (!data || data["v2"] != "online") return {success:false,errorReason:"HTML Transcripts are currently unavailable due to maintenance!",pendingMessage:null}
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
}catch{
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts INIT_COMMUNICATON_503 error! (check otdebug.txt for details)"))
|
||||||
opendiscord.debugfile.writeNote("HTML Transcripts Error => unable to parse status! body:\n"+res.body)
|
return {success:false,errorReason:"The HTML Transcripts are currently unreachable. Please try again later.",pendingMessage:null,initData:null}
|
||||||
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts INIT_STATUS_PARSE error! (check otdebug.txt for details)"))
|
|
||||||
return {success:false,errorReason:"HTML Transcripts are currently unavailable due to JSON parse error!",pendingMessage:null}
|
}else if (res.status == 429){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts INIT_COMMUNICATON_429 error! (check otdebug.txt for details)"))
|
||||||
|
return {success:false,errorReason:"The HTML Transcripts are currently unreachable because the bot is ratelimited. Please try again in a few minutes.",pendingMessage:null,initData:null}
|
||||||
|
|
||||||
|
}else if (res.status == 403){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts INIT_COMMUNICATON_403 error! (check otdebug.txt for details)"))
|
||||||
|
return {success:false,errorReason:"The HTML Transcripts are unreachable because the bot has been banned from using the API. If you don't know why, please contact us at https://discord.dj-dj.be",pendingMessage:null,initData:null}
|
||||||
|
|
||||||
|
}else if (res.status == 500){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts INIT_COMMUNICATON_500 error! (check otdebug.txt for details)"))
|
||||||
|
return {success:false,errorReason:"Something went wrong while compiling the HTML Transcripts, please report this error at https://discord.dj-dj.be",pendingMessage:null,initData:null}
|
||||||
|
|
||||||
|
}else if (res.status == 413){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts INIT_COMMUNICATON_413 error! (check otdebug.txt for details)"))
|
||||||
|
return {success:false,errorReason:"Unable to upload transcript, file size is too large (Max 5MB)!",pendingMessage:null,initData:null}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts INIT_COMMUNICATON_UNKNOWN error! (check otdebug.txt for details)"))
|
||||||
|
return {success:false,errorReason:"Something went wrong while compiling the HTML Transcripts, please report this error at https://discord.dj-dj.be",pendingMessage:null,initData:null}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {success:true,errorReason:null,pendingMessage:await messages.getSafe("opendiscord:transcript-html-progress").build("channel",{guild:channel.guild,channel,user,ticket,compiler:opendiscord.transcripts.get("opendiscord:html-compiler"),remaining:16000})}
|
},async (ticket,channel,user,initData) => {
|
||||||
},async (ticket,channel,user) => {
|
|
||||||
//COMPILE
|
//COMPILE
|
||||||
|
if (!initData) return {ticket,channel,user,success:false,errorReason:"Could not authenticate with HTML Transcript API.",messages:null,data:null}
|
||||||
const rawMessages = await collector.collectAllMessages(ticket)
|
const rawMessages = await collector.collectAllMessages(ticket)
|
||||||
if (!rawMessages) return {ticket,channel,user,success:false,errorReason:"Unable to collect messages! Channel not found!",messages:null,data:null}
|
if (!rawMessages) return {ticket,channel,user,success:false,errorReason:"Unable to collect messages! Channel not found!",messages:null,data:null}
|
||||||
const messages = await collector.convertMessagesToTranscriptData(rawMessages)
|
const messages = await collector.convertMessagesToTranscriptData(rawMessages)
|
||||||
@@ -350,18 +388,14 @@ export const loadAllTranscriptCompilers = async () => {
|
|||||||
const dsf = transcriptConfig.data.htmlTranscriptStyle.favicon
|
const dsf = transcriptConfig.data.htmlTranscriptStyle.favicon
|
||||||
|
|
||||||
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
|
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
|
||||||
const claimer = await opendiscord.tickets.getTicketUser(ticket,"claimer")
|
|
||||||
const closer = await opendiscord.tickets.getTicketUser(ticket,"closer")
|
const closer = await opendiscord.tickets.getTicketUser(ticket,"closer")
|
||||||
|
const claimer = await opendiscord.tickets.getTicketUser(ticket,"claimer")
|
||||||
|
const pinner = await opendiscord.tickets.getTicketUser(ticket,"pinner")
|
||||||
|
|
||||||
const htmlFinal: api.ODTranscriptHtmlV2Data = {
|
const htmlFinal: api.ODTranscriptHtmlV2Data = {
|
||||||
version:"2",
|
version:"2.1",
|
||||||
otversion:opendiscord.versions.get("opendiscord:version").toString(true),
|
otversion:opendiscord.versions.get("opendiscord:version").toString(true),
|
||||||
bot:{
|
language:opendiscord.languages.getLanguageMetadata()?.language.toLowerCase() ?? "english",
|
||||||
name:opendiscord.client.client.user.displayName,
|
|
||||||
id:opendiscord.client.client.user.id,
|
|
||||||
pfp:opendiscord.client.client.user.displayAvatarURL({extension:"png"}),
|
|
||||||
},
|
|
||||||
language:opendiscord.languages.getLanguageMetadata()?.language ?? "english",
|
|
||||||
style:{
|
style:{
|
||||||
background:{
|
background:{
|
||||||
backgroundData:(dsb.backgroundImage == "") ? dsb.backgroundColor : dsb.backgroundImage,
|
backgroundData:(dsb.backgroundImage == "") ? dsb.backgroundColor : dsb.backgroundImage,
|
||||||
@@ -387,30 +421,44 @@ export const loadAllTranscriptCompilers = async () => {
|
|||||||
enableCustomFavicon:dsf.enableCustomFavicon
|
enableCustomFavicon:dsf.enableCustomFavicon
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
bot:{
|
||||||
|
name:opendiscord.client.client.user.displayName,
|
||||||
|
id:opendiscord.client.client.user.id,
|
||||||
|
pfp:opendiscord.client.client.user.displayAvatarURL({extension:"png"}),
|
||||||
|
},
|
||||||
ticket:{
|
ticket:{
|
||||||
name:channel.name,
|
name:channel.name,
|
||||||
id:channel.id,
|
id:channel.id,
|
||||||
|
|
||||||
guildname:channel.guild.name,
|
guildname:channel.guild.name,
|
||||||
guildid:channel.guild.id,
|
guildid:channel.guild.id,
|
||||||
guildinvite:"",
|
guildinvite:false,
|
||||||
|
|
||||||
creatorname:(creator ? creator.displayName : "<unknown>"),
|
createdname:(creator ? creator.displayName : false),
|
||||||
creatorid:(creator ? creator.id : "<unknown>"),
|
createdid:(creator ? creator.id : false),
|
||||||
creatorpfp:(creator ? creator.displayAvatarURL() : "https://transcripts.dj-dj.be/favicon.png"),
|
createdpfp:(creator ? creator.displayAvatarURL() : false),
|
||||||
|
|
||||||
//closer is ticket deleter (small bug)
|
closedname:(closer ? closer.displayName : false),
|
||||||
closedbyname:user.displayName,
|
closedid:(closer ? closer.id : false),
|
||||||
closedbyid:user.id,
|
closedpfp:(closer ? closer.displayAvatarURL() : false),
|
||||||
closedbypfp:user.displayAvatarURL(),
|
|
||||||
|
|
||||||
//claiming is currently unused
|
claimedname:(claimer ? claimer.displayName : false),
|
||||||
claimedname:(claimer ? claimer.displayName : "<not-claimed>"),
|
claimedid:(claimer ? claimer.id : false),
|
||||||
claimedid:(claimer ? claimer.id : "<not-claimed>"),
|
claimedpfp:(claimer ? claimer.displayAvatarURL() : false),
|
||||||
claimedpfp:(claimer ? claimer.displayAvatarURL() : "https://transcripts.dj-dj.be/favicon.png"),
|
|
||||||
|
pinnedname:(pinner ? pinner.displayName : false),
|
||||||
closedtime:new Date().getTime(),
|
pinnedid:(pinner ? pinner.id : false),
|
||||||
openedtime:ticket.get("opendiscord:opened-on").value ?? new Date().getTime(),
|
pinnedpfp:(pinner ? pinner.displayAvatarURL() : false),
|
||||||
|
|
||||||
|
deletedname:user.displayName,
|
||||||
|
deletedid:user.id,
|
||||||
|
deletedpfp:user.displayAvatarURL(),
|
||||||
|
|
||||||
|
createdtime:ticket.get("opendiscord:opened-on").value ?? false,
|
||||||
|
closedtime:ticket.get("opendiscord:closed-on").value ?? false,
|
||||||
|
claimedtime:ticket.get("opendiscord:claimed-on").value ?? false,
|
||||||
|
pinnedtime:ticket.get("opendiscord:pinned-on").value ?? false,
|
||||||
|
deletedtime:new Date().getTime(),
|
||||||
|
|
||||||
//role colors are currently unused
|
//role colors are currently unused
|
||||||
roleColors:[],
|
roleColors:[],
|
||||||
@@ -440,39 +488,71 @@ export const loadAllTranscriptCompilers = async () => {
|
|||||||
},
|
},
|
||||||
customFavicon:{
|
customFavicon:{
|
||||||
enabled:dsf.enableCustomFavicon,
|
enabled:dsf.enableCustomFavicon,
|
||||||
image:(dsf.imageUrl) ? dsf.imageUrl : "https://transcripts.dj-dj.be/favicon.png"
|
image:(dsf.imageUrl) ? dsf.imageUrl : "https://t.dj-dj.be/favicon.png"
|
||||||
},
|
},
|
||||||
additionalFlags:[]
|
additionalFlags:[]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const req = new ODHTTPHtmlPostRequest("apis.dj-dj.be",htmlFinal)
|
const req = new ODHTTPHtmlPostRequest(initData.auth,htmlFinal)
|
||||||
const res = await req.run()
|
const res = await req.run()
|
||||||
|
|
||||||
//check status
|
//check status
|
||||||
if (!res || res.status != 200 || !res.body){
|
if (res.status == 200 && res.body){
|
||||||
//ratelimit error
|
//check body
|
||||||
if (res.status == 429) return {ticket,channel,user,success:false,errorReason:"Failed to upload HTML Transcripts! (Ratelimit)\nTry again in a few minutes!",messages,data:null}
|
|
||||||
|
|
||||||
//unknown status error
|
|
||||||
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
|
||||||
return {ticket,channel,user,success:false,errorReason:"Failed to upload HTML Transcripts! (Unknown Error)",messages,data:null}
|
|
||||||
}
|
|
||||||
//check body
|
|
||||||
try{
|
|
||||||
var data: api.ODTranscriptHtmlV2Response = JSON.parse(res.body)
|
var data: api.ODTranscriptHtmlV2Response = JSON.parse(res.body)
|
||||||
if (!data || data["status"] != "success"){
|
if (!data || data["status"] != "success"){
|
||||||
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
return {ticket,channel,user,success:false,errorReason:"Failed to upload HTML Transcripts! (Server 500 Error)",messages,data:null}}
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts COMPILE_JSON_STATUS error! (check otdebug.txt for details)"))
|
||||||
}catch{
|
return {ticket,channel,user,success:false,errorReason:"TFailed to read the response of the HTML Transcripts server.",messages:null,data:null}
|
||||||
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
}
|
||||||
return {ticket,channel,user,success:false,errorReason:"Failed to upload HTML Transcripts! (JSON parse error)",messages,data:null}
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = "https://transcripts.dj-dj.be/v2/"+data.time+"_"+data.id+".html"
|
return {
|
||||||
return {ticket,channel,user,success:true,errorReason:null,messages,data:{url}}
|
ticket,channel,user,
|
||||||
|
success:true,
|
||||||
|
errorReason:null,
|
||||||
|
messages,
|
||||||
|
data:{
|
||||||
|
url:data.url,
|
||||||
|
availableUntil:new Date(data.availableUntil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
if (res.status == 503){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts COMPILE_COMMUNICATON_503 error! (check otdebug.txt for details)"))
|
||||||
|
return {ticket,channel,user,success:false,errorReason:"The HTML Transcripts are currently unreachable. Please try again later.",messages:null,data:null}
|
||||||
|
|
||||||
|
}else if (res.status == 429){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts COMPILE_COMMUNICATON_429 error! (check otdebug.txt for details)"))
|
||||||
|
return {ticket,channel,user,success:false,errorReason:"The HTML Transcripts are currently unreachable because the bot is ratelimited. Please try again in a few minutes.",messages:null,data:null}
|
||||||
|
|
||||||
|
}else if (res.status == 403){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts COMPILE_COMMUNICATON_403 error! (check otdebug.txt for details)"))
|
||||||
|
return {ticket,channel,user,success:false,errorReason:"The HTML Transcripts are unreachable because the bot has been banned from using the API. If you don't know why, please contact us at https://discord.dj-dj.be",messages:null,data:null}
|
||||||
|
|
||||||
|
}else if (res.status == 500){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts COMPILE_COMMUNICATON_500 error! (check otdebug.txt for details)"))
|
||||||
|
return {ticket,channel,user,success:false,errorReason:"Something went wrong while compiling the HTML Transcripts, please report this error at https://discord.dj-dj.be",messages:null,data:null}
|
||||||
|
|
||||||
|
}else if (res.status == 413){
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts COMPILE_COMMUNICATON_413 error! (check otdebug.txt for details)"))
|
||||||
|
return {ticket,channel,user,success:false,errorReason:"Unable to upload transcript, file size is too large (Max 5MB)!",messages:null,data:null}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
opendiscord.debugfile.writeNote("HTML Transcripts Error => status: "+res.status+", body:\n"+res.body)
|
||||||
|
process.emit("uncaughtException",new api.ODSystemError("HTML Transcripts COMPILE_COMMUNICATON_UNKNOWN error! (check otdebug.txt for details)"))
|
||||||
|
return {ticket,channel,user,success:false,errorReason:"Something went wrong while compiling the HTML Transcripts, please report this error at https://discord.dj-dj.be",messages:null,data:null}
|
||||||
|
}
|
||||||
|
}
|
||||||
},async (result) => {
|
},async (result) => {
|
||||||
//READY
|
//READY
|
||||||
await utilities.timer(16000) //wait until transcript is ready
|
//WAIT UNTIL READY (not required anymore) => await utilities.timer(16000)
|
||||||
return {
|
return {
|
||||||
channelMessage:await messages.getSafe("opendiscord:transcript-html-ready").build("channel",{guild:result.channel.guild,channel:result.channel,user:result.user,ticket:result.ticket,result,compiler:opendiscord.transcripts.get("opendiscord:html-compiler")}),
|
channelMessage:await messages.getSafe("opendiscord:transcript-html-ready").build("channel",{guild:result.channel.guild,channel:result.channel,user:result.user,ticket:result.ticket,result,compiler:opendiscord.transcripts.get("opendiscord:html-compiler")}),
|
||||||
creatorDmMessage:await messages.getSafe("opendiscord:transcript-html-ready").build("creator-dm",{guild:result.channel.guild,channel:result.channel,user:result.user,ticket:result.ticket,result,compiler:opendiscord.transcripts.get("opendiscord:html-compiler")}),
|
creatorDmMessage:await messages.getSafe("opendiscord:transcript-html-ready").build("creator-dm",{guild:result.channel.guild,channel:result.channel,user:result.user,ticket:result.ticket,result,compiler:opendiscord.transcripts.get("opendiscord:html-compiler")}),
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
INFORMATION:
|
INFORMATION:
|
||||||
============
|
============
|
||||||
Open Ticket v4.0.2 - © DJdj Development
|
Open Ticket v4.0.5 - © DJdj Development
|
||||||
|
|
||||||
support us: https://github.com/sponsors/DJj123dj
|
support us: https://github.com/sponsors/DJj123dj
|
||||||
discord: https://discord.dj-dj.be
|
discord: https://discord.dj-dj.be
|
||||||
|
|||||||
Reference in New Issue
Block a user