Compare commits

..
15 Commits
Author SHA1 Message Date
DJj123dj 8e1fd0266d Update README.md 2026-07-10 21:51:01 +02:00
DJj123dj 91d09a9096 Update package.json 2026-06-14 17:22:35 +02:00
DJj123dj d54a922146 Update package.json 2026-06-03 20:18:26 +02:00
DJj123dj c27733b245 Updated OD Framework to v2.0.4 2026-06-03 18:08:01 +02:00
Jasper 8a2fa0b4ff Open Ticket v4.2.1
Open Ticket v4.2.1
2026-06-01 19:36:43 +02:00
DJj123dj 44561e2690 Updated example plugin 2026-06-01 19:28:20 +02:00
DJj123dj 77ab113fc0 Removed deprecated panel entries in database 2026-06-01 19:16:03 +02:00
DJj123dj 97a7a966c8 File uploads will now be sent as attachments 2026-06-01 19:14:08 +02:00
DJj123dj becf0ee50d Open Ticket v4.2.1: Versioning 2026-05-31 22:41:33 +02:00
DJj123dj 1e66cf9917 OT v4.2.1: Fixed TS bug with shared components 2026-05-31 22:37:54 +02:00
Jasper 2eb6d9e981 Small README improvements + updated example plugin
Small README improvements + updated example plugin
2026-05-31 18:48:09 +02:00
DJj123dj 0245420313 Update README.md 2026-05-31 18:46:28 +02:00
DJj123dj 6555f16012 Transferred sponsors SVG to separate repository 2026-05-31 18:32:55 +02:00
DJj123dj 7f3624bcee Update README.md 2026-05-31 18:06:35 +02:00
DJj123dj 2e6fa61b4f Updated example plugin 2026-05-31 17:15:50 +02:00
67 changed files with 161 additions and 1171 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
# Contributing Guidelines
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
[![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-4.2.0-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.2.0) [![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj)
[![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-4.2.1-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.2.1) [![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj)
These are the Contributing Guidelines of Open Ticket!<br>
Here you can find everything you need to know about contributing to Open Ticket.<br>
-93
View File
@@ -1,93 +0,0 @@
{
"_INFO":"This document contains all Open Ticket contributors.",
"SPONSOR_TEMPLATE":{
"name":"INSERT_NAME",
"pictureUrl":"INSERT_PICTURE_URL",
"profileUrl":"INSERT_PROFILE_URL",
"sectionId":"INSERT_ID"
},
"SECTION_TEMPLATE":{
"name":"INSERT_NAME",
"id":"INSERT_ID",
"pfpSize":50,
"pfpColumns":5,
"withNames":true
},
"sections":[
{
"name":"🛠️ Contributors",
"id":"contributor",
"pfpSize":100,
"pfpColumns":8,
"withNames":true
},
{
"name":"📞 Discord Support",
"id":"support",
"pfpSize":100,
"pfpColumns":8,
"withNames":true
},
{
"name":"🧩 Plugin Developers",
"id":"plugin-dev",
"pfpSize":100,
"pfpColumns":8,
"withNames":true
},
{
"name":"💬 Translators",
"id":"translator",
"pfpSize":100,
"pfpColumns":8,
"withNames":true
}
],
"contributors":[
{"sectionId":"contributor","name":"DJj123dj","pictureUrl":"https://github.com/DJj123dj.png","profileUrl":"https://github.com/DJj123dj"},
{"sectionId":"contributor","name":"guillee3","pictureUrl":"https://github.com/guillee3.png","profileUrl":"https://github.com/guillee3"},
{"sectionId":"contributor","name":"SKaranjaN","pictureUrl":"https://github.com/SKaranjaN.png","profileUrl":"https://github.com/SKaranjaN"},
{"sectionId":"contributor","name":"Ashish5180","pictureUrl":"https://github.com/Ashish5180.png","profileUrl":"https://github.com/Ashish5180"},
{"sectionId":"contributor","name":"duboiss","pictureUrl":"https://github.com/duboiss.png","profileUrl":"https://github.com/duboiss"},
{"sectionId":"contributor","name":"sdehaarte","pictureUrl":"https://github.com/sdehaarte.png","profileUrl":"https://github.com/sdehaarte"},
{"sectionId":"contributor","name":"MauroDruwel","pictureUrl":"https://github.com/MauroDruwel.png","profileUrl":"https://github.com/MauroDruwel"},
{"sectionId":"support","name":"smetsliam","pictureUrl":"https://github.com/smetsliam.png","profileUrl":"https://github.com/smetsliam"},
{"sectionId":"support","name":"Sank34","pictureUrl":"https://github.com/Sank34.png","profileUrl":"https://github.com/Sank34"},
{"sectionId":"support","name":"FrankVissers","pictureUrl":"https://github.com/FrankVissers.png","profileUrl":"https://github.com/FrankVissers"},
{"sectionId":"plugin-dev","name":"Rapid-Fast","pictureUrl":"https://github.com/Rapid-Fast.png","profileUrl":"https://github.com/Rapid-Fast"},
{"sectionId":"plugin-dev","name":"NotMukundOP","pictureUrl":"https://github.com/NotMukundOP.png","profileUrl":"https://github.com/NotMukundOP"},
{"sectionId":"plugin-dev","name":"Imperatorix17","pictureUrl":"https://github.com/imperatorix17.png","profileUrl":"https://github.com/imperatorix17"},
{"sectionId":"plugin-dev","name":"DanoGlez","pictureUrl":"https://github.com/DanoGlez.png","profileUrl":"https://github.com/DanoGlez"},
{"sectionId":"plugin-dev","name":"yowsef","pictureUrl":"https://github.com/Yow-sef.png","profileUrl":"https://github.com/Yow-sef"},
{"sectionId":"plugin-dev","name":"MeneerSouf","pictureUrl":"https://github.com/MeneerSouf.png","profileUrl":"https://github.com/MeneerSouf"},
{"sectionId":"plugin-dev","name":"challenger_nova","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"HanumeshGupta","pictureUrl":"https://github.com/HanumeshGupta.png","profileUrl":"https://github.com/HanumeshGupta"},
{"sectionId":"translator","name":"benzorich","pictureUrl":"https://github.com/benzorich.png","profileUrl":"https://github.com/benzorich"},
{"sectionId":"translator","name":"Reddishye","pictureUrl":"https://github.com/Reddishye.png","profileUrl":"https://github.com/Reddishye"},
{"sectionId":"translator","name":"josuens","pictureUrl":"https://github.com/josuens.png","profileUrl":"https://github.com/josuens"},
{"sectionId":"translator","name":"quiradon","pictureUrl":"https://github.com/quiradon.png","profileUrl":"https://github.com/quiradon"},
{"sectionId":"translator","name":"Imperatorix17","pictureUrl":"https://github.com/imperatorix17.png","profileUrl":"https://github.com/imperatorix17"},
{"sectionId":"translator","name":"NoOneNook","pictureUrl":"https://github.com/NoOneNook.png","profileUrl":"https://github.com/NoOneNook"},
{"sectionId":"translator","name":"guillee3","pictureUrl":"https://github.com/guillee3.png","profileUrl":"https://github.com/guillee3"},
{"sectionId":"translator","name":"Mods HD","pictureUrl":"https://github.com/mods-hd.png","profileUrl":"https://github.com/mods-hd"},
{"sectionId":"translator","name":"anderskiy","pictureUrl":"https://github.com/anderskiy.png","profileUrl":"https://github.com/anderskiy"},
{"sectionId":"translator","name":"SpyEye2","pictureUrl":"https://github.com/SpyEye2.png","profileUrl":"https://github.com/SpyEye2"},
{"sectionId":"translator","name":"Sank34","pictureUrl":"https://github.com/Sank34.png","profileUrl":"https://github.com/Sank34"},
{"sectionId":"translator","name":"thegamer5095","pictureUrl":"https://github.com/thegamer5095.png","profileUrl":"https://github.com/thegamer5095"},
{"sectionId":"translator","name":"danoglez","pictureUrl":"https://github.com/danoglez.png","profileUrl":"https://github.com/danoglez"},
{"sectionId":"translator","name":"zhavis","pictureUrl":"https://github.com/zhavis.png","profileUrl":"https://github.com/zhavis"},
{"sectionId":"translator","name":"yuuslokrobjakkroval","pictureUrl":"https://github.com/yuuslokrobjakkroval.png","profileUrl":"https://github.com/yuuslokrobjakkroval"},
{"sectionId":"translator","name":"imLudwig","pictureUrl":"https://github.com/imLudwig.png","profileUrl":"https://github.com/imLudwig"},
{"sectionId":"translator","name":"iamnotmega","pictureUrl":"https://github.com/iamnotmega.png","profileUrl":"https://github.com/iamnotmega"},
{"sectionId":"translator","name":"Ronalds13424","pictureUrl":"https://github.com/Ronalds13424.png","profileUrl":"https://github.com/Ronalds13424"},
{"sectionId":"translator","name":"dysashop","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"fraden1mvp.","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"palestinian","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"challenger_nova","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"erxg","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"tsgindrius","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"kornel0706","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"me.october","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""},
{"sectionId":"translator","name":"ngocdiep2006","pictureUrl":"https://apis.dj-dj.be/cdn/openticket/default-avatar.png","profileUrl":""}
]
}
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.4 MiB

+2 -1
View File
@@ -20,7 +20,8 @@ This list will be updated on every release.
| Version | Supported | Notes |
|------------|-----------|---------------------------------------------------------------|
| 4.2.x | 🟦 | In Development |
| 4.2.1 | 🟦 | In Development |
| 4.2.2 | 🟦 | In Development |
| 4.2.1 | ✅ | |
| 4.2.0 | ✅ | |
| 4.1.3 | ✅ | (LTS) Long-Term-Support, Until September 2026 |
| 4.1.2 | 🚧 | |
-90
View File
@@ -1,90 +0,0 @@
{
"_INFO":"This document contains all Open Ticket sponsors.",
"SPONSOR_TEMPLATE":{
"name":"INSERT_NAME",
"pictureUrl":"INSERT_PICTURE_URL",
"profileUrl":"INSERT_PROFILE_URL",
"sectionId":"INSERT_ID"
},
"SECTION_TEMPLATE":{
"name":"INSERT_NAME",
"id":"INSERT_ID",
"pfpSize":50,
"pfpColumns":5,
"withNames":true
},
"sections":[
{
"name":"💎 Platinum Sponsors",
"id":"platinum",
"pfpSize":120,
"pfpColumns":4,
"withNames":true
},
{
"name":"🥇 Gold Sponsors",
"id":"gold",
"pfpSize":60,
"pfpColumns":8,
"withNames":true
},
{
"name":"🥈 Silver Sponsors",
"id":"silver",
"pfpSize":40,
"pfpColumns":16,
"withNames":false
},
{
"name":"❤️ Past Sponsors",
"id":"past",
"pfpSize":30,
"pfpColumns":20,
"withNames":false
}
],
"sponsors":[
{
"name":"Guillee3",
"pictureUrl":"https://github.com/guillee3.png",
"profileUrl":"https://github.com/guillee3",
"sectionId":"platinum"
},
{
"name":"Jacob Humston",
"pictureUrl":"https://github.com/jacobhumston.png",
"profileUrl":"https://github.com/jacobhumston",
"sectionId":"platinum"
},
{
"name":"SpyEye2",
"pictureUrl":"https://github.com/SpyEye2.png",
"profileUrl":"https://github.com/SpyEye2",
"sectionId":"gold"
},
{
"name":"DOSEV5",
"pictureUrl":"https://github.com/DOSEV5.png",
"profileUrl":"https://github.com/DOSEV5",
"sectionId":"gold"
},
{
"name":"YeeetSK",
"pictureUrl":"https://github.com/YeeetSK.png",
"profileUrl":"https://github.com/YeeetSK",
"sectionId":"silver"
},
{
"name":"BENZORICH",
"pictureUrl":"https://github.com/BENZORICH.png",
"profileUrl":"https://github.com/BENZORICH",
"sectionId":"silver"
},
{
"name":"Mods HD",
"pictureUrl":"https://github.com/mods-hd.png",
"profileUrl":"https://github.com/mods-hd",
"sectionId":"silver"
}
]
}
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 124 KiB

+1 -1
View File
@@ -2,7 +2,7 @@
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
[![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3)
[![version](https://img.shields.io/badge/version-4.2.0-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.2.0)
[![version](https://img.shields.io/badge/version-4.2.1-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.2.1)
[![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj)
[![Open Ticket supports Pterodactyl Eggs!](https://img.shields.io/badge/pterodactyl-supported-10539F?style=flat-square&logo=pterodactyl)](.eggs/README.md)
@@ -1,62 +0,0 @@
{
"_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:19+01:00",
"name": "Open Ticket (v3.5.9)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v3.5.9, 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 (v3.5.9)\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=\"v3.5.9\"\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,62 +0,0 @@
{
"_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.7)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.7, 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.7)\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.7\"\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,62 +0,0 @@
{
"_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.1.1)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.1.1, 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.1.1)\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.1.1\"\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,62 +0,0 @@
{
"_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.1.2)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.1.2, 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.1.2)\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.1.2\"\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"
}
]
}
@@ -5,9 +5,9 @@
"update_url": null
},
"exported_at": "2025-03-16T18:10:18+01:00",
"name": "Open Ticket (v4.1.0)",
"name": "Open Ticket (v4.2.1)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.1.0, 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!",
"description": "This is the official Pterodactyl egg for Open Ticket v4.2.1, 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"
@@ -22,7 +22,7 @@
},
"scripts": {
"installation": {
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.1.0)\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.1.0\"\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",
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.2.1)\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.2.1\"\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"
}
-130
View File
@@ -1,130 +0,0 @@
/// <reference types="node"/>
import fs from "fs"
import path from "path"
import crypto from "crypto"
const contributorData: {contributors:Contributor[],sections:Section[]} = JSON.parse(fs.readFileSync(path.join(process.cwd(),"./.github/CONTRIBUTORS.json")).toString())
//CONSTANTS
const CORNER_RADIUS = 10
const SPACE_MULTIPLIER = 1.2
const SVG_WIDTH = 1000
//TYPES
interface Contributor {
name:string,
pictureUrl:string,
profileUrl:string,
sectionId:string
}
interface Section {
name:string,
id:string,
pfpSize:number,
pfpColumns:number,
withNames:boolean
}
//FUNCTIONS
async function downloadPfpToBase64URL(url:string){
const res = await fetch(url,{method:"GET"})
if (!res.ok) return null
const buffer = Buffer.from(await res.arrayBuffer())
console.log("Downloaded picture URL:",url)
return "data:image/png;base64,"+buffer.toString("base64")
}
function createTitle(yPos:number,name:string){
return `<text x="${20}" y="${yPos+20}" text-anchor="start" class="contributor-tier-title">${name}</text>`
}
async function createPfp(yPos:number,xPos:number,size:number,contributor:Contributor,withNames:boolean){
const randomId = crypto.randomBytes(8).toString("hex")
const nameElement = (withNames) ? `<text x="${Math.round(xPos+(size/2))}" y="${yPos+size+20}" text-anchor="middle" fill="currentColor">${contributor.name}</text>` : ""
return (`<a href="${contributor.profileUrl}" class="contributor-link" target="_blank">
<clipPath id="clipPath-${randomId}">
<rect x="${xPos}" y="${yPos}" width="${size}" height="${size}" rx="${CORNER_RADIUS}" ry="${CORNER_RADIUS}"/>
</clipPath>
<image x="${xPos}" y="${yPos}" width="${size}" height="${size}" href="${await downloadPfpToBase64URL(contributor.pictureUrl)}" clip-path="url(#clipPath-${randomId})"/>
${nameElement}
</a>`)
}
async function generateSection(yPos:number,section:Section,contributors:Contributor[]){
let sectionHtml: string = ""
sectionHtml += createTitle(yPos,section.name)
const nameOffset = (section.withNames) ? 20 : 0
//divide contributors in rows
const groupedContributors: Contributor[][] = []
let currentGroup: Contributor[] = []
for (const contributor of contributors){
currentGroup.push(contributor)
if (currentGroup.length == section.pfpColumns){
groupedContributors.push(currentGroup)
currentGroup = []
}
}
if (currentGroup.length > 0) groupedContributors.push(currentGroup)
let y = 0
for (const contributorGroup of groupedContributors){
let x = 0
for (const contributor of contributorGroup){
const pfpYPos = 40 + yPos + (y * ((section.pfpSize * SPACE_MULTIPLIER) + nameOffset))
const pfpXPos = 20 + (x * section.pfpSize * SPACE_MULTIPLIER)
sectionHtml += await createPfp(pfpYPos,pfpXPos,section.pfpSize,contributor,section.withNames)
x++
}
y++
}
let sectionHeight: number = 40 + (y * ((section.pfpSize * SPACE_MULTIPLIER) + nameOffset))
return {sectionHtml,sectionHeight}
}
async function generateSections(sections:Section[],contributors:Contributor[]){
let finalHeight: number = 10
let finalHtml: string = ""
for (const section of sections){
const sectionContributors = contributors.filter((s) => s.sectionId === section.id)
if (sectionContributors.length < 1) continue
const {sectionHtml,sectionHeight} = await generateSection(finalHeight,section,sectionContributors)
finalHeight += sectionHeight
finalHtml += sectionHtml
}
finalHeight += 10
return {finalHeight,finalHtml}
}
function generateFinalHtml(sectionsHtml:string,sectionHeight:number){
return (`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 ${SVG_WIDTH} ${sectionHeight}" width="${SVG_WIDTH}" height="${sectionHeight}">
<style>
text {
font-weight: 300;
font-size: 14px;
fill: #777777;
font-family: 'Open Sans', 'Helvetica Neue', sans-serif;
}
.contributor-link {
cursor: pointer;
}
.contributor-tier-title {
font-weight: 500;
font-size: 20px;
}
</style>
${sectionsHtml}
</svg>`)
}
//GENERATE CONTRIBUTORS SVG
async function main(){
const {finalHeight,finalHtml} = await generateSections(contributorData.sections,contributorData.contributors)
fs.writeFileSync(path.join(process.cwd(),"./.github/CONTRIBUTORS.svg"),generateFinalHtml(finalHtml,finalHeight))
}
main()
-132
View File
@@ -1,132 +0,0 @@
/// <reference types="node"/>
import fs from "fs"
import path from "path"
import crypto from "crypto"
const sponsorData: {sponsors:Sponsor[],sections:Section[]} = JSON.parse(fs.readFileSync(path.join(process.cwd(),"./.github/SPONSORS.json")).toString())
//CONSTANTS
const CORNER_RADIUS = 10
const SPACE_MULTIPLIER = 1.2
const SVG_WIDTH = 1000
//TYPES
interface Sponsor {
name:string,
pictureUrl:string,
profileUrl:string,
sectionId:string
}
interface Section {
name:string,
id:string,
pfpSize:number,
pfpColumns:number,
withNames:boolean
}
//FUNCTIONS
async function downloadPfpToBase64URL(url:string){
const res = await fetch(url,{method:"GET"})
if (!res.ok) return null
const buffer = Buffer.from(await res.arrayBuffer())
console.log("Downloaded picture URL:",url)
return "data:image/png;base64,"+buffer.toString("base64")
}
function createTitle(yPos:number,name:string){
return `<text x="${Math.round(SVG_WIDTH/2)}" y="${yPos+20}" text-anchor="middle" class="sponsor-tier-title">${name}</text>`
}
async function createPfp(yPos:number,xPos:number,size:number,sponsor:Sponsor,withNames:boolean){
const randomId = crypto.randomBytes(8).toString("hex")
const nameElement = (withNames) ? `<text x="${Math.round(xPos+(size/2))}" y="${yPos+size+20}" text-anchor="middle" fill="currentColor">${sponsor.name}</text>` : ""
return (`<a href="${sponsor.profileUrl}" class="sponsor-link" target="_blank">
<clipPath id="clipPath-${randomId}">
<rect x="${xPos}" y="${yPos}" width="${size}" height="${size}" rx="${CORNER_RADIUS}" ry="${CORNER_RADIUS}"/>
</clipPath>
<image x="${xPos}" y="${yPos}" width="${size}" height="${size}" href="${await downloadPfpToBase64URL(sponsor.pictureUrl)}" clip-path="url(#clipPath-${randomId})"/>
${nameElement}
</a>`)
}
async function generateSection(yPos:number,section:Section,sponsors:Sponsor[]){
let sectionHtml: string = ""
sectionHtml += createTitle(yPos,section.name)
const nameOffset = (section.withNames) ? 20 : 0
//divide sponsors in rows
const groupedSponsors: Sponsor[][] = []
let currentGroup: Sponsor[] = []
for (const sponsor of sponsors){
currentGroup.push(sponsor)
if (currentGroup.length == section.pfpColumns){
groupedSponsors.push(currentGroup)
currentGroup = []
}
}
if (currentGroup.length > 0) groupedSponsors.push(currentGroup)
let y = 0
for (const sponsorGroup of groupedSponsors){
const xOffset = Math.round((SVG_WIDTH - (sponsorGroup.length * section.pfpSize * SPACE_MULTIPLIER))/2)
let x = 0
for (const sponsor of sponsorGroup){
const pfpYPos = 40 + yPos + (y * ((section.pfpSize * SPACE_MULTIPLIER) + nameOffset))
const pfpXPos = xOffset + (x * section.pfpSize * SPACE_MULTIPLIER)
sectionHtml += await createPfp(pfpYPos,pfpXPos,section.pfpSize,sponsor,section.withNames)
x++
}
y++
}
let sectionHeight: number = 40 + (y * ((section.pfpSize * SPACE_MULTIPLIER) + nameOffset))
return {sectionHtml,sectionHeight}
}
async function generateSections(sections:Section[],sponsors:Sponsor[]){
let finalHeight: number = 10
let finalHtml: string = ""
for (const section of sections){
const sectionSponsors = sponsors.filter((s) => s.sectionId === section.id)
if (sectionSponsors.length < 1) continue
const {sectionHtml,sectionHeight} = await generateSection(finalHeight,section,sectionSponsors)
finalHeight += sectionHeight
finalHtml += sectionHtml
}
finalHeight += 10
return {finalHeight,finalHtml}
}
function generateFinalHtml(sectionsHtml:string,sectionHeight:number){
return (`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 ${SVG_WIDTH} ${sectionHeight}" width="${SVG_WIDTH}" height="${sectionHeight}">
<style>
text {
font-weight: 300;
font-size: 14px;
fill: #777777;
font-family: 'Open Sans', 'Helvetica Neue', sans-serif;
}
.sponsor-link {
cursor: pointer;
}
.sponsor-tier-title {
font-weight: 500;
font-size: 20px;
}
</style>
<rect x="2" y="2" width="${SVG_WIDTH-4}" height="${sectionHeight-4}" rx="20" ry="20" style="fill:transparent;stroke:#f8ba00;stroke-width:3"></rect>
${sectionsHtml}
</svg>`)
}
//GENERATE SPONSORS SVG
async function main(){
const {finalHeight,finalHtml} = await generateSections(sponsorData.sections,sponsorData.sponsors)
fs.writeFileSync(path.join(process.cwd(),"./.github/SPONSORS.svg"),generateFinalHtml(finalHtml,finalHeight))
}
main()
+45 -45
View File
@@ -4,7 +4,7 @@
<sub align="center">Related Projects:</sub><br>
<a href="https://odplugins.dj-dj.be"><img src="https://apis.dj-dj.be/cdn/opendiscord/logo.png" alt="Open Discord" height="55px"></a><br><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://github.com/open-discord-bots/open-ticket/releases/tag/v4.2.0"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.2.0-brightgreen.svg?style=flat-square"></img></a>
<a href="https://github.com/open-discord-bots/open-ticket/releases/tag/v4.2.1"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.2.1-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://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>
@@ -21,7 +21,7 @@ The bot is fully translated into <b>38+ languages</b> and has been battle-tested
<h3 align="center"><b>⭐️ Support Open Ticket’s growth by starring this repo! ⭐️</b></h3>
<p align="center"><sup>❤️ Love Open Ticket? <a href="https://github.com/sponsors/DJj123dj">Sponsorships</a> help fuel our HTML transcript servers and future features! ❤️</sup><br>
<img align="center" src=".github/SPONSORS.svg" alt="Open Ticket" width="800px">
<img align="center" src="https://raw.githubusercontent.com/open-discord-bots/hall-of-fame/refs/heads/main/svg/SPONSORS_YELLOW.svg" alt="A list of Open Ticket Sponsors" width="800px">
</p>
---
@@ -33,59 +33,59 @@ The bot is fully translated into <b>38+ languages</b> and has been battle-tested
### 📌 Features
#### Core Features
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-management.svg"></img> **Ticket Management** - Close, reopen, delete, claim or pin tickets with ease.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-commands.svg"></img> **Powerful Commands** - Manage your support system with **30+ commands** for staff & users.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-questions.svg"></img> **Modal Questions** - Ask users **custom questions** before a ticket is created.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-priorities.svg"></img> **Priorities** - Assign **priority levels** to tickets to highlight urgent requests.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-participants.svg"></img> **Participants** - Add or remove participants & transfer ownership from one user to another.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-adjustments.svg"></img> **Adjustments** - Rename tickets, change ticket types or transfer ownership.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-blacklist.svg"></img> **Blacklist & Limits** - Prevent users from creating tickets and set per-user or global ticket limits.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-customisable.svg"></img> **Highly Customisable** - Configure **350+ settings** covering appearance and behaviour.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-management.svg"></img> **Ticket Management** - Close, reopen, delete, claim or pin tickets with ease.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-commands.svg"></img> **Powerful Commands** - Manage your support system with **30+ commands** for staff & users.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-questions.svg"></img> **Modal Questions** - Ask users **custom questions** before a ticket is created.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-priorities.svg"></img> **Priorities** - Assign **priority levels** to tickets to highlight urgent requests.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-participants.svg"></img> **Participants** - Add or remove participants & transfer ownership from one user to another.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-adjustments.svg"></img> **Adjustments** - Rename tickets, change ticket types or transfer ownership.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-blacklist.svg"></img> **Blacklist & Limits** - Prevent users from creating tickets and set per-user or global ticket limits.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-customisable.svg"></img> **Highly Customisable** - Configure **350+ settings** covering appearance and behaviour.
#### Ticket Automation & Workflows
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/automation-unlimited.svg"></img> **Unlimited Possibilities** - Create unlimited tickets, panels & question flows.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/automation-autoclose.svg"></img> **Autoclose Tickets** - Automatically **close tickets** after predefined conditions.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/automation-autodelete.svg"></img> **Autodelete Tickets** - Automatically **delete closed tickets** to keep channels clean.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/automation-categories.svg"></img> **Category Routing** - Move tickets between categories based on claim or close state.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/automation-unlimited.svg"></img> **Unlimited Possibilities** - Create unlimited tickets, panels & question flows.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/automation-autoclose.svg"></img> **Autoclose Tickets** - Automatically **close tickets** after predefined conditions.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/automation-autodelete.svg"></img> **Autodelete Tickets** - Automatically **delete closed tickets** to keep channels clean.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/automation-categories.svg"></img> **Category Routing** - Move tickets between categories based on claim or close state.
#### Transcripts & Insights
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/insights-transcripts.svg"></img> **HTML Transcripts** - Generate beautiful, easy-to-read **HTML transcripts** for every ticket.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/insights-stats.svg"></img> **Detailed Statistics** - Track **50+ statistics** for tickets, users and server activity.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/insights-logs.svg"></img> **Ticket Logs** - Track **all ticket events** such as creation, closures, and staff actions.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/insights-transcripts.svg"></img> **HTML Transcripts** - Generate beautiful, easy-to-read **HTML transcripts** for every ticket.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/insights-stats.svg"></img> **Detailed Statistics** - Track **50+ statistics** for tickets, users and server activity.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/insights-logs.svg"></img> **Ticket Logs** - Track **all ticket events** such as creation, closures, and staff actions.
#### User Experience
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ux-translated.svg"></img> **Fully Translated** - Available in **38+ languages**, translated and maintained by the community.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ux-interactions.svg"></img> **Modern Interactions** - Full support for buttons, dropdowns, slash/text commands & modals.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ux-panels.svg"></img> **Panels** - Create messages with buttons or a dropdown for users to open tickets.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ux-sub-panels.svg"></img> **Sub-Panels** - One panel not enough? Use multiple panels to offer more choices.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ux-translated.svg"></img> **Fully Translated** - Available in **38+ languages**, translated and maintained by the community.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ux-interactions.svg"></img> **Modern Interactions** - Full support for buttons, dropdowns, slash/text commands & modals.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ux-panels.svg"></img> **Panels** - Create messages with buttons or a dropdown for users to open tickets.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ux-sub-panels.svg"></img> **Sub-Panels** - One panel not enough? Use multiple panels to offer more choices.
#### Plugins & Ecosystem
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-plugins.svg"></img> **Plugin System** - Use custom plugins to **add new features** or **modify existing behavior** of the bot.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-community.svg"></img> **Community Plugins** - Use and share plugins built by the community.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-api.svg"></img> **Advanced API** - Build advanced plugins with access to ticket events and internal systems.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-integrations.svg"></img> **Integrations** - Connect Open Ticket with external services to automate workflows across platforms.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-bonus.svg"></img> **Bonus Features** - Somehow, we included Reaction Roles and URL Button support as well.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-plugins.svg"></img> **Plugin System** - Use custom plugins to **add new features** or **modify existing behavior** of the bot.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-community.svg"></img> **Community Plugins** - Use and share plugins built by the community.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-api.svg"></img> **Advanced API** - Build advanced plugins with access to ticket events and internal systems.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-integrations.svg"></img> **Integrations** - Connect Open Ticket with external services to automate workflows across platforms.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/ecosystem-bonus.svg"></img> **Bonus Features** - Somehow, we included Reaction Roles and URL Button support as well.
#### Deployment
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-quick.svg"></img> **Quick Setup** - Easy **5-minute configuration** using the Interactive Setup CLI.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-scale.svg"></img> **Scalable & Reliable** - Battle-tested in servers with **100k+ members**.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-secure.svg"></img> **Private & Secure** - Used by thousands of servers with respect for security & privacy.
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-pterodactyl.svg"></img> **Pterodactyl Support** - 100% compatible with Pterodactyl panels. [(Download official eggs)](.eggs/README.md)
- <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-docker.svg"></img> **Docker Support** - Deploy Open Ticket in minutes with Docker containers.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-quick.svg"></img> **Quick Setup** - Easy **5-minute configuration** using the Interactive Setup CLI.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-scale.svg"></img> **Scalable & Reliable** - Battle-tested in servers with **100k+ members**.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-secure.svg"></img> **Private & Secure** - Used by thousands of servers with respect for security & privacy.
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-pterodactyl.svg"></img> **Pterodactyl Support** - 100% compatible with Pterodactyl panels. [(Download official eggs)](.eggs/README.md)
- <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/deployment-docker.svg"></img> **Docker Support** - Deploy Open Ticket in minutes with Docker containers.
#### Extend functionality even more with our [pre-made community plugins](#-plugins)!
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-reviews.svg"></img> **Reviews** - Create and manage a support review system for tickets.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-tags.svg"></img> **Tags** - Define keywords that automatically trigger predefined responses.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-reminders.svg"></img> **Reminders** - Create and manage custom reminders for users or staff.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-ai.svg"></img> **AI Integrations** - Connect to AI providers such as ChatGPT, Claude, or Gemini.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-display.svg"></img> **Channel Display** - Create voice channels that display real-time ticket system statistics.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-forms.svg"></img> **Forms** - Build advanced forms for collecting structured information from users.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-embeds.svg"></img> **Custom Embeds** - Create and send custom embeds via commands.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-customisable.svg"></img> **Customization Tools** - Additional configuration options for advanced behavior and styling.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-dashboard.svg"></img> **Web Dashboard** - Configure and manage the bot through a remote web dashboard.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-feedback.svg"></img> **Feedback** - Collect user feedback after ticket deletion using forms.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-sqlite.svg"></img> **SQLite Database** - Use an SQLite backend for improved performance and lightweight storage.
> - <img align="center" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-more.svg"></img> **And more** - Additional community plugins are available and actively expanding.
#### Extend functionality even more with our [pre-made community plugins](https://github.com/open-discord-bots/plugins)!
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-reviews.svg"></img> **Reviews** - Create and manage a support review system for tickets.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-tags.svg"></img> **Tags** - Define keywords that automatically trigger predefined responses.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-reminders.svg"></img> **Reminders** - Create and manage custom reminders for users or staff.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-ai.svg"></img> **AI Integrations** - Connect to AI providers such as ChatGPT, Claude, or Gemini.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-display.svg"></img> **Channel Display** - Create voice channels that display real-time ticket system statistics.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-forms.svg"></img> **Forms** - Build advanced forms for collecting structured information from users.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-embeds.svg"></img> **Custom Embeds** - Create and send custom embeds via commands.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/core-customisable.svg"></img> **Customization Tools** - Additional configuration options for advanced behavior and styling.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-dashboard.svg"></img> **Web Dashboard** - Configure and manage the bot through a remote web dashboard.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-feedback.svg"></img> **Feedback** - Collect user feedback after ticket deletion using forms.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-sqlite.svg"></img> **SQLite Database** - Use an SQLite backend for improved performance and lightweight storage.
> - <img align="top" src="https://apis.dj-dj.be/cdn/openticket/readme-icons/plugin-more.svg"></img> **And more** - Additional community plugins are available and actively expanding.
## ⏱️ Quick Start
> 1. Download the [latest version of Open Ticket](https://github.com/open-discord-bots/open-ticket/releases/latest).
@@ -166,7 +166,7 @@ With the amazing support of our translators, we've been able to translate Open T
<!--[⭐ Contribute!](.github/CONTRIBUTING.md) -->
## 😎 Hall Of Fame
<img alt="The full list of contributors for Open Ticket and Open Discord." src=".github/CONTRIBUTORS.svg">
<img alt="The full list of contributors for Open Ticket and Open Discord." src="https://raw.githubusercontent.com/open-discord-bots/hall-of-fame/refs/heads/main/svg/CONTRIBUTORS.svg">
## ⭐️ Star History
If you enjoy using Open ticket, **consider starring** our repository.
+1 -1
View File
@@ -18,7 +18,7 @@
* Good luck! DJj123dj & contributors
*/
{
"_CONFIG_VERSION":"open-ticket-v4.2.0",
"_CONFIG_VERSION":"open-ticket-v4.2.1",
/* Load the bot token from .env or the "token" field below. Leave "token" empty if using "tokenFromENV". */
"token":"INSERT_BOT_TOKEN",
+1 -1
View File
@@ -31,7 +31,7 @@
"image":"", //Image URL. Leave empty to disable
"thumbnail":"", //Image URL. Leave empty to disable
"footer":"Open Ticket v4.2.0", //Leave empty to disable
"footer":"Open Ticket v4.2.1", //Leave empty to disable
/* Embed fields. Set to empty list [] to disable. */
"fields":[
{"name":"Field name","value":"Field value","inline":false}
+1 -1
View File
@@ -13,7 +13,7 @@ const flags = [
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
v4.2.0 - Made by DJj123dj & Contributors
v4.2.1 - Made by DJj123dj & Contributors
Discord: https://discord.dj-dj.be
Docs: https://otdocs.dj-dj.be
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["palestinian"],
"lastedited":"25/05/2026",
"language":"Arabic",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["HanumeshGupta"],
"lastedited":"25/05/2026",
"language":"Bengali",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["guillee3"],
"lastedited":"25/05/2026",
"language":"Catalan",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["DJj123dj"],
"lastedited":"25/05/2026",
"language":"Custom",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["spyeye_"],
"lastedited":"25/05/2026",
"language":"Czech",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["the_gamer"],
"lastedited":"25/05/2026",
"language":"Danish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["DJj123dj"],
"lastedited":"25/05/2026",
"language":"Dutch",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["DJj123dj"],
"lastedited":"25/05/2026",
"language":"English",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["iamnotmega","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Estonian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["iamnotmega","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Finnish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["guillee3"],
"lastedited":"25/05/2026",
"language":"French",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["benzorich"],
"lastedited":"25/05/2026",
"language":"German",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Greek",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["challenger_nova"],
"lastedited":"25/05/2026",
"language":"Hindi",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["Kornel0706"],
"lastedited":"25/05/2026",
"language":"Hungarian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["erxg"],
"lastedited":"25/05/2026",
"language":"Indonesian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["fraden1mvp.","imperatorix_17"],
"lastedited":"25/05/2026",
"language":"Italian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Japanese",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["yuuslokrobjakkroval"],
"lastedited":"25/05/2026",
"language":"Khmer",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Korean",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Kurdish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["NoOneNook"],
"lastedited":"25/05/2026",
"language":"Latvian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["TsgIndrius"],
"lastedited":"25/05/2026",
"language":"Lithuanian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["NoOneNook"],
"lastedited":"25/05/2026",
"language":"Norwegian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["dysashop","zhavis"],
"lastedited":"25/05/2026",
"language":"Persian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["DanoGlez"],
"lastedited":"25/05/2026",
"language":"Polish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["quiradon"],
"lastedited":"25/05/2026",
"language":"Portuguese",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["SankeDev"],
"lastedited":"25/05/2026",
"language":"Romanian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["NoOneNook"],
"lastedited":"25/05/2026",
"language":"Russian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Simplified Chainese",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Solvenian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["Redactado","Josuens"],
"lastedited":"25/05/2026",
"language":"Spanish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["NoOneNook"],
"lastedited":"25/05/2026",
"language":"Svenska",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"25/05/2026",
"language":"Tamil",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["modshd"],
"lastedited":"25/05/2026",
"language":"Thai",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["me.october"],
"lastedited":"25/05/2026",
"language":"Traditional Chinese",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["palestinian"],
"lastedited":"25/05/2026",
"language":"Turkish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["Anderskiy"],
"lastedited":"25/05/2026",
"language":"Ukrainian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.2.0",
"otversion":"v4.2.1",
"translators":["ngocdiep2006"],
"lastedited":"25/05/2026",
"language":"Vietnamese",
+2 -4
View File
@@ -1,7 +1,7 @@
{
"name": "open-ticket",
"author": "DJdj Development",
"version": "4.2.0",
"version": "4.2.1",
"description": "The most advanced open-source discord ticket bot with HTML transcripts, plugins, questions, claiming, pinning & more! Using discord.js v14 & JSON database! ",
"keywords": [
"ticket-bot",
@@ -20,15 +20,13 @@
"testsetup": "node index.js --cli --dev-config --dev-database --soft-plugins",
"testnc": "node index.js --no-compile --dev-config --dev-database --soft-plugins",
"tools:mergelang": "bun run .tools/mergeTranslations.js",
"tools:sponsors": "bun run .tools/createSponsors.ts",
"tools:contributors": "bun run .tools/createContributors.ts",
"docker:build": ".tools/build-docker.sh djj123dj/open-ticket --no-push"
},
"type": "module",
"license": "GPL-3.0-only",
"dependencies": {
"@discordjs/rest": "^2.6.1",
"@open-discord-bots/framework": "^1.0.0",
"@open-discord-bots/framework": "^2.0.6",
"@types/node": "^22.5.0",
"@types/terminal-kit": "^2.5.7",
"ansis": "^4.2.0",
+1 -1
View File
@@ -1,4 +1,4 @@
# Example Plugin
A simple example of an Open Ticket v4 plugin!
A basic example plugin for developers that want to create their own plugin.
> Use this plugin as a starter template for all your custom plugins!
+41 -19
View File
@@ -1,14 +1,17 @@
import {api, opendiscord, utilities} from "#opendiscord"
import * as discord from "discord.js"
if (opendiscord.project != "openticket") throw new api.ODPluginError("This plugin only works in Open Ticket.")
/////////////////////////////////////////////
//// This plugin is not enabled yet! ////
//// Enable it in the plugin.json file! ////
/////////////////////////////////////////////
/** ============= Warning! =============
*
* This plugin is not yet enabled and will not run by default.
* Please enable this plugin in the "plugin.json" file!
*
* =====================================
*/
if (opendiscord.project != "openticket") throw new api.ODPluginError("This plugin only works in Open Ticket!")
//Add Typescript autocomplete support for plugin data. (!!!OPTIONAL!!!)
//Add optional Typescript type-safety. This improves the developer experience.
declare module "#opendiscord-types" {
export interface ODPluginManagerIdMappings {
"example-plugin":api.ODPlugin
@@ -18,29 +21,48 @@ declare module "#opendiscord-types" {
}
}
//Let's register the example config. This way it's available for all plugins & systems.
opendiscord.events.get("onConfigLoad").listen((configManager) => {
configManager.add(new api.ODJsonConfig("example-plugin:config","config.json","./plugins/example-plugin/"))
//REGISTER CONFIG
opendiscord.events.get("onConfigLoad").listen((configs) => {
//Let's register our example config. The plugin, all systems and even other plugins can access it.
configs.add(new api.ODJsonConfig("example-plugin:config","config.json","./plugins/example-plugin/"))
/* ===== What did we do? =====
- "example-plugin:config" Is the ID of this config. You can use this id troughout the bot to access this config file. Even in other plugins.
- "config.json" Is the FILE of this config. It is just the filename.
- "./plugins/example-plugin/" Is the DIRECTORY of this config. By default it's "./config/", but we want to change it to point at the plugin directory.
* "example-plugin:config" --> Is the ID of this config. It will be used throughout the code to access this config file.
* "config.json" --> Is the FILENAME of this config with extension.
* "./plugins/example-plugin/" --> Is the DIRECTORY of this config. It is set to "./config/" by default, but we want to change it to our plugin directory.
*/
})
//Let's also log it to the console to let us know it worked!
const ourConfig = configManager.get("example-plugin:config")
//CONFIG READY FOR USAGE
opendiscord.events.get("afterConfigsInitiated").listen((configs) => {
//After the "afterConfigsInitiated" event is fired, configs can be read without problems.
//Almost all events happen after this one, so you don't need to worry about it.
const ourConfig = configs.get("example-plugin:config")
opendiscord.log("The example config loaded successfully!","plugin",[
{key:"var-1",value:ourConfig.data.testVariable1.toString()},
{key:"var-2",value:ourConfig.data.testVariable2.toString()},
{key:"var-3",value:ourConfig.data.testVariable3.toString()}
{key:"test-property-1",value:ourConfig.data.testVariable1.toString()},
{key:"test-property-2",value:ourConfig.data.testVariable2.toString()},
{key:"test-property-3",value:ourConfig.data.testVariable3.toString()}
])
})
//LISTEN FOR TICKET EVENTS
opendiscord.events.get("onTicketCreate").listen((creator) => {
//This is logged before the ticket is created (after the button is pressed)
//Do something before a ticket is created (just after the button press)
opendiscord.log("Ticket is getting created...","plugin")
})
opendiscord.events.get("afterTicketCreated").listen((ticket,creator,channel) => {
//This is logged after the ticket is created
//Do something after a ticket is created and ready for usage
opendiscord.log("Ticket ready!","plugin")
})
opendiscord.events.get("onTicketClose").listen((ticket,closer,channel,reason) => {
//Do something when a ticket will be closed
opendiscord.log("Ticket is getting closed...","plugin")
})
//MODIFY BUILT-IN OPEN TICKET MESSAGES
opendiscord.events.get("afterEmbedBuildersLoaded").listen((embeds) => {
//Let's modify the close message to include a URL in the embed.
embeds.get("opendiscord:close-message").workers.add(new api.ODWorker("example-plugin:testing",0,(instance,params,origin,cancel) => {
instance.setUrl("https://example.com")
}))
})
+3 -3
View File
@@ -3,7 +3,7 @@
"id":"example-plugin",
"version":"1.0.0",
"startFile":"index.ts",
"supportedVersions":["OTv4.0.x","OTv4.1.x","OTv4.2.x"],
"supportedVersions":["OTv4.2.x"],
"enabled":false,
"priority":0,
@@ -16,8 +16,8 @@
"details":{
"author":"DJj123dj",
"contributors":[],
"shortDescription":"A simple template for an Open Ticket v4 plugin!",
"longDescription":"A simple example of an Open Ticket v4 plugin!",
"shortDescription":"A basic example plugin for developers that want to create their own plugin.",
"longDescription":"A basic example plugin for developers that want to create their own plugin.",
"imageUrl":"",
"projectUrl":"",
"tags":["template","example","default"]
+11 -1
View File
@@ -194,8 +194,18 @@ export async function registerActions(){
//pin ticket message (if required)
if (generalConfig.data.ticketSystem.pinFirstTicketMessage && ticketMsg.pinnable) await ticketMsg.pin("Ticket Message")
//send modal file upload answers in separate message to prevent deletion after 72h
const attachments = answers
.filter((answer) => answer.type == "file-upload")
.map((answer) => answer.files).flat()
.map((file) => new discord.AttachmentBuilder(file.url,{
name:file.name,
description:file.description ?? undefined
}))
if (attachments.length > 0) await channel.send({files:attachments})
//manage stats
await opendiscord.statistics.get("opendiscord:ticket").setStat("opendiscord:messages-sent",ticket.id.value,1,"increase")
await opendiscord.statistics.get("opendiscord:ticket").setStat("opendiscord:messages-sent",ticket.id.value,2,"increase")
await opendiscord.events.get("afterTicketMainMessageCreated").emit([ticket,ticketMsg,channel,user])
}catch(err){
+1 -1
View File
@@ -60,7 +60,7 @@ export class ODOpenTicketMain extends api.ODMain {
priorities: api.ODMappedPriorityManager
constructor(){
const version = api.ODVersion.fromString("opendiscord:version","v4.2.0")
const version = api.ODVersion.fromString("opendiscord:version","v4.2.1")
const debugfile = new api.ODDebugFileManager("./","otdebug.txt",5000,version)
const console = new api.ODConsoleManager(100,debugfile)
const debug = new api.ODDebugger(console)
+2 -2
View File
@@ -10,8 +10,8 @@ import { ODTicket } from "../api/ticket.js"
* A list of all available IDs in the default `ODSharedComponentManager` class in `opendiscord`.
* It's used to generate typescript declarations for this class.
*/
export interface ODSharedComponentManagerIdMappings extends api.ODComponentManagerIdConstraint {
//"opendiscord:example-component":{origin:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:example-component"},
export interface ODSharedComponentManagerIdMappings extends api.ODSharedComponentManagerIdConstraint {
//"opendiscord:example-component":{component:api.ODComponent<object,any>,origin:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:example-component"},
}
/**## ODMessageComponentManagerIdMappings `interface`
-2
View File
@@ -29,8 +29,6 @@ export interface ODDatabaseManagerIdMappings extends api.ODDatabaseManagerIdCons
* It's used to generate typescript declarations for this class.
*/
export interface ODGlobalDatabaseIdMappings extends api.ODDatabaseIdConstraint {
"opendiscord:panel-message":string,
"opendiscord:panel-update":string,
"opendiscord:option-suffix-counter":number,
"opendiscord:option-suffix-history":string[],
"opendiscord:last-version":string
+4 -1
View File
@@ -372,7 +372,7 @@ export const migrations = [
const message = await opendiscord.client.fetchChannelMessage(channelId,messageId)
const autoUpdate = typeof (await globalDatabase.get("opendiscord:panel-update",panelMessage.key)) == "string"
//if message still exists
if (message) migratedPanelStates.push({channelId,messageId,panelId:panelMessage.value,autoUpdate})
if (message) migratedPanelStates.push({channelId,messageId,panelId:panelMessage.value as string,autoUpdate})
await globalDatabase.delete("opendiscord:panel-message",panelMessage.key)
await globalDatabase.delete("opendiscord:panel-update",panelMessage.key)
@@ -418,4 +418,7 @@ export const migrations = [
})
}
}),
//MIGRATE TO v4.2.1
new api.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.2.1"),{}),
]
+1 -1
View File
@@ -20,7 +20,7 @@
INFORMATION:
============
Open Ticket v4.2.0 - © DJdj Development
Open Ticket v4.2.1 - © DJdj Development
support us: https://github.com/sponsors/DJj123dj
discord: https://discord.dj-dj.be