Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
849c688e56 | ||
|
|
6babc5e4b8 | ||
|
|
4606ddac3c | ||
|
|
e6ab09dbbd | ||
|
|
39427cdbea | ||
|
|
adfcb1c82f | ||
|
|
6c994f6f86 | ||
|
|
4cfde9f5c4 | ||
|
|
fd1e0d6bdb | ||
|
|
e7475af694 | ||
|
|
9da066e99e | ||
|
|
45f15a2df6 | ||
|
|
58a6bcde45 | ||
|
|
eb44f41d3a | ||
|
|
66c5bc4565 | ||
|
|
22d4caf03e | ||
|
|
77dde68edc | ||
|
|
c8c8a94d6f | ||
|
|
6c41aecfa7 | ||
|
|
c64220cad4 | ||
|
|
7f02dd5848 | ||
|
|
c442e50cb4 | ||
|
|
4af9b9e17f | ||
|
|
98d13c6569 | ||
|
|
345a64f51a | ||
|
|
45080ccd96 | ||
|
|
87c034d215 | ||
|
|
1b2e38f524 | ||
|
|
8f780992aa | ||
|
|
a28bcd4f8b | ||
|
|
a0b3aff661 | ||
|
|
9ca375ee2c | ||
|
|
0f9ae79d49 | ||
|
|
dd8d5a12d6 | ||
|
|
afd7f80b8d | ||
|
|
ca5faa3365 | ||
|
|
cf9ddf58d0 | ||
|
|
15ff345948 | ||
|
|
0c45a0ad6a | ||
|
|
e6f6aa1af4 | ||
|
|
1a530aae4c | ||
|
|
67f4417ee6 | ||
|
|
b5e15921ef | ||
|
|
cb8afdf9a6 | ||
|
|
7030b7011c | ||
|
|
7dd8a57a83 | ||
|
|
5763659900 | ||
|
|
65334a8a25 | ||
|
|
4be54399a6 | ||
|
|
1f9fa54344 | ||
|
|
e4b4acfd9f | ||
|
|
6bfa0e0f10 | ||
|
|
4eb9331bf4 | ||
|
|
10f5ae9d44 | ||
|
|
27a9f04d83 | ||
|
|
600419f763 | ||
|
|
a18b19da66 | ||
|
|
230ef70d86 | ||
|
|
2d9a9b42d4 | ||
|
|
50c7fc5e90 | ||
|
|
fa8bc0eb6c | ||
|
|
f42b70d1b9 | ||
|
|
4c2a617a51 | ||
|
|
a1198866f3 | ||
|
|
fe3f2d04a9 | ||
|
|
cb8139b8a0 | ||
|
|
ddae7b5e46 | ||
|
|
32c9a6b4f3 | ||
|
|
0ad24ba89f | ||
|
|
5412416166 | ||
|
|
78a937d4e9 | ||
|
|
5b45dc265b | ||
|
|
4b210fe793 | ||
|
|
8891320bdf | ||
|
|
8ccfd5c4eb | ||
|
|
44074004e4 | ||
|
|
2f1c885b4f | ||
|
|
c94867280d | ||
|
|
138f7fa2bb | ||
|
|
465eda1c24 | ||
|
|
c821e7dd6d | ||
|
|
f9ce496cc5 | ||
|
|
3989fb5f76 | ||
|
|
779efca39a | ||
|
|
4976aa3d45 | ||
|
|
9cdff2c1de | ||
|
|
2e29947ba5 | ||
|
|
0aa3dca63b | ||
|
|
90851f881d | ||
|
|
b972c97871 | ||
|
|
db94f226fb | ||
|
|
6a4f40d862 | ||
|
|
1f402a848e | ||
|
|
24d98aeaeb | ||
|
|
b95b8f239e | ||
|
|
488b5fce53 | ||
|
|
c2117a67ed | ||
|
|
d31be1bb57 | ||
|
|
76095bea30 | ||
|
|
da962c6c2e | ||
|
|
a89d5c2149 | ||
|
|
7d5313c77e | ||
|
|
16f1be32a3 | ||
|
|
e1a6feea6e | ||
|
|
9668851a82 | ||
|
|
68d6a2df3f | ||
|
|
f835850b3f | ||
|
|
f7fa0998b6 | ||
|
|
4416736947 | ||
|
|
5494c1ad8f | ||
|
|
4147658575 | ||
|
|
f7cda48ed6 | ||
|
|
4b485adf82 | ||
|
|
e55438cc67 | ||
|
|
c7b44232c4 | ||
|
|
68a8170570 | ||
|
|
34ed4edede | ||
|
|
a40a9b8be8 | ||
|
|
e8f96ef84f | ||
|
|
8413d3c2b7 | ||
|
|
30b6ab4df6 | ||
|
|
2aef855902 | ||
|
|
4aacdd1607 | ||
|
|
d66925a450 | ||
|
|
d2cd6be513 | ||
|
|
30a0a6c503 | ||
|
|
72f84b2566 | ||
|
|
6ce017b407 | ||
|
|
415330be21 | ||
|
|
21ce2921a1 | ||
|
|
b07252151b | ||
|
|
02d37dd177 | ||
|
|
706006e319 | ||
|
|
82f2aeaa90 | ||
|
|
793c6f0603 | ||
|
|
1ef74f0b6b | ||
|
|
337dc3827e | ||
|
|
810db76e91 | ||
|
|
f4f6f30fa2 | ||
|
|
8436b19cbf | ||
|
|
549c161830 | ||
|
|
adc2433216 | ||
|
|
3b3c0aff96 | ||
|
|
ce6ca6fc09 | ||
|
|
e3bc985c0c | ||
|
|
ff8568fde7 | ||
|
|
8ec710fa55 | ||
|
|
076fcbcb37 | ||
|
|
6df3498cb5 | ||
|
|
8116d4d8dd | ||
|
|
e987c176b7 | ||
|
|
2ea38cd7a5 | ||
|
|
b2f2ef3405 | ||
|
|
c2e6f781b9 | ||
|
|
8dfd17ddde | ||
|
|
5f077e87f6 | ||
|
|
76dc3b1022 | ||
|
|
93ed56b4ae | ||
|
|
160f89c7cf | ||
|
|
51c4ae0229 | ||
|
|
2cc2ccc68e | ||
|
|
0a29e13640 | ||
|
|
31b94718f1 | ||
|
|
6ac993617e | ||
|
|
9f4999b89b | ||
|
|
dd3c159413 | ||
|
|
72627a7058 | ||
|
|
b683365126 | ||
|
|
03b3495eb2 | ||
|
|
a6be9df213 | ||
|
|
6b2f291122 | ||
|
|
af0dc879c6 | ||
|
|
a12f60136a | ||
|
|
1d05d04bf2 | ||
|
|
ff6a9eefaf | ||
|
|
aa9004d7e2 | ||
|
|
7e1fe78a26 | ||
|
|
675571b8d8 | ||
|
|
48f0d65fad | ||
|
|
a54422b222 | ||
|
|
c243d03216 | ||
|
|
b965a4f5a2 | ||
|
|
0d8dd8cd17 | ||
|
|
6ac432cadc | ||
|
|
dec6c7598b | ||
|
|
2de2e3cd9b | ||
|
|
f117943e00 | ||
|
|
951aff093a | ||
|
|
2acd185d6f | ||
|
|
2fbef46a53 | ||
|
|
5d0776a9b9 | ||
|
|
7bf843c851 | ||
|
|
3e3ea9263f | ||
|
|
bb5c3e9c8d | ||
|
|
8df13b0d36 | ||
|
|
b5dd7158df | ||
|
|
05919bb57e | ||
|
|
1d6572aa36 | ||
|
|
83080a6e4d | ||
|
|
35fdafb21d | ||
|
|
a0e03be103 | ||
|
|
d404f343e0 | ||
|
|
adf4acd443 | ||
|
|
94f32674cb | ||
|
|
e8eb52e00b | ||
|
|
4efa165949 | ||
|
|
4c3e4ef9a5 | ||
|
|
fd739054fd | ||
|
|
2d1724893e | ||
|
|
7696202dec | ||
|
|
e36c1992de | ||
|
|
e73c8e9b3b | ||
|
|
ad623f9650 | ||
|
|
515b7e1ffc | ||
|
|
605173e788 | ||
|
|
e129724c12 | ||
|
|
49504bc3de | ||
|
|
f414fd77fc | ||
|
|
5dcbcbfabc | ||
|
|
6ec228df53 | ||
|
|
1f3894141a | ||
|
|
9253377766 | ||
|
|
6355fb5562 | ||
|
|
442c201994 | ||
|
|
b61f9d4d5a | ||
|
|
129053b9f5 | ||
|
|
35a0511b97 | ||
|
|
bae221056c | ||
|
|
9c6e4ccde4 | ||
|
|
ac6845b4d4 | ||
|
|
30352b570a | ||
|
|
1fddad1e96 | ||
|
|
75770c84b2 | ||
|
|
2281d78896 | ||
|
|
37cc3b794e | ||
|
|
d545d21bb1 | ||
|
|
5f79ae909b | ||
|
|
831e120093 | ||
|
|
376fa23288 | ||
|
|
9414b96221 | ||
|
|
0befd2860e | ||
|
|
74d4ac24f2 | ||
|
|
364bf4f702 | ||
|
|
dd5b76f3d8 | ||
|
|
a02ba56e9a | ||
|
|
6d5bdc5dd4 | ||
|
|
51bfb1a367 | ||
|
|
d85d842046 | ||
|
|
53136e0e6c | ||
|
|
2031a82523 | ||
|
|
453c48fab5 | ||
|
|
fd3bc0e7b9 | ||
|
|
f316ae83e7 | ||
|
|
d2c5cf0fc1 | ||
|
|
45dfc18c1d | ||
|
|
d81b1e7be3 | ||
|
|
2a82bdebae | ||
|
|
c9e13b2471 | ||
|
|
cbeac2fda2 | ||
|
|
8b1dd7d27a | ||
|
|
9e7cd28c6a | ||
|
|
fabe11bfd1 | ||
|
|
79187b9995 | ||
|
|
a1251cf11c | ||
|
|
1bc8b2b401 | ||
|
|
ce727e52b0 | ||
|
|
30233df7b0 | ||
|
|
48d3296868 | ||
|
|
6b8ef26b4c | ||
|
|
9c992c3dbd | ||
|
|
6feb56c25c | ||
|
|
e29b6afd87 | ||
|
|
d35b7fca99 | ||
|
|
126fada990 | ||
|
|
bd4929f11b | ||
|
|
d28fcf40d7 | ||
|
|
bed4e2a56a | ||
|
|
ba3a35a343 | ||
|
|
1e159c9bab | ||
|
|
e7ad3dd50b | ||
|
|
177dee7468 | ||
|
|
0d40c23aa8 | ||
|
|
15eef95fdd | ||
|
|
c89e93d33d | ||
|
|
e6c413cdf5 | ||
|
|
b12556120c | ||
|
|
58674452d8 | ||
|
|
a2f9593d55 | ||
|
|
9702c4d97d | ||
|
|
f13777e5f3 | ||
|
|
9395e9af75 | ||
|
|
b2a5e65fe2 | ||
|
|
071c8f953c | ||
|
|
9a4e5e2175 | ||
|
|
4e709f2a0b | ||
|
|
27e3e78439 | ||
|
|
06e7919162 | ||
|
|
bf952e3ef7 | ||
|
|
a397b66c9e | ||
|
|
27f6e3a81f | ||
|
|
f2cefae37c | ||
|
|
6acbf74846 | ||
|
|
29f8e1452c | ||
|
|
ce242741cd | ||
|
|
ac587568d3 | ||
|
|
f5e78949d7 | ||
|
|
8e7fe4e502 | ||
|
|
e51cc54090 | ||
|
|
dc3515da10 | ||
|
|
c57f3397a4 | ||
|
|
686b45b0bd | ||
|
|
96d6758b4a | ||
|
|
52b49ec564 | ||
|
|
deebd2b758 | ||
|
|
ed9afffd70 | ||
|
|
91cad963e5 | ||
|
|
baa4e35878 | ||
|
|
f6c70fa62a | ||
|
|
58fb7b7512 | ||
|
|
5e1cfe7942 | ||
|
|
507d254556 | ||
|
|
43356fef05 | ||
|
|
bbae139c6b | ||
|
|
6516857866 | ||
|
|
213ec32225 | ||
|
|
04789d5426 | ||
|
|
0437af1507 | ||
|
|
73d188c5dc | ||
|
|
057a5fc6ae | ||
|
|
d35eb8f8bf | ||
|
|
19e5902320 | ||
|
|
66b0377a2b | ||
|
|
3bd308007c | ||
|
|
40bd873a33 | ||
|
|
09d9b2d265 | ||
|
|
7fb169789b | ||
|
|
1ab207b4eb | ||
|
|
5e5ac3e409 | ||
|
|
7809ffc5c6 | ||
|
|
9da823aa4b | ||
|
|
ff23b0e89e | ||
|
|
c3474fb017 | ||
|
|
03982f644e | ||
|
|
3a30152cb2 | ||
|
|
334c9dde21 | ||
|
|
b6985f9d28 | ||
|
|
7d30bf24d9 | ||
|
|
138378ac31 | ||
|
|
9a73ee0d01 | ||
|
|
f26e6f5e99 | ||
|
|
209041c1e5 | ||
|
|
499901fbf1 | ||
|
|
1a1a3f3b02 | ||
|
|
dd5374f84c | ||
|
|
02e8b7d0a1 | ||
|
|
ce0af7e1e9 | ||
|
|
e1fab310a4 | ||
|
|
0615235780 | ||
|
|
abd672dd3b | ||
|
|
f05d2d7d1b | ||
|
|
e65a092bc0 | ||
|
|
17e1902681 | ||
|
|
91657f7519 | ||
|
|
cfa692b356 | ||
|
|
0604e334ed | ||
|
|
e9d20c0a14 | ||
|
|
67465bfdf4 | ||
|
|
a66d3aad2d | ||
|
|
f2de7fc408 | ||
|
|
0cbf991090 | ||
|
|
72f7cbce26 | ||
|
|
05b4080ac5 | ||
|
|
7646b3fc35 | ||
|
|
bf13e15d56 | ||
|
|
f0183c319a | ||
|
|
c6e836455c | ||
|
|
8a6a8e527f | ||
|
|
4e7d45ea07 | ||
|
|
b7f5c7191d | ||
|
|
106cb0f718 | ||
|
|
0c2b688862 | ||
|
|
a037d76060 | ||
|
|
1e2321313f | ||
|
|
91ea12a6cc | ||
|
|
5d86269743 | ||
|
|
42ff447a94 | ||
|
|
7627c07b71 | ||
|
|
147ebc90da | ||
|
|
e8319cccea | ||
|
|
66ab30bf06 | ||
|
|
d0ef2a9873 | ||
|
|
3e928ed06e | ||
|
|
b22f7b2de7 | ||
|
|
6b36b1caf6 | ||
|
|
f8da68607d | ||
|
|
a31588f025 | ||
|
|
5a4b45aa3f | ||
|
|
92aa42fc7c | ||
|
|
4022ae49c2 | ||
|
|
319bbe318d | ||
|
|
970807d144 | ||
|
|
929f57721b | ||
|
|
3469e61065 | ||
|
|
3ddb03a569 | ||
|
|
3fa72e07d8 | ||
|
|
6423ed4b41 | ||
|
|
fc8a252e67 | ||
|
|
ca9fe0aa77 | ||
|
|
798ab8fab1 | ||
|
|
848c968483 | ||
|
|
330ea47ab9 | ||
|
|
4e10cba203 | ||
|
|
56e1fb3939 | ||
|
|
7c76be8473 | ||
|
|
7fa5dca7b3 | ||
|
|
6d3f210612 | ||
|
|
118161698e | ||
|
|
6a8a8dd34d | ||
|
|
28f0d974e5 | ||
|
|
77c486e2b7 | ||
|
|
20bf25aa98 | ||
|
|
70048fa399 | ||
|
|
8eae88b1c6 | ||
|
|
35b02e0a8f | ||
|
|
2a8e41005f | ||
|
|
85026793a4 | ||
|
|
55bcff8030 | ||
|
|
39099a0dfe | ||
|
|
504889a83d | ||
|
|
c1c80fc04d | ||
|
|
4e030bf95b | ||
|
|
adae64bab9 | ||
|
|
bfa05297b2 | ||
|
|
509e961446 | ||
|
|
147eae05b3 | ||
|
|
e410ceaa64 | ||
|
|
51e1ca6fa3 | ||
|
|
e67c505e32 | ||
|
|
12885f63d6 | ||
|
|
c49f577f7f | ||
|
|
d5295a9480 | ||
|
|
177ab95dba | ||
|
|
5e2e0417dc | ||
|
|
b3cd37bb4b | ||
|
|
5512bc1134 | ||
|
|
7dd9bf1ac0 | ||
|
|
cd7fb7533f | ||
|
|
8e730fdfae | ||
|
|
1dd8c0246a | ||
|
|
0a69efdfe5 | ||
|
|
9028eaa16a | ||
|
|
0c2aca7039 | ||
|
|
9326d0fae8 | ||
|
|
e1f4936ae6 | ||
|
|
fd3ae39150 | ||
|
|
1b0da061ba | ||
|
|
07eb8f34e9 | ||
|
|
64fef62bf5 | ||
|
|
b2be76f5b6 | ||
|
|
856ccc10b9 | ||
|
|
8c6681f025 | ||
|
|
cc21e28470 | ||
|
|
7815400472 | ||
|
|
fda8a397d6 | ||
|
|
ae306332bb | ||
|
|
bc46d4ab46 | ||
|
|
b0b4e21aff | ||
|
|
fb3764eefb | ||
|
|
d5efe06fe5 | ||
|
|
cdb2673217 | ||
|
|
6018a183fb | ||
|
|
73f9f4037f | ||
|
|
b5b537e85e | ||
|
|
6ebeb7a93c | ||
|
|
7584c25e93 | ||
|
|
94b3788cfb | ||
|
|
e7d9ad374e | ||
|
|
0e597232f0 | ||
|
|
acc89990c2 | ||
|
|
ee9f8eaca1 | ||
|
|
ae8a8d1b14 | ||
|
|
38afb9c2a6 | ||
|
|
5bdb7941b6 | ||
|
|
01c1f3150e | ||
|
|
e524cccd19 | ||
|
|
ede102bddf | ||
|
|
ab5d5c06be | ||
|
|
355f078ee5 | ||
|
|
c207560743 | ||
|
|
b29dfaeaae | ||
|
|
1710111fcb | ||
|
|
805c6b8e55 | ||
|
|
d0ab311da4 | ||
|
|
92a3671768 | ||
|
|
71074e1afe | ||
|
|
e80ce1a64a | ||
|
|
5dfbce1856 | ||
|
|
407e56a806 | ||
|
|
e0f42834e5 | ||
|
|
d03abd9eeb | ||
|
|
466a4aea81 | ||
|
|
9d96d11cd3 | ||
|
|
e3b99e656e | ||
|
|
07e2a68d06 | ||
|
|
795ca4f981 | ||
|
|
5231129278 | ||
|
|
f62bc7adf9 | ||
|
|
5de6b1e906 | ||
|
|
62413505d6 | ||
|
|
20b617f6eb | ||
|
|
94510bbfb0 | ||
|
|
d51511fdb5 | ||
|
|
3447a37603 | ||
|
|
4b17aa640f | ||
|
|
3b7674f1a5 | ||
|
|
7de9339da3 | ||
|
|
e2e1e19bc8 | ||
|
|
5f19adf561 | ||
|
|
1bb70745ea | ||
|
|
589bbe5cd5 | ||
|
|
447fddea56 | ||
|
|
bf7a003799 | ||
|
|
6115ab1cc8 | ||
|
|
c2307fd1ed | ||
|
|
2a3850c3cc | ||
|
|
688c40ce7b | ||
|
|
dee2a21be9 | ||
|
|
d7ae040d60 | ||
|
|
7b6202985a | ||
|
|
a2f2c601a5 | ||
|
|
b27016df2e | ||
|
|
6341f2f71b | ||
|
|
56a5b9c7d0 | ||
|
|
f608cb71ce | ||
|
|
7c7c325307 | ||
|
|
832021d72a | ||
|
|
030554a7f5 | ||
|
|
ada5ea0c5d | ||
|
|
fb6b891835 | ||
|
|
739ad81f3f | ||
|
|
a6f67a9452 | ||
|
|
56a6540663 | ||
|
|
5f8812d261 | ||
|
|
7a3dcf4c42 | ||
|
|
7cebd4dd6a | ||
|
|
27912a0c37 | ||
|
|
67871d885a | ||
|
|
1bd0d013ed | ||
|
|
a074a17519 | ||
|
|
67af96ef5c | ||
|
|
a041f28cf7 | ||
|
|
a8c9c2ea8d | ||
|
|
8748301b04 | ||
|
|
2d7a7b5728 | ||
|
|
0807ca884c | ||
|
|
0ead037fa8 | ||
|
|
4287c11bf1 | ||
|
|
69fdc7ccf0 | ||
|
|
6c213306b6 | ||
|
|
4096e8196d | ||
|
|
94ee890848 | ||
|
|
4dced819a3 | ||
|
|
1159af9fa9 | ||
|
|
67d429c52b | ||
|
|
f67af805c1 | ||
|
|
944032f690 | ||
|
|
ee248e86bc | ||
|
|
b171bce62b | ||
|
|
df0bce0189 | ||
|
|
2630aa899f | ||
|
|
dba370d66e | ||
|
|
d0bcf26b93 | ||
|
|
65f82171d3 | ||
|
|
6e730f058d | ||
|
|
4702c633ec | ||
|
|
dc14a39c4e | ||
|
|
05c97909d4 | ||
|
|
b3c4c2f6e8 | ||
|
|
e0e678bee0 | ||
|
|
1b01b1703f | ||
|
|
26539360c6 | ||
|
|
627c461f64 | ||
|
|
2e40dc0468 | ||
|
|
fa57b9a93f | ||
|
|
930452155b | ||
|
|
e70f22162d | ||
|
|
d5b0a0f3c6 | ||
|
|
c43081e05d | ||
|
|
8c4bf735f1 | ||
|
|
3a20c4707b | ||
|
|
9a7e563c57 | ||
|
|
72b4f43a25 | ||
|
|
5fec028cc9 | ||
|
|
81300303e5 | ||
|
|
8a1ea1c856 | ||
|
|
8a9d63bf8b | ||
|
|
208b365276 | ||
|
|
abb64a0575 | ||
|
|
c930140540 | ||
|
|
294c4d3f2b | ||
|
|
28e7d48e7e | ||
|
|
bad278e681 | ||
|
|
2e2542d064 | ||
|
|
2c48da45ae | ||
|
|
e1232a559e | ||
|
|
3d58475461 | ||
|
|
f702b199da | ||
|
|
ea1604a805 | ||
|
|
f8bc3d9e12 |
@@ -0,0 +1,13 @@
|
|||||||
|
# Exclude local build artifacts — these are regenerated inside the container
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
.git/
|
||||||
|
.backup/
|
||||||
|
.vscode/
|
||||||
|
devconfig/
|
||||||
|
devdatabase/
|
||||||
|
build-docker
|
||||||
|
otdebug.txt
|
||||||
|
plugins/*
|
||||||
|
!plugins/example-plugin/
|
||||||
|
!plugins/example-plugin/**
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# 🎥 Content Creators
|
||||||
|
Hi there! We're searching for content creators to create tutorials & setup guides for Open Ticket.
|
||||||
|
You can get many great rewards from helping us!
|
||||||
|
|
||||||
|
You can choose which type of tutorial you want to make. You can create a quick setup, full setup, plugin tutorial or something else!
|
||||||
|
You are not required to talk in the video, but make sure it has some kind of subtitles instead.
|
||||||
|
|
||||||
|
### 📄 Requirements
|
||||||
|
- 📌 Video length of at least 2 minutes.
|
||||||
|
- 📌 Provide a link to the Open Ticket repository in the description of the video.
|
||||||
|
- 📌 Please use the latest version of Open Ticket available at the time of making the video.
|
||||||
|
- 📌 **(Optional)** Recommended language is English.
|
||||||
|
- 📌 **(Optional)** Recommended platform is YouTube!
|
||||||
|
- 📌 **(Optional)** Speech in the video *(AI is allowed)*
|
||||||
|
|
||||||
|
|
||||||
|
### 🎁 Rewards
|
||||||
|
We won't give out any compensation in money, but we will give you some advantages!
|
||||||
|
- ✅ Advertisement of tutorial in the [README.md](../README.md)!
|
||||||
|
- ✅ Advertisement of channel in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
- ✅ `Content Creator` role in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
- ✅ Advertisement of tutorial & channel in documentation!
|
||||||
|
- ✅ Lot's of of views generated from GitHub traffic!
|
||||||
|
- ✅ A completely free 24/7 hosted Open Ticket bot!
|
||||||
|
- ✅ We will advertise the video to all our socials!
|
||||||
|
|
||||||
|
### 💤 Outdated Content
|
||||||
|
When a tutorial or setup guide is outdated or no longer applicable,
|
||||||
|
we will remove it from the `README.md` & documentation.
|
||||||
|
Your channel will still stay in the list of contributors, so don't worry about that!
|
||||||
|
|
||||||
|
You will be noticed at least a month before removal.
|
||||||
|
This way you can take time to create an updated tutorial if you want.
|
||||||
|
|
||||||
|
### 💬 Contact Us
|
||||||
|
If you've read all these guidelines, requirements & rewards,
|
||||||
|
you can create a ticket in our [discord server](https://discord.dj-dj.be) to start working on it!
|
||||||
|
|
||||||
|
We will try to help you as fast as possible!
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# Contributing Guidelines
|
||||||
|
<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.2.0) [](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>
|
||||||
|
This includes new features, translations & bug fixes.
|
||||||
|
|
||||||
|
### 💬 Translations
|
||||||
|
#### Step 1: View & Check
|
||||||
|
1. Check the [`./languages/`](./languages/) folder for existing translations.
|
||||||
|
2. When it doesn't exist yet, visit **[step 2](#step-2-translation)**.
|
||||||
|
3. When it does exist, check if it is outdated, incorrect or incomplete.
|
||||||
|
4. If you match one of these requirements, you can also visit **[step 2](#step-2-translating)**.
|
||||||
|
|
||||||
|
#### Step 2: Translation
|
||||||
|
1. If your language doesn't exist yet, copy the [`english.json`](./../languages/english.json) file and rename it to your language.
|
||||||
|
2. **(❌ Not Recommended)** You are allowed to use `Google Translate` or `DeepL`, but only when you say it in the pull request and enable the `"automated"` boolean.
|
||||||
|
3. Only translate existing values in the json file. Don't add or remove any values from the file.
|
||||||
|
4. You're **NOT REQUIRED** to translate everything! If you only want to translate a part of it, it's okay!
|
||||||
|
5. If you are unable to translate something, leave it in `English`.
|
||||||
|
|
||||||
|
#### Step 3: Metadata
|
||||||
|
Metadata can be found in the `_TRANSLATION` variable.
|
||||||
|
|Value |Notes |
|
||||||
|
|--------------|-------------------------------------------------------------------------------------------------|
|
||||||
|
|`otversion` |The Open Ticket version of this translation. **❌ DON'T EDIT!** |
|
||||||
|
|`translators` |The discord usernames from the translators. Add your name to the list when you've contributed. |
|
||||||
|
|`lastedited` |The last edited date in the `DD/MM/YYYY` format. |
|
||||||
|
|`language` |The full name of the language with capital letter. |
|
||||||
|
|`automated` |Enable this boolean when this translation has been made using ChatGPT, Google Translate, ... |
|
||||||
|
|
||||||
|
> #### ✅ You are also allowed to add your username to the [`README.md`](./../README.md) translator list!
|
||||||
|
|
||||||
|
#### Step 4: Uploading
|
||||||
|
1. When adding a new language, please mention @DJj123dj. He will add the code required for the language to work.
|
||||||
|
2. There are currently 3 ways of uploading translations:
|
||||||
|
- Create a pull request to the [__`dev` branch!__](https://github.com/open-discord-bots/open-ticket/tree/dev)
|
||||||
|
- Create a ticket in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
- Send a DM to @DJj123dj on discord!
|
||||||
|
3. Now you'll need to wait until the next Open Ticket version for it to be added.
|
||||||
|
|
||||||
|
#### Step 5: Rewards
|
||||||
|
Translators get some rewards for translating Open Ticket!
|
||||||
|
- ✅ Credits in the [`README.md`](./../README.md) translator list!
|
||||||
|
- ✅ Credits in the changelog!
|
||||||
|
- ✅ Credits in the documentation!
|
||||||
|
- ✅ Credits in the translation JSON file!
|
||||||
|
- ✅ A special role in our [Discord server](https://discord.dj-dj.be)!
|
||||||
|
|
||||||
|
### 🧩 Plugins
|
||||||
|
#### Step 1: Creating Plugins
|
||||||
|
The documentation for creating plugins will be ready soon!<br>
|
||||||
|
In the meantime, you can already look at existing plugins or try it at your own!
|
||||||
|
|
||||||
|
#### Step 2: Uploading Plugins
|
||||||
|
Create a pull request in the [**`open-discord-plugins`**](https://odplugins.dj-dj.be/) repository or contact DJj123dj in our [Discord server](https://discord.dj-dj.be)!
|
||||||
|
|
||||||
|
### 📦 Features
|
||||||
|
Feature requests are required to be made in one of the following ways:
|
||||||
|
- ✅ In our [Discord server](https://discord.dj-dj.be)
|
||||||
|
- ✅ Create an issue on GitHub
|
||||||
|
- ✅ Message DJj123dj in DM on Discord
|
||||||
|
- ✅ Email to support@dj-dj.be
|
||||||
|
|
||||||
|
> **We won't accept pull requests for features. Only for bugs, small fixes, translation and plugins!**
|
||||||
|
|
||||||
|
### 🕷️ Bug Fixes
|
||||||
|
You are able to report bugs in one of the following ways:
|
||||||
|
- ✅ In our [Discord server](https://discord.dj-dj.be)
|
||||||
|
- ✅ Create an issue on GitHub
|
||||||
|
- ✅ Message DJj123dj in DM on Discord
|
||||||
|
- ✅ Email to support@dj-dj.be
|
||||||
|
|
||||||
|
📌 **If you want, you can also create a pull request to fix the bug yourself :)**
|
||||||
|
|
||||||
|
#### 🔴 Security Vulnerabilities
|
||||||
|
If you've found a bug which could affect the **SECURITY OF THE BOT** or may be potentially dangerous to the users of the bot,
|
||||||
|
you are **REQUIRED to send the bug privately via one of the following methods:**
|
||||||
|
- 🔴 Message DJj123dj in DM on Discord
|
||||||
|
- 🔴 Email to support@dj-dj.be
|
||||||
|
|
||||||
|
> ### Please try to always include the `otdebug.txt` file!
|
||||||
|
|
||||||
|
---
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
|
||||||
|
|
||||||
|
**Contributing Guidelines**<br>
|
||||||
|
[Changelog](https://otgithub.dj-dj.be/releases) - [Documentation](https://otdocs.dj-dj.be) - [Website](https://openticket.dj-dj.be) - [Support Server](https://discord.dj-dj.be) - [License](./LICENSE.md)<br>
|
||||||
|
|
||||||
|
© 2021 - 2026 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
{
|
||||||
|
"_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
|
After Width: | Height: | Size: 2.4 MiB |
@@ -0,0 +1 @@
|
|||||||
|
github: DJj123dj
|
||||||
@@ -1,37 +1,30 @@
|
|||||||
---
|
---
|
||||||
name: Bug report
|
name: Bug Report
|
||||||
about: Create a report to help us improve Open Ticket
|
about: Report bugs to help us improve Open Ticket!
|
||||||
title: "[BUG] your bug"
|
title: "Your Bug Name"
|
||||||
labels: bug
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Describe the bug**
|
### Bug Description:
|
||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
**To Reproduce**
|
### Steps To Reproduce:
|
||||||
Steps to reproduce the behavior:
|
Steps to reproduce the behavior:
|
||||||
1. Go to '...'
|
1. Go to '...'
|
||||||
2. Click on '....'
|
2. Click on '....'
|
||||||
3. Scroll down to '....'
|
3. Scroll down to '....'
|
||||||
4. See error
|
4. See error
|
||||||
|
|
||||||
**Expected behavior**
|
> Leave empty when you are unable to reproduce the bug!
|
||||||
|
|
||||||
|
### Expected Behaviour:
|
||||||
A clear and concise description of what you expected to happen.
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
**Screenshots**
|
### Screenshots:
|
||||||
If applicable, add screenshots to help explain your problem.
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**Device:**
|
### Files:
|
||||||
- Device: [e.g. Macbook pro, raspberry pi, HP Probook]
|
Please include the `otdebug.txt` file in your report! With this file, we can take a deep-dive in to the error that happend.
|
||||||
- OS: [e.g. MacOS, Ubuntu, Windows,...]
|
> This file doesn't contain any credentials or sensitive information!
|
||||||
- Node.js version:
|
|
||||||
- Open Ticket Version:
|
|
||||||
|
|
||||||
**Files:**
|
### Additional Notes:
|
||||||
Please include the `openticketdebug.txt` file in your report!
|
Add any other context about the problem here.
|
||||||
This is a file that we can see what happend!
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
name: Documentation
|
||||||
|
about: Do you know anything to be improved in the Open Ticket documentation?
|
||||||
|
title: "Documentation Improvement Name"
|
||||||
|
labels: "Documentation"
|
||||||
|
---
|
||||||
|
|
||||||
|
### Related Docs/Systems:
|
||||||
|
Choose related systems/docs for this improvement/change:
|
||||||
|
- [ ] Guides
|
||||||
|
- [ ] Developer Guides
|
||||||
|
- [ ] API Reference
|
||||||
|
- [ ] Blog
|
||||||
|
- [ ] System (Docusaurus & Javascript)
|
||||||
|
- [ ] Assets (images)
|
||||||
|
- [ ] Other
|
||||||
|
|
||||||
|
### Improvement Description:
|
||||||
|
A clear and concise description of the improvement.
|
||||||
|
|
||||||
|
> Please explain it as detailed as possible!
|
||||||
|
|
||||||
|
### Screenshots:
|
||||||
|
If applicable, add screenshots to help explain your request.
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
Add any other context about the request here.
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
name: Feature Request
|
||||||
|
about: Do you have a great idea for Open Ticket? Let us know using this issue!
|
||||||
|
title: "Your Feature Name"
|
||||||
|
labels: "Concept"
|
||||||
|
---
|
||||||
|
|
||||||
|
### Feature Description:
|
||||||
|
A clear and concise description of what the feature is.
|
||||||
|
|
||||||
|
### Affected Systems
|
||||||
|
Systems which are affected, improved or modified:
|
||||||
|
- (example) Slash command registration...
|
||||||
|
- (example) API embed builders...
|
||||||
|
- Scroll down to '....'
|
||||||
|
- See error
|
||||||
|
|
||||||
|
> Leave empty when you don't know which parts this feature affects!
|
||||||
|
|
||||||
|
### Advantages & Use Cases:
|
||||||
|
What advantages & use cases do you think this feature would result in?
|
||||||
|
|
||||||
|
### Screenshots:
|
||||||
|
If applicable, add screenshots to help explain your feature request.
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
Add any other context about the request here.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: HTML Transcripts
|
||||||
|
about: Found a bug related to the HTML Transcripts? Or do you have a feature request?
|
||||||
|
title: "Your Bug/Improvement Name"
|
||||||
|
labels: "HTML Transcripts"
|
||||||
|
---
|
||||||
|
|
||||||
|
### Feature/Bug Description:
|
||||||
|
A clear and concise description of what the feature/bug report is.
|
||||||
|
|
||||||
|
### Screenshots:
|
||||||
|
If applicable, add screenshots to help explain your feature request or bug report.
|
||||||
|
|
||||||
|
### Files:
|
||||||
|
Please include the `otdebug.txt` file in your report! With this file, we can take a deep-dive in to the error that happend.
|
||||||
|
> #### Include this file for bug reports!
|
||||||
|
> This file doesn't contain any credentials or sensitive information!
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
Add any other context about the problem here.
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
name: New Language
|
||||||
|
about: Do you want to add a new language to Open Ticket?
|
||||||
|
title: "Language Name"
|
||||||
|
labels: "New Translation"
|
||||||
|
---
|
||||||
|
|
||||||
|
### Language Name
|
||||||
|
The name of the new language.
|
||||||
|
|
||||||
|
### Language Description/Details:
|
||||||
|
A clear and concise description of the translation/language.
|
||||||
|
|
||||||
|
### Checklist
|
||||||
|
Before the language is fully implemented, the following checklist must be met:
|
||||||
|
- [ ] **📌 Created a language file in the `./languages/` directory.**
|
||||||
|
- [ ] **📌 The translation file uses the `<lowercase-language-name>.json` format.**
|
||||||
|
- [ ] **📌 The `"_TRANSLATION"` metadata in the language file is correctly configured.**
|
||||||
|
- [ ] The `"otversion"` is correct.
|
||||||
|
- [ ] The `"translators"` list is up to date has the discord/github usernames from all translators.
|
||||||
|
- [ ] The `"lastedited"` variable is the last edited date in the following format: `DD/MM/YYYY`.
|
||||||
|
- [ ] The `"language"` variable is the name of the language in English.
|
||||||
|
- [ ] `"automated"` is enabled when `Google Translate`, `DeepL`, `ChatGPT` or any other kind of translation tools were used.
|
||||||
|
- [ ] **📌 The language has been added to the `README.md` list.**
|
||||||
|
- [ ] **📌 The language counters have been updated in the `README.md`.**
|
||||||
|
- [ ] **📌 The language has been added to the list in the `ODLanguageManagerIds_Default` interface in (`./src/core/api/defaults/language.ts`).**
|
||||||
|
- [ ] **📌 The language has been added to the list in `./src/data/languageLoader.ts`.**
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
Add any other context about the problem here.
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
---
|
|
||||||
name: Plugin
|
|
||||||
about: Show your open ticket plugins here!
|
|
||||||
title: "[PLUGIN] your plugin"
|
|
||||||
labels: plugin
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Plugin Name:**
|
|
||||||
What's the name of your plugin?
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Tell a little bit about what the plugin does!
|
|
||||||
Also tell how to use the plugin, like if there is additional setup needed!
|
|
||||||
|
|
||||||
**NPM libraries:**
|
|
||||||
List all the libraries needed for this plugin to work!
|
|
||||||
*The default open ticket libraries are not required!*
|
|
||||||
|
|
||||||
**Author:**
|
|
||||||
- github account [e.g. DJj123dj]
|
|
||||||
- discord account [e.g. Wumpus#1234]
|
|
||||||
|
|
||||||
**Compatible versions:**
|
|
||||||
[e.g. from v2.2.1 until v3.0.1]
|
|
||||||
|
|
||||||
**File:**
|
|
||||||
Please attach the plugin file to this issue!
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Plugin Request
|
||||||
|
about: Do you have an idea for an Open Ticket plugin?
|
||||||
|
title: "Your Plugin Name"
|
||||||
|
labels: "Plugin"
|
||||||
|
---
|
||||||
|
|
||||||
|
### Plugin Description:
|
||||||
|
A clear and concise description of what the plugin is & does.
|
||||||
|
|
||||||
|
> Please explain the plugin as detailed as possible!
|
||||||
|
|
||||||
|
### Advantages & Use Cases:
|
||||||
|
What advantages & use cases do you think this plugin would result in?
|
||||||
|
|
||||||
|
### Screenshots:
|
||||||
|
If applicable, add screenshots to help explain your plugin request.
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
Add any other context about the request here.
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
name: Question
|
||||||
|
about: Do you have a question about Open Ticket?
|
||||||
|
title: "My Question"
|
||||||
|
labels: "Question"
|
||||||
|
---
|
||||||
|
|
||||||
|
### Question:
|
||||||
|
A clear and concise description of the question.
|
||||||
|
|
||||||
|
> Please explain the question as detailed as possible!
|
||||||
|
|
||||||
|
### Screenshots:
|
||||||
|
If applicable, add screenshots to help explain your plugin request.
|
||||||
|
|
||||||
|
### Checklist:
|
||||||
|
Before creating this question, the following checklist must be met:
|
||||||
|
- [ ] **📌 I've read the docs (https://otdocs.dj-dj.be) and I didn't found the solution.**
|
||||||
|
- [ ] **📌 I've asked other people & they didn't know the solution.**
|
||||||
|
- [ ] **📌 The question is not related to the following subjects: (If so, ask it in our discord server: https://discord.dj-dj.be)**
|
||||||
|
- Configuring the bot
|
||||||
|
- Hosting the bot (24/7)
|
||||||
|
- Updating the bot
|
||||||
|
- [ ] **📌 I know that this issue is publicly visible for everyone and I haven't shared any private info.**
|
||||||
|
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
Add any other context about the request here.
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
name: Updated Language
|
||||||
|
about: Do you want to update/improve an existing language in Open Ticket?
|
||||||
|
title: "Language Name"
|
||||||
|
labels: "Updated Translation"
|
||||||
|
---
|
||||||
|
|
||||||
|
### Language Name
|
||||||
|
The name of the existing language.
|
||||||
|
|
||||||
|
### Language Description/Details:
|
||||||
|
A clear and concise description of the translation/language changes.
|
||||||
|
|
||||||
|
### Checklist
|
||||||
|
Before the language is updated, the following checklist must be met:
|
||||||
|
- [ ] **📌 The `"_TRANSLATION"` metadata in the language file is correctly configured.**
|
||||||
|
- [ ] The `"otversion"` is correct.
|
||||||
|
- [ ] The `"translators"` list is up to date has the discord/github usernames from all translators.
|
||||||
|
- [ ] The `"lastedited"` variable is the last edited date in the following format: `DD/MM/YYYY`.
|
||||||
|
- [ ] The `"language"` variable is the name of the language in English.
|
||||||
|
- [ ] `"automated"` is enabled when `Google Translate`, `DeepL`, `ChatGPT` or any other kind of translation tools were used.
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
Add any other context about the problem here.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# Security Policy
|
||||||
|
<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.4) [](https://github.com/sponsors/DJj123dj)
|
||||||
|
|
||||||
|
This is the Security Policy of Open Ticket!<br>
|
||||||
|
Here you can find a list of all supported & deprecated versions of the bot.<br>
|
||||||
|
You will also find some guidelines about how to report vulnerabilities, bugs & errors.
|
||||||
|
|
||||||
|
### 📦 Supported Versions
|
||||||
|
Below, you can find a list with the status of every Open Ticket version.<br>
|
||||||
|
This list will be updated on every release.
|
||||||
|
|
||||||
|
- 🟦 In Development **(ideas, bugs, support, html transcripts)**
|
||||||
|
- ✅ Supported **(features, bugs, support, docs, html transcripts)**
|
||||||
|
- 🚧 Maintenance **(support, docs, html transcripts)**
|
||||||
|
- 🟧 Deprecated **(docs only)**
|
||||||
|
- ❌ Fully Deprecated
|
||||||
|
|
||||||
|
| Version | Supported | Notes |
|
||||||
|
|------------|-----------|---------------------------------------------------------------|
|
||||||
|
| 4.2.x | 🟦 | In Development |
|
||||||
|
| 4.2.1 | 🟦 | In Development |
|
||||||
|
| 4.2.0 | ✅ | |
|
||||||
|
| 4.1.3 | ✅ | (LTS) Long-Term-Support, Until September 2026 |
|
||||||
|
| 4.1.2 | 🚧 | |
|
||||||
|
| 4.1.1 | 🚧 | |
|
||||||
|
| 4.1.0 | 🚧 | |
|
||||||
|
| 4.0.7 | 🟧 | Deprecated |
|
||||||
|
| < 4.0.7 | ❌ | |
|
||||||
|
|
||||||
|
### 🕷️ Reporting Vulnerabilities
|
||||||
|
You can report vulnerabilities, errors & bugs using one of the following methods:
|
||||||
|
- Create an issue on GitHub!
|
||||||
|
- Create a ticket in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
- Message @DJj123dj in DM on discord!
|
||||||
|
- Send an E-mail to [support@dj-dj.be](mailto:support@dj-dj.be)!
|
||||||
|
|
||||||
|
When you report a problem, please **give a small description** about what & how it happend.<br>
|
||||||
|
Try to explain the issue in as much detail as possible.
|
||||||
|
|
||||||
|
If possible, try to provide screenshots!
|
||||||
|
|
||||||
|
### Please upload the `otdebug.txt` file together with your bug report!
|
||||||
|
|
||||||
|
---
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
|
||||||
|
|
||||||
|
**Security Policy**<br>
|
||||||
|
[Changelog](https://otgithub.dj-dj.be/releases) - [Documentation](https://otdocs.dj-dj.be) - [Website](https://openticket.dj-dj.be) - [Support Server](https://discord.dj-dj.be) - [License](./LICENSE.md)<br>
|
||||||
|
|
||||||
|
© 2021 - 2026 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
{
|
||||||
|
"_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
|
After Width: | Height: | Size: 124 KiB |
@@ -0,0 +1,53 @@
|
|||||||
|
# Pterodactyl Eggs
|
||||||
|
<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.2.0)
|
||||||
|
[](https://github.com/sponsors/DJj123dj)
|
||||||
|
[](.eggs/README.md)
|
||||||
|
|
||||||
|
|
||||||
|
Hi there! Open Ticket provides **official eggs** for the Pterodactyl & Pelican panels!<br>
|
||||||
|
There are different eggs for different versions of Open Ticket.
|
||||||
|
Please choose the one that fits your needs the most.
|
||||||
|
|
||||||
|
If you encounter any issues while installing these eggs, please head to our [**discord server**](https://discord.dj-dj.be) for further assistance!
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
It's recommended to provide at least `1GB` of **Memory/RAM** and `5GB` of **disk space** for Open Ticket to work correctly.
|
||||||
|
|
||||||
|
### Egg Variants
|
||||||
|
[**`openticket-egg-main.json` (Recommended)**](openticket-egg-main.json)
|
||||||
|
- This egg will use the `main` branch of Open Ticket.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.2.0.json`**](openticket-egg-v4.2.0.json)
|
||||||
|
- This egg will always use Open Ticket `v4.2.0`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.1.3.json`**](openticket-egg-v4.1.3.json)
|
||||||
|
- This egg will always use Open Ticket `v4.1.3`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.1.2.json`**](openticket-egg-v4.1.2.json)
|
||||||
|
- This egg will always use Open Ticket `v4.1.2`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.1.1.json`**](openticket-egg-v4.1.1.json)
|
||||||
|
- This egg will always use Open Ticket `v4.1.1`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.1.0.json`**](openticket-egg-v4.1.0.json)
|
||||||
|
- This egg will always use Open Ticket `v4.1.0`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.0.7.json`**](openticket-egg-v4.0.7.json)
|
||||||
|
- This egg will always use Open Ticket `v4.0.7`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v3.5.9.json`**](openticket-egg-v3.5.9.json)
|
||||||
|
- This egg will always use Open Ticket `v3.5.9`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-dev.json` (Not Recommended)**](openticket-egg-dev.json)
|
||||||
|
- This egg will use the `dev` branch of Open Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
|
||||||
|
|
||||||
|
**Pterodactyl Eggs**<br>
|
||||||
|
[Changelog](https://otgithub.dj-dj.be/releases) - [Documentation](https://otdocs.dj-dj.be) - [Website](https://openticket.dj-dj.be) - [Support Server](https://discord.dj-dj.be) - [License](./LICENSE.md)<br>
|
||||||
|
|
||||||
|
© 2021 - 2026 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
|
||||||
@@ -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:21+01:00",
|
||||||
|
"name": "Open Ticket (Experimental)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the experimental Pterodactyl egg for Open Ticket, the most advanced & customisable discord ticket bot that you will ever find! DO NOT USE IN PRODUCTION!",
|
||||||
|
"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 (dev)\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=\"dev\"\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:20+01:00",
|
||||||
|
"name": "Open Ticket (Latest)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket, 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 (main)\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=\"main\"\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: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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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.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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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.1.0)",
|
||||||
|
"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!",
|
||||||
|
"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.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",
|
||||||
|
"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.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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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.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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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.1.3)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.1.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.1.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.1.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.2.0)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.2.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!",
|
||||||
|
"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.2.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.2.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",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+23
-17
@@ -1,20 +1,26 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
package-lock.json
|
package-lock.json
|
||||||
devConfig.json
|
|
||||||
devConfig1.json
|
|
||||||
devConfig2.json
|
|
||||||
devConfig3.json
|
|
||||||
devConfig4.json
|
|
||||||
devConfig5.json
|
|
||||||
.DS_Store
|
|
||||||
openticketdebug.txt
|
|
||||||
developerChangelog.md
|
|
||||||
storage/dynamicDB/
|
|
||||||
storage/slashcmdEnabled.txt
|
|
||||||
storage/database.json
|
|
||||||
storage/tsdatabase.json
|
|
||||||
storage/.DS_Store
|
|
||||||
.vscode/
|
.vscode/
|
||||||
livestatus.json
|
|
||||||
test.js
|
devconfig/
|
||||||
testtsconfig.json
|
devdatabase/
|
||||||
|
plugins/*
|
||||||
|
!plugins/example-plugin/
|
||||||
|
database/openticket.sqlite
|
||||||
|
dist/
|
||||||
|
|
||||||
|
otdebug.txt
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
*/.DS_Store
|
||||||
|
*/*/.DS_Store
|
||||||
|
*/*/*/.DS_Store
|
||||||
|
**/.DS_Store
|
||||||
|
|
||||||
|
.backup/*
|
||||||
|
.tools/*
|
||||||
|
!.tools/createSponsors.ts
|
||||||
|
!.tools/createContributors.ts
|
||||||
|
!.tools/mergeTranslations.ts
|
||||||
|
!.tools/docker-compose.yml
|
||||||
|
!.tools/build-docker.sh
|
||||||
Executable
+37
@@ -0,0 +1,37 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# build.sh — Build Open Ticket Docker images for all supported architectures.
|
||||||
|
#
|
||||||
|
# Usage: ./build.sh <image> [--no-push]
|
||||||
|
# image Full image name, e.g. djj123dj/open-ticket
|
||||||
|
#
|
||||||
|
# Example: ./build.sh djj123dj/open-ticket --no-push
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
echo "✅ Switched working directory to Open Ticket root"
|
||||||
|
pwd
|
||||||
|
|
||||||
|
IMAGE="${1:?Usage: ./build-docker.sh <image> [--no-push]}"
|
||||||
|
PLATFORMS="linux/amd64,linux/arm64" # linux/arm/v6,linux/arm/v7,linux/s390x are taking too long to build, so we'll skip them for now
|
||||||
|
VERSION=$(node -p "require('./package.json').version")
|
||||||
|
|
||||||
|
# Create a multi-arch builder if it doesn't exist yet
|
||||||
|
docker buildx inspect ot-builder &>/dev/null \
|
||||||
|
|| docker buildx create --name ot-builder --driver docker-container --bootstrap --use
|
||||||
|
docker buildx use ot-builder
|
||||||
|
|
||||||
|
PUSH_FLAG="--push"
|
||||||
|
[[ "${2:-}" == "--no-push" ]] && PUSH_FLAG=""
|
||||||
|
|
||||||
|
docker buildx build \
|
||||||
|
--platform "$PLATFORMS" \
|
||||||
|
--tag "${IMAGE}:v${VERSION}" \
|
||||||
|
--tag "${IMAGE}:latest" \
|
||||||
|
--load \
|
||||||
|
$PUSH_FLAG \
|
||||||
|
.
|
||||||
|
|
||||||
|
[[ -n "$PUSH_FLAG" ]] \
|
||||||
|
&& echo "✅ Pushed ${IMAGE}:v${VERSION} and ${IMAGE}:latest" \
|
||||||
|
|| echo "✅ Built ${IMAGE}:v${VERSION} (not pushed)"
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
/// <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()
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
/// <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()
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Docker Compose for Open Ticket
|
||||||
|
services:
|
||||||
|
openticket:
|
||||||
|
image: djj123dj/open-ticket:latest
|
||||||
|
volumes:
|
||||||
|
- config:/home/container/config
|
||||||
|
- database:/home/container/database
|
||||||
|
- plugins:/home/container/plugins
|
||||||
|
restart: unless-stopped
|
||||||
|
container_name: open-ticket
|
||||||
|
volumes:
|
||||||
|
config:
|
||||||
|
database:
|
||||||
|
plugins:
|
||||||
@@ -0,0 +1,671 @@
|
|||||||
|
/// <reference types="node"/>
|
||||||
|
import fjs from "formatted-json-stringify"
|
||||||
|
import fs from "fs"
|
||||||
|
|
||||||
|
const formatter = new fjs.ObjectFormatter(null,true,[
|
||||||
|
new fjs.ObjectFormatter("_TRANSLATION",true,[
|
||||||
|
new fjs.PropertyFormatter("otversion"),
|
||||||
|
new fjs.ArrayFormatter("translators",false,new fjs.PropertyFormatter(null)),
|
||||||
|
new fjs.PropertyFormatter("lastedited"),
|
||||||
|
new fjs.PropertyFormatter("language"),
|
||||||
|
new fjs.PropertyFormatter("automated"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("checker",true,[
|
||||||
|
new fjs.ObjectFormatter("system",true,[
|
||||||
|
new fjs.PropertyFormatter("typeError"),
|
||||||
|
new fjs.PropertyFormatter("headerOpenTicket"),
|
||||||
|
new fjs.PropertyFormatter("typeWarning"),
|
||||||
|
new fjs.PropertyFormatter("typeInfo"),
|
||||||
|
new fjs.PropertyFormatter("headerConfigChecker"),
|
||||||
|
new fjs.PropertyFormatter("headerDescription"),
|
||||||
|
new fjs.PropertyFormatter("footerError"),
|
||||||
|
new fjs.PropertyFormatter("footerWarning"),
|
||||||
|
new fjs.PropertyFormatter("footerSupport"),
|
||||||
|
new fjs.PropertyFormatter("compactInformation"),
|
||||||
|
new fjs.PropertyFormatter("dataPath"),
|
||||||
|
new fjs.PropertyFormatter("dataDocs"),
|
||||||
|
new fjs.PropertyFormatter("dataMessages"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("messages",true,[
|
||||||
|
new fjs.PropertyFormatter("stringTooShort"),
|
||||||
|
new fjs.PropertyFormatter("stringTooLong"),
|
||||||
|
new fjs.PropertyFormatter("stringLengthInvalid"),
|
||||||
|
new fjs.PropertyFormatter("stringStartsWith"),
|
||||||
|
new fjs.PropertyFormatter("stringEndsWith"),
|
||||||
|
new fjs.PropertyFormatter("stringContains"),
|
||||||
|
new fjs.PropertyFormatter("stringChoices"),
|
||||||
|
new fjs.PropertyFormatter("stringRegex"),
|
||||||
|
|
||||||
|
new fjs.PropertyFormatter("stringInvertedContains"),
|
||||||
|
new fjs.PropertyFormatter("stringLowercase"),
|
||||||
|
new fjs.PropertyFormatter("stringUppercase"),
|
||||||
|
new fjs.PropertyFormatter("stringSpecialCharacters"),
|
||||||
|
new fjs.PropertyFormatter("stringNoSpaces"),
|
||||||
|
new fjs.PropertyFormatter("stringCapitalWord"),
|
||||||
|
new fjs.PropertyFormatter("stringCapitalSentence"),
|
||||||
|
new fjs.PropertyFormatter("stringPunctuation"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("numberTooShort"),
|
||||||
|
new fjs.PropertyFormatter("numberTooLong"),
|
||||||
|
new fjs.PropertyFormatter("numberLengthInvalid"),
|
||||||
|
new fjs.PropertyFormatter("numberTooSmall"),
|
||||||
|
new fjs.PropertyFormatter("numberTooLarge"),
|
||||||
|
new fjs.PropertyFormatter("numberNotEqual"),
|
||||||
|
new fjs.PropertyFormatter("numberStep"),
|
||||||
|
new fjs.PropertyFormatter("numberStepOffset"),
|
||||||
|
new fjs.PropertyFormatter("numberStartsWith"),
|
||||||
|
new fjs.PropertyFormatter("numberEndsWith"),
|
||||||
|
new fjs.PropertyFormatter("numberContains"),
|
||||||
|
new fjs.PropertyFormatter("numberChoices"),
|
||||||
|
new fjs.PropertyFormatter("numberFloat"),
|
||||||
|
new fjs.PropertyFormatter("numberNegative"),
|
||||||
|
new fjs.PropertyFormatter("numberPositive"),
|
||||||
|
new fjs.PropertyFormatter("numberZero"),
|
||||||
|
new fjs.PropertyFormatter("numberNan"),
|
||||||
|
new fjs.PropertyFormatter("numberInvertedContains"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("booleanTrue"),
|
||||||
|
new fjs.PropertyFormatter("booleanFalse"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("arrayEmptyDisabled"),
|
||||||
|
new fjs.PropertyFormatter("arrayEmptyRequired"),
|
||||||
|
new fjs.PropertyFormatter("arrayTooShort"),
|
||||||
|
new fjs.PropertyFormatter("arrayTooLong"),
|
||||||
|
new fjs.PropertyFormatter("arrayLengthInvalid"),
|
||||||
|
new fjs.PropertyFormatter("arrayInvalidTypes"),
|
||||||
|
new fjs.PropertyFormatter("arrayDouble"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("discordInvalidId"),
|
||||||
|
new fjs.PropertyFormatter("discordInvalidIdOptions"),
|
||||||
|
new fjs.PropertyFormatter("discordInvalidToken"),
|
||||||
|
new fjs.PropertyFormatter("colorInvalid"),
|
||||||
|
new fjs.PropertyFormatter("emojiTooShort"),
|
||||||
|
new fjs.PropertyFormatter("emojiTooLong"),
|
||||||
|
new fjs.PropertyFormatter("emojiCustom"),
|
||||||
|
new fjs.PropertyFormatter("emojiInvalid"),
|
||||||
|
new fjs.PropertyFormatter("urlInvalid"),
|
||||||
|
new fjs.PropertyFormatter("urlInvalidHttp"),
|
||||||
|
new fjs.PropertyFormatter("urlInvalidProtocol"),
|
||||||
|
new fjs.PropertyFormatter("urlInvalidHostname"),
|
||||||
|
new fjs.PropertyFormatter("urlInvalidExtension"),
|
||||||
|
new fjs.PropertyFormatter("urlInvalidPath"),
|
||||||
|
new fjs.PropertyFormatter("idNotUnique"),
|
||||||
|
new fjs.PropertyFormatter("idNonExistent"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("invalidType"),
|
||||||
|
new fjs.PropertyFormatter("propertyMissing"),
|
||||||
|
new fjs.PropertyFormatter("propertyOptional"),
|
||||||
|
new fjs.PropertyFormatter("objectDisabled"),
|
||||||
|
new fjs.PropertyFormatter("nullInvalid"),
|
||||||
|
new fjs.PropertyFormatter("switchInvalidType"),
|
||||||
|
new fjs.PropertyFormatter("objectSwitchInvalid"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("invalidLanguage"),
|
||||||
|
new fjs.PropertyFormatter("invalidButton"),
|
||||||
|
new fjs.PropertyFormatter("unusedOption"),
|
||||||
|
new fjs.PropertyFormatter("unusedQuestion"),
|
||||||
|
new fjs.PropertyFormatter("dropdownOption"),
|
||||||
|
new fjs.PropertyFormatter("customInvalidVersion"),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("actions",true,[
|
||||||
|
new fjs.ObjectFormatter("buttons",true,[
|
||||||
|
new fjs.PropertyFormatter("create"),
|
||||||
|
new fjs.PropertyFormatter("close"),
|
||||||
|
new fjs.PropertyFormatter("delete"),
|
||||||
|
new fjs.PropertyFormatter("reopen"),
|
||||||
|
new fjs.PropertyFormatter("claim"),
|
||||||
|
new fjs.PropertyFormatter("unclaim"),
|
||||||
|
new fjs.PropertyFormatter("pin"),
|
||||||
|
new fjs.PropertyFormatter("unpin"),
|
||||||
|
new fjs.PropertyFormatter("clear"),
|
||||||
|
new fjs.PropertyFormatter("helpSwitchSlash"),
|
||||||
|
new fjs.PropertyFormatter("helpSwitchText"),
|
||||||
|
new fjs.PropertyFormatter("helpPage"),
|
||||||
|
new fjs.PropertyFormatter("withReason"),
|
||||||
|
new fjs.PropertyFormatter("withoutTranscript"),
|
||||||
|
new fjs.PropertyFormatter("blacklistAdd"),
|
||||||
|
new fjs.PropertyFormatter("blacklistRemove"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("titles",true,[
|
||||||
|
new fjs.PropertyFormatter("created"),
|
||||||
|
new fjs.PropertyFormatter("close"),
|
||||||
|
new fjs.PropertyFormatter("delete"),
|
||||||
|
new fjs.PropertyFormatter("reopen"),
|
||||||
|
new fjs.PropertyFormatter("claim"),
|
||||||
|
new fjs.PropertyFormatter("unclaim"),
|
||||||
|
new fjs.PropertyFormatter("pin"),
|
||||||
|
new fjs.PropertyFormatter("unpin"),
|
||||||
|
new fjs.PropertyFormatter("rename"),
|
||||||
|
new fjs.PropertyFormatter("move"),
|
||||||
|
new fjs.PropertyFormatter("add"),
|
||||||
|
new fjs.PropertyFormatter("remove"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("help"),
|
||||||
|
new fjs.PropertyFormatter("statsReset"),
|
||||||
|
new fjs.PropertyFormatter("blacklistAdd"),
|
||||||
|
new fjs.PropertyFormatter("blacklistRemove"),
|
||||||
|
new fjs.PropertyFormatter("blacklistGet"),
|
||||||
|
new fjs.PropertyFormatter("blacklistView"),
|
||||||
|
new fjs.PropertyFormatter("blacklistAddDm"),
|
||||||
|
new fjs.PropertyFormatter("blacklistRemoveDm"),
|
||||||
|
new fjs.PropertyFormatter("clear"),
|
||||||
|
new fjs.PropertyFormatter("clearTickets"),
|
||||||
|
new fjs.PropertyFormatter("roles"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("autoclose"),
|
||||||
|
new fjs.PropertyFormatter("autocloseEnabled"),
|
||||||
|
new fjs.PropertyFormatter("autocloseDisabled"),
|
||||||
|
new fjs.PropertyFormatter("autodelete"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteEnabled"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteDisabled"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("topicSet"),
|
||||||
|
new fjs.PropertyFormatter("prioritySet"),
|
||||||
|
new fjs.PropertyFormatter("priorityGet"),
|
||||||
|
new fjs.PropertyFormatter("transfer"),
|
||||||
|
new fjs.PropertyFormatter("transcripts"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("descriptions",true,[
|
||||||
|
new fjs.PropertyFormatter("create"),
|
||||||
|
new fjs.PropertyFormatter("close"),
|
||||||
|
new fjs.PropertyFormatter("delete"),
|
||||||
|
new fjs.PropertyFormatter("reopen"),
|
||||||
|
new fjs.PropertyFormatter("claim"),
|
||||||
|
new fjs.PropertyFormatter("unclaim"),
|
||||||
|
new fjs.PropertyFormatter("pin"),
|
||||||
|
new fjs.PropertyFormatter("unpin"),
|
||||||
|
new fjs.PropertyFormatter("rename"),
|
||||||
|
new fjs.PropertyFormatter("move"),
|
||||||
|
new fjs.PropertyFormatter("add"),
|
||||||
|
new fjs.PropertyFormatter("remove"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("helpExplanation"),
|
||||||
|
new fjs.PropertyFormatter("statsReset"),
|
||||||
|
new fjs.PropertyFormatter("statsError"),
|
||||||
|
new fjs.PropertyFormatter("blacklistAdd"),
|
||||||
|
new fjs.PropertyFormatter("blacklistRemove"),
|
||||||
|
new fjs.PropertyFormatter("blacklistGetSuccess"),
|
||||||
|
new fjs.PropertyFormatter("blacklistGetEmpty"),
|
||||||
|
new fjs.PropertyFormatter("blacklistViewEmpty"),
|
||||||
|
new fjs.PropertyFormatter("blacklistViewTip"),
|
||||||
|
new fjs.PropertyFormatter("clearVerify"),
|
||||||
|
new fjs.PropertyFormatter("clearReady"),
|
||||||
|
new fjs.PropertyFormatter("rolesEmpty"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("autocloseLeave"),
|
||||||
|
new fjs.PropertyFormatter("autocloseTimeout"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteLeave"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteTimeout"),
|
||||||
|
new fjs.PropertyFormatter("autocloseEnabled"),
|
||||||
|
new fjs.PropertyFormatter("autocloseDisabled"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteEnabled"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteDisabled"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("ticketMessageLimit"),
|
||||||
|
new fjs.PropertyFormatter("ticketMessageAutoclose"),
|
||||||
|
new fjs.PropertyFormatter("ticketMessageAutodelete"),
|
||||||
|
new fjs.PropertyFormatter("panelReady"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("topicSet"),
|
||||||
|
new fjs.PropertyFormatter("prioritySet"),
|
||||||
|
new fjs.PropertyFormatter("priorityGet"),
|
||||||
|
new fjs.PropertyFormatter("transfer"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("modal",true,[
|
||||||
|
new fjs.PropertyFormatter("closePlaceholder"),
|
||||||
|
new fjs.PropertyFormatter("deletePlaceholder"),
|
||||||
|
new fjs.PropertyFormatter("reopenPlaceholder"),
|
||||||
|
new fjs.PropertyFormatter("claimPlaceholder"),
|
||||||
|
new fjs.PropertyFormatter("unclaimPlaceholder"),
|
||||||
|
new fjs.PropertyFormatter("pinPlaceholder"),
|
||||||
|
new fjs.PropertyFormatter("unpinPlaceholder"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("logs",true,[
|
||||||
|
new fjs.PropertyFormatter("createLog"),
|
||||||
|
new fjs.PropertyFormatter("closeLog"),
|
||||||
|
new fjs.PropertyFormatter("closeDm"),
|
||||||
|
new fjs.PropertyFormatter("deleteLog"),
|
||||||
|
new fjs.PropertyFormatter("deleteDm"),
|
||||||
|
new fjs.PropertyFormatter("reopenLog"),
|
||||||
|
new fjs.PropertyFormatter("reopenDm"),
|
||||||
|
new fjs.PropertyFormatter("claimLog"),
|
||||||
|
new fjs.PropertyFormatter("claimDm"),
|
||||||
|
new fjs.PropertyFormatter("unclaimLog"),
|
||||||
|
new fjs.PropertyFormatter("unclaimDm"),
|
||||||
|
new fjs.PropertyFormatter("pinLog"),
|
||||||
|
new fjs.PropertyFormatter("pinDm"),
|
||||||
|
new fjs.PropertyFormatter("unpinLog"),
|
||||||
|
new fjs.PropertyFormatter("unpinDm"),
|
||||||
|
new fjs.PropertyFormatter("renameLog"),
|
||||||
|
new fjs.PropertyFormatter("renameDm"),
|
||||||
|
new fjs.PropertyFormatter("moveLog"),
|
||||||
|
new fjs.PropertyFormatter("moveDm"),
|
||||||
|
new fjs.PropertyFormatter("addLog"),
|
||||||
|
new fjs.PropertyFormatter("addDm"),
|
||||||
|
new fjs.PropertyFormatter("removeLog"),
|
||||||
|
new fjs.PropertyFormatter("removeDm"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("blacklistAddLog"),
|
||||||
|
new fjs.PropertyFormatter("blacklistRemoveLog"),
|
||||||
|
new fjs.PropertyFormatter("blacklistAddDm"),
|
||||||
|
new fjs.PropertyFormatter("blacklistRemoveDm"),
|
||||||
|
new fjs.PropertyFormatter("clearLog"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("transferLog"),
|
||||||
|
new fjs.PropertyFormatter("transferDm"),
|
||||||
|
new fjs.PropertyFormatter("prioritySetLog"),
|
||||||
|
new fjs.PropertyFormatter("prioritySetDm"),
|
||||||
|
new fjs.PropertyFormatter("roleUpdateLog"),
|
||||||
|
new fjs.PropertyFormatter("roleUpdateDm"),
|
||||||
|
new fjs.PropertyFormatter("topicSetLog"),
|
||||||
|
new fjs.PropertyFormatter("topicSetDm"),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("transcripts",true,[
|
||||||
|
new fjs.ObjectFormatter("success",true,[
|
||||||
|
new fjs.PropertyFormatter("visit"),
|
||||||
|
new fjs.PropertyFormatter("ready"),
|
||||||
|
new fjs.PropertyFormatter("textFileDescription"),
|
||||||
|
new fjs.PropertyFormatter("htmlProgress"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("createdChannel"),
|
||||||
|
new fjs.PropertyFormatter("createdCreator"),
|
||||||
|
new fjs.PropertyFormatter("createdParticipant"),
|
||||||
|
new fjs.PropertyFormatter("createdActiveAdmin"),
|
||||||
|
new fjs.PropertyFormatter("createdEveryAdmin"),
|
||||||
|
new fjs.PropertyFormatter("createdOther"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("errors",true,[
|
||||||
|
new fjs.PropertyFormatter("retry"),
|
||||||
|
new fjs.PropertyFormatter("continue"),
|
||||||
|
new fjs.PropertyFormatter("backup"),
|
||||||
|
new fjs.PropertyFormatter("error"),
|
||||||
|
new fjs.PropertyFormatter("title"),
|
||||||
|
new fjs.PropertyFormatter("noHistory"),
|
||||||
|
new fjs.PropertyFormatter("historyNotSupported"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("text",true,[
|
||||||
|
new fjs.PropertyFormatter("messagesTitle"),
|
||||||
|
new fjs.PropertyFormatter("embedTitle"),
|
||||||
|
new fjs.PropertyFormatter("fileTitle"),
|
||||||
|
new fjs.PropertyFormatter("fieldsTitle"),
|
||||||
|
new fjs.PropertyFormatter("reactionsTitle"),
|
||||||
|
new fjs.PropertyFormatter("statsTitle"),
|
||||||
|
new fjs.PropertyFormatter("emptyContent"),
|
||||||
|
new fjs.PropertyFormatter("noTitle"),
|
||||||
|
new fjs.PropertyFormatter("noDesc"),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("errors",true,[
|
||||||
|
new fjs.ObjectFormatter("titles",true,[
|
||||||
|
new fjs.PropertyFormatter("internalError"),
|
||||||
|
new fjs.PropertyFormatter("optionMissing"),
|
||||||
|
new fjs.PropertyFormatter("optionInvalid"),
|
||||||
|
new fjs.PropertyFormatter("unknownCommand"),
|
||||||
|
new fjs.PropertyFormatter("noPermissions"),
|
||||||
|
new fjs.PropertyFormatter("unknownTicket"),
|
||||||
|
new fjs.PropertyFormatter("deprecatedTicket"),
|
||||||
|
new fjs.PropertyFormatter("unknownOption"),
|
||||||
|
new fjs.PropertyFormatter("unknownPanel"),
|
||||||
|
new fjs.PropertyFormatter("notInGuild"),
|
||||||
|
new fjs.PropertyFormatter("channelRename"),
|
||||||
|
new fjs.PropertyFormatter("channelCategory"),
|
||||||
|
new fjs.PropertyFormatter("busy"),
|
||||||
|
new fjs.PropertyFormatter("permissionError"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("descriptions",true,[
|
||||||
|
new fjs.PropertyFormatter("askForInfo"),
|
||||||
|
new fjs.PropertyFormatter("askForInfoResolve"),
|
||||||
|
new fjs.PropertyFormatter("internalError"),
|
||||||
|
new fjs.PropertyFormatter("optionMissing"),
|
||||||
|
new fjs.PropertyFormatter("optionInvalid"),
|
||||||
|
new fjs.PropertyFormatter("optionInvalidChoose"),
|
||||||
|
new fjs.PropertyFormatter("unknownCommand"),
|
||||||
|
new fjs.PropertyFormatter("noPermissions"),
|
||||||
|
new fjs.PropertyFormatter("noPermissionsList"),
|
||||||
|
new fjs.PropertyFormatter("noPermissionsCooldown"),
|
||||||
|
new fjs.PropertyFormatter("noPermissionsBlacklist"),
|
||||||
|
new fjs.PropertyFormatter("noPermissionsLimitGlobal"),
|
||||||
|
new fjs.PropertyFormatter("noPermissionsLimitGlobalUser"),
|
||||||
|
new fjs.PropertyFormatter("noPermissionsLimitOption"),
|
||||||
|
new fjs.PropertyFormatter("noPermissionsLimitOptionUser"),
|
||||||
|
new fjs.PropertyFormatter("unknownTicket"),
|
||||||
|
new fjs.PropertyFormatter("deprecatedTicket"),
|
||||||
|
new fjs.PropertyFormatter("notInGuild"),
|
||||||
|
new fjs.PropertyFormatter("channelRename"),
|
||||||
|
new fjs.PropertyFormatter("channelCategory"),
|
||||||
|
new fjs.PropertyFormatter("channelRenameSource"),
|
||||||
|
new fjs.PropertyFormatter("busy"),
|
||||||
|
new fjs.PropertyFormatter("closeBeforeMessage"),
|
||||||
|
new fjs.PropertyFormatter("closeBeforeAdminMessage"),
|
||||||
|
new fjs.PropertyFormatter("unableToCreateTicket"),
|
||||||
|
new fjs.PropertyFormatter("messageMissing"),
|
||||||
|
new fjs.PropertyFormatter("stateExpired"),
|
||||||
|
new fjs.PropertyFormatter("panelStateExpired"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("optionInvalidReasons",true,[
|
||||||
|
new fjs.PropertyFormatter("stringRegex"),
|
||||||
|
new fjs.PropertyFormatter("stringMinLength"),
|
||||||
|
new fjs.PropertyFormatter("stringMaxLength"),
|
||||||
|
new fjs.PropertyFormatter("numberInvalid"),
|
||||||
|
new fjs.PropertyFormatter("numberMin"),
|
||||||
|
new fjs.PropertyFormatter("numberMax"),
|
||||||
|
new fjs.PropertyFormatter("numberDecimal"),
|
||||||
|
new fjs.PropertyFormatter("numberNegative"),
|
||||||
|
new fjs.PropertyFormatter("numberPositive"),
|
||||||
|
new fjs.PropertyFormatter("numberZero"),
|
||||||
|
new fjs.PropertyFormatter("channelNotFound"),
|
||||||
|
new fjs.PropertyFormatter("userNotFound"),
|
||||||
|
new fjs.PropertyFormatter("roleNotFound"),
|
||||||
|
new fjs.PropertyFormatter("memberNotFound"),
|
||||||
|
new fjs.PropertyFormatter("mentionableNotFound"),
|
||||||
|
new fjs.PropertyFormatter("channelType"),
|
||||||
|
new fjs.PropertyFormatter("notInGuild"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("permissions",true,[
|
||||||
|
new fjs.PropertyFormatter("developer"),
|
||||||
|
new fjs.PropertyFormatter("owner"),
|
||||||
|
new fjs.PropertyFormatter("admin"),
|
||||||
|
new fjs.PropertyFormatter("moderator"),
|
||||||
|
new fjs.PropertyFormatter("support"),
|
||||||
|
new fjs.PropertyFormatter("member"),
|
||||||
|
new fjs.PropertyFormatter("discord-administrator"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("actionInvalid",true,[
|
||||||
|
new fjs.PropertyFormatter("close"),
|
||||||
|
new fjs.PropertyFormatter("reopen"),
|
||||||
|
new fjs.PropertyFormatter("claim"),
|
||||||
|
new fjs.PropertyFormatter("unclaim"),
|
||||||
|
new fjs.PropertyFormatter("pin"),
|
||||||
|
new fjs.PropertyFormatter("unpin"),
|
||||||
|
new fjs.PropertyFormatter("add"),
|
||||||
|
new fjs.PropertyFormatter("remove"),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("params",true,[
|
||||||
|
new fjs.ObjectFormatter("uppercase",true,[
|
||||||
|
new fjs.PropertyFormatter("ticket"),
|
||||||
|
new fjs.PropertyFormatter("tickets"),
|
||||||
|
new fjs.PropertyFormatter("reason"),
|
||||||
|
new fjs.PropertyFormatter("creator"),
|
||||||
|
new fjs.PropertyFormatter("remaining"),
|
||||||
|
new fjs.PropertyFormatter("added"),
|
||||||
|
new fjs.PropertyFormatter("removed"),
|
||||||
|
new fjs.PropertyFormatter("filter"),
|
||||||
|
new fjs.PropertyFormatter("method"),
|
||||||
|
new fjs.PropertyFormatter("type"),
|
||||||
|
new fjs.PropertyFormatter("blacklisted"),
|
||||||
|
new fjs.PropertyFormatter("panel"),
|
||||||
|
new fjs.PropertyFormatter("command"),
|
||||||
|
new fjs.PropertyFormatter("system"),
|
||||||
|
new fjs.PropertyFormatter("true"),
|
||||||
|
new fjs.PropertyFormatter("false"),
|
||||||
|
new fjs.PropertyFormatter("syntax"),
|
||||||
|
new fjs.PropertyFormatter("originalName"),
|
||||||
|
new fjs.PropertyFormatter("newName"),
|
||||||
|
new fjs.PropertyFormatter("originalCategory"),
|
||||||
|
new fjs.PropertyFormatter("newCategory"),
|
||||||
|
new fjs.PropertyFormatter("until"),
|
||||||
|
new fjs.PropertyFormatter("validOptions"),
|
||||||
|
new fjs.PropertyFormatter("validPanels"),
|
||||||
|
new fjs.PropertyFormatter("autoclose"),
|
||||||
|
new fjs.PropertyFormatter("autodelete"),
|
||||||
|
new fjs.PropertyFormatter("startupDate"),
|
||||||
|
new fjs.PropertyFormatter("version"),
|
||||||
|
new fjs.PropertyFormatter("name"),
|
||||||
|
new fjs.PropertyFormatter("role"),
|
||||||
|
new fjs.PropertyFormatter("status"),
|
||||||
|
new fjs.PropertyFormatter("claimed"),
|
||||||
|
new fjs.PropertyFormatter("pinned"),
|
||||||
|
new fjs.PropertyFormatter("creationDate"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("noone"),
|
||||||
|
new fjs.PropertyFormatter("open"),
|
||||||
|
new fjs.PropertyFormatter("closed"),
|
||||||
|
new fjs.PropertyFormatter("priority"),
|
||||||
|
new fjs.PropertyFormatter("participants"),
|
||||||
|
new fjs.PropertyFormatter("yes"),
|
||||||
|
new fjs.PropertyFormatter("no"),
|
||||||
|
new fjs.PropertyFormatter("accept"),
|
||||||
|
new fjs.PropertyFormatter("cancel"),
|
||||||
|
new fjs.PropertyFormatter("option"),
|
||||||
|
new fjs.PropertyFormatter("topic"),
|
||||||
|
new fjs.PropertyFormatter("uptime"),
|
||||||
|
new fjs.PropertyFormatter("messages"),
|
||||||
|
new fjs.PropertyFormatter("embeds"),
|
||||||
|
new fjs.PropertyFormatter("files"),
|
||||||
|
new fjs.PropertyFormatter("components"),
|
||||||
|
new fjs.PropertyFormatter("cooldown"),
|
||||||
|
new fjs.PropertyFormatter("maxTickets"),
|
||||||
|
new fjs.PropertyFormatter("admins"),
|
||||||
|
new fjs.PropertyFormatter("roles"),
|
||||||
|
new fjs.PropertyFormatter("size"),
|
||||||
|
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("lowercase",true,[
|
||||||
|
new fjs.PropertyFormatter("text"),
|
||||||
|
new fjs.PropertyFormatter("html"),
|
||||||
|
new fjs.PropertyFormatter("command"),
|
||||||
|
new fjs.PropertyFormatter("modal"),
|
||||||
|
new fjs.PropertyFormatter("button"),
|
||||||
|
new fjs.PropertyFormatter("dropdown"),
|
||||||
|
new fjs.PropertyFormatter("method"),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("commands",true,[
|
||||||
|
new fjs.PropertyFormatter("reason"),
|
||||||
|
new fjs.PropertyFormatter("help"),
|
||||||
|
new fjs.PropertyFormatter("panel"),
|
||||||
|
new fjs.PropertyFormatter("panelId"),
|
||||||
|
new fjs.PropertyFormatter("panelAutoUpdate"),
|
||||||
|
new fjs.PropertyFormatter("ticket"),
|
||||||
|
new fjs.PropertyFormatter("ticketId"),
|
||||||
|
new fjs.PropertyFormatter("ticketOtherUser"),
|
||||||
|
new fjs.PropertyFormatter("close"),
|
||||||
|
new fjs.PropertyFormatter("delete"),
|
||||||
|
new fjs.PropertyFormatter("deleteNoTranscript"),
|
||||||
|
new fjs.PropertyFormatter("reopen"),
|
||||||
|
new fjs.PropertyFormatter("claim"),
|
||||||
|
new fjs.PropertyFormatter("claimUser"),
|
||||||
|
new fjs.PropertyFormatter("unclaim"),
|
||||||
|
new fjs.PropertyFormatter("pin"),
|
||||||
|
new fjs.PropertyFormatter("unpin"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("move"),
|
||||||
|
new fjs.PropertyFormatter("moveId"),
|
||||||
|
new fjs.PropertyFormatter("rename"),
|
||||||
|
new fjs.PropertyFormatter("renameName"),
|
||||||
|
new fjs.PropertyFormatter("add"),
|
||||||
|
new fjs.PropertyFormatter("addUser"),
|
||||||
|
new fjs.PropertyFormatter("remove"),
|
||||||
|
new fjs.PropertyFormatter("removeUser"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("blacklist"),
|
||||||
|
new fjs.PropertyFormatter("blacklistView"),
|
||||||
|
new fjs.PropertyFormatter("blacklistAdd"),
|
||||||
|
new fjs.PropertyFormatter("blacklistRemove"),
|
||||||
|
new fjs.PropertyFormatter("blacklistGet"),
|
||||||
|
new fjs.PropertyFormatter("blacklistGetUser"),
|
||||||
|
new fjs.PropertyFormatter("stats"),
|
||||||
|
new fjs.PropertyFormatter("statsReset"),
|
||||||
|
new fjs.PropertyFormatter("statsGlobal"),
|
||||||
|
new fjs.PropertyFormatter("statsUser"),
|
||||||
|
new fjs.PropertyFormatter("statsUserUser"),
|
||||||
|
new fjs.PropertyFormatter("statsTicket"),
|
||||||
|
new fjs.PropertyFormatter("statsTicketTicket"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("clear"),
|
||||||
|
new fjs.PropertyFormatter("clearFilter"),
|
||||||
|
new fjs.ObjectFormatter("clearFilters",true,[
|
||||||
|
new fjs.PropertyFormatter("all"),
|
||||||
|
new fjs.PropertyFormatter("open"),
|
||||||
|
new fjs.PropertyFormatter("close"),
|
||||||
|
new fjs.PropertyFormatter("claim"),
|
||||||
|
new fjs.PropertyFormatter("unclaim"),
|
||||||
|
new fjs.PropertyFormatter("pin"),
|
||||||
|
new fjs.PropertyFormatter("unpin"),
|
||||||
|
new fjs.PropertyFormatter("autoclose"),
|
||||||
|
]),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("autoclose"),
|
||||||
|
new fjs.PropertyFormatter("autocloseDisable"),
|
||||||
|
new fjs.PropertyFormatter("autocloseEnable"),
|
||||||
|
new fjs.PropertyFormatter("autocloseEnableTime"),
|
||||||
|
new fjs.PropertyFormatter("autodelete"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteDisable"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteEnable"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteEnableTime"),
|
||||||
|
new fjs.TextFormatter(""),
|
||||||
|
new fjs.PropertyFormatter("topic"),
|
||||||
|
new fjs.PropertyFormatter("topicSet"),
|
||||||
|
new fjs.PropertyFormatter("topicValue"),
|
||||||
|
new fjs.PropertyFormatter("topicList"),
|
||||||
|
new fjs.PropertyFormatter("priority"),
|
||||||
|
new fjs.PropertyFormatter("prioritySet"),
|
||||||
|
new fjs.PropertyFormatter("priorityValue"),
|
||||||
|
new fjs.PropertyFormatter("priorityGet"),
|
||||||
|
new fjs.PropertyFormatter("priorityList"),
|
||||||
|
new fjs.PropertyFormatter("transfer"),
|
||||||
|
new fjs.PropertyFormatter("transferUser"),
|
||||||
|
new fjs.PropertyFormatter("transcripts"),
|
||||||
|
new fjs.PropertyFormatter("transcriptsUser"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("helpMenu",true,[
|
||||||
|
new fjs.PropertyFormatter("help"),
|
||||||
|
new fjs.PropertyFormatter("ticket"),
|
||||||
|
new fjs.PropertyFormatter("close"),
|
||||||
|
new fjs.PropertyFormatter("delete"),
|
||||||
|
new fjs.PropertyFormatter("reopen"),
|
||||||
|
new fjs.PropertyFormatter("pin"),
|
||||||
|
new fjs.PropertyFormatter("unpin"),
|
||||||
|
new fjs.PropertyFormatter("move"),
|
||||||
|
new fjs.PropertyFormatter("rename"),
|
||||||
|
new fjs.PropertyFormatter("claim"),
|
||||||
|
new fjs.PropertyFormatter("unclaim"),
|
||||||
|
new fjs.PropertyFormatter("add"),
|
||||||
|
new fjs.PropertyFormatter("remove"),
|
||||||
|
new fjs.PropertyFormatter("panel"),
|
||||||
|
new fjs.PropertyFormatter("blacklistView"),
|
||||||
|
new fjs.PropertyFormatter("blacklistAdd"),
|
||||||
|
new fjs.PropertyFormatter("blacklistRemove"),
|
||||||
|
new fjs.PropertyFormatter("blacklistGet"),
|
||||||
|
new fjs.PropertyFormatter("statsGlobal"),
|
||||||
|
new fjs.PropertyFormatter("statsTicket"),
|
||||||
|
new fjs.PropertyFormatter("statsUser"),
|
||||||
|
new fjs.PropertyFormatter("statsReset"),
|
||||||
|
new fjs.PropertyFormatter("autocloseDisable"),
|
||||||
|
new fjs.PropertyFormatter("autocloseEnable"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteDisable"),
|
||||||
|
new fjs.PropertyFormatter("autodeleteEnable"),
|
||||||
|
new fjs.ObjectFormatter("categories",true,[
|
||||||
|
new fjs.PropertyFormatter("general"),
|
||||||
|
new fjs.PropertyFormatter("basicTicket"),
|
||||||
|
new fjs.PropertyFormatter("advancedTicket"),
|
||||||
|
new fjs.PropertyFormatter("userTicket"),
|
||||||
|
new fjs.PropertyFormatter("admin"),
|
||||||
|
new fjs.PropertyFormatter("advanced"),
|
||||||
|
new fjs.PropertyFormatter("extra"),
|
||||||
|
])
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("stats",true,[
|
||||||
|
new fjs.ObjectFormatter("scopes",true,[
|
||||||
|
new fjs.PropertyFormatter("global"),
|
||||||
|
new fjs.PropertyFormatter("system"),
|
||||||
|
new fjs.PropertyFormatter("user"),
|
||||||
|
new fjs.PropertyFormatter("ticket"),
|
||||||
|
new fjs.PropertyFormatter("participants"),
|
||||||
|
new fjs.PropertyFormatter("messages"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("properties",true,[
|
||||||
|
new fjs.PropertyFormatter("ticketsCreated"),
|
||||||
|
new fjs.PropertyFormatter("ticketsClosed"),
|
||||||
|
new fjs.PropertyFormatter("ticketsDeleted"),
|
||||||
|
new fjs.PropertyFormatter("ticketsReopened"),
|
||||||
|
new fjs.PropertyFormatter("ticketsAutoclosed"),
|
||||||
|
new fjs.PropertyFormatter("ticketsClaimed"),
|
||||||
|
new fjs.PropertyFormatter("ticketsPinned"),
|
||||||
|
new fjs.PropertyFormatter("ticketsMoved"),
|
||||||
|
new fjs.PropertyFormatter("usersBlacklisted"),
|
||||||
|
new fjs.PropertyFormatter("transcriptsCreated"),
|
||||||
|
new fjs.PropertyFormatter("ticketsAutodeleted"),
|
||||||
|
new fjs.PropertyFormatter("ticketsTransferred"),
|
||||||
|
new fjs.PropertyFormatter("ticketVolume"),
|
||||||
|
new fjs.PropertyFormatter("averageTickets"),
|
||||||
|
new fjs.PropertyFormatter("currentTickets"),
|
||||||
|
new fjs.PropertyFormatter("age"),
|
||||||
|
new fjs.PropertyFormatter("responseTime"),
|
||||||
|
new fjs.PropertyFormatter("resolutionTime"),
|
||||||
|
new fjs.PropertyFormatter("createdOn"),
|
||||||
|
new fjs.PropertyFormatter("createdBy"),
|
||||||
|
new fjs.PropertyFormatter("closedOn"),
|
||||||
|
new fjs.PropertyFormatter("closedBy"),
|
||||||
|
new fjs.PropertyFormatter("claimedOn"),
|
||||||
|
new fjs.PropertyFormatter("claimedBy"),
|
||||||
|
new fjs.PropertyFormatter("pinnedOn"),
|
||||||
|
new fjs.PropertyFormatter("pinnedBy"),
|
||||||
|
new fjs.PropertyFormatter("deletedOn"),
|
||||||
|
new fjs.PropertyFormatter("deletedBy"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("roles",true,[
|
||||||
|
new fjs.PropertyFormatter("developer"),
|
||||||
|
new fjs.PropertyFormatter("serverOwner"),
|
||||||
|
new fjs.PropertyFormatter("serverAdmin"),
|
||||||
|
new fjs.PropertyFormatter("moderator"),
|
||||||
|
new fjs.PropertyFormatter("support"),
|
||||||
|
new fjs.PropertyFormatter("member"),
|
||||||
|
])
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("panel",true,[
|
||||||
|
new fjs.PropertyFormatter("selectTicket"),
|
||||||
|
new fjs.PropertyFormatter("selectRole"),
|
||||||
|
new fjs.PropertyFormatter("selectOption"),
|
||||||
|
new fjs.PropertyFormatter("selectPriorityLevel"),
|
||||||
|
]),
|
||||||
|
new fjs.ObjectFormatter("priorities",true,[
|
||||||
|
new fjs.PropertyFormatter("urgent"),
|
||||||
|
new fjs.PropertyFormatter("veryHigh"),
|
||||||
|
new fjs.PropertyFormatter("high"),
|
||||||
|
new fjs.PropertyFormatter("normal"),
|
||||||
|
new fjs.PropertyFormatter("low"),
|
||||||
|
new fjs.PropertyFormatter("veryLow"),
|
||||||
|
new fjs.PropertyFormatter("none"),
|
||||||
|
]),
|
||||||
|
])
|
||||||
|
|
||||||
|
for (const language of fs.readdirSync(".tools/languages/")){
|
||||||
|
if (!fs.existsSync("./languages/"+language)){
|
||||||
|
console.log("language:",language,"does not exist yet in the primary ./languages/ folder. Unable to merge!")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
console.log("merging "+language+"...")
|
||||||
|
const original = JSON.parse(fs.readFileSync("./languages/"+language).toString())
|
||||||
|
const newSentences = JSON.parse(fs.readFileSync(".tools/languages/"+language).toString())
|
||||||
|
|
||||||
|
for (const key of Object.keys(newSentences)){
|
||||||
|
if (key.startsWith("_")) continue
|
||||||
|
try{
|
||||||
|
const splitted = key.split(".")
|
||||||
|
let currentObject = original
|
||||||
|
splitted.forEach((property,index) => {
|
||||||
|
let shouldBeObject = (splitted.length-1 !== index)
|
||||||
|
if (shouldBeObject && typeof currentObject[property] == "object"){
|
||||||
|
currentObject = currentObject[property]
|
||||||
|
}else if (shouldBeObject && typeof currentObject[property] == "undefined"){
|
||||||
|
currentObject[property] = {}
|
||||||
|
currentObject = currentObject[property]
|
||||||
|
}else if (typeof currentObject[property] == "string" || typeof currentObject[property] == "undefined"){
|
||||||
|
currentObject[property] = newSentences[key]
|
||||||
|
}else{
|
||||||
|
console.log("Failed to merge key:",key,"in file:",language,"--> Invalid type:",typeof currentObject[property])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}catch(err){
|
||||||
|
console.log("Failed to merge key:",key,"in file:",language)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
original["_TRANSLATION"]["lastedited"] = new Date().toLocaleDateString("nl-BE",{day:"2-digit",month:"2-digit",year:"numeric"})
|
||||||
|
original["_TRANSLATION"]["otversion"] = "v"+JSON.parse(fs.readFileSync("./package.json").toString()).version
|
||||||
|
const finalText = formatter.stringify(original)
|
||||||
|
fs.writeFileSync("./languages/"+language,finalText)
|
||||||
|
}
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# comming soon
|
|
||||||
For now on, you can create a ticket in our server:
|
|
||||||
https://discord.dj-dj.be
|
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
# Docker File for Open Ticket
|
||||||
|
FROM node:22-alpine
|
||||||
|
|
||||||
|
# /home/container keeps Pterodactyl panel compatibility
|
||||||
|
# chown the workdir so node user can create/remove subdirectories
|
||||||
|
RUN mkdir -p /home/container && chown node:node /home/container
|
||||||
|
WORKDIR /home/container
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
COPY --chown=node:node package*.json ./
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
# Copy app source
|
||||||
|
COPY --chown=node:node . .
|
||||||
|
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
|
# Run as the built-in non-root node user
|
||||||
|
USER node
|
||||||
|
|
||||||
|
CMD ["node", "index.js"]
|
||||||
+42
-3
@@ -1,7 +1,17 @@
|
|||||||
|
<!-- omit from toc -->
|
||||||
|
# Open Ticket (License)
|
||||||
|
© 2021 - 2026 - DJj123dj & Contributors
|
||||||
|
|
||||||
|
#### Table Of Contents
|
||||||
|
- [General License](#general-license)
|
||||||
|
- [Additional Terms for Open Ticket](#additional-terms-for-open-ticket)
|
||||||
|
|
||||||
|
### General License
|
||||||
|
```
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
Copyright (C) 2026 DJdj Development. <https://www.dj-dj.be/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
@@ -70,7 +80,7 @@ modification follow.
|
|||||||
|
|
||||||
TERMS AND CONDITIONS
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
0. Definitions.
|
1. Definitions.
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
@@ -671,4 +681,33 @@ into proprietary programs. If your program is a subroutine library, you
|
|||||||
may consider it more useful to permit linking proprietary applications with
|
may consider it more useful to permit linking proprietary applications with
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License. But first, please read
|
Public License instead of this License. But first, please read
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Additional Terms for Open Ticket
|
||||||
|
#### Terminology:
|
||||||
|
1. **“Software”**
|
||||||
|
Refers to the Open Ticket source code, documentation, and any associated files distributed under this license, including any modifications or derivative works thereof.
|
||||||
|
|
||||||
|
1. **“Public Discord Bot**
|
||||||
|
A Discord bot that is made publicly available for use by multiple, unrelated Discord servers or users, where the bot’s functionality is provided as a service rather than for private or personal use.
|
||||||
|
|
||||||
|
1. **“Monetized Service”**
|
||||||
|
Refers to any service or deployment that generates direct or indirect revenue through the use of the Software. This includes, but is not limited to, subscriptions, premium features, paid hosting, advertisements.
|
||||||
|
|
||||||
|
1. **“For-Profit Discord Server”**
|
||||||
|
Means a Discord server that generates income, revenue, or other material benefits, whether through memberships, donations, or other monetization strategies.
|
||||||
|
|
||||||
|
1. **“Private Use”**
|
||||||
|
Refers to using the Software on a limited number of Discord servers controlled or operated by a single individual or organization, not made available as a public service to multiple unrelated users.
|
||||||
|
|
||||||
|
#### Additional Terms:
|
||||||
|
The following additional terms apply to the use of this software:
|
||||||
|
|
||||||
|
1. This software may not be used as (or part of) a public Discord bot that is monetized (e.g., generating revenue through subscriptions, donations, or other forms of payment) without the prior written permission of the original author.
|
||||||
|
|
||||||
|
2. This software may not be used as (or part of) a public Discord bot on multiple Discord servers without attribution to the original author.
|
||||||
|
|
||||||
|
3. You are allowed to use this bot in a Discord server that makes money or is for-profit, provided that the income is not generated directly from the ticket bot or its functionality.
|
||||||
|
|
||||||
|
These additional terms are an extension to the GNU GPL v3 and must be followed alongside the original license terms. In case of any conflict between these additional terms and the GNU GPL v3, the additional terms shall take precedence.
|
||||||
@@ -1,58 +1,189 @@
|
|||||||
# Open Ticket
|
<p align="center">
|
||||||
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v3.2.0) []() [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [](https://docs.openticket.dj-dj.be)
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket" width="650px"><br>
|
||||||
|
<span align="center"><b>The most advanced self-hosted ticket bot for Discord</b></span><br>
|
||||||
|
<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://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>
|
||||||
|
<a href="https://github.com/sponsors/DJj123dj"><img alt="Sponsor DJj123dj" src="https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors"></img></a>
|
||||||
|
<a href="https://hub.docker.com/repository/docker/djj123dj/open-ticket"><img alt="Open Ticket supports Docker!" src="https://img.shields.io/badge/docker-supported-2496ED?style=flat-square&logo=docker"></img></a>
|
||||||
|
<a href=".github/pterodactyl-eggs/README.md"><img alt="Open Ticket supports Pterodactyl Eggs!" src="https://img.shields.io/badge/pterodactyl-supported-10539F?style=flat-square&logo=pterodactyl"></img></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
Open ticket is the most configurable open-source ticket bot for discord! Made with the newest technologies. Like: Slash commands, transcripts, multiple ticket types, buttons & dropdowns!
|
<p align="center">
|
||||||
Start using it now, you can do anything!
|
Open Ticket is the most <b>advanced and customizable</b> Discord ticket bot available right now. It features more than <b>350+ configurable settings</b> to control almost every aspect of your ticket system.
|
||||||
|
From <code>HTML transcripts</code> and <code>Advanced Plugins</code> to <code>Claiming & Pinning</code>, <code>Modal Questions & Limits</code>, <code>Detailed Statistics</code>, and much more.
|
||||||
|
The bot is fully translated into <b>38+ languages</b> and has been battle-tested in large Discord servers. Need help or want to get involved? Feel free to join our <a href="https://discord.dj-dj.be"><b>Discord server</b></a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
*We love to hear suggestions for more features!*
|
<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">
|
||||||
|
</p>
|
||||||
|
|
||||||
<img src="logo.png" alt="Open Ticket logo" style="height: 200px; width:200px;"/>
|
---
|
||||||
|
> **[-> Navigate to (⏱️ Quick Setup)](#️-quick-start)**
|
||||||
|
> **[-> Navigate to (📚 Documentation)](https://otdocs.dj-dj.be)**
|
||||||
|
> **[-> Navigate to (📞 Support Server)](https://discord.dj-dj.be)**
|
||||||
|
> **[-> Navigate to (🧩 Plugins/Addons)](https://odplugins.dj-dj.be)**
|
||||||
|
> **[-> Navigate to (🦇 Pterodactyl Eggs)](.github/pterodactyl-eggs/README.md)**
|
||||||
|
|
||||||
[](https://www.github.com/DJj123dj/open-ticket/wiki)
|
### 📌 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.
|
||||||
|
|
||||||
### Thanks to these people:
|
#### Ticket Automation & Workflows
|
||||||
- DJ-Lite: for doing the administration
|
- <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.
|
||||||
- Sanke: for translation & new ideas
|
- <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.
|
||||||
- Everyone that reported a bug
|
- <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.
|
||||||
#### And our translators!
|
- <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.
|
||||||
- Sanke#6086 (Romanian & French)
|
|
||||||
- Redactado#1673 (Spanish)
|
|
||||||
- t0miiis#3022 (Czech)
|
|
||||||
- josuens14 (Spanish)
|
|
||||||
- M4#5882 (Arabic)
|
|
||||||
- ChilledBroke#9986 (Arabic)
|
|
||||||
- David.#0187 (German)
|
|
||||||
- Maurizio#0268 (Italian)
|
|
||||||
- the_gamer#5095 (Danish)
|
|
||||||
|
|
||||||
## features
|
#### Transcripts & Insights
|
||||||
- **🎉 NEW! html transcripts!**
|
- <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.
|
||||||
- discord interaction buttons
|
- <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.
|
||||||
- slash & text commands
|
- <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.
|
||||||
- close, delete & re-open tickets
|
|
||||||
- translation in 10 different languages
|
|
||||||
- transcripts
|
|
||||||
- add/remove users from a ticket
|
|
||||||
- a lot of customisation options.
|
|
||||||
- tickets, reaction roles & links are all possible!
|
|
||||||
- choose between buttons or dropdowns!
|
|
||||||
- discord.js v14
|
|
||||||
- everyting is configurable
|
|
||||||
- custom API + plugins
|
|
||||||
- unlimited tickets spread over multiple messages
|
|
||||||
- close with reason
|
|
||||||
- view transcripts in html
|
|
||||||
|
|
||||||
## quick start
|
#### User Experience
|
||||||
[Click here to start your adventure!](https://docs.openticket.dj-dj.be/quick-start)
|
- <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.
|
||||||
|
|
||||||
## documentation
|
#### Plugins & Ecosystem
|
||||||
[<img src="./otWIKI.png" width="400px" href="https://docs.openticket.dj-dj.be">](https://docs.openticket.dj-dj.be)
|
- <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.
|
||||||
|
|
||||||
## information
|
#### 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.
|
||||||
|
|
||||||
_v3.2.0_
|
#### 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.
|
||||||
|
|
||||||
changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
|
## ⏱️ Quick Start
|
||||||
|
> 1. Download the [latest version of Open Ticket](https://github.com/open-discord-bots/open-ticket/releases/latest).
|
||||||
|
> 2. Make sure you have installed Node.js on your system (check using `node -v`, minimum `v20`).
|
||||||
|
> 3. Install any required dependencies using `npm install`.
|
||||||
|
> 4. Configure the bot in one of the following ways:
|
||||||
|
> - Method 1 (Easy): Start the **Quick Setup CLI** using `npm run setup`.
|
||||||
|
> - Method 2 (Hard): Manual **JSON configuration** in `./config/...`
|
||||||
|
> 5. If using the **Quick Setup CLI**, click on `> ⏱️ Quick Setup` and follow the instructions.
|
||||||
|
> 6. Start the bot using `npm start` or `node index.js`
|
||||||
|
> - If any config errors occur, the bot will give you a report of how to solve them.
|
||||||
|
> - Follow the instructions and restart the bot.
|
||||||
|
> 7. Enjoy using Open Ticket!
|
||||||
|
> 8. Install plugins from the [**Official Plugin Repository**](https://github.com/open-discord-bots/plugins)
|
||||||
|
>
|
||||||
|
> #### 🚦 Next Steps
|
||||||
|
> **[-> Navigate to (📚 Documentation)](https://otdocs.dj-dj.be)**
|
||||||
|
> **[-> Navigate to (📞 Support Server)](https://discord.dj-dj.be)**
|
||||||
|
> **[-> Navigate to (🧩 Plugins/Addons)](https://odplugins.dj-dj.be)**
|
||||||
|
> **[-> Navigate to (🦇 Pterodactyl Eggs)](.github/pterodactyl-eggs/README.md)**
|
||||||
|
>
|
||||||
|
> #### 🖥️ Recommended Hosting
|
||||||
|
> - **A VPS (Virtual Private Server)** - Extra customisation & more stability. Recommended for most servers.
|
||||||
|
> - **Any Pterodactyl-Based Panel** - Easy installation & configuration.
|
||||||
|
|
||||||
© 2022 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms)
|
## 📸 Previews
|
||||||
|
<img alt="Preview of: Advanced Ticket Management" src="https://apis.dj-dj.be/cdn/openticket/ot-previews/preview-1.png">
|
||||||
|
<img alt="Preview of: Customisable Ticket Panels" src="https://apis.dj-dj.be/cdn/openticket/ot-previews/preview-2.png">
|
||||||
|
<img alt="Preview of: Modal Questions & Forms" src="https://apis.dj-dj.be/cdn/openticket/ot-previews/preview-3.png">
|
||||||
|
<img alt="Preview of: Detailed Statistics & Insights" src="https://apis.dj-dj.be/cdn/openticket/ot-previews/preview-4.png">
|
||||||
|
<img alt="Preview of: 30+ Powerful Commands" src="https://apis.dj-dj.be/cdn/openticket/ot-previews/preview-5.png">
|
||||||
|
<img alt="Preview of: Buttons, Transcripts, Limits & More!" src="https://apis.dj-dj.be/cdn/openticket/ot-previews/preview-6.png">
|
||||||
|
|
||||||
|
## 💬 Translations
|
||||||
|
With the amazing support of our translators, we've been able to translate Open Ticket in more than **38 languages**!
|
||||||
|
#### Categories: 🟢 Available - 🤖 Partially Made Using AI - 🟠 Incomplete - 🔴 Unavailable/Outdated
|
||||||
|
|
||||||
|
|🔍 |Languages (38) |Config Value |Maintainers (Github/Discord) |
|
||||||
|
|----|----------------------|------------------------|--------------------------------|
|
||||||
|
|🟢 |🇬🇧 English |`"english"` |djj123dj |
|
||||||
|
|🟢 |🇳🇱 Dutch |`"dutch"` |djj123dj |
|
||||||
|
|🟢 |🇩🇪 German |`"german"` |benzorich |
|
||||||
|
|🟢 |🇫🇷 French |`"french"` |guillee.3 |
|
||||||
|
|🟢 |🇪🇸 Spanish |`"spanish"` |Reddishye & josuens |
|
||||||
|
|🟢 |🇵🇹 Portuguese |`"portuguese"` |quiradon |
|
||||||
|
|🟢 |🇮🇹 Italian |`"italian"` |fraden1mvp. & imperatorix_17 |
|
||||||
|
|🟢 |🇸🇪 Swedish |`"swedish"` |NoOneNook |
|
||||||
|
|🟢 |🇳🇴 Norwegian |`"norwegian"` |NoOneNook |
|
||||||
|
|🟢 |🇹🇭 Thai |`"thai"` |modshd |
|
||||||
|
|🟢 |🇮🇳 Hindi |`"hindi"` |challenger_nova |
|
||||||
|
|🟢 |🇭🇺 Hungarian |`"hungarian"` |kornel0706 |
|
||||||
|
|🟢 |🇮🇩 Indonesian |`"indonesian"` |erxg |
|
||||||
|
|🟢 |🇱🇹 Lithuanian |`"lithuanian"` |tsgindrius |
|
||||||
|
|🟢 |🇺🇦 Ukrainian |`"ukrainian"` |anderskiy |
|
||||||
|
|🟢 |🇨🇿 Czech |`"czech"` |spyeye_ |
|
||||||
|
|🟢 |🇷🇴 Romanian |`"romanian"` |sankedev |
|
||||||
|
|🟢 |🇩🇰 Danish |`"danish"` |the_gamer |
|
||||||
|
|🟢 |🇹🇷 Turkish |`"turkish"` |palestinian |
|
||||||
|
|🟢 |🇦🇪 Arabic |`"arabic"` |palestinian |
|
||||||
|
|🟢 |🇵🇱 Polish |`"polish"` |danoglez |
|
||||||
|
|🟢 |🇮🇷 Persian |`"persian"` |dysashop & zhavis |
|
||||||
|
|🟢 |🇧🇩 Bengali |`"bengali"` |HanumeshGupta |
|
||||||
|
|🟢 |❓ Catalan |`"catalan"` |guillee3 |
|
||||||
|
|🟢 |🇨🇳 Traditional Chinese|`"traditional-chinese"` |me.october |
|
||||||
|
|🟢 |🇰🇭 Khmer (Cambodia) |`"khmer"` |yuuslokrobjakkroval |
|
||||||
|
|🤖 |🇪🇪 Estonian |`"estonian"` |iamnotmega |
|
||||||
|
|🤖 |🇫🇮 Finnish |`"finnish"` |iamnotmega |
|
||||||
|
|🤖 |🇯🇵 Japanese |`"japanese"` |HanumeshGupta |
|
||||||
|
|🤖 |🇬🇷 Greek |`"greek"` |HanumeshGupta |
|
||||||
|
|🤖 |🇸🇮 Slovenian |`"slovenian"` |HanumeshGupta |
|
||||||
|
|🤖 |🇰🇷 Korean |`"korean"` |HanumeshGupta |
|
||||||
|
|🤖 |🇮🇳 Tamil |`"tamil"` |HanumeshGupta |
|
||||||
|
|🤖 |❓ Kurdish |`"kurdish"` |HanumeshGupta |
|
||||||
|
|🤖 |🇷🇺 Russian |`"russian"` |NoOneNook |
|
||||||
|
|🤖 |🇱🇻 Latvian |`"latvian"` |NoOneNook |
|
||||||
|
|🤖 |🇻🇳 Vietnamese |`"vietnamese"` |ngocdiep2006 |
|
||||||
|
|🤖 |🇨🇳 Simplified Chinese |`"simplified-chinese"` |HanumeshGupta |
|
||||||
|
<!--[⭐ Contribute!](.github/CONTRIBUTING.md) -->
|
||||||
|
|
||||||
|
## 😎 Hall Of Fame
|
||||||
|
<img alt="The full list of contributors for Open Ticket and Open Discord." src=".github/CONTRIBUTORS.svg">
|
||||||
|
|
||||||
|
## ⭐️ Star History
|
||||||
|
If you enjoy using Open ticket, **consider starring** our repository.
|
||||||
|
This will help us grow and reach even more people!
|
||||||
|
|
||||||
|
<a href="https://star-history.com/#open-discord-bots/open-ticket&Date">
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=open-discord-bots/open-ticket&type=Date&theme=dark" />
|
||||||
|
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=open-discord-bots/open-ticket&type=Date" />
|
||||||
|
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=open-discord-bots/open-ticket&type=Date" />
|
||||||
|
</picture>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
---
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
|
||||||
|
|
||||||
|
**README.md**<br>
|
||||||
|
[Changelog](https://otgithub.dj-dj.be/releases) - [Documentation](https://otdocs.dj-dj.be) - [Website](https://openticket.dj-dj.be) - [Support Server](https://discord.dj-dj.be) - [License](./LICENSE.md)<br>
|
||||||
|
|
||||||
|
© 2021 - 2026 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded add.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.add) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"add")) return
|
|
||||||
var user = msg.mentions.users.first()
|
|
||||||
if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"add <user>`")]})
|
|
||||||
|
|
||||||
if (!msg.guild) return
|
|
||||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(msg.author)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
|
|
||||||
msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]})
|
|
||||||
|
|
||||||
var loguser = msg.mentions.users.first()
|
|
||||||
log("command","someone used the 'add' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
log("system","user added to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.tag}])
|
|
||||||
|
|
||||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
|
||||||
APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
|
||||||
|
|
||||||
APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.add) client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "add") return
|
|
||||||
const user = interaction.options.getUser("user")
|
|
||||||
|
|
||||||
if (!interaction.guild) return
|
|
||||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(interaction.user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
|
|
||||||
interaction.reply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]})
|
|
||||||
|
|
||||||
var loguser = user
|
|
||||||
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
log("system","user added to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.tag}])
|
|
||||||
|
|
||||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
|
||||||
APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
|
|
||||||
APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded change.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.change) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"change")) return
|
|
||||||
|
|
||||||
if (!msg.guild) return
|
|
||||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(msg.author)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
var newtype = msg.content.split(config.prefix+"change")[1].substring(1)
|
|
||||||
if (!newtype) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
|
|
||||||
|
|
||||||
const newTicket = require("../core/utils/configParser").getTicketById(newtype)
|
|
||||||
const list = []
|
|
||||||
config.options.forEach((o) => list.push(o.id))
|
|
||||||
if (!newTicket) return bot.errorLog.invalidIdChooseFromList(list)
|
|
||||||
|
|
||||||
/**@type {String} */
|
|
||||||
var chName = msg.channel.name
|
|
||||||
const splitted = chName.split("-")
|
|
||||||
const prefix = splitted.shift()
|
|
||||||
const name = (splitted.length > 0) ? splitted.join("-") : prefix
|
|
||||||
|
|
||||||
|
|
||||||
msg.channel.setName(newTicket.channelprefix+name)
|
|
||||||
msg.channel.send({embeds:[bot.embeds.commands.changeEmbed(msg.author,newtype)]})
|
|
||||||
|
|
||||||
log("command","someone used the 'change' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
log("system","ticket type changed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}])
|
|
||||||
APIEvents.onCommand("change",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.change) client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "change") return
|
|
||||||
|
|
||||||
if (!interaction.guild) return
|
|
||||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(interaction.user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//interaction.deferReply()
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
console.log("HELLO WORLD!! 1")
|
|
||||||
var newtype = interaction.options.getString("type",true)
|
|
||||||
if (!newtype) return interaction.reply({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
|
|
||||||
|
|
||||||
console.log("HELLO WORLD!! 2")
|
|
||||||
const newTicket = require("../core/utils/configParser").getTicketById(newtype,true)
|
|
||||||
const list = []
|
|
||||||
config.options.forEach((o) => list.push(o.id))
|
|
||||||
if (!newTicket) return bot.errorLog.invalidIdChooseFromList(list)
|
|
||||||
|
|
||||||
console.log("HELLO WORLD!! 3")
|
|
||||||
/**@type {String} */
|
|
||||||
var chName = interaction.channel.name
|
|
||||||
const splitted = chName.split("-")
|
|
||||||
const prefix = splitted.shift()
|
|
||||||
const name = (splitted.length > 0) ? splitted.join("-") : prefix
|
|
||||||
|
|
||||||
console.log("HELLO WORLD!! 4")
|
|
||||||
|
|
||||||
interaction.channel.setName(newTicket.channelprefix+name)
|
|
||||||
interaction.reply({embeds:[bot.embeds.commands.changeEmbed(interaction.user,newtype)]})
|
|
||||||
|
|
||||||
console.log("HELLO WORLD!! 5")
|
|
||||||
log("command","someone used the 'change' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
log("system","ticket type changed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}])
|
|
||||||
APIEvents.onCommand("change",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded claim.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.claim) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"claim")) return
|
|
||||||
var user = msg.mentions.users.first()
|
|
||||||
|
|
||||||
const claimingUser = user ? user : msg.author
|
|
||||||
|
|
||||||
if (!msg.guild) return
|
|
||||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(msg.author)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
|
|
||||||
//msg.channel.send({embeds:[bot.embeds.commands.claimEmbed(claimingUser,msg.author)]})
|
|
||||||
msg.channel.send({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]})
|
|
||||||
|
|
||||||
var loguser = claimingUser
|
|
||||||
log("command","someone used the 'claim' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
log("system","user claimed to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.tag}])
|
|
||||||
|
|
||||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
|
||||||
//APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
|
||||||
//APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.claim) client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "claim") return
|
|
||||||
const user = interaction.options.getUser("user",false) ? interaction.options.getUser("user",true) : interaction.user
|
|
||||||
|
|
||||||
if (!interaction.guild) return
|
|
||||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(interaction.user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
//interaction.reply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]})
|
|
||||||
interaction.reply({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]})
|
|
||||||
|
|
||||||
var loguser = user
|
|
||||||
log("command","someone used the 'claim' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
log("system","user claimed to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"claimed_user",value:loguser.tag}])
|
|
||||||
|
|
||||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
|
||||||
//APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
|
|
||||||
//APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded close.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.close) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"close")) return
|
|
||||||
|
|
||||||
const args = msg.content.substring((config.prefix+"close").length).split(" ")
|
|
||||||
args.shift()
|
|
||||||
/**@type {String|false} */
|
|
||||||
var tempreason = args.join(" ")
|
|
||||||
if (!tempreason || tempreason == " " || tempreason == " "){
|
|
||||||
tempreason = false
|
|
||||||
}
|
|
||||||
const reason = tempreason
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
|
|
||||||
|
|
||||||
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
|
|
||||||
msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
|
|
||||||
|
|
||||||
var name = msg.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
require("../core/ticketActions/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",reason,true)
|
|
||||||
|
|
||||||
log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.close) client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "close") return
|
|
||||||
|
|
||||||
//interaction.deferReply()
|
|
||||||
|
|
||||||
const reason = interaction.options.getString("reason") ? interaction.options.getString("reason") : false
|
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
|
|
||||||
|
|
||||||
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
|
|
||||||
interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
|
|
||||||
|
|
||||||
var name = interaction.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
require("../core/ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true)
|
|
||||||
|
|
||||||
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded delete.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.delete) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"delete")) return
|
|
||||||
|
|
||||||
if (!msg.guild) return
|
|
||||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(msg.author)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]})
|
|
||||||
|
|
||||||
var name = msg.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
require("../core/ticketActions/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"delete",false,true)
|
|
||||||
|
|
||||||
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.delete) client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "delete") return
|
|
||||||
|
|
||||||
//interaction.deferReply()
|
|
||||||
|
|
||||||
if (!interaction.guild) return
|
|
||||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(interaction.user)
|
|
||||||
return interaction.reply({embeds:[bot.errorLog.noPermsDelete(interaction.user)]})
|
|
||||||
}
|
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
interaction.reply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
|
|
||||||
|
|
||||||
var name = interaction.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
require("../core/ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
|
|
||||||
|
|
||||||
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded help.js")
|
|
||||||
|
|
||||||
const msgName = config.system.showSlashcmdsInHelp ? "message" : "msg"
|
|
||||||
const prefix = config.system.showSlashcmdsInHelp ? "/" : config.prefix
|
|
||||||
|
|
||||||
const helpEmbed = new discord.EmbedBuilder()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle("❔ "+l.helpMenu.title)
|
|
||||||
|
|
||||||
const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2
|
|
||||||
helpEmbed.setDescription(header+"`"+prefix+msgName+" <id>` ➜ _"+l.helpMenu.msgCmd+"_\n\n`"+prefix+"rename <name>` ➜ _"+l.helpMenu.renameCmd+"_\n`"+prefix+"close` ➜ _"+l.helpMenu.closeCmd+"_\n`"+prefix+"delete` ➜ _"+l.helpMenu.deleteCmd+"_\n`"+prefix+"reopen` ➜ _"+l.helpMenu.reopenCmd+"_\n\n`"+prefix+"add <user>` ➜ _"+l.helpMenu.addCmd+"_\n`"+prefix+"remove <user>` ➜ _"+l.helpMenu.removeCmd+"_")
|
|
||||||
|
|
||||||
var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.help) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix)) return
|
|
||||||
var args = msg.content.split(config.prefix)
|
|
||||||
|
|
||||||
if (msg.content == config.prefix || msg.content == config.prefix+" " || msg.content == otherprefix){
|
|
||||||
msg.channel.send({embeds:[helpEmbed]})
|
|
||||||
log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[1]){
|
|
||||||
if (!args[1].startsWith("close") && !args[1].startsWith("delete") && !args[1].startsWith("remove") && !args[1].startsWith("add") && !args[1].startsWith("msg") && !args[1].startsWith("remove") && !args[1].startsWith("rename") && !args[1].startsWith("reopen")){
|
|
||||||
msg.channel.send({embeds:[helpEmbed]})
|
|
||||||
log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.help) client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "help") return
|
|
||||||
|
|
||||||
interaction.reply({embeds:[helpEmbed]})
|
|
||||||
log("command","someone used the 'help' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
APIEvents.onCommand("help",true,interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded remove.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.remove) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"remove")) return
|
|
||||||
var user = msg.mentions.users.first()
|
|
||||||
if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"remove <user>`")]})
|
|
||||||
|
|
||||||
if (!msg.guild) return
|
|
||||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(msg.author)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
msg.channel.permissionOverwrites.delete(user.id)
|
|
||||||
msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]})
|
|
||||||
|
|
||||||
var loguser = msg.mentions.users.first()
|
|
||||||
|
|
||||||
log("command","someone used the 'remove' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
log("system","user removed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.tag}])
|
|
||||||
|
|
||||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
|
||||||
APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
|
||||||
APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.remove) client.on("interactionCreate",async (interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "remove") return
|
|
||||||
const user = interaction.options.getUser("user")
|
|
||||||
|
|
||||||
if (!interaction.guild) return
|
|
||||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(interaction.user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
await interaction.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
interaction.channel.permissionOverwrites.delete(user.id)
|
|
||||||
interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]})
|
|
||||||
|
|
||||||
var loguser = user
|
|
||||||
|
|
||||||
log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
log("system","user removed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.tag}])
|
|
||||||
|
|
||||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
|
||||||
APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
|
|
||||||
APIEvents.onCommand("remove",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded rename.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.rename) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"rename")) return
|
|
||||||
|
|
||||||
if (!msg.guild) return
|
|
||||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(msg.author)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
var newname = msg.content.split(config.prefix+"rename")[1].substring(1)
|
|
||||||
|
|
||||||
if (!newname) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<name>`:\n`"+config.prefix+"rename <name>`")]})
|
|
||||||
|
|
||||||
var name = msg.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!prefix) prefix = "noprefix-"
|
|
||||||
|
|
||||||
msg.channel.setName(prefix+newname)
|
|
||||||
msg.channel.send({embeds:[bot.embeds.commands.renameEmbed(msg.author,prefix+newname)]})
|
|
||||||
|
|
||||||
log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
|
|
||||||
APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.rename) client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "rename") return
|
|
||||||
|
|
||||||
if (!interaction.guild) return
|
|
||||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(interaction.user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//interaction.deferReply()
|
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
var newname = interaction.options.getString("name")
|
|
||||||
var name = interaction.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!prefix) prefix = "noprefix-"
|
|
||||||
|
|
||||||
interaction.channel.setName(prefix+newname)
|
|
||||||
interaction.reply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]})
|
|
||||||
|
|
||||||
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
|
|
||||||
|
|
||||||
APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded reopen.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.reopen) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"reopen")) return
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]})
|
|
||||||
|
|
||||||
require("../core/ticketActions/ticketReopener").reopenTicket(msg.guild,msg.channel,msg.author)
|
|
||||||
|
|
||||||
log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.reopen) client.on("interactionCreate",async (interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "reopen") return
|
|
||||||
|
|
||||||
//interaction.deferReply()
|
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(async msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
|
|
||||||
|
|
||||||
await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
|
|
||||||
|
|
||||||
require("../core/ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
|
|
||||||
|
|
||||||
log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded ticket.js")
|
|
||||||
|
|
||||||
/**@type {String[]} */
|
|
||||||
var msgIds = []
|
|
||||||
config.messages.forEach((msg) => {
|
|
||||||
msgIds.push(msg.id)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.msg) client.on("messageCreate", msg => {
|
|
||||||
if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){
|
|
||||||
|
|
||||||
if (!msg.guild) return
|
|
||||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(msg.author)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false
|
|
||||||
|
|
||||||
if (!id) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]})
|
|
||||||
if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]})
|
|
||||||
|
|
||||||
|
|
||||||
const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id)
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[embed],components:componentRows})
|
|
||||||
|
|
||||||
log("command","someone used the 'message' command",[{key:"user",value:msg.author.tag},{key:"id",value:id}])
|
|
||||||
APIEvents.onCommand("message",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.msg) client.on("interactionCreate", (interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "message") return
|
|
||||||
|
|
||||||
if (!interaction.guild) return
|
|
||||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(interaction.user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const id = interaction.options.getString("id")
|
|
||||||
|
|
||||||
if (!msgIds.includes(id)) return interaction.reply({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]})
|
|
||||||
|
|
||||||
const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id)
|
|
||||||
|
|
||||||
interaction.reply({content:l.commands.ticketWarning})
|
|
||||||
interaction.channel.send({embeds:[embed],components:componentRows})
|
|
||||||
|
|
||||||
log("command","someone used the 'message' command",[{key:"user",value:interaction.user.tag},{key:"id",value:id}])
|
|
||||||
|
|
||||||
APIEvents.onCommand("message",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
const DISABLE = require("../core/api/api.json").disable
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
bot.errorLog.log("debug","COMMANDS: loaded unclaim.js")
|
|
||||||
|
|
||||||
if (!DISABLE.commands.text.unclaim) client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"unclaim")) return
|
|
||||||
|
|
||||||
if (!msg.guild) return
|
|
||||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(msg.author)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
|
|
||||||
//msg.channel.send({embeds:[bot.embeds.commands.unclaimEmbed(msg.author)]})
|
|
||||||
msg.channel.send({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]})
|
|
||||||
|
|
||||||
var loguser = msg.author
|
|
||||||
log("command","someone used the 'unclaim' command",[{key:"user",value:msg.author.tag}])
|
|
||||||
log("system","user unclaimed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"unclaimed_user",value:msg.author.tag}])
|
|
||||||
|
|
||||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
|
||||||
//APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
|
||||||
//APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!DISABLE.commands.slash.unclaim) client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "unclaim") return
|
|
||||||
const user = interaction.user
|
|
||||||
|
|
||||||
if (!interaction.guild) return
|
|
||||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(interaction.user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
|
|
||||||
//interaction.reply({embeds:[bot.embeds.commands.unclaimEmbed(interaction.user)]})
|
|
||||||
interaction.reply({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]})
|
|
||||||
|
|
||||||
var loguser = user
|
|
||||||
log("command","someone used the 'unclaim' command",[{key:"user",value:interaction.user.tag}])
|
|
||||||
log("system","user unclaimed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"unclaimed_user",value:loguser.tag}])
|
|
||||||
|
|
||||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
|
||||||
//APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
|
|
||||||
//APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
-121
@@ -1,121 +0,0 @@
|
|||||||
{
|
|
||||||
"main_color":"#ffffff",
|
|
||||||
"server_id":"server id (for slash cmds)",
|
|
||||||
"auth_token":"auth token",
|
|
||||||
"main_adminroles":["discord role id"],
|
|
||||||
"prefix":"!ticket ",
|
|
||||||
"languagefile":"english",
|
|
||||||
|
|
||||||
"status":{
|
|
||||||
"enabled":true,
|
|
||||||
"type":"PLAYING",
|
|
||||||
"text":"!ticket help"
|
|
||||||
},
|
|
||||||
|
|
||||||
"system":{
|
|
||||||
"ticket_channel":"channel id",
|
|
||||||
"max_allowed_tickets":3,
|
|
||||||
"enable_DM_Messages":true,
|
|
||||||
|
|
||||||
"has@everyoneaccess":false,
|
|
||||||
"member_role":"member role (doesn't have access to tickets)",
|
|
||||||
"closeMode":"adminonly|normal",
|
|
||||||
|
|
||||||
"transcripts":"!!!! ALL SETTINGS FOR TRANSCRIPTS ARE LOCATED IN: transcriptconfig.json !!!!",
|
|
||||||
|
|
||||||
"showSlashcmdsInHelp":false
|
|
||||||
},
|
|
||||||
|
|
||||||
"options":[
|
|
||||||
{
|
|
||||||
"id":"general",
|
|
||||||
"name":"Question",
|
|
||||||
"description":"Create this ticket if you have a question.",
|
|
||||||
"icon":"🎫",
|
|
||||||
"label":"question",
|
|
||||||
"type":"ticket",
|
|
||||||
|
|
||||||
"color":"gray",
|
|
||||||
"adminroles":["role id"],
|
|
||||||
"channelprefix":"question-",
|
|
||||||
"category":"category id",
|
|
||||||
"message":"You created a ticket!",
|
|
||||||
"enableDmOnOpen":true,
|
|
||||||
"ticketmessage":"The staff will help you soon!\n\n*Click on the button below to close the ticket!*",
|
|
||||||
|
|
||||||
"thumbnail":{
|
|
||||||
"enable":false,
|
|
||||||
"url":"https://www.example.com/catmemes/cat.png"
|
|
||||||
},
|
|
||||||
|
|
||||||
"closedCategory":{
|
|
||||||
"enable":false,
|
|
||||||
"id":"category id"
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"website",
|
|
||||||
"name":"Website",
|
|
||||||
"description":"Go to our website.",
|
|
||||||
"icon":"✅",
|
|
||||||
"label":"click here",
|
|
||||||
"type":"website",
|
|
||||||
|
|
||||||
"url":"https://www.dj-dj.be"
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"role",
|
|
||||||
"name":"Verify",
|
|
||||||
"description":"Click here to get the verify role.",
|
|
||||||
"icon":"👮🏼",
|
|
||||||
"label":"get a role",
|
|
||||||
"type":"role",
|
|
||||||
|
|
||||||
"color":"red",
|
|
||||||
"roles":["discord role id"],
|
|
||||||
"mode":"add&remove|remove|add",
|
|
||||||
"enableDmOnOpen":true
|
|
||||||
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
"messages":[
|
|
||||||
{
|
|
||||||
"id":"1",
|
|
||||||
"name":"Choose Your Ticket",
|
|
||||||
"description":"You can click one of the buttons below!",
|
|
||||||
"dropdown":false,
|
|
||||||
|
|
||||||
"enableFooter":false,
|
|
||||||
"footer":"Open Ticket v3.2.0 - I'm a footer!",
|
|
||||||
|
|
||||||
"enableThumbnail":false,
|
|
||||||
"thumbnail":"https://www.example.com/catmemes/cat.png",
|
|
||||||
|
|
||||||
"enableCustomColor":false,
|
|
||||||
"color":"#ffffff",
|
|
||||||
|
|
||||||
"options":["general","apply"],
|
|
||||||
|
|
||||||
"other":{
|
|
||||||
"enableTicketExplaination":true,
|
|
||||||
"enableMaxTicketsWarning":true,
|
|
||||||
|
|
||||||
"customDropdownPlaceholder":{
|
|
||||||
"enable":false,
|
|
||||||
"text":"Choose a ticket"
|
|
||||||
},
|
|
||||||
"customCategoryText":{
|
|
||||||
"enable":false,
|
|
||||||
"text":"choose a category:"
|
|
||||||
},
|
|
||||||
"embedTitleURL":{
|
|
||||||
"enable":false,
|
|
||||||
"url":"https://www.dj-dj.be/projects/open-ticket"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
/*
|
||||||
|
* Hi there! Thank you for installing Open Ticket.
|
||||||
|
* ----------------------------------------------
|
||||||
|
* If you need any assistance with configuring the bot,
|
||||||
|
* feel free to use the documentation or join our Discord server:
|
||||||
|
* https://otdocs.dj-dj.be
|
||||||
|
* https://discord.dj-dj.be
|
||||||
|
* ----------------------------------------------
|
||||||
|
* SETUP:
|
||||||
|
* 1. Install the required dependencies using the command: "npm install"
|
||||||
|
* 2. Configure the bot in one of the following ways:
|
||||||
|
* a. (easy) Using the Quick Setup CLI Tool
|
||||||
|
* b. (difficult) Using the JSON files in `./config/`
|
||||||
|
*
|
||||||
|
* Start the Quick Setup CLI Tool using the command: "npm run setup"
|
||||||
|
* After configuration, start the bot using the command: "npm start"
|
||||||
|
*
|
||||||
|
* Good luck! DJj123dj & contributors
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
"_CONFIG_VERSION":"open-ticket-v4.2.0",
|
||||||
|
|
||||||
|
/* Load the bot token from .env or the "token" field below. Leave "token" empty if using "tokenFromENV". */
|
||||||
|
"token":"INSERT_BOT_TOKEN",
|
||||||
|
"tokenFromENV":false,
|
||||||
|
|
||||||
|
"mainColor":"#f8ba00", //Hex color used in most embeds
|
||||||
|
"language":"english", //Visit README.md for list
|
||||||
|
"prefix":"!ticket ", //Prefix used in text commands
|
||||||
|
"serverId":"DISCORD_SERVER_ID",
|
||||||
|
"globalAdmins":["DISCORD_ROLE_ID"], //Have access to all commands
|
||||||
|
|
||||||
|
/* Enable/disable text or slash commands. */
|
||||||
|
"slashCommands":true,
|
||||||
|
"textCommands":true,
|
||||||
|
|
||||||
|
/* Configure the status of the bot. */
|
||||||
|
"status":{
|
||||||
|
"enabled":true,
|
||||||
|
"type":"listening", //Choices: listening, watching, playing, custom
|
||||||
|
"mode":"online", //Choices: online, invisible, idle, dnd
|
||||||
|
"text":"/help",
|
||||||
|
"state":"" //Additional text (Leave empty to disable)
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Send ticket logs to a channel or in DM of the ticket creator. */
|
||||||
|
"logs":{
|
||||||
|
"enabled":false,
|
||||||
|
"channel":"DISCORD_CHANNEL_ID",
|
||||||
|
"logMessages":{
|
||||||
|
"creation":{"dm":false,"logs":true},
|
||||||
|
"closing":{"dm":false,"logs":true},
|
||||||
|
"deleting":{"dm":false,"logs":true},
|
||||||
|
"reopening":{"dm":false,"logs":true},
|
||||||
|
"claiming":{"dm":false,"logs":true},
|
||||||
|
"pinning":{"dm":false,"logs":true},
|
||||||
|
"adding":{"dm":false,"logs":true},
|
||||||
|
"removing":{"dm":false,"logs":true},
|
||||||
|
"renaming":{"dm":false,"logs":true},
|
||||||
|
"moving":{"dm":false,"logs":true},
|
||||||
|
"blacklisting":{"dm":false,"logs":true},
|
||||||
|
"transferring":{"dm":false,"logs":true},
|
||||||
|
"topicChange":{"dm":false,"logs":true},
|
||||||
|
"priorityChange":{"dm":false,"logs":true},
|
||||||
|
"reactionRole":{"dm":false,"logs":true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* A large collection of settings for the ticket system. */
|
||||||
|
"ticketSystem":{
|
||||||
|
"preferSlashOverText":true, //Show slashcmds in help menu's
|
||||||
|
"sendErrorOnUnknownCommand":true, //Send error when command not found
|
||||||
|
"questionFieldsInCodeBlock":true, //Put question answers in code blocks
|
||||||
|
"displayFieldsWithQuestions":false, //Display embed fields together with question answers
|
||||||
|
"showGlobalAdminsInPanelRoles":false, //Include "globalAdmins" in panel admin lists
|
||||||
|
"disableVerifyBars":false, //Disable the (❌/✅) buttons
|
||||||
|
"useRedErrorEmbeds":true, //Make errors embeds always red
|
||||||
|
"alwaysShowReason":false, //Show reason even if none is provided
|
||||||
|
"emojiStyle":"before", //The style of emoji's in embeds. Choices: before, after, double, disabled
|
||||||
|
"pinEmoji":"📌", //Channel emoji of pinned tickets (Leave empty to disable)
|
||||||
|
"closeEmoji":"", //Channel emoji of closed tickets (Leave empty to disable)
|
||||||
|
|
||||||
|
"replyOnTicketCreation":true, //Reply with a msg when a ticket is created
|
||||||
|
"replyOnReactionRole":true, //Reply with a msg when a reaction role is used
|
||||||
|
"askPriorityOnTicketCreation":true, //Show a dropdown to select priority
|
||||||
|
"removeParticipantsOnClose":false, //Remove non-admins when ticket is closed
|
||||||
|
"disableAutocloseAfterReopen":true, //Disable autoclose after ticket got reopened
|
||||||
|
"autodeleteRequiresClosedTicket":true, //A ticket must be closed before autodelete works
|
||||||
|
"adminOnlyDeleteWithoutTranscript":true, //Only allow "globalAdmins" to delete a ticket without transcript
|
||||||
|
"allowCloseBeforeMessage":false, //Allow closing before a message is sent
|
||||||
|
"allowCloseBeforeAdminMessage":true, //Allow closing before an admin has sent a message
|
||||||
|
"useTranslatedConfigChecker":true, //Translate config errors in the console
|
||||||
|
"pinFirstTicketMessage":true, //Pin the ticket message to the channel
|
||||||
|
|
||||||
|
/* Enable/disable certain buttons & features of the bot. */
|
||||||
|
"enableTicketClaimButtons":true,
|
||||||
|
"enableTicketCloseButtons":true,
|
||||||
|
"enableTicketPinButtons":true,
|
||||||
|
"enableTicketDeleteButtons":true,
|
||||||
|
"enableTicketActionWithReason":true,
|
||||||
|
"enableDeleteWithoutTranscript":true, //Allow deleting tickets without transcript
|
||||||
|
"enableCreateTicketForOtherUser":true, //Allow creating tickets for other users
|
||||||
|
|
||||||
|
/* Set the maximum amount of simultaneous tickets. */
|
||||||
|
"limits":{
|
||||||
|
"enabled":true,
|
||||||
|
"globalMaximum":50,
|
||||||
|
"userMaximum":3
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Choose which data is shown in the channel topic. */
|
||||||
|
"channelTopic":{
|
||||||
|
"showOptionName":true,
|
||||||
|
"showOptionDescription":false,
|
||||||
|
"showOptionTopic":true,
|
||||||
|
"showPriority":false,
|
||||||
|
"showClosed":true,
|
||||||
|
"showClaimed":false,
|
||||||
|
"showPinned":false,
|
||||||
|
"showCreator":false,
|
||||||
|
"showParticipants":false
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Move closed tickets to a separate category. */
|
||||||
|
"closedCategory":{
|
||||||
|
"enabled":false,
|
||||||
|
"categoryId":"DISCORD_CATEGORY_ID"
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Create tickets in a backup category when the original category exceeds 50 channels. */
|
||||||
|
"backupCategory":{
|
||||||
|
"enabled":false,
|
||||||
|
"categoryId":"DISCORD_CATEGORY_ID"
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Move claimed tickets to a matching category of the user that claimed the ticket. Set to empty list [] to disable. */
|
||||||
|
"claimedCategories":[
|
||||||
|
{"user":"DISCORD_USER_ID","category":"DISCORD_CATEGORY_ID"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set permissions for each individual command, button or action.
|
||||||
|
* CHOICES:
|
||||||
|
* >> "none" -> Command disabled
|
||||||
|
* >> "everyone" -> Allowed for everyone
|
||||||
|
* >> "admin" -> Global & ticket admins only
|
||||||
|
* >> "DISCORD_ROLE_ID" -> Custom role only
|
||||||
|
*/
|
||||||
|
"permissions":{
|
||||||
|
"help":"everyone",
|
||||||
|
"panel":"admin",
|
||||||
|
"ticket":"none",
|
||||||
|
"close":"everyone",
|
||||||
|
"delete":"admin",
|
||||||
|
"reopen":"everyone",
|
||||||
|
"claim":"admin",
|
||||||
|
"unclaim":"admin",
|
||||||
|
"pin":"admin",
|
||||||
|
"unpin":"admin",
|
||||||
|
"move":"admin",
|
||||||
|
"rename":"admin",
|
||||||
|
"add":"admin",
|
||||||
|
"remove":"admin",
|
||||||
|
"blacklist":"admin",
|
||||||
|
"stats":"everyone",
|
||||||
|
"clear":"admin",
|
||||||
|
"autoclose":"admin",
|
||||||
|
"autodelete":"admin",
|
||||||
|
"transfer":"admin",
|
||||||
|
"topic":"admin",
|
||||||
|
"priority":"admin",
|
||||||
|
"transcripts":"admin"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
/*
|
||||||
|
* OPEN TICKET BUTTON OPTIONS
|
||||||
|
* ----------------------------------------------
|
||||||
|
* Create customizable ticket, website, reaction-role or sub-panel button options.
|
||||||
|
* Up to 25 options can be added to each panel in (config/panels.jsonc)
|
||||||
|
* There are 4 types of options available: ticket, website, role, sub-panel
|
||||||
|
*
|
||||||
|
* TIP: Create new options by copying everything between and including the {...} brackets of an option. Paste it after the last option and make sure that they are seperated by a comma.
|
||||||
|
*/
|
||||||
|
[
|
||||||
|
{
|
||||||
|
/* A ticket option creates a button to open a ticket. */
|
||||||
|
"id":"example-ticket",
|
||||||
|
"name":"Question",
|
||||||
|
"description":"Want to tell us something? Create this ticket for general questions for our support team.", //Leave empty to disable
|
||||||
|
"type":"ticket",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
/* Configure the button style of this option. At least one of "emoji" or "label" must be provided. */
|
||||||
|
"emoji":"🎫",
|
||||||
|
"label":"Question",
|
||||||
|
"color":"gray" //Choices: gray, red, green, blue
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Add up to 5 modal questions IDs from (config/questions.jsonc). */
|
||||||
|
"questions":["example-question-1","example-question-2"],
|
||||||
|
|
||||||
|
"ticketAdmins":["DISCORD_ROLE_ID"],
|
||||||
|
"readonlyAdmins":["DISCORD_ROLE_ID"],
|
||||||
|
"allowCreationByBlacklistedUsers":false,
|
||||||
|
|
||||||
|
"channel":{
|
||||||
|
/* Configure the name, topic and category of the ticket option. */
|
||||||
|
"prefix":"question-",
|
||||||
|
"suffix":"user-name", //Choices: user-name, user-id, random-number, random-hex, counter-dynamic, counter-fixed
|
||||||
|
"category":"DISCORD_CATEGORY_ID", //Leave empty to disable
|
||||||
|
"topic":"The ticket topic shown in the channel." //Leave empty to disable
|
||||||
|
},
|
||||||
|
|
||||||
|
"dmMessage":{
|
||||||
|
/* Send a customisable message in DM when creating a ticket. */
|
||||||
|
"enabled":false,
|
||||||
|
"text":"", //Leave empty to disable
|
||||||
|
"embed":{
|
||||||
|
"enabled":false,
|
||||||
|
"title":"Question Ticket", //Leave empty to disable
|
||||||
|
"description":"Thank you for creating a ticket in our server. We will try to help you as soon as possible.", //Leave empty to disable
|
||||||
|
"customColor":"#f8ab00", //Leave empty to use default color
|
||||||
|
|
||||||
|
"image":"", //Image URL. Leave empty to disable
|
||||||
|
"thumbnail":"", //Image URL. Leave empty to disable
|
||||||
|
/* Embed fields. Set to empty list [] to disable. */
|
||||||
|
"fields":[
|
||||||
|
{"name":"FIELD_NAME","value":"FIELD_VALUE","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ticketMessage":{
|
||||||
|
/* Send a customisable message in the ticket with close, claim, delete, ... buttons. */
|
||||||
|
"enabled":true,
|
||||||
|
"text":"", //Leave empty to disable
|
||||||
|
"embed":{
|
||||||
|
"enabled":true,
|
||||||
|
"title":"Question Ticket", //Leave empty to disable
|
||||||
|
"description":"Thank you for creating a ticket in our server.\nOur support team will assist you as soon as possible.", //Leave empty to disable
|
||||||
|
"customColor":"#f8ab00", //Leave empty to use default color
|
||||||
|
|
||||||
|
"image":"", //Image URL. Leave empty to disable
|
||||||
|
"thumbnail":"", //Image URL. Leave empty to disable
|
||||||
|
/* Embed fields. Set to empty list [] to disable. */
|
||||||
|
"fields":[
|
||||||
|
{"name":"FIELD_NAME","value":"FIELD_VALUE","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
},
|
||||||
|
"ping":{
|
||||||
|
/* Customise the user & role mentions of this ticket message. */
|
||||||
|
"@here":true,
|
||||||
|
"@everyone":false,
|
||||||
|
"custom":["DISCORD_ROLE_ID"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoclose":{
|
||||||
|
/* Autoclose this ticket after a period of inactivity or when the creator leaves the server. */
|
||||||
|
"enableInactiveHours":false,
|
||||||
|
"inactiveHours":24,
|
||||||
|
"enableUserLeave":false,
|
||||||
|
"disableOnClaim":false
|
||||||
|
},
|
||||||
|
"autodelete":{
|
||||||
|
/* Autodelete this ticket after a period of inactivity or when the creator leaves the server. */
|
||||||
|
"enableInactiveDays":false,
|
||||||
|
"inactiveDays":7,
|
||||||
|
"enableUserLeave":false,
|
||||||
|
"disableOnClaim":false
|
||||||
|
},
|
||||||
|
"cooldown":{
|
||||||
|
/* Users must wait a certain period before being able to create another ticket of this type. */
|
||||||
|
"enabled":false,
|
||||||
|
"cooldownMinutes":10
|
||||||
|
},
|
||||||
|
"limits":{
|
||||||
|
/* Set the maximum amount of simultaneous tickets of this option. */
|
||||||
|
"enabled":false,
|
||||||
|
"globalMaximum":20,
|
||||||
|
"userMaximum":3
|
||||||
|
},
|
||||||
|
"slowMode":{
|
||||||
|
/* Enable slow-mode in the ticket channel. */
|
||||||
|
"enabled":false,
|
||||||
|
"slowModeSeconds":20
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* A website option creates a button with a URL to an external website. */
|
||||||
|
"id":"example-website",
|
||||||
|
"name":"Website",
|
||||||
|
"description":"Take a look at our amazing website.", //Leave empty to disable
|
||||||
|
"type":"website",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
/* Configure the button style of this option. At least one of "emoji" or "label" must be provided. */
|
||||||
|
"emoji":"😃",
|
||||||
|
"label":"Visit Website"
|
||||||
|
},
|
||||||
|
|
||||||
|
"url":"https://www.dj-dj.be"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* A reaction-role option creates a button for members to choose roles. */
|
||||||
|
"id":"example-role",
|
||||||
|
"name":"Update Ping",
|
||||||
|
"description":"Receive notifications about updates in our server.", //Leave empty to disable
|
||||||
|
"type":"role",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
/* Configure the button style of this option. At least one of "emoji" or "label" must be provided. */
|
||||||
|
"emoji":"📢",
|
||||||
|
"label":"Update Ping",
|
||||||
|
"color":"gray" //Choices: gray, red, green, blue
|
||||||
|
},
|
||||||
|
|
||||||
|
"roles":["DISCORD_ROLE_ID"],
|
||||||
|
"mode":"add&remove OR remove OR add", //What to do with the roles. Choices: add&remove, add, remove
|
||||||
|
"removeRolesOnAdd":["DISCORD_ROLE_ID"], //Remove these old roles when new roles are added.
|
||||||
|
"addOnMemberJoin":false //Add these roles automatically when joining the server.
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* A sub-panel option creates a button which sends another panel for additional options. */
|
||||||
|
"id":"example-sub-panel",
|
||||||
|
"name":"Example Sub-Panel",
|
||||||
|
"description":"This is an example of how to implement a sub-panel in Open Ticket.", //Leave empty to disable
|
||||||
|
"type":"sub-panel",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
/* Configure the button style of this option. At least one of "emoji" or "label" must be provided. */
|
||||||
|
"emoji":"📋",
|
||||||
|
"label":"Sub-Panel Example",
|
||||||
|
"color":"gray" //Choices: gray, red, green, blue
|
||||||
|
},
|
||||||
|
|
||||||
|
"subPanelId":"example-panel" //Choose a panel ID from (config/panels.jsonc)
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* OPEN TICKET PANELS
|
||||||
|
* ----------------------------------------------
|
||||||
|
* Create customizable panel messages with buttons or a dropdown.
|
||||||
|
* Add up to 25 options to this panel from (config/options.jsonc)
|
||||||
|
* Panels can be customised with text, images, colors and more.
|
||||||
|
*
|
||||||
|
* Spawn the panel in Discord using: /panel <id>
|
||||||
|
*
|
||||||
|
* TIP: Create new panels by copying everything between and including the {...} brackets of an panel. Paste it after the last panel and make sure that they are seperated by a comma.
|
||||||
|
*/
|
||||||
|
[
|
||||||
|
{
|
||||||
|
/* A panel is creates a message with up to 25 options as buttons or dropdown. */
|
||||||
|
"id":"example-panel",
|
||||||
|
"name":"Example Panel",
|
||||||
|
"dropdown":false,
|
||||||
|
|
||||||
|
/* Add up to 5 option IDs from (config/options.jsonc). */
|
||||||
|
"options":["example-ticket","example-website","example-role"],
|
||||||
|
|
||||||
|
"text":"", //Leave empty to disable
|
||||||
|
"embed":{
|
||||||
|
"enabled":true,
|
||||||
|
"title":"Tickets:", //Leave empty to disable
|
||||||
|
"description":"Create a ticket by selecting one of the options below. Once selected, a private ticket will be created for you and our support team will be able to assist you directly.", //Leave empty to disable
|
||||||
|
|
||||||
|
"customColor":"#f8ab00", //Leave empty to use default color
|
||||||
|
"url":"", //URL. Leave empty to disable
|
||||||
|
|
||||||
|
"image":"", //Image URL. Leave empty to disable
|
||||||
|
"thumbnail":"", //Image URL. Leave empty to disable
|
||||||
|
|
||||||
|
"footer":"Open Ticket v4.2.0", //Leave empty to disable
|
||||||
|
/* Embed fields. Set to empty list [] to disable. */
|
||||||
|
"fields":[
|
||||||
|
{"name":"Field name","value":"Field value","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
},
|
||||||
|
"settings":{
|
||||||
|
"dropdownPlaceholder":"Create a ticket...", //Leave empty to use default.
|
||||||
|
"maximumButtonsPerRow":5,
|
||||||
|
|
||||||
|
/* Display the maximum amount of tickets per user. */
|
||||||
|
"enableMaxTicketsWarningInText":false,
|
||||||
|
"enableMaxTicketsWarningInEmbed":true,
|
||||||
|
|
||||||
|
/* Automatically generate option descriptions from (config/options.jsonc). */
|
||||||
|
"describeOptionsLayout":"normal", //Choices: simple, normal, detailed
|
||||||
|
"describeOptionsCustomTitle":"",
|
||||||
|
"describeOptionsInText":false,
|
||||||
|
"describeOptionsInEmbedFields":true,
|
||||||
|
"describeOptionsInEmbedDescription":false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* OPEN TICKET MODAL QUESTIONS
|
||||||
|
* ----------------------------------------------
|
||||||
|
* Create customizable modal questions that will be shown before creating a ticket.
|
||||||
|
* Each ticket option (config/options.jsonc) can contain a maximum of 5 questions.
|
||||||
|
* There are 6 types of questions available: short, paragraph, dropdown, radio-select, checkbox-select, text-display
|
||||||
|
*
|
||||||
|
* TIP: Create new questions by copying everything between and including the {...} brackets of a question. Paste it after the last question and make sure that they are seperated by a comma.
|
||||||
|
*/
|
||||||
|
[
|
||||||
|
{
|
||||||
|
/* A short text input modal question. */
|
||||||
|
"id":"example-question-1",
|
||||||
|
"name":"Example Question 1",
|
||||||
|
"description":"", //Leave empty to disable
|
||||||
|
"type":"short",
|
||||||
|
"required":true,
|
||||||
|
|
||||||
|
"placeholder":"Insert answer...",
|
||||||
|
"length":{
|
||||||
|
/* Configure length limits for the answer. */
|
||||||
|
"enabled":false,
|
||||||
|
"min":0,
|
||||||
|
"max":1000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* A paragraph text input modal question. */
|
||||||
|
"id":"example-question-2",
|
||||||
|
"name":"Example Question 2",
|
||||||
|
"description":"", //Leave empty to disable
|
||||||
|
"type":"paragraph",
|
||||||
|
"required":false,
|
||||||
|
|
||||||
|
"placeholder":"Insert answer...",
|
||||||
|
"length":{
|
||||||
|
/* Configure length limits for the answer. */
|
||||||
|
"enabled":false,
|
||||||
|
"min":0,
|
||||||
|
"max":1000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* A dropdown menu input modal question with up to 25 choices. "emoji" & "description" fields are optional. */
|
||||||
|
"id":"example-question-3",
|
||||||
|
"name":"Example Question 3",
|
||||||
|
"description":"This is a dropdown question.", //Leave empty to disable
|
||||||
|
"type":"dropdown",
|
||||||
|
"required":false,
|
||||||
|
|
||||||
|
"placeholder":"Choose your answer...",
|
||||||
|
"choices":[
|
||||||
|
{"title":"Choice A","description":"Apple","emoji":"🍎"},
|
||||||
|
{"title":"Choice B","description":"Banana","emoji":"🍌"},
|
||||||
|
{"title":"Choice C","description":"Orange","emoji":"🍊"},
|
||||||
|
{"title":"Choice D","description":"Kiwi","emoji":"🥝"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* A radio select input modal question with up to 10 choices. */
|
||||||
|
"id":"example-question-4",
|
||||||
|
"name":"Example Question 4",
|
||||||
|
"description":"This is a radio select question.", //Leave empty to disable
|
||||||
|
"type":"radio-select",
|
||||||
|
"required":true,
|
||||||
|
|
||||||
|
"choices":[
|
||||||
|
{"title":"Choice A","description":"Up","selectedByDefault":false},
|
||||||
|
{"title":"Choice B","description":"Down","selectedByDefault":false},
|
||||||
|
{"title":"Choice C","description":"Left","selectedByDefault":false},
|
||||||
|
{"title":"Choice D","description":"Right","selectedByDefault":false}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* A checkbox select input modal question with up to 10 choices. */
|
||||||
|
"id":"example-question-5",
|
||||||
|
"name":"Example Question 5",
|
||||||
|
"description":"This is a checkbox select question.", //Leave empty to disable
|
||||||
|
"type":"checkbox-select",
|
||||||
|
"required":true,
|
||||||
|
|
||||||
|
"limits":{
|
||||||
|
/* Configure checkbox amount limits for the answer. */
|
||||||
|
"enabled":false,
|
||||||
|
"min":0,
|
||||||
|
"max":10
|
||||||
|
},
|
||||||
|
"choices":[
|
||||||
|
{"title":"Choice A","description":"Happiness","selectedByDefault":false},
|
||||||
|
{"title":"Choice B","description":"Anger","selectedByDefault":false},
|
||||||
|
{"title":"Choice C","description":"Sadness","selectedByDefault":false},
|
||||||
|
{"title":"Choice D","description":"Fear","selectedByDefault":false}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* Show text in a modal to provide extra details or explain questions. */
|
||||||
|
"id":"example-text-display",
|
||||||
|
"type":"text-display",
|
||||||
|
|
||||||
|
"textContents":"This is a text display. It isn't a question, but allows you to display additional details."
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* OPEN TICKET TRANSCRIPTS
|
||||||
|
* ----------------------------------------------
|
||||||
|
* Enable transcript creation when tickets are deleted. There are 2 available transcript types: HTML & Text
|
||||||
|
*
|
||||||
|
* HTML Transcripts (recommended):
|
||||||
|
* Generate transcripts as HTML files to view in the browser. No server or domain required. HTML Transcripts use an external service to process and host the transcripts.
|
||||||
|
*
|
||||||
|
* Text Transcripts:
|
||||||
|
* Generate transcripts as simple .txt files with limited details. Processing happens fully local.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
"general":{
|
||||||
|
"enabled":false,
|
||||||
|
|
||||||
|
/* Choose which users and channel get the generated transcript. */
|
||||||
|
"enableChannel":false,
|
||||||
|
"enableCreatorDM":false,
|
||||||
|
"enableParticipantDM":false,
|
||||||
|
"enableActiveAdminDM":false,
|
||||||
|
"enableEveryAdminDM":false,
|
||||||
|
|
||||||
|
"channel":"DISCORD_CHANNEL_ID", //Where to send transcripts. Leave empty when disabled.
|
||||||
|
"mode":"html" //The type of transcript to use. Choices: html, text
|
||||||
|
},
|
||||||
|
"embedSettings":{
|
||||||
|
/* Customise the embed which contains the generated transcript file or URL. */
|
||||||
|
"customColor":"#f8ab00", //Leave empty to use default color
|
||||||
|
"listAllParticipants":false,
|
||||||
|
"includeTicketStats":false
|
||||||
|
},
|
||||||
|
"textTranscriptStyle":{
|
||||||
|
/* Customise layout of the text transcripts. */
|
||||||
|
"layout":"normal", //Choices: simple, normal, detailed
|
||||||
|
"includeStats":true,
|
||||||
|
"includeIds":false,
|
||||||
|
"includeEmbeds":true,
|
||||||
|
"includeFiles":true,
|
||||||
|
"includeBotMessages":true,
|
||||||
|
|
||||||
|
"fileMode":"custom", //How to name the transcript file? Choices: custom, channel-name, channel-id, user-name, user-id
|
||||||
|
"customFileName":"transcript" //Custom filename without extension
|
||||||
|
},
|
||||||
|
"htmlTranscriptStyle":{
|
||||||
|
/* Customise layout of the HTML transcripts. */
|
||||||
|
"background":{
|
||||||
|
"enableCustomBackground":false,
|
||||||
|
"backgroundColor":"#f8ba00", //Leave empty to use Open Ticket color (#f8ba00)
|
||||||
|
"backgroundImage":"https://www.example.com/image.png" //Image URL to fill entire background. Leave empty to disable
|
||||||
|
},
|
||||||
|
"header":{
|
||||||
|
"enableCustomHeader":false,
|
||||||
|
"backgroundColor":"#202225",
|
||||||
|
"decoColor":"#f8ba00",
|
||||||
|
"textColor":"#ffffff"
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"enableCustomStats":false,
|
||||||
|
"backgroundColor":"#202225",
|
||||||
|
"keyTextColor":"#737373",
|
||||||
|
"valueTextColor":"#ffffff",
|
||||||
|
"hideBackgroundColor":"#40444a",
|
||||||
|
"hideTextColor":"#ffffff"
|
||||||
|
},
|
||||||
|
"favicon":{
|
||||||
|
"enableCustomFavicon":false,
|
||||||
|
"imageUrl":"https://t.dj-dj.be/favicon.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
//base
|
|
||||||
const bot = require("../../index")
|
|
||||||
|
|
||||||
exports.client = bot.client
|
|
||||||
exports.config = bot.config
|
|
||||||
exports.utils = {
|
|
||||||
log:bot.errorLog.log(),
|
|
||||||
storage:bot.storage
|
|
||||||
}
|
|
||||||
|
|
||||||
//events
|
|
||||||
const events = require("./modules/events").events
|
|
||||||
exports.events = events
|
|
||||||
|
|
||||||
//actions
|
|
||||||
const actions = require("./modules/actions").actions
|
|
||||||
//comming soon
|
|
||||||
//exports.actions = actions
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
{
|
|
||||||
"version":"1.0.0",
|
|
||||||
"enableAPIdebug":false,
|
|
||||||
"enableAPIconsolelogs":false,
|
|
||||||
|
|
||||||
"info":"If you turn these switches to true, then the feature will be turned OFF!",
|
|
||||||
"info2":"You can use this to disable some features you don't want!",
|
|
||||||
"disable":{
|
|
||||||
"messages":{
|
|
||||||
"DISCLAIMER":"the messages part doesn't work yet!",
|
|
||||||
"ticketCreated":false,
|
|
||||||
"ticketClosed":false,
|
|
||||||
"ticketDeleted":false,
|
|
||||||
"ticketReopened":false
|
|
||||||
},
|
|
||||||
"transcripts":{
|
|
||||||
"server":false,
|
|
||||||
"dm":false
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"text":{
|
|
||||||
"help":false,
|
|
||||||
"msg":false,
|
|
||||||
"close":false,
|
|
||||||
"delete":false,
|
|
||||||
"reopen":false,
|
|
||||||
"new":false,
|
|
||||||
"add":false,
|
|
||||||
"remove":false,
|
|
||||||
"rename":false,
|
|
||||||
"claim":false,
|
|
||||||
"unclaim":false,
|
|
||||||
"change":false
|
|
||||||
},
|
|
||||||
"slash":{
|
|
||||||
"help":false,
|
|
||||||
"msg":false,
|
|
||||||
"close":false,
|
|
||||||
"delete":false,
|
|
||||||
"reopen":false,
|
|
||||||
"new":false,
|
|
||||||
"add":false,
|
|
||||||
"remove":false,
|
|
||||||
"rename":false,
|
|
||||||
"claim":false,
|
|
||||||
"unclaim":false,
|
|
||||||
"change":false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"checkerjs":{
|
|
||||||
"token":false,
|
|
||||||
"all":false
|
|
||||||
},
|
|
||||||
"debug":{
|
|
||||||
"all":false,
|
|
||||||
"debuglogs":false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
//ACTIONS:
|
|
||||||
|
|
||||||
|
|
||||||
//EXPORT ACTIONS:
|
|
||||||
exports.actions = {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
/** FOR DEVELOPERS ONLY!!
|
|
||||||
* Don't change anything in this file before reading the documentation!
|
|
||||||
* visit the api documentation at https://docs.openticket.dj-dj.be
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
exports.embeddedMode = false
|
|
||||||
exports.clientLocation = require("../../../index").client
|
|
||||||
@@ -1,454 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
const configParser = require("../../utils/configParser")
|
|
||||||
|
|
||||||
|
|
||||||
//EVENT API:
|
|
||||||
const ticketOpenListeners = []
|
|
||||||
const ticketCloseListeners = []
|
|
||||||
const ticketDeleteListeners = []
|
|
||||||
const ticketReopenListeners = []
|
|
||||||
|
|
||||||
const ticketAddListeners = []
|
|
||||||
const ticketRemoveListeners = []
|
|
||||||
|
|
||||||
const ticketClaimListeners = []
|
|
||||||
const ticketUnclaimListeners = []
|
|
||||||
const ticketChangeListeners = []
|
|
||||||
|
|
||||||
|
|
||||||
const transcriptCreationListeners = []
|
|
||||||
const commandListeners = []
|
|
||||||
const reactionRoleListeners = []
|
|
||||||
const errorListeners = []
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
|
|
||||||
*/
|
|
||||||
exports.onTicketOpen = (user,channel,guild,date,ticketdata) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","new ticket created",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
|
||||||
|
|
||||||
ticketOpenListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(user,channel,guild,date,ticketdata)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
* @param {String} reason
|
|
||||||
*/
|
|
||||||
exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","ticket closed",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)},{key:"reason",value:reason}])
|
|
||||||
|
|
||||||
ticketCloseListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(user,channel,guild,date,ticketdata,reason)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","ticket deleted",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
|
||||||
|
|
||||||
ticketDeleteListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(user,channel,guild,date,ticketdata)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
exports.onTicketReopen = (user,channel,guild,date,ticketdata) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","ticket reopened",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
|
||||||
|
|
||||||
ticketReopenListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(user,channel,guild,date,ticketdata)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.User} editeduser
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","user added to ticket",[{key:"userid",value:user.id},{key:"editeduser",value:editeduser.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
|
||||||
|
|
||||||
ticketAddListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(user,editeduser,channel,guild,date,ticketdata)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.User} editeduser
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
exports.onTicketRemove = (user,editeduser,channel,guild,date,ticketdata) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","user removed from ticket",[{key:"userid",value:user.id},{key:"editeduser",value:editeduser.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
|
||||||
|
|
||||||
ticketRemoveListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(user,editeduser,channel,guild,date,ticketdata)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
exports.onTicketClaim = (user,channel,guild,date,ticketdata) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","user claimed a ticket",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
|
||||||
|
|
||||||
ticketClaimListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(user,channel,guild,date,ticketdata)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
exports.onTicketUnclaim = (user,channel,guild,date,ticketdata) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","user unclaimed a ticket",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
|
||||||
|
|
||||||
ticketUnclaimListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(user,channel,guild,date,ticketdata)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} newtype
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
exports.onTicketChange = (newtype,user,channel,guild,date,ticketdata) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","user changed ticket type",[{key:"newtype",value:newtype},{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
|
||||||
|
|
||||||
ticketChangeListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(newtype,user,channel,guild,date,ticketdata)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.Message[]} messages
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
*/
|
|
||||||
exports.onTranscriptCreation = (messages,channel,guild,date) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","transcript created",[{key:"messages",value:JSON.stringify(messages)},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}])
|
|
||||||
|
|
||||||
transcriptCreationListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(messages,channel,guild,date)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@typedef {"help"|"message"|"close"|"delete"|"reopen"|"rename"|"add"|"remove"|"claim"|"unclaim"|"change"} OTCommandType */
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {OTCommandType} type
|
|
||||||
* @param {Boolean} hasPerms
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
*/
|
|
||||||
exports.onCommand = (type,hasPerms,user,channel,guild,date) => {
|
|
||||||
|
|
||||||
const newguild = guild ? guild : false
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","someone used a command",[{key:"type",value:type},{key:"hasPerms",value:hasPerms},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:newguild.id}])
|
|
||||||
|
|
||||||
commandListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(type,hasPerms,user,channel,newguild,date)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@typedef {"add"|"remove"|"add&remove"} OTReactionRoleType */
|
|
||||||
/**@typedef {"add"|"remove"} OTReactionRoleMode */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {OTReactionRoleMode} mode
|
|
||||||
* @param {OTReactionRoleType} type
|
|
||||||
* @param {discord.Role} role
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
*/
|
|
||||||
exports.onReactionRole = (mode,type,role,user,channel,guild,date) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","someone used a reaction role",[{key:"mode",value:mode},{key:"type",value:type},{key:"roleid",value:role.id},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}])
|
|
||||||
|
|
||||||
reactionRoleListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(mode,type,role,user,channel,guild,date)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} err
|
|
||||||
* @param {Date} date
|
|
||||||
*/
|
|
||||||
exports.onError = (err,date) => {
|
|
||||||
//system
|
|
||||||
bot.errorLog.log("api","there is an error",[{key:"error",value:err}])
|
|
||||||
|
|
||||||
errorListeners.forEach((func) => {
|
|
||||||
try {
|
|
||||||
func(err,date)
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//EVENT CALLBACKS:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback TicketActionEvent
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback TicketCloseEvent
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
* @param {String} reason
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback TranscriptCreationEvent
|
|
||||||
* @param {discord.Message[]} messages
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback TicketUserChangeEvent
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.User} editeduser
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback TicketTypeChangeEvent
|
|
||||||
* @param {String} newtype
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback CommandEvent
|
|
||||||
* @param {OTCommandType} type
|
|
||||||
* @param {Boolean} hasPerms
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild|false} guild
|
|
||||||
* @param {Date} date
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback ReactionRoleEvent
|
|
||||||
* @param {OTReactionRoleMode} mode
|
|
||||||
* @param {OTReactionRoleType} type
|
|
||||||
* @param {discord.Role} role
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {Date} date
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback ErrorEvent
|
|
||||||
* @param {String} error
|
|
||||||
* @param {Date} date
|
|
||||||
*/
|
|
||||||
|
|
||||||
//EVENT EXPORT:
|
|
||||||
|
|
||||||
/**@param {TicketActionEvent} callback */
|
|
||||||
const onTicketOpen = (callback) => {
|
|
||||||
ticketOpenListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TicketCloseEvent} callback */
|
|
||||||
const onTicketClose = (callback) => {
|
|
||||||
ticketCloseListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TicketActionEvent} callback */
|
|
||||||
const onTicketDelete = (callback) => {
|
|
||||||
ticketDeleteListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TicketActionEvent} callback */
|
|
||||||
const onTicketReopen = (callback) => {
|
|
||||||
ticketReopenListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TicketUserChangeEvent} callback */
|
|
||||||
const onTicketAdd = (callback) => {
|
|
||||||
ticketAddListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TicketUserChangeEvent} callback */
|
|
||||||
const onTicketRemove = (callback) => {
|
|
||||||
ticketRemoveListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TicketActionEvent} callback */
|
|
||||||
const onTicketClaim = (callback) => {
|
|
||||||
ticketClaimListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TicketActionEvent} callback */
|
|
||||||
const onTicketUnclaim = (callback) => {
|
|
||||||
ticketUnclaimListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TicketTypeChangeEvent} callback */
|
|
||||||
const onTicketChange = (callback) => {
|
|
||||||
ticketChangeListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {TranscriptCreationEvent} callback */
|
|
||||||
const onTranscriptCreation = (callback) => {
|
|
||||||
transcriptCreationListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {CommandEvent} callback */
|
|
||||||
const onCommand = (callback) => {
|
|
||||||
commandListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {ReactionRoleEvent} callback */
|
|
||||||
const onReactionRole = (callback) => {
|
|
||||||
commandListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {ErrorEvent} callback */
|
|
||||||
const onError = (callback) => {
|
|
||||||
errorListeners.push(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.events = {
|
|
||||||
onTicketOpen,
|
|
||||||
onTicketClose,
|
|
||||||
onTicketDelete,
|
|
||||||
onTicketReopen,
|
|
||||||
onTicketAdd,
|
|
||||||
onTicketRemove,
|
|
||||||
onTicketClaim,
|
|
||||||
onTicketUnclaim,
|
|
||||||
onTicketChange,
|
|
||||||
onTranscriptCreation,
|
|
||||||
onCommand,
|
|
||||||
onReactionRole,
|
|
||||||
onError
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
const fs = require("fs")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
const files = fs.readdirSync("./plugins")
|
|
||||||
const api = require("./api.json")
|
|
||||||
var totalcount = 0
|
|
||||||
var successcount = 0
|
|
||||||
var failcount = 0
|
|
||||||
files.forEach((file) => {
|
|
||||||
if (file.endsWith(".plugin.js")){
|
|
||||||
try {
|
|
||||||
require("../../plugins/"+file)()
|
|
||||||
|
|
||||||
successcount++
|
|
||||||
totalcount++
|
|
||||||
}catch(err){
|
|
||||||
/**@type {Error} */
|
|
||||||
const theError = err
|
|
||||||
if (api.enableAPIdebug){
|
|
||||||
try {
|
|
||||||
const data = fs.readFileSync("./apiDebug.txt")
|
|
||||||
const newData = data ? data.toString() : ""
|
|
||||||
fs.writeFileSync("./apiDebug.txt",newData+"ERROR: "+theError.name+": "+theError.message+"\n"+theError.stack+"\n\n")
|
|
||||||
}catch{
|
|
||||||
fs.writeFileSync("./apiDebug.txt","ERROR: "+theError.name+": "+theError.message+"\n"+theError.stack+"\n\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failcount++
|
|
||||||
totalcount++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
log("info","loaded plugins",[{key:"success",value:successcount},{key:"error",value:failcount},{key:"total",value:totalcount}])
|
|
||||||
}
|
|
||||||
-495
@@ -1,495 +0,0 @@
|
|||||||
exports.checker = async () => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
|
|
||||||
if (process.argv.some((v) => v == "--nochecker")) return
|
|
||||||
if (process.argv.some((v) => v == "--devconfig")){
|
|
||||||
//console.log(chalk.blue("=> used dev config instead of normal config"))
|
|
||||||
try{
|
|
||||||
var tempconfig = require("../devConfig.json")
|
|
||||||
}catch(err){console.log(err);var tempconfig = require("../config.json")}
|
|
||||||
}else{
|
|
||||||
var tempconfig = require("../config.json")
|
|
||||||
}
|
|
||||||
|
|
||||||
const config = tempconfig
|
|
||||||
var errorList = []
|
|
||||||
var isError = false
|
|
||||||
var warnList = []
|
|
||||||
var isWarn = false
|
|
||||||
const createError = (message) => {
|
|
||||||
isError = true
|
|
||||||
errorList.push("open-ticket CONFIG ERROR: "+message)
|
|
||||||
}
|
|
||||||
const createWarn = (message) => {
|
|
||||||
isWarn = true
|
|
||||||
warnList.push("open-ticket CONFIG WARNING: "+message)
|
|
||||||
}
|
|
||||||
|
|
||||||
//validators
|
|
||||||
/**@param {"userid"|"roleid"|"channelid"|"serverid"|"categoryid"} mode @param {String} value @param {String} path */
|
|
||||||
const checkDiscord = (mode,value,path) => {
|
|
||||||
if (mode == "userid"){
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+"' | this user id is invalid")
|
|
||||||
}
|
|
||||||
}else if (mode == "channelid"){
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+"' | this channel id is invalid")
|
|
||||||
}
|
|
||||||
}else if (mode == "roleid"){
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+"' | this role id is invalid")
|
|
||||||
}
|
|
||||||
}else if (mode == "serverid"){
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+"' | this server id is invalid")
|
|
||||||
}
|
|
||||||
}else if (mode == "categoryid"){
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+"' | this category id is invalid")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**@param {String} value */
|
|
||||||
const checkToken = (value) => {
|
|
||||||
if (value.length < 40){
|
|
||||||
createError("'auth_token' | your token is invalid")
|
|
||||||
}
|
|
||||||
if (value.includes(" ")) createError("'auth_token' | your token includes spaces!")
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {String} value @param {String} path */
|
|
||||||
const checkHexColor = (value,path) => {
|
|
||||||
if (!/^#[a-fA-F0-9]{3,6}$/.test(value)){
|
|
||||||
if (value.length < 4) return createError("'"+path+"' | hex color too short! (example: #123abc)")
|
|
||||||
if (value.length > 7) return createError("'"+path+"' | hex color too long! (example: #123abc)")
|
|
||||||
createError("'"+path+"' | invalid color! (example: #123abc)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {String} value @param {String} path */
|
|
||||||
const checkEmbedColor = (value,path) => {
|
|
||||||
if (!['DEFAULT','WHITE','AQUA','GREEN','BLUE','YELLOW','PURPLE','LUMINOUS_VIVID_PINK','FUCHSIA','GOLD','ORANGE','RED','GREY','DARKER_GREY','NAVY','DARK_AQUA','DARK_GREEN','DARK_BLUE','DARK_PURPLE','DARK_VIVID_PINK','DARK_GOLD','DARK_ORANGE','DARK_RED','DARK_GREY','LIGHT_GREY','DARK_NAVY','BLURPLE','GREYPLE','DARK_BUT_NOT_BLACK','NOT_QUITE_BLACK','RANDOM'].includes(value)){
|
|
||||||
return createError("'"+path+"' | invalid color, must be a hex code or default color (more info in the wiki)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {String} value @param {String} path @param {Number} minLength @param {Number} maxLength @param {String} name */
|
|
||||||
const checkString = (value,minLength,maxLength,path,name) => {
|
|
||||||
if (value.length < minLength){
|
|
||||||
createError("'"+path+"' | "+name+" is too short!")
|
|
||||||
}else if (value.length > maxLength){
|
|
||||||
createError("'"+path+"' | "+name+" is too long!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {"userid"|"roleid"|"channelid"|"serverid"} mode @param {String[]} arrayValue @param {String} path */
|
|
||||||
const checkDiscordArray = (mode,arrayValue,path) => {
|
|
||||||
if (!Array.isArray(arrayValue)){
|
|
||||||
return createError("'"+path+"' | this needs to be an Array!")
|
|
||||||
}
|
|
||||||
if (mode == "userid"){
|
|
||||||
arrayValue.forEach((value,index) => {
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+":"+index+"' | this user id is invalid")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else if (mode == "channelid"){
|
|
||||||
arrayValue.forEach((value,index) => {
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+":"+index+"' | this channel id is invalid")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else if (mode == "roleid"){
|
|
||||||
arrayValue.forEach((value,index) => {
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+":"+index+"' | this role id is invalid")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else if (mode == "serverid"){
|
|
||||||
arrayValue.forEach((value,index) => {
|
|
||||||
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
|
||||||
createError("'"+path+":"+index+"' | this server id is invalid")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**@param {String} value @param {"string"|"boolean"|"number"} type */
|
|
||||||
const checkType = (value,type,path) => {
|
|
||||||
if (type == "boolean"){
|
|
||||||
if (typeof value != "boolean"){
|
|
||||||
createError("'"+path+"' | invalid type, this must be a boolean!")
|
|
||||||
}
|
|
||||||
}else if (type == "number"){
|
|
||||||
if (typeof value != "number"){
|
|
||||||
createError("'"+path+"' | invalid type, this must be a number!")
|
|
||||||
}
|
|
||||||
}else if (type == "string"){
|
|
||||||
if (typeof value != "string"){
|
|
||||||
createError("'"+path+"' | invalid type, this must be a string!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const checkButtonColor = (value,path) => {
|
|
||||||
if (value != "none" && value != "grey" && value != "gray" && value != "black" && value != "red" && value != "green" && value != "blue" && value != "blurple"){
|
|
||||||
createError("'"+path+"' | invalid color, it must be one of these: none, gray, red, green, blue!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const configParser = require("./utils/configParser")
|
|
||||||
/**
|
|
||||||
* @param {configParser.OTAllOptions} option
|
|
||||||
* @param {String} path
|
|
||||||
*/
|
|
||||||
|
|
||||||
const checkOption = (option,path) => {
|
|
||||||
|
|
||||||
//id
|
|
||||||
checkType(option.id,"string",path+"/id")
|
|
||||||
if (option.id.includes(" ")){
|
|
||||||
createError("'"+path+"/id' | option id can't contain space characters!")
|
|
||||||
}
|
|
||||||
if (option.id.length > 20){
|
|
||||||
createError("'"+path+"/id' | option id max lenght is 20!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//name
|
|
||||||
checkType(option.name,"string",path+"/name")
|
|
||||||
if (option.name.length > 100){
|
|
||||||
createWarn("'"+path+"/name' | if your name is too long it maybe doesn't look so good!")
|
|
||||||
}else if (option.name.length < 1){
|
|
||||||
createError("'"+path+"/name' | there is no name!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//description
|
|
||||||
checkType(option.description,"string",path+"/description")
|
|
||||||
|
|
||||||
//icon
|
|
||||||
const emojiRegex = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/gi;
|
|
||||||
if (option.icon.length > 0){
|
|
||||||
|
|
||||||
const isEmoji = emojiRegex.test(option.icon)
|
|
||||||
|
|
||||||
if (isEmoji == false){
|
|
||||||
createError("'"+path+"/icon' | invalid emoji or custom discord emoji")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
checkType(option.icon,"string",path+"/icon")
|
|
||||||
|
|
||||||
//label
|
|
||||||
checkType(option.label,"string",path+"/label")
|
|
||||||
if (option.label.length < 1 && option.icon.length < 1){
|
|
||||||
createError("'"+path+"' | you need at least one of these: label, icon!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//type
|
|
||||||
checkType(option.type,"string",path+"/type")
|
|
||||||
if (option.type != "ticket" && option.type != "website" && option.type != "role"){
|
|
||||||
createError("'"+path+"/type' | the type must be one of these: ticket, website, role!")
|
|
||||||
}
|
|
||||||
/**@type {"ticket"|"website"|"role"} */
|
|
||||||
const type = option.type
|
|
||||||
|
|
||||||
if (type == "ticket"){
|
|
||||||
//color
|
|
||||||
checkType(option.color,"string",path+"/color")
|
|
||||||
checkButtonColor(option.color,path+"/color")
|
|
||||||
|
|
||||||
//adminroles
|
|
||||||
checkDiscordArray("roleid",option.adminroles,path+"/adminroles")
|
|
||||||
|
|
||||||
//channelprefix
|
|
||||||
checkType(option.channelprefix,"string",path+"/channelprefix")
|
|
||||||
if (option.channelprefix.includes(" ")){
|
|
||||||
createWarn("'"+path+"/channelprefix' | this prefix can't contain spaces!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//category
|
|
||||||
checkType(option.category,"string",path+"/category")
|
|
||||||
if (option.category.length > 0){
|
|
||||||
checkDiscord("categoryid",option.category,path+"/category")
|
|
||||||
}
|
|
||||||
|
|
||||||
//message
|
|
||||||
checkType(option.message,"string",path+"/message")
|
|
||||||
|
|
||||||
//enableDmOnOpen
|
|
||||||
checkType(option.enableDmOnOpen,"boolean",path+"/enableDmOnOpen")
|
|
||||||
|
|
||||||
//ticketmessage
|
|
||||||
checkType(option.ticketmessage,"string",path+"/ticketmessage")
|
|
||||||
|
|
||||||
//thumbnail
|
|
||||||
checkType(option.thumbnail.enable,"boolean",path/"/thumbnail/enable")
|
|
||||||
checkType(option.thumbnail.url,"string",path/"/thumbnail/url")
|
|
||||||
|
|
||||||
//closedCategory
|
|
||||||
checkType(option.closedCategory.enable,"boolean",path/"/closedCategory/enable")
|
|
||||||
checkType(option.closedCategory.id,"string",path/"/closedCategory/id")
|
|
||||||
if (option.closedCategory.enable){
|
|
||||||
checkDiscord("roleid",option.closedCategory.id,path+"/closedCategory/id")
|
|
||||||
}
|
|
||||||
|
|
||||||
}else if (type == "website"){
|
|
||||||
//url
|
|
||||||
checkType(option.url,"string",path+"/url")
|
|
||||||
if (option.url.includes(" ")){
|
|
||||||
createWarn("'"+path+"/url' | a url can't contain spaces")
|
|
||||||
}
|
|
||||||
if (option.url.length < 1){
|
|
||||||
createError("'"+path+"/url' | there is no url!")
|
|
||||||
}
|
|
||||||
if (!option.url.startsWith("https://") && !option.url.startsWith("http://") && !option.url.startsWith("discord://")){
|
|
||||||
createWarn("'"+path+"/url' | your url doesn't start with https or http!")
|
|
||||||
}
|
|
||||||
if (option.url.startsWith("http://")){
|
|
||||||
createWarn("'"+path+"/url' | your url is not a HTTPS link! discord can block this url!")
|
|
||||||
}
|
|
||||||
}else if (type == "role"){
|
|
||||||
//color
|
|
||||||
checkType(option.color,"string",path+"/color")
|
|
||||||
checkButtonColor(option.color,path+"/color")
|
|
||||||
|
|
||||||
//roles
|
|
||||||
checkDiscordArray("roleid",option.roles,path+"/roles")
|
|
||||||
|
|
||||||
//mode
|
|
||||||
checkType(option.mode,"string",path+"/mode")
|
|
||||||
if (option.mode != "add&remove" && option.mode != "add" && option.mode != "remove"){
|
|
||||||
createError("'"+path+"/mode' | mode must be one of these: add, remove, add&remove")
|
|
||||||
}
|
|
||||||
|
|
||||||
//enableDmOnOpen
|
|
||||||
checkType(option.enableDmOnOpen,"boolean",path+"/enableDmOnOpen")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {configParser.OTConfigMessage} input
|
|
||||||
* @param {String} path
|
|
||||||
*/
|
|
||||||
const checkMessage = (input,path) => {
|
|
||||||
//id
|
|
||||||
if (!input.id) createError("'"+path+"/id' | this embed doesn't have an id!")
|
|
||||||
if (input.id.length > 50) createError("'"+path+"/id' | the id can't be longer than 50")
|
|
||||||
if (input.id.includes(" ") || input.id.includes("\n")) createError("'"+path+"/id' | the id can't contain spaces!")
|
|
||||||
|
|
||||||
//name
|
|
||||||
if (input.name.length < 1){
|
|
||||||
createWarn("'"+path+"/name' | this embed has no name!")
|
|
||||||
}else if (input.name.length > 99) {
|
|
||||||
createError("'"+path+"/name' | the name can't be longer than 100")
|
|
||||||
}
|
|
||||||
|
|
||||||
//description
|
|
||||||
if (input.description.length < 0){
|
|
||||||
createWarn("'"+path+"/description' | this embed doesn't have a description!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//dropdown
|
|
||||||
checkType(input.dropdown,"boolean",path+"/dropdown")
|
|
||||||
|
|
||||||
//footer
|
|
||||||
checkType(input.enableFooter,"boolean",path+"/enableFooter")
|
|
||||||
if (input.enableFooter){
|
|
||||||
if (input.footer.length < 1) createError("'"+path+"/footer' | no footer!")
|
|
||||||
if (input.footer.length > 200) createError("'"+path+"/footer' | footer length can't be more than 200!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//thumbnail
|
|
||||||
checkType(input.enableThumbnail,"boolean",path+"/enableThumbnail")
|
|
||||||
if (input.enableThumbnail){
|
|
||||||
if (input.thumbnail.length < 1) createError("'"+path+"/thumbnail' | no thumbnail url!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//customColor
|
|
||||||
checkType(input.enableCustomColor,"boolean",path+"/enableCustomColor")
|
|
||||||
if (input.enableCustomColor){
|
|
||||||
if (input.color.length < 1) createError("'"+path+"/color' | no color!")
|
|
||||||
checkHexColor(input.color,path+"/color")
|
|
||||||
}
|
|
||||||
|
|
||||||
//OPTIONS!!!
|
|
||||||
var counter = 0
|
|
||||||
input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}})
|
|
||||||
|
|
||||||
if (counter == input.options.length){
|
|
||||||
createWarn("'"+path+"/options' | insert the option ids here!")
|
|
||||||
}else{
|
|
||||||
input.options.forEach((option,index) => {
|
|
||||||
if (!configParser.optionExists(option)){
|
|
||||||
createWarn("'"+path+"/options:"+index+"' | this option doesnt exist!")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
//other
|
|
||||||
//ticket explaination & max tickets warning
|
|
||||||
if (typeof input.other != "object"){
|
|
||||||
createError("'"+path+"/other' | this object doesn't exist!")
|
|
||||||
}else{
|
|
||||||
checkType(input.other.enableTicketExplaination,"boolean",path+"/other/enableTicketExplaination")
|
|
||||||
checkType(input.other.enableMaxTicketsWarning,"boolean",path+"/other/enableMaxTicketsWarning")
|
|
||||||
|
|
||||||
//customDropdownPlaceholder
|
|
||||||
if (typeof input.other.customDropdownPlaceholder != "object"){
|
|
||||||
createError("'"+path+"/other/customDropdownPlaceholder' | this object doesn't exist!")
|
|
||||||
}else{
|
|
||||||
checkType(input.other.customDropdownPlaceholder.enable,"boolean",path+"/other/customDropdownPlaceholder/enable")
|
|
||||||
checkType(input.other.customDropdownPlaceholder.text,"string",path+"/other/customDropdownPlaceholder/text")
|
|
||||||
if (input.other.customDropdownPlaceholder.enable && input.other.customDropdownPlaceholder.text.length < 1){createError("'"+path+"/other/customDropdownPlaceholder/text' | there is no placeholder text!")}
|
|
||||||
}
|
|
||||||
|
|
||||||
//customCategoryText
|
|
||||||
if (typeof input.other.customCategoryText != "object"){
|
|
||||||
createError("'"+path+"/other/customCategoryText' | this object doesn't exist!")
|
|
||||||
}else{
|
|
||||||
checkType(input.other.customCategoryText.enable,"boolean",path+"/other/customCategoryText/enable")
|
|
||||||
checkType(input.other.customCategoryText.text,"string",path+"/other/customCategoryText/text")
|
|
||||||
if (input.other.customCategoryText.enable && input.other.customCategoryText.text.length < 1){createError("'"+path+"/other/customCategoryText/text' | there is no category text!")}
|
|
||||||
}
|
|
||||||
|
|
||||||
//embedTitleURL
|
|
||||||
if (typeof input.other.embedTitleURL != "object"){
|
|
||||||
createError("'"+path+"/other/embedTitleURL' | this object doesn't exist!")
|
|
||||||
}else{
|
|
||||||
checkType(input.other.embedTitleURL.enable,"boolean",path+"/other/embedTitleURL/enable")
|
|
||||||
checkType(input.other.embedTitleURL.url,"string",path+"/other/embedTitleURL/text")
|
|
||||||
if (input.other.embedTitleURL.enable && input.other.embedTitleURL.url.length < 1){createError("'"+path+"/other/embedTitleURL/url' | there is no url!")}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------|
|
|
||||||
//--------------------------|
|
|
||||||
//checker => START HERE |
|
|
||||||
//--------------------------|
|
|
||||||
//--------------------------|
|
|
||||||
|
|
||||||
var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","status","system","options","messages"]
|
|
||||||
configArray.forEach((item) => {
|
|
||||||
if (config[item] == undefined){
|
|
||||||
throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
checkHexColor(config.main_color,"main_color")
|
|
||||||
checkDiscord("serverid",config.server_id,"server_id")
|
|
||||||
|
|
||||||
if (!require("./api/api.json").disable.checkerjs.token) checkToken(config.auth_token)
|
|
||||||
|
|
||||||
checkDiscordArray("roleid",config.main_adminroles,"main_adminroles")
|
|
||||||
checkString(config.prefix,1,15,"prefix","prefix")
|
|
||||||
//languagefile
|
|
||||||
checkType(config.languagefile,"string","languagefile")
|
|
||||||
const lf = config.languagefile
|
|
||||||
|
|
||||||
if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese") && !lf.startsWith("french") && !lf.startsWith("italian")){
|
|
||||||
createError("'languagefile' | invalid language, more info in the wiki")
|
|
||||||
}
|
|
||||||
|
|
||||||
//status:
|
|
||||||
checkType(config.status.enabled,"boolean","status/enabled")
|
|
||||||
if (config.status.enabled){
|
|
||||||
if (config.status.type != "PLAYING" && config.status.type != "LISTENING" && config.status.type != "WATCHING"){
|
|
||||||
createError("'status/type' | not a valid status type! (LISTENING,WATCHING,PLAYING)")
|
|
||||||
}
|
|
||||||
if (config.status.text.length < 1){
|
|
||||||
createError("'status/text' | there is no status text!")
|
|
||||||
}
|
|
||||||
if (config.status.text.length > 50) createError("'status/text' | text too long!")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//system:
|
|
||||||
if (config.system.ticket_channel){
|
|
||||||
if (config.system.ticket_channel.length < 16 || config.system.ticket_channel.length > 20 || !/^\d+$/.test(config.system.ticket_channel)){
|
|
||||||
createError("'system/ticket_channel' | this channel id is invalid")
|
|
||||||
}
|
|
||||||
}else createWarn("'"+path+"' | you have no ticket channel selected!")
|
|
||||||
checkType(config.system.max_allowed_tickets,"number","system/max_allowed_tickets")
|
|
||||||
checkType(config.system.enable_DM_Messages,"boolean","system/enable_DM_Messages")
|
|
||||||
checkType(config.system["has@everyoneaccess"],"boolean","system/has@everyoneaccess")
|
|
||||||
if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){
|
|
||||||
checkDiscord("roleid",config.system.member_role,"system/member_role")
|
|
||||||
}else{
|
|
||||||
createWarn("'system/member_role' | You don't have a member role, but it's recommended!")
|
|
||||||
}
|
|
||||||
checkType(config.system.closeMode,"string","system/closeMode")
|
|
||||||
if (!["normal","adminonly"].includes(config.system.closeMode)){
|
|
||||||
createError("'system/closeMode' | the close mode must be adminonly or normal")
|
|
||||||
}
|
|
||||||
|
|
||||||
checkType(config.system.showSlashcmdsInHelp,"boolean","system/showSlashcmdsInHelp")
|
|
||||||
|
|
||||||
//options
|
|
||||||
|
|
||||||
config.options.forEach((option,index) => {
|
|
||||||
checkOption(option,"options/"+index)
|
|
||||||
})
|
|
||||||
|
|
||||||
//messages
|
|
||||||
config.messages.forEach((message,index) => {
|
|
||||||
checkMessage(message,"messages/"+index)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
//discord check
|
|
||||||
/**
|
|
||||||
const discord = require("discord.js")
|
|
||||||
const {GatewayIntentBits,Partials} = discord
|
|
||||||
const client = new discord.Client({
|
|
||||||
intents:[
|
|
||||||
GatewayIntentBits.DirectMessages,
|
|
||||||
GatewayIntentBits.GuildInvites,
|
|
||||||
GatewayIntentBits.GuildMembers,
|
|
||||||
GatewayIntentBits.GuildMessages,
|
|
||||||
GatewayIntentBits.Guilds,
|
|
||||||
GatewayIntentBits.MessageContent
|
|
||||||
],
|
|
||||||
partials:[Partials.Channel,Partials.Message]
|
|
||||||
})
|
|
||||||
await client.guilds.fetch()
|
|
||||||
if (!client.guilds.cache.find(g => g.id == config.server_id)){
|
|
||||||
createError("'server_id' | i'm not in a server with this id!")
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//the end
|
|
||||||
if (errorList.length > 0 || warnList.length > 0){
|
|
||||||
console.log("REPORT:\n===========================")
|
|
||||||
}
|
|
||||||
warnList.forEach((w) => {
|
|
||||||
const splitw = w.split("'")
|
|
||||||
if (splitw.length > 1){
|
|
||||||
var splitstring = chalk.yellow(splitw[0])+chalk.blue("'"+splitw[1]+"'")+chalk.yellow(splitw[2])
|
|
||||||
if (splitw[3]){splitstring = splitstring+chalk.yellow(splitw[3])}
|
|
||||||
if (splitw[4]){splitstring = splitstring+chalk.yellow(splitw[4])}
|
|
||||||
if (splitw[5]){splitstring = splitstring+chalk.yellow(splitw[5])}
|
|
||||||
}else {var splitstring = chalk.yellow(splitw[0])}
|
|
||||||
console.log(splitstring)
|
|
||||||
})
|
|
||||||
errorList.forEach((e) => {
|
|
||||||
const splite = e.split("'")
|
|
||||||
if (splite.length > 1){
|
|
||||||
var splitstring = chalk.red(splite[0])+chalk.blue("'"+splite[1]+"'")+chalk.red(splite[2])
|
|
||||||
}else {var splitstring = chalk.red(splite[0])}
|
|
||||||
console.log(splitstring)
|
|
||||||
})
|
|
||||||
if (isError){
|
|
||||||
console.log("===========================")
|
|
||||||
console.log("=> "+chalk.bgRed("your bot doesn't work if you don't fix the above errors!"))
|
|
||||||
if (isWarn){
|
|
||||||
console.log("\n=> "+chalk.bgYellow("if you ignore warns, some things may work differently than expected!"))
|
|
||||||
}
|
|
||||||
process.exit(0)
|
|
||||||
}else if (isWarn == true && isError == false){
|
|
||||||
console.log("===========================")
|
|
||||||
console.log("=> "+chalk.bgYellow("if you ignore warns, some things may work differently than expected!"))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
const fs = require('fs')
|
|
||||||
const readline = require("readline")
|
|
||||||
const rl = readline.createInterface({
|
|
||||||
input:process.stdin,
|
|
||||||
output:process.stdout,
|
|
||||||
terminal:true
|
|
||||||
})
|
|
||||||
|
|
||||||
const ask = async () => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
rl.question(chalk.yellow("WARNING: are you sure that there are",chalk.red("no tickets open"),"at the moment? ")+chalk.green("(yes/no)")+"\n",(answer) => {
|
|
||||||
if (answer != "1" && !answer.toLowerCase().startsWith("yes")){
|
|
||||||
console.log(chalk.red("invalid answer"))
|
|
||||||
ask()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
console.log(chalk.green("clearing data..."))
|
|
||||||
runClear()
|
|
||||||
rl.close()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
ask()
|
|
||||||
|
|
||||||
const runClear = async () => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
//console.log(chalk.blue("You can get a node.js warning below, just ignore that, it's not important!"))
|
|
||||||
const dataPaths = ["./storage/dynamicDB"]
|
|
||||||
|
|
||||||
var index = 0
|
|
||||||
|
|
||||||
dataPaths.forEach((path) => {
|
|
||||||
try {
|
|
||||||
fs.rmSync(path,{recursive:true,force:true})
|
|
||||||
}catch{
|
|
||||||
//console.log(path,"doesn't exist")
|
|
||||||
}
|
|
||||||
setTimeout(() => {
|
|
||||||
try{
|
|
||||||
fs.mkdirSync(path)
|
|
||||||
}catch{
|
|
||||||
//console.log(path,"already exists")
|
|
||||||
}
|
|
||||||
index++
|
|
||||||
},500)
|
|
||||||
})
|
|
||||||
|
|
||||||
setInterval(() => {
|
|
||||||
if (index >= 1){
|
|
||||||
console.log(chalk.bgGreen("All local data is cleared!"))
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
},500)
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
const fs = require("fs")
|
|
||||||
const location = "./storage/database.json"
|
|
||||||
|
|
||||||
|
|
||||||
/**@returns {[{category:String, key:String, value:String}]}*/
|
|
||||||
function getData(){
|
|
||||||
if (fs.existsSync(location)){
|
|
||||||
return JSON.parse(fs.readFileSync(location).toString())
|
|
||||||
}else{
|
|
||||||
fs.writeFileSync(location,"[]")
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**@param {[{category:String, key:String, value:String}]} data*/
|
|
||||||
function setData(data){
|
|
||||||
fs.writeFileSync(location,JSON.stringify(data,null,"\t"))
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.set = (category,key,value) => {
|
|
||||||
const currentData = getData()
|
|
||||||
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
|
|
||||||
var newData = []
|
|
||||||
if (exists){
|
|
||||||
currentData.forEach((d,i) => {
|
|
||||||
if (d.category == category && d.key == key){
|
|
||||||
newData.push({category,key,value})
|
|
||||||
}else{
|
|
||||||
newData.push(d)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
currentData.push({category,key,value})
|
|
||||||
newData = currentData
|
|
||||||
}
|
|
||||||
|
|
||||||
setData(newData)
|
|
||||||
return exists
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {String} category
|
|
||||||
* @param {String} key
|
|
||||||
* @returns {String|false}
|
|
||||||
*/
|
|
||||||
exports.get = (category,key) => {
|
|
||||||
const currentData = getData()
|
|
||||||
const tempresult = currentData.find((d) => (d.category == category) && (d.key == key))
|
|
||||||
const result = tempresult ? tempresult.value : false
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {String} category
|
|
||||||
* @param {String} key
|
|
||||||
* @param {String} value
|
|
||||||
*/
|
|
||||||
exports.delete = (category,key) => {
|
|
||||||
const currentData = getData()
|
|
||||||
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
|
|
||||||
var newData = []
|
|
||||||
if (exists){
|
|
||||||
currentData.forEach((d,i) => {
|
|
||||||
if (!(d.category == category && d.key == key)){
|
|
||||||
newData.push(d)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
newData = currentData
|
|
||||||
}
|
|
||||||
|
|
||||||
setData(newData)
|
|
||||||
return exists
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
const localstorage = require("node-localstorage")
|
|
||||||
|
|
||||||
const ls = new localstorage.LocalStorage("./storage/dynamicDB")
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} category
|
|
||||||
* @param {String} id
|
|
||||||
* @param {String} value
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.set = (category,id,value) => {
|
|
||||||
ls.setItem(category+"--"+id,value.toString())
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} category
|
|
||||||
* @param {String} id
|
|
||||||
* @returns {String|false}
|
|
||||||
*/
|
|
||||||
exports.get = (category,id) => {
|
|
||||||
const result = ls.getItem(category+"--"+id)
|
|
||||||
if (!result) return false
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} category
|
|
||||||
* @param {String} id
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.delete = (category,id) => {
|
|
||||||
ls.removeItem(category+"--"+id)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
this.set("category","key","value")
|
|
||||||
this.get("category","key",)
|
|
||||||
this.delete("category","key")
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
try {
|
|
||||||
var db = require("./dynamicfiles/database")
|
|
||||||
}catch(err){
|
|
||||||
console.log(err)
|
|
||||||
console.log("I couldn't find the database file! (location: ./core/dynamicdatabase/storage.js:2)")
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = db
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
const loadChalk = async () => {
|
|
||||||
return await (await import("chalk")).default
|
|
||||||
}
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const c = discord.Colors
|
|
||||||
|
|
||||||
/**@param {discord.User} user*/
|
|
||||||
exports.noPermsMessage = (user) => {
|
|
||||||
return new embed()
|
|
||||||
.setColor(c.Red)
|
|
||||||
.setTitle(":x: "+l.errors.noPermsTitle)
|
|
||||||
.setDescription(l.errors.noPermsDescription)
|
|
||||||
.setFooter({iconURL:user.displayAvatarURL(),text:user.tag})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {discord.User} user*/
|
|
||||||
exports.noPermsDelete = (user) => {
|
|
||||||
return new embed()
|
|
||||||
.setColor(c.Red)
|
|
||||||
.setTitle(":x: "+l.errors.noPermsTitle)
|
|
||||||
.setDescription(l.errors.noPermsDelete)
|
|
||||||
.setFooter({iconURL:user.displayAvatarURL(),text:user.tag})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {String} message */
|
|
||||||
exports.invalidArgsMessage = (message) => {
|
|
||||||
var x = new embed()
|
|
||||||
.setColor(c.Red)
|
|
||||||
.setTitle(":x: "+l.errors.missingArgsTitle)
|
|
||||||
.setDescription(message)
|
|
||||||
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {String} message */
|
|
||||||
exports.serverError = (message) => {
|
|
||||||
var x = new embed()
|
|
||||||
.setColor(c.Orange)
|
|
||||||
.setTitle(":warning: "+l.errors.boterror)
|
|
||||||
.setDescription(message)
|
|
||||||
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {String[]} list */
|
|
||||||
exports.invalidIdChooseFromList = (list) => {
|
|
||||||
var x = new embed()
|
|
||||||
.setColor(c.Red)
|
|
||||||
.setTitle(":x: "+l.errors.chooseFromListTitle)
|
|
||||||
.setDescription(l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`")
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.notInATicket = new embed()
|
|
||||||
.setColor(c.Red)
|
|
||||||
.setTitle(":x: "+l.errors.notInTicketTitle)
|
|
||||||
.setDescription(l.errors.notInTicketDescription)
|
|
||||||
|
|
||||||
|
|
||||||
/**@param {String} message @param {String} title */
|
|
||||||
exports.success = (title,message) => {
|
|
||||||
var x = new embed()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle(":white_check_mark: "+title)
|
|
||||||
.setDescription(message)
|
|
||||||
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {String} message @param {String} title */
|
|
||||||
exports.warning = (title,message) => {
|
|
||||||
var x = new embed()
|
|
||||||
.setColor(c.Orange)
|
|
||||||
.setTitle(":warning: "+title)
|
|
||||||
.setDescription(message)
|
|
||||||
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@param {String} message the message @param {String} title the title @param {String} emoji an discord emoji @param {discord.ColorResolvable} color the embed color*/
|
|
||||||
exports.custom = (title,message,emoji,color) => {
|
|
||||||
var x = new embed()
|
|
||||||
.setColor(color)
|
|
||||||
.setTitle(emoji+" "+title)
|
|
||||||
.setDescription(message)
|
|
||||||
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.clearDebugFile = () => {
|
|
||||||
const fs = require("fs")
|
|
||||||
if (!fs.existsSync("./openticketdebug.txt")) return
|
|
||||||
const content = fs.readFileSync("./openticketdebug.txt").toString().split("\n")
|
|
||||||
if (content.length < 5000) return
|
|
||||||
for (let i = 0; i < 4000; i++) {
|
|
||||||
content.shift()
|
|
||||||
}
|
|
||||||
|
|
||||||
const newContent = "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="+content.join("\n")
|
|
||||||
fs.writeFileSync("./openticketdebug.txt",newContent)
|
|
||||||
}
|
|
||||||
|
|
||||||
const normalLog = (debugString) => {
|
|
||||||
const fs = require("fs")
|
|
||||||
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
|
|
||||||
fs.writeFileSync("./openticketdebug.txt",content+"\nSYSTEM: "+debugString)
|
|
||||||
this.clearDebugFile()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {"system"|"command"|"info"|"api"|"debug"} type
|
|
||||||
* @param {String} message
|
|
||||||
* @param {[{key:String,value:String}]} params
|
|
||||||
*/
|
|
||||||
exports.log = async (type,message,params) => {
|
|
||||||
var ptype = type
|
|
||||||
const chalk = await loadChalk()
|
|
||||||
var paramstring = ""
|
|
||||||
if (params){
|
|
||||||
if (params.length > 0){
|
|
||||||
params.forEach((p) => {
|
|
||||||
paramstring = paramstring+p.key+": "+p.value+" "
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const parameters = params ? "("+paramstring+")" : " "
|
|
||||||
|
|
||||||
if (ptype == "command"){
|
|
||||||
console.log(chalk.green("[command] ")+message+" "+chalk.yellow(parameters))
|
|
||||||
}else if (ptype == "info"){
|
|
||||||
console.log(chalk.blue("[info] ")+message+" "+chalk.yellow(parameters))
|
|
||||||
}else if (ptype == "system"){
|
|
||||||
console.log(chalk.green("[system] ")+message+" "+chalk.yellow(parameters))
|
|
||||||
}else if (ptype == "api"){
|
|
||||||
if (require("./api/api.json").enableAPIconsolelogs == true){
|
|
||||||
console.log(chalk.red("[api v"+require("./api/api.json").version+"] ")+message+" "+chalk.yellow(parameters))
|
|
||||||
}
|
|
||||||
ptype = "api v"+require("./api/api.json").version
|
|
||||||
}else if (ptype == "debug"){
|
|
||||||
if (!process.argv.some((v) => v == "--debug")) return
|
|
||||||
console.log(chalk.redBright("[DEBUG] ")+message+" "+chalk.yellow(parameters))
|
|
||||||
}
|
|
||||||
|
|
||||||
const cd = new Date()
|
|
||||||
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
|
|
||||||
normalLog("["+cd.getDate()+" "+months[cd.getMonth()-1]+" "+cd.getFullYear()+" - "+cd.getSeconds()+":"+cd.getMinutes()+":"+cd.getHours()+"] ["+ptype+"] "+message+" "+parameters)
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
|
|
||||||
exports.closeCommandRow = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicket1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTreopenTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Success)
|
|
||||||
.setLabel(l.buttons.reopen)
|
|
||||||
.setEmoji("✔")
|
|
||||||
)
|
|
||||||
|
|
||||||
exports.closeCommandRowDisabled = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicket1")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(bs.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTreopenTicket")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(bs.Success)
|
|
||||||
.setLabel(l.buttons.reopen)
|
|
||||||
.setEmoji("✔")
|
|
||||||
)
|
|
||||||
|
|
||||||
exports.openRowNormal = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTcloseTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setLabel(l.buttons.close)
|
|
||||||
.setEmoji("🔒")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
|
|
||||||
exports.openRowDisabled = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTcloseTicket")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setLabel(l.buttons.close)
|
|
||||||
.setEmoji("🔒")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicket")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(bs.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
|
|
||||||
exports.firstmsgRowNormal = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTcloseTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setLabel(l.buttons.close)
|
|
||||||
.setEmoji("🔒")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
|
|
||||||
exports.firstmsgRowDisabled = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTcloseTicket")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setLabel(l.buttons.close)
|
|
||||||
.setEmoji("🔒")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicket")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(bs.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
exports.closeVerifyBar = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTcloseTicketReason")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Primary)
|
|
||||||
.setEmoji("💬")
|
|
||||||
.setLabel(l.buttons.closeWithReason)
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTcloseTicketTrue")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTcloseTicketFalse")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
|
|
||||||
exports.deleteVerifyBar = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicketTrue")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicketFalse")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
|
|
||||||
exports.delete1VerifyBar = new arb()
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicketTrue1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTdeleteTicketFalse1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} addedUser
|
|
||||||
* @param {discord.User} adder
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.addEmbed = (addedUser,adder) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username))
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:adder.tag,iconURL:adder.displayAvatarURL()})
|
|
||||||
.setThumbnail(addedUser.displayAvatarURL({extension:"png"}))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} removedUser
|
|
||||||
* @param {discord.User} remover
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.removeEmbed = (removedUser,remover) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username))
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:remover.tag,iconURL:remover.displayAvatarURL()})
|
|
||||||
.setThumbnail(removedUser.displayAvatarURL({extension:"png"}))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} closer
|
|
||||||
* @param {String} description
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.closeEmbed = (closer,description) => {
|
|
||||||
const embd = new embed()
|
|
||||||
.setTitle("🔒 "+l.commands.closeTitle)
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()})
|
|
||||||
|
|
||||||
if (description) embd.setDescription(description)
|
|
||||||
return embd
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} deleter
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.deleteEmbed = (deleter) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("❌ "+l.commands.deleteTitle)
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:deleter.tag,iconURL:deleter.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} renamer
|
|
||||||
* @param {String} newname
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.renameEmbed = (renamer,newname) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("🔄 "+l.commands.renameTitle.replace("{0}",newname))
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:renamer.tag,iconURL:renamer.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} reopener
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.reopenEmbed = (reopener) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("🔓 "+l.commands.reopenTitle)
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:reopener.tag,iconURL:reopener.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} claimer
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.claimEmbed = (claimer,user) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("📌 "+l.commands.claimTitle.replace("{0}",claimer.username))
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:user.tag,iconURL:user.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} unclaimer
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.unclaimEmbed = (unclaimer) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("🆓 "+l.commands.unclaimTitle)
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:unclaimer.tag,iconURL:unclaimer.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {Boolean} done
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.User} author
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.sendTranscriptEmbed = (done,channel,author) => {
|
|
||||||
if (done){
|
|
||||||
return new embed()
|
|
||||||
.setTitle("📄 "+l.messages.hereIsTheTranscript)
|
|
||||||
.setColor(mc)
|
|
||||||
.setDescription("Ticket: "+channel.name)
|
|
||||||
.setFooter({text:author.tag,iconURL:author.displayAvatarURL()})
|
|
||||||
}else{
|
|
||||||
return new embed()
|
|
||||||
.setTitle("📄 "+l.messages.hereIsTheTranscript)
|
|
||||||
.setColor(mc)
|
|
||||||
.setDescription("Loading...")
|
|
||||||
.setFooter({text:author.tag,iconURL:author.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} changer
|
|
||||||
* @param {String} newtype
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.changeEmbed = (changer,newtype) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("🔄 "+l.commands.changeTitle.replace("{0}",newtype))
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:changer.tag,iconURL:changer.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const permissionChecker = require("../../../utils/permisssionChecker")
|
|
||||||
const storage = bot.storage
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
//CLOSE
|
|
||||||
var closeTicketButtonChecker = false
|
|
||||||
client.on("interactionCreate",async interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTcloseTicketTrue") return
|
|
||||||
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
|
|
||||||
if (closeTicketButtonChecker == true) return
|
|
||||||
closeTicketButtonChecker = true
|
|
||||||
|
|
||||||
const firstcomponents = interaction.message.components
|
|
||||||
|
|
||||||
if (config.system.closeMode == "adminonly"){
|
|
||||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
if (!permissionChecker.sendUserNoPerms(interaction.user)){
|
|
||||||
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
|
|
||||||
}
|
|
||||||
interaction.message.edit({components:[firstcomponents]})
|
|
||||||
closeTicketButtonChecker = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {String}
|
|
||||||
*/
|
|
||||||
const name = interaction.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
|
|
||||||
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true)
|
|
||||||
closeTicketButtonChecker = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const permissionChecker = require("../../../utils/permisssionChecker")
|
|
||||||
const storage = bot.storage
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
const modal = discord.ModalBuilder
|
|
||||||
const tis = discord.TextInputStyle
|
|
||||||
const tib = discord.TextInputBuilder
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
//theModal
|
|
||||||
const reasonModal = new modal()
|
|
||||||
.setTitle(l.buttons.closeWithReason)
|
|
||||||
.setCustomId("OTCloseReasonModal")
|
|
||||||
|
|
||||||
const reasonInput = new arb()
|
|
||||||
.addComponents([
|
|
||||||
new tib()
|
|
||||||
.setCustomId('OTreasonInput')
|
|
||||||
.setLabel(l.messages.modalreason)
|
|
||||||
.setStyle(tis.Short)
|
|
||||||
.setMaxLength(100)
|
|
||||||
.setRequired(true)
|
|
||||||
.setValue("")
|
|
||||||
.setPlaceholder("reason")
|
|
||||||
])
|
|
||||||
|
|
||||||
reasonModal.addComponents(reasonInput)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//CLOSE WITH REASON
|
|
||||||
var closeTicketButtonChecker = false
|
|
||||||
|
|
||||||
client.on("interactionCreate",async interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTcloseTicketReason") return
|
|
||||||
|
|
||||||
if (closeTicketButtonChecker == true) return interaction.deferUpdate()
|
|
||||||
closeTicketButtonChecker = true
|
|
||||||
|
|
||||||
const firstcomponents = interaction.message.components
|
|
||||||
|
|
||||||
if (config.system.closeMode == "adminonly"){
|
|
||||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
if (!permissionChecker.sendUserNoPerms(interaction.user)){
|
|
||||||
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
|
|
||||||
}
|
|
||||||
interaction.message.edit({components:[firstcomponents]})
|
|
||||||
closeTicketButtonChecker = false
|
|
||||||
return interaction.deferUpdate()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
|
|
||||||
await interaction.showModal(reasonModal)
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("interactionCreate",async (interaction) => {
|
|
||||||
if (interaction.type != discord.InteractionType.ModalSubmit) return
|
|
||||||
if (interaction.customId != "OTCloseReasonModal") return
|
|
||||||
|
|
||||||
interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
|
|
||||||
|
|
||||||
const reason = interaction.fields.getTextInputValue("OTreasonInput")
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {String}
|
|
||||||
*/
|
|
||||||
const name = interaction.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
//interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
|
|
||||||
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",reason,true)
|
|
||||||
closeTicketButtonChecker = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const permissionChecker = require("../../../utils/permisssionChecker")
|
|
||||||
const storage = bot.storage
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
//DELETE
|
|
||||||
var deleteTicketButtonChecker = false
|
|
||||||
client.on("interactionCreate",async interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicketTrue") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (deleteTicketButtonChecker == true) return
|
|
||||||
deleteTicketButtonChecker = true
|
|
||||||
|
|
||||||
const firstcomponents = bot.buttons.close.openRowNormal
|
|
||||||
|
|
||||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
if (!permissionChecker.sendUserNoDelete(interaction.user)){
|
|
||||||
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
|
|
||||||
}
|
|
||||||
await interaction.message.edit({components:[firstcomponents]})
|
|
||||||
deleteTicketButtonChecker = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {String}
|
|
||||||
*/
|
|
||||||
const name = interaction.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
|
|
||||||
await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
|
|
||||||
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
|
|
||||||
deleteTicketButtonChecker = false
|
|
||||||
})
|
|
||||||
|
|
||||||
//DELETE NO TRANSCRIPT
|
|
||||||
var deleteTicketButtonChecker1 = false
|
|
||||||
client.on("interactionCreate",async interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicketTrue1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (deleteTicketButtonChecker1 == true) return
|
|
||||||
deleteTicketButtonChecker1 = true
|
|
||||||
|
|
||||||
const firstcomponents = bot.buttons.close.closeCommandRow
|
|
||||||
|
|
||||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
if (!permissionChecker.sendUserNoDelete(interaction.user)){
|
|
||||||
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
|
|
||||||
}
|
|
||||||
await interaction.message.edit({components:[firstcomponents]})
|
|
||||||
deleteTicketButtonChecker1 = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {String}
|
|
||||||
*/
|
|
||||||
const name = interaction.channel.name
|
|
||||||
var prefix = ""
|
|
||||||
const tickets = config.options
|
|
||||||
tickets.forEach((ticket) => {
|
|
||||||
if (name.startsWith(ticket.channelprefix)){
|
|
||||||
prefix = ticket.channelprefix
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
await interaction.message.edit({components:[bot.buttons.close.closeCommandRowDisabled]})
|
|
||||||
await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
|
|
||||||
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
|
|
||||||
deleteTicketButtonChecker1 = false
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const permissionChecker = require("../../../utils/permisssionChecker")
|
|
||||||
const storage = bot.storage
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
//REOPEN
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTreopenTicket") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
|
|
||||||
require("../../../ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const storage = bot.storage
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
module.exports = () => {
|
|
||||||
require("./firstmsg")()
|
|
||||||
require("./verifyBars")()
|
|
||||||
|
|
||||||
//accepted
|
|
||||||
require("./accepted/closing")()
|
|
||||||
require("./accepted/reopening")()
|
|
||||||
require("./accepted/deleting")()
|
|
||||||
require("./accepted/closingReason")()
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const storage = bot.storage
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
const button = discord.ButtonBuilder
|
|
||||||
const arb = discord.ActionRowBuilder
|
|
||||||
const bs = discord.ButtonStyle
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
//CLOSE
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTcloseTicket") return
|
|
||||||
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTcloseTicketFalse") return
|
|
||||||
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
|
|
||||||
})
|
|
||||||
|
|
||||||
//DELETE
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicket") return
|
|
||||||
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicketFalse") return
|
|
||||||
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
|
|
||||||
})
|
|
||||||
|
|
||||||
//DELETE NO TRANSCRIPT
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicket1") return
|
|
||||||
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicketFalse1") return
|
|
||||||
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
interaction.message.edit({components:[bot.buttons.close.closeCommandRow]})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
const index = require("../index")
|
|
||||||
|
|
||||||
if (index.developerConfig){
|
|
||||||
var config = require("../devConfig.json")
|
|
||||||
}else{var config = require("../config.json")}
|
|
||||||
|
|
||||||
|
|
||||||
var localLanguage = require("../language/english.json")
|
|
||||||
if (config.languagefile.startsWith("custom")) localLanguage = require("../language/custom.json")
|
|
||||||
else if (config.languagefile.startsWith("dutch")) localLanguage = require("../language/dutch.json")
|
|
||||||
else if (config.languagefile.startsWith("english")) localLanguage = require("../language/english.json")
|
|
||||||
else if (config.languagefile.startsWith("german")) localLanguage = require("../language/german.json")
|
|
||||||
else if (config.languagefile.startsWith("french")) localLanguage = require("../language/french.json")
|
|
||||||
else if (config.languagefile.startsWith("romanian")) localLanguage = require("../language/romanian.json")
|
|
||||||
else if (config.languagefile.startsWith("arabic")) localLanguage = require("../language/arabic.json")
|
|
||||||
else if (config.languagefile.startsWith("spanish")) localLanguage = require("../language/spanish.json")
|
|
||||||
else if (config.languagefile.startsWith("portuguese")) localLanguage = require("../language/portuguese.json")
|
|
||||||
else if (config.languagefile.startsWith("italian")) localLanguage = require("../language/italian.json")
|
|
||||||
else if (config.languagefile.startsWith("danish")) localLanguage = require("../language/danish.json")
|
|
||||||
|
|
||||||
|
|
||||||
const errorLog = async () => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
|
|
||||||
console.log(chalk.red("Something went wrong when loading the language!")+"\nCheck the config file or create a ticket in our server!")
|
|
||||||
}
|
|
||||||
|
|
||||||
const successLog = async (language) => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
|
|
||||||
console.log(chalk.green("loaded language "+language+"..."))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!localLanguage){
|
|
||||||
const runError = async () => {
|
|
||||||
await errorLog()
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
runError()
|
|
||||||
}else{
|
|
||||||
exports.language = localLanguage
|
|
||||||
successLog(config.languagefile)
|
|
||||||
}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const storage = bot.storage
|
|
||||||
|
|
||||||
const APIEvents = require("./api/modules/events")
|
|
||||||
|
|
||||||
module.exports = async () => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isButton() && !interaction.isStringSelectMenu()) return
|
|
||||||
if (interaction.isButton() && !interaction.customId.startsWith("newR")) return
|
|
||||||
if (interaction.isStringSelectMenu() && !(interaction.customId == "OTdropdownMenu")) return
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const optionidRaw = interaction.isStringSelectMenu() ? interaction.values[0] : interaction.customId
|
|
||||||
if (!optionidRaw.includes("newR")) return
|
|
||||||
const optionid = optionidRaw.split("newR")[1]
|
|
||||||
if (!optionid){
|
|
||||||
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.roleDoesntExist)]})
|
|
||||||
return
|
|
||||||
}else{
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
const option = require("./utils/getButton").getOption(optionid)
|
|
||||||
/**@type {"add"|"remove"|"add&remove"} */
|
|
||||||
const mode = option.mode
|
|
||||||
const user = interaction.member
|
|
||||||
|
|
||||||
if (mode == "add"){
|
|
||||||
option.roles.forEach((role) => {
|
|
||||||
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
|
|
||||||
|
|
||||||
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
|
|
||||||
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
|
|
||||||
APIEvents.onReactionRole("add","add",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
}else if (mode == "remove"){
|
|
||||||
option.roles.forEach((role) => {
|
|
||||||
interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role)
|
|
||||||
|
|
||||||
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
|
|
||||||
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
|
|
||||||
APIEvents.onReactionRole("remove","remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
}else if (mode == "add&remove"){
|
|
||||||
option.roles.forEach((role) => {
|
|
||||||
if (!interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){
|
|
||||||
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
|
|
||||||
|
|
||||||
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
|
|
||||||
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
|
|
||||||
APIEvents.onReactionRole("add","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
}else {
|
|
||||||
interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role)
|
|
||||||
|
|
||||||
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
|
|
||||||
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
|
|
||||||
APIEvents.onReactionRole("remove","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}catch{
|
|
||||||
interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrong)]})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
const discord = require("discord.js")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const client = require("../../index").client
|
|
||||||
const config = bot.config
|
|
||||||
const configParser = require("../utils/configParser")
|
|
||||||
|
|
||||||
const act = discord.ApplicationCommandType
|
|
||||||
const acot = discord.ApplicationCommandOptionType
|
|
||||||
|
|
||||||
module.exports = async () => {
|
|
||||||
bot.errorLog.log("info","auto-updating slash commands...")
|
|
||||||
const sid = config.server_id
|
|
||||||
|
|
||||||
const ids = configParser.getTicketValuesArray("id")
|
|
||||||
/**@type {[{name:String,value:String}]} */
|
|
||||||
var choices = []
|
|
||||||
ids.forEach((id) => {
|
|
||||||
const option = configParser.getTicketById(id)
|
|
||||||
if (option){
|
|
||||||
choices.push({name:option.name,value:option.id})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
/**@type {[{name:String,value:String}]} */
|
|
||||||
var msgchoices = []
|
|
||||||
config.messages.forEach((msg) => {
|
|
||||||
msgchoices.push({name:msg.id,value:msg.id})
|
|
||||||
})
|
|
||||||
|
|
||||||
//slashtranslation
|
|
||||||
const ST = require("../../language/slashcmds/slash.json").data
|
|
||||||
|
|
||||||
//create a ticket (/new or /ticket)
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"ticket",
|
|
||||||
description:"Create a ticket!",
|
|
||||||
descriptionLocalizations:ST.newticket,
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.String,
|
|
||||||
name:"type",
|
|
||||||
description:"The type of ticket.",
|
|
||||||
required:true,
|
|
||||||
choices:choices
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid)
|
|
||||||
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"new",
|
|
||||||
description:"Create a ticket!",
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput,
|
|
||||||
descriptionLocalizations:ST.newticket,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.String,
|
|
||||||
name:"type",
|
|
||||||
description:"The type of ticket.",
|
|
||||||
required:true,
|
|
||||||
choices:choices
|
|
||||||
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid)
|
|
||||||
|
|
||||||
//msg
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"message",
|
|
||||||
description:"Create a ticket message.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.message,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.String,
|
|
||||||
name:"id",
|
|
||||||
description:"The message id.",
|
|
||||||
required:true,
|
|
||||||
choices:msgchoices,
|
|
||||||
max_length:30
|
|
||||||
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid)
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
const discord = require("discord.js")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const client = require("../../index").client
|
|
||||||
const config = bot.config
|
|
||||||
|
|
||||||
module.exports = async () => {
|
|
||||||
const chalk = (await import("chalk")).default
|
|
||||||
|
|
||||||
console.log(chalk.red("\nINSTRUCTIONS:\n\n1: Run the command you want to delete in discord.\n2: You get the message 'This command is now deleted!'\n3: There is also a message in the console that says the command is deleted.\n4: reload your discord."))
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return console.log("this isn't a command!")
|
|
||||||
|
|
||||||
interaction.reply({content:"This command is now deleted!"})
|
|
||||||
|
|
||||||
try {
|
|
||||||
client.application.commands.delete(interaction.commandId,interaction.guild.id).then(() => {
|
|
||||||
console.log("deleted the command",chalk.blue(interaction.commandName),"(id:",interaction.commandId+")")
|
|
||||||
})
|
|
||||||
}catch{
|
|
||||||
console.log(chalk.red("something went wrong by the deleting of this command!"))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,267 +0,0 @@
|
|||||||
const discord = require("discord.js")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const client = require("../../index").client
|
|
||||||
const config = bot.config
|
|
||||||
const configParser = require("../utils/configParser")
|
|
||||||
|
|
||||||
const act = discord.ApplicationCommandType
|
|
||||||
const acot = discord.ApplicationCommandOptionType
|
|
||||||
|
|
||||||
module.exports = async () => {
|
|
||||||
const chalk = (await import("chalk")).default
|
|
||||||
const sid = config.server_id
|
|
||||||
|
|
||||||
const ids = configParser.getTicketValuesArray("id")
|
|
||||||
/**@type {[{name:String,value:String}]} */
|
|
||||||
var choices = []
|
|
||||||
ids.forEach((id) => {
|
|
||||||
const option = configParser.getTicketById(id)
|
|
||||||
if (option){
|
|
||||||
choices.push({name:option.name,value:option.id})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
/**@type {[{name:String,value:String}]} */
|
|
||||||
var msgchoices = []
|
|
||||||
config.messages.forEach((msg) => {
|
|
||||||
msgchoices.push({name:msg.id,value:msg.id})
|
|
||||||
})
|
|
||||||
|
|
||||||
var readystats = 0
|
|
||||||
|
|
||||||
//process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)")
|
|
||||||
setInterval(() => {
|
|
||||||
process.stdout.cursorTo(0)
|
|
||||||
process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 13")+" commands ready! (this can take up to 40 seconds)")
|
|
||||||
if (readystats >= 13){
|
|
||||||
const fs = require("fs")
|
|
||||||
fs.writeFileSync("./storage/slashcmdEnabled.txt","true")
|
|
||||||
console.log(chalk.green("\nready!"))
|
|
||||||
console.log(chalk.blue("you can now start the bot with "+chalk.bgBlue("'npm start'")+"!"))
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
},100)
|
|
||||||
|
|
||||||
//slashtranslation
|
|
||||||
const ST = require("../../language/slashcmds/slash.json").data
|
|
||||||
|
|
||||||
//create a ticket (/new or /ticket)
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"ticket",
|
|
||||||
description:"Create a ticket!",
|
|
||||||
descriptionLocalizations:ST.newticket,
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.String,
|
|
||||||
name:"type",
|
|
||||||
description:"The type of ticket.",
|
|
||||||
required:true,
|
|
||||||
choices:choices
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"new",
|
|
||||||
description:"Create a ticket!",
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput,
|
|
||||||
descriptionLocalizations:ST.newticket,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.String,
|
|
||||||
name:"type",
|
|
||||||
description:"The type of ticket.",
|
|
||||||
required:true,
|
|
||||||
choices:choices
|
|
||||||
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//help
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"help",
|
|
||||||
description:"View the available commands.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.help,
|
|
||||||
type:act.ChatInput
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
//close
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"close",
|
|
||||||
description:"Close the current ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.close,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[{
|
|
||||||
name:"reason",
|
|
||||||
type:discord.ApplicationCommandOptionType.String,
|
|
||||||
required:false,
|
|
||||||
description:"The reason to close this ticket.",
|
|
||||||
maxLength:100
|
|
||||||
}]
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//delete
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"delete",
|
|
||||||
description:"Delete the current ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.delete,
|
|
||||||
type:act.ChatInput
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//msg
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"message",
|
|
||||||
description:"Create a ticket message.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.message,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.String,
|
|
||||||
name:"id",
|
|
||||||
description:"The message id.",
|
|
||||||
required:true,
|
|
||||||
choices:msgchoices,
|
|
||||||
max_length:30
|
|
||||||
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//add
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"add",
|
|
||||||
description:"Add people to this ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.add,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.User,
|
|
||||||
name:"user",
|
|
||||||
description:"The user to add.",
|
|
||||||
required:true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//remove
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"remove",
|
|
||||||
description:"Remove people from this ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.remove,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.User,
|
|
||||||
name:"user",
|
|
||||||
description:"The user to remove.",
|
|
||||||
required:true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//rename
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"rename",
|
|
||||||
description:"Rename this ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.rename,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.String,
|
|
||||||
name:"name",
|
|
||||||
description:"The new name (without prefix).",
|
|
||||||
required:true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//reopen
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"reopen",
|
|
||||||
description:"Reopen this ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
descriptionLocalizations:ST.reopen,
|
|
||||||
type:act.ChatInput
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//claim
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"claim",
|
|
||||||
description:"Claim this ticket / claim it for someone else.",
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
name:"user",
|
|
||||||
type:acot.User,
|
|
||||||
required:false,
|
|
||||||
description:"The user to claim for."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//unclaim
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"unclaim",
|
|
||||||
description:"Unclaim this ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//category
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"change",
|
|
||||||
description:"Change ticket type.",
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput,
|
|
||||||
options:[
|
|
||||||
{
|
|
||||||
type:acot.String,
|
|
||||||
name:"type",
|
|
||||||
description:"The new ticket type.",
|
|
||||||
required:true,
|
|
||||||
choices:choices
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const storage = bot.storage
|
|
||||||
const permsChecker = require("../utils/permisssionChecker")
|
|
||||||
|
|
||||||
const pendingDelete = []
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.GuildMember} member
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {String} prefix
|
|
||||||
* @param {"delete"|"close"|"deletenotranscript"} mode
|
|
||||||
* @param {Boolean} nomessage
|
|
||||||
* @param {String} reason only when closing, not when deleting!
|
|
||||||
*/
|
|
||||||
exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => {
|
|
||||||
const guild = channel.guild
|
|
||||||
const user = member.user
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
|
|
||||||
const newReason = reason ? reason : l.messages.none
|
|
||||||
|
|
||||||
//start code
|
|
||||||
|
|
||||||
//FIX CHANNEL COULD BE CLOSED AFTER DELETE:
|
|
||||||
if (pendingDelete.includes(channel.id)) return false
|
|
||||||
|
|
||||||
/**@type {String}*/
|
|
||||||
const channelname = channel.name
|
|
||||||
const ticketOpenerChannelName = channelname.split(prefix)[1]
|
|
||||||
|
|
||||||
//get user that opened the ticket
|
|
||||||
var getuserID = storage.get("userTicketStorage",channel.id)
|
|
||||||
try {
|
|
||||||
var ticketOpener = client.users.cache.find(u => u.id === getuserID)
|
|
||||||
var isDatabaseError = false
|
|
||||||
}catch{var isDatabaseError = true}
|
|
||||||
|
|
||||||
if (!ticketOpener){
|
|
||||||
console.log(chalk.red("[database error]"),"something went wrong when getting the data in the database.\nNo panic, this error fixes itself!")
|
|
||||||
var isDatabaseError = true
|
|
||||||
}
|
|
||||||
|
|
||||||
var enableTranscript = true
|
|
||||||
var deleteRequired = false
|
|
||||||
|
|
||||||
if (mode == "delete" || mode == "deletenotranscript"){
|
|
||||||
//delete
|
|
||||||
//check perms
|
|
||||||
if (!guild) return
|
|
||||||
if (!permsChecker.command(user.id,guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//start delete proccess
|
|
||||||
deleteRequired = true
|
|
||||||
if (!nomessage){
|
|
||||||
await channel.send({content:"**"+l.messages.gettingdeleted+"**"})
|
|
||||||
}
|
|
||||||
log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
|
|
||||||
pendingDelete.push(channel.id)
|
|
||||||
|
|
||||||
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
|
|
||||||
|
|
||||||
//getID & send DM & send api event
|
|
||||||
await channel.messages.fetchPinned().then(async msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value.value
|
|
||||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
|
||||||
|
|
||||||
require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData})
|
|
||||||
|
|
||||||
const id = hiddendata.data.find(d => d.key == "openerid").value
|
|
||||||
|
|
||||||
const sphd = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
|
|
||||||
sphd.hiddenData.data.push({key:"pendingdelete",value:"true"})
|
|
||||||
const newEmbed = new discord.EmbedBuilder(firstmsg.embeds[0].data)
|
|
||||||
newEmbed.setDescription(sphd.description + bot.hiddenData.writeHiddenData(sphd.hiddenData.type,sphd.hiddenData.data))
|
|
||||||
await firstmsg.edit({embeds:[newEmbed]})
|
|
||||||
|
|
||||||
if (!id) return false
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
}else if (mode == "close"){
|
|
||||||
//close
|
|
||||||
//check perms
|
|
||||||
if (config.system.closeMode == "adminonly"){
|
|
||||||
if (!guild) return
|
|
||||||
if (!permsChecker.command(user.id,guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//set new permissions
|
|
||||||
var permissionArray = []
|
|
||||||
const pfb = discord.PermissionFlagsBits
|
|
||||||
|
|
||||||
if (!isDatabaseError) permissionArray.push({
|
|
||||||
id:ticketOpener,
|
|
||||||
type:"member",
|
|
||||||
allow:[pfb.ViewChannel],
|
|
||||||
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
|
|
||||||
})
|
|
||||||
|
|
||||||
permissionArray.push({
|
|
||||||
id:guild.roles.everyone,
|
|
||||||
type:"role",
|
|
||||||
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
|
||||||
})
|
|
||||||
|
|
||||||
//add main adminroles
|
|
||||||
config.main_adminroles.forEach((role,index) => {
|
|
||||||
try {
|
|
||||||
const adminrole = guild.roles.cache.find(r => r.id == role)
|
|
||||||
if (!adminrole) return
|
|
||||||
|
|
||||||
permissionArray.push({
|
|
||||||
id:adminrole,
|
|
||||||
type:"role",
|
|
||||||
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
|
||||||
})
|
|
||||||
}catch{
|
|
||||||
log("system","invalid role! At 'config.json => main_adminroles:"+index)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
//add ticket adminroles
|
|
||||||
await channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
|
||||||
|
|
||||||
if (!ticketData) return
|
|
||||||
|
|
||||||
if (ticketData.closedCategory.enable){
|
|
||||||
/**@type {discord.CategoryChannel} */
|
|
||||||
const category = guild.channels.cache.find(c => c.id == ticketData.closedCategory.id && c.type == discord.ChannelType.GuildCategory)
|
|
||||||
try {
|
|
||||||
channel.setParent(category)
|
|
||||||
}catch{
|
|
||||||
bot.errorLog.log("system","failed to move channel to new category!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {String[]}
|
|
||||||
*/
|
|
||||||
const ticketadmin = ticketData.adminroles
|
|
||||||
ticketadmin.forEach((role,index) => {
|
|
||||||
if (!config.main_adminroles.includes(role)){
|
|
||||||
try {
|
|
||||||
const adminrole = guild.roles.cache.find(r => r.id == role)
|
|
||||||
if (!adminrole) return
|
|
||||||
|
|
||||||
permissionArray.push({
|
|
||||||
id:adminrole,
|
|
||||||
type:"role",
|
|
||||||
allow:[pfb.AddReactions,pfb.ViewChannel],
|
|
||||||
deny:[pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
|
|
||||||
})
|
|
||||||
}catch{
|
|
||||||
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
channel.permissionOverwrites.set(permissionArray)
|
|
||||||
|
|
||||||
if (!nomessage){
|
|
||||||
//message
|
|
||||||
var closeButtonRow = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("OTdeleteTicket1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("OTreopenTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Success)
|
|
||||||
.setLabel(l.buttons.reopen)
|
|
||||||
.setEmoji("✔")
|
|
||||||
)
|
|
||||||
|
|
||||||
const embed = new discord.EmbedBuilder()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle(":lock: "+l.messages.closedTitle+" :lock:")
|
|
||||||
.setDescription(l.messages.closedDescription)
|
|
||||||
channel.send({embeds:[embed],components:[closeButtonRow]})
|
|
||||||
}
|
|
||||||
|
|
||||||
log("system","closed a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
|
|
||||||
|
|
||||||
|
|
||||||
//getID & send DM & send api event
|
|
||||||
await channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
|
||||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
|
||||||
|
|
||||||
require("../api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason)
|
|
||||||
|
|
||||||
const id = hiddendata.data.find(d => d.key == "openerid").value
|
|
||||||
|
|
||||||
if (!id) return false
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const transcriptHandler = async () => {
|
|
||||||
if (!bot.tsconfig.sendTranscripts.enableChannel && !bot.tsconfig.sendTranscripts.enableDM) return false
|
|
||||||
|
|
||||||
const APIEvents = require("../api/modules/events")
|
|
||||||
const messages = await channel.messages.fetch({cache:true})
|
|
||||||
await require("../transcriptSystem/manager")(messages,guild,channel,user,reason)
|
|
||||||
APIEvents.onTranscriptCreation(messages,channel,guild,new Date())
|
|
||||||
}
|
|
||||||
const deleteHandler = async () => {
|
|
||||||
if (deleteRequired){
|
|
||||||
pendingDelete.shift()
|
|
||||||
await channel.delete()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mode == "delete" || mode == "deletenotranscript") await transcriptHandler()
|
|
||||||
deleteHandler()
|
|
||||||
}
|
|
||||||
@@ -1,220 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
const configParser = require("../utils/configParser")
|
|
||||||
const storage = bot.storage
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
//dropdown placeholder
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isStringSelectMenu()) return
|
|
||||||
if (interaction.customId != "OTdropdownMenu") return
|
|
||||||
if (interaction.values.includes("OTChooseTicket")){
|
|
||||||
interaction.deferUpdate()
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
var closeButton = bot.buttons.firstmsg.firstmsgRowNormal
|
|
||||||
|
|
||||||
//ticket button click / create ticket
|
|
||||||
client.on("interactionCreate",async (interaction) => {
|
|
||||||
if (interaction.isChatInputCommand() && (interaction.commandName == "new" || interaction.commandName == "ticket")){
|
|
||||||
var customId = "OTnewT"+interaction.options.getString("type")
|
|
||||||
}else if (interaction.isButton()){
|
|
||||||
var customId = interaction.customId
|
|
||||||
}else if (interaction.isStringSelectMenu() && (interaction.customId == "OTdropdownMenu")){
|
|
||||||
var customId = interaction.values[0]
|
|
||||||
|
|
||||||
}else return
|
|
||||||
|
|
||||||
if (interaction.isButton()){
|
|
||||||
if (interaction.customId.startsWith("OTnewT")){
|
|
||||||
const optionid = interaction.customId.split("OTnewT")[1]
|
|
||||||
if (!optionid){
|
|
||||||
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (configParser.getTicketValuesArray("id").includes(customId)){
|
|
||||||
|
|
||||||
//ticketoptions from config
|
|
||||||
const currentTicketOptions = configParser.getTicketById(customId)
|
|
||||||
|
|
||||||
if (currentTicketOptions == false) return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]})
|
|
||||||
|
|
||||||
if (interaction.isButton()){
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
}else if (interaction.isChatInputCommand()){
|
|
||||||
interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)]})
|
|
||||||
}else if (interaction.isStringSelectMenu()){
|
|
||||||
try {
|
|
||||||
interaction.deferUpdate()
|
|
||||||
} catch{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (storage.get("ticketStorage",interaction.member.id) == null || storage.get("ticketStorage",interaction.member.id) == "false"|| Number(storage.get("ticketStorage",interaction.member.id)) < config.system.max_allowed_tickets){
|
|
||||||
|
|
||||||
try{
|
|
||||||
if (currentTicketOptions.enableDmOnOpen){
|
|
||||||
interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.main_color)]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch{log("system","can't send DM to member, member doesn't allow dm's")}
|
|
||||||
|
|
||||||
|
|
||||||
//update storage
|
|
||||||
storage.set("ticketStorage",interaction.member.id,Number(storage.get("ticketStorage",interaction.member.id))+1)
|
|
||||||
var ticketNumber = interaction.member.user.username
|
|
||||||
|
|
||||||
//set ticketName
|
|
||||||
var ticketName = currentTicketOptions.channelprefix+ticketNumber
|
|
||||||
var logsname = currentTicketOptions.name
|
|
||||||
|
|
||||||
//category
|
|
||||||
if (currentTicketOptions.category.length < 16 || currentTicketOptions.category.length > 20){
|
|
||||||
var newTicketCategory = null
|
|
||||||
}else{
|
|
||||||
var newTicketCategory = currentTicketOptions.category
|
|
||||||
}
|
|
||||||
|
|
||||||
var permissionsArray = []
|
|
||||||
const pfb = discord.PermissionFlagsBits
|
|
||||||
const guild = client.guilds.cache.find(g => g.id == interaction.guild.id)
|
|
||||||
|
|
||||||
//set everyone allowed
|
|
||||||
if (config.system['has@everyoneaccess']){
|
|
||||||
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
|
||||||
var everyoneDenyPerms = []
|
|
||||||
}else{
|
|
||||||
var everyoneAllowPerms = []
|
|
||||||
var everyoneDenyPerms = [pfb.ViewChannel]
|
|
||||||
}
|
|
||||||
permissionsArray.push({
|
|
||||||
id:interaction.guild.roles.everyone,
|
|
||||||
type:"role",
|
|
||||||
allow:everyoneAllowPerms,
|
|
||||||
deny:everyoneDenyPerms
|
|
||||||
})
|
|
||||||
|
|
||||||
//add the user that created the ticket
|
|
||||||
permissionsArray.push({
|
|
||||||
id:interaction.member.user,
|
|
||||||
type:"member",
|
|
||||||
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
|
||||||
})
|
|
||||||
|
|
||||||
//add main adminroles
|
|
||||||
config.main_adminroles.forEach((role,index) => {
|
|
||||||
try {
|
|
||||||
const adminrole = guild.roles.cache.find(r => r.id == role)
|
|
||||||
if (!adminrole) return
|
|
||||||
|
|
||||||
permissionsArray.push({
|
|
||||||
id:adminrole,
|
|
||||||
type:"role",
|
|
||||||
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
|
||||||
})
|
|
||||||
}catch{
|
|
||||||
log("system","invalid role! At 'config.json => main_adminroles:"+index)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
//add ticket adminroles
|
|
||||||
/**
|
|
||||||
* @type {String[]}
|
|
||||||
*/
|
|
||||||
const ticketadmin = currentTicketOptions.adminroles
|
|
||||||
ticketadmin.forEach((role,index) => {
|
|
||||||
if (!config.main_adminroles.includes(role)){
|
|
||||||
try {
|
|
||||||
const adminrole = guild.roles.cache.find(r => r.id == role)
|
|
||||||
if (!adminrole) return
|
|
||||||
|
|
||||||
permissionsArray.push({
|
|
||||||
id:adminrole,
|
|
||||||
type:"role",
|
|
||||||
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
|
||||||
})
|
|
||||||
}catch{
|
|
||||||
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
//add member role
|
|
||||||
if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){
|
|
||||||
try {
|
|
||||||
const userrole = guild.roles.cache.find(r => r.id == config.system.member_role)
|
|
||||||
if (!userrole) return
|
|
||||||
permissionsArray.push({
|
|
||||||
id:userrole,
|
|
||||||
type:"role",
|
|
||||||
deny:[pfb.ViewChannel]
|
|
||||||
})
|
|
||||||
}catch{
|
|
||||||
log("system","invalid role! At 'config.json => system/member_role")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//create the channel
|
|
||||||
interaction.guild.channels.create({
|
|
||||||
name:ticketName,
|
|
||||||
type:discord.ChannelType.GuildText,
|
|
||||||
parent:newTicketCategory,
|
|
||||||
reason:"A new ticket is created",
|
|
||||||
permissionOverwrites:permissionsArray
|
|
||||||
|
|
||||||
}).then((ticketChannel) => {
|
|
||||||
storage.set("userTicketStorage",ticketChannel.id,interaction.member.id)
|
|
||||||
|
|
||||||
const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}])
|
|
||||||
|
|
||||||
var ticketEmbed = new discord.EmbedBuilder()
|
|
||||||
//.setAuthor({name:interaction.user.id})
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle(currentTicketOptions.name)
|
|
||||||
//.setFooter({text:"Ticket Type: "+currentTicketOptions.id})
|
|
||||||
if (currentTicketOptions.ticketmessage.length > 0){
|
|
||||||
ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata)
|
|
||||||
}else{
|
|
||||||
ticketEmbed.setDescription(hiddendata)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentTicketOptions.thumbnail.enable) ticketEmbed.setThumbnail(currentTicketOptions.thumbnail.url)
|
|
||||||
|
|
||||||
ticketChannel.send({
|
|
||||||
content:"<@"+interaction.member.id+"> @here",
|
|
||||||
embeds:[ticketEmbed],
|
|
||||||
components:[closeButton]
|
|
||||||
|
|
||||||
}).then(firstmsg => {
|
|
||||||
firstmsg.pin()
|
|
||||||
})
|
|
||||||
|
|
||||||
log("system","created new ticket",[{key:"ticket",value:ticketName},{key:"user",value:interaction.user.tag}])
|
|
||||||
require("../api/modules/events").onTicketOpen(interaction.user,ticketChannel,interaction.guild,new Date(),{name:ticketName,status:"open",ticketOptions:currentTicketOptions})
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
try {
|
|
||||||
if (config.system.enable_DM_Messages){
|
|
||||||
interaction.member.send({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch{log("system","can't send DM to member, member doesn't allow dm's")}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const storage = bot.storage
|
|
||||||
const pfb = discord.PermissionFlagsBits
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {discord.TextBasedChannel} channel
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
const reopenTicket = (guild,channel,user) => {
|
|
||||||
log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.tag}])
|
|
||||||
|
|
||||||
var permissionsArray = []
|
|
||||||
|
|
||||||
//set everyone allowed
|
|
||||||
if (config.system['has@everyoneaccess']){
|
|
||||||
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
|
||||||
var everyoneDenyPerms = []
|
|
||||||
}else{
|
|
||||||
var everyoneAllowPerms = []
|
|
||||||
var everyoneDenyPerms = [pfb.ViewChannel]
|
|
||||||
}
|
|
||||||
permissionsArray.push({
|
|
||||||
id:guild.roles.everyone,
|
|
||||||
type:"role",
|
|
||||||
allow:everyoneAllowPerms,
|
|
||||||
deny:everyoneDenyPerms
|
|
||||||
})
|
|
||||||
|
|
||||||
channel.permissionOverwrites.cache.forEach((p) => {
|
|
||||||
if (p.type == 1){
|
|
||||||
permissionsArray.push({
|
|
||||||
id:p.id,
|
|
||||||
type:"member",
|
|
||||||
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
|
|
||||||
deny:[]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
channel.permissionOverwrites.set(permissionsArray)
|
|
||||||
|
|
||||||
require("../api/modules/events").onTicketReopen(user,channel,guild,new Date(),{name:channel.name,status:"reopened",ticketOptions:false})
|
|
||||||
}
|
|
||||||
exports.reopenTicket = reopenTicket
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
|
|
||||||
const bot = require("../../../index")
|
|
||||||
const tsconfig = bot.tsconfig
|
|
||||||
const tsembeds = require("../embeds")
|
|
||||||
const tsdb = require("../tsdb")
|
|
||||||
|
|
||||||
const otversion = require("../../../package.json").version
|
|
||||||
const version = require("../info.json").version
|
|
||||||
|
|
||||||
/**@typedef {{style:{enableCustomBackground:Boolean, backgroundModus:"color"|"image", backgroundData:String, titleColor:String}, bot:{name:String, id:Number, pfp:String}, ticket:{creatorname:String, creatorid:Number, closedtime:Number, openedtime:Number}}} OThtsDataOption */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {discord.Channel} channel
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {discord.Message[]} messagesInv
|
|
||||||
* @param {OThtsDataOption} data
|
|
||||||
*/
|
|
||||||
exports.compile = (guild,channel,user,messagesInv,data) => {
|
|
||||||
const messages = messagesInv.reverse()
|
|
||||||
var invisibleMessages = 0
|
|
||||||
|
|
||||||
const rawfiles = messages.filter((m) => Array.from(m.attachments).length > 0)
|
|
||||||
var fileAmount = 0
|
|
||||||
rawfiles.forEach((msg) => {
|
|
||||||
fileAmount = fileAmount + Array.from(msg.attachments).length
|
|
||||||
})
|
|
||||||
|
|
||||||
const messagesArray = []
|
|
||||||
messages.forEach((msg) => {
|
|
||||||
if (msg.content || msg.embeds.length > 0 || msg.attachments.toJSON().length > 0){
|
|
||||||
|
|
||||||
const embedArray = []
|
|
||||||
const fileArray = []
|
|
||||||
|
|
||||||
msg.attachments.forEach((file) => {
|
|
||||||
fileArray.push({
|
|
||||||
name:file.name,
|
|
||||||
type:file.contentType,
|
|
||||||
size:file.size.toString()+" bytes",
|
|
||||||
url:file.url
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
msg.embeds.forEach((embed) => {
|
|
||||||
if (embed.description){
|
|
||||||
var desc = bot.hiddenData.removeHiddenData(embed.description).description
|
|
||||||
}else{var desc = false}
|
|
||||||
|
|
||||||
embedArray.push({
|
|
||||||
title:embed.title || false,
|
|
||||||
description:desc,
|
|
||||||
authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false),
|
|
||||||
authortext:(embed.author ? embed.author.name : false),
|
|
||||||
footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false),
|
|
||||||
footertext:(embed.footer ? embed.footer.text : false),
|
|
||||||
color:embed.hexColor,
|
|
||||||
image:((embed.image && embed.image.url) ? embed.image.url : false),
|
|
||||||
thumbnail:((embed.thumbnail && embed.thumbnail.url) ? embed.thumbnail.url : false),
|
|
||||||
url:(embed.url ? embed.url : false)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
messagesArray.push({
|
|
||||||
author:{
|
|
||||||
name:msg.author.tag,
|
|
||||||
id:Number(msg.author.id),
|
|
||||||
color:msg.author.hexAccentColor || "#ffffff",
|
|
||||||
pfp:msg.author.displayAvatarURL()
|
|
||||||
},
|
|
||||||
content:msg.content || "",
|
|
||||||
timestamp:msg.createdTimestamp,
|
|
||||||
embeds:embedArray,
|
|
||||||
files:fileArray
|
|
||||||
})
|
|
||||||
}else {invisibleMessages++}
|
|
||||||
})
|
|
||||||
|
|
||||||
const result = {
|
|
||||||
version,otversion,
|
|
||||||
style:{
|
|
||||||
backgroundData:data.style.backgroundData || "",
|
|
||||||
backgroundModus:data.style.backgroundModus || "",
|
|
||||||
enableCustomBackground:data.style.enableCustomBackground || false,
|
|
||||||
titleColor:data.style.titleColor || "#F8BA00"
|
|
||||||
},
|
|
||||||
bot:{
|
|
||||||
name:data.bot.name || "Open Ticket",
|
|
||||||
id:Number(data.bot.id) || 0,
|
|
||||||
pfp:data.bot.pfp || "dj-dj.be/wp-content/uploads/2022/07/profielfoto-blauw-wit.png?size=128"
|
|
||||||
},
|
|
||||||
ticket:{
|
|
||||||
name:channel.name,
|
|
||||||
id:Number(channel.id),
|
|
||||||
|
|
||||||
guildname:guild.name,
|
|
||||||
guildid:Number(guild.id),
|
|
||||||
|
|
||||||
creatorname:data.ticket.creatorname,
|
|
||||||
creatorid:Number(data.ticket.creatorid),
|
|
||||||
closedbyname:user.tag,
|
|
||||||
closedbyid:Number(user.id),
|
|
||||||
|
|
||||||
closedtime:data.ticket.closedtime,
|
|
||||||
openedtime:data.ticket.openedtime,
|
|
||||||
|
|
||||||
messages:Array.from(messages).length-invisibleMessages,
|
|
||||||
files:fileAmount
|
|
||||||
},
|
|
||||||
messages:messagesArray
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
const axios = require("axios").default
|
|
||||||
const discord = require('discord.js')
|
|
||||||
|
|
||||||
const bot = require("../../../index")
|
|
||||||
const tsconfig = bot.tsconfig
|
|
||||||
const tsembeds = require("../embeds")
|
|
||||||
const tsdb = require("../tsdb")
|
|
||||||
|
|
||||||
/**@typedef {{status:"success"|"error", id:String, time:Number, estimated:{lastdump: Number, processtime:Number}, transcriptstatus:{value:2, data:{fetchedmsgs:true, uploaded:true, inqueue:true, processed:false, waiting:false, available:false}}}} OTuploadResponse */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object} json
|
|
||||||
* @returns {Promise<OTuploadResponse|false>}
|
|
||||||
*/
|
|
||||||
exports.upload = async (json) => {
|
|
||||||
return new Promise(async (resolve,reject) => {
|
|
||||||
const data = encodeURIComponent(JSON.stringify(json))
|
|
||||||
|
|
||||||
try {
|
|
||||||
const res = await axios.get("https://api.transcripts.dj-dj.be/upload?auth=openticketTRANSCRIPT1234&version=1.0.0&data="+data)
|
|
||||||
if (res.status != 200) resolve(false)
|
|
||||||
|
|
||||||
resolve(res.data)
|
|
||||||
}catch{
|
|
||||||
console.log("failed transcript upload!")
|
|
||||||
resolve(false)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
{
|
|
||||||
"version":"1.0.0",
|
|
||||||
"otversion":"3.2.0",
|
|
||||||
"style":{
|
|
||||||
"enableCustomBackground":false,
|
|
||||||
"backgroundModus":"color OR image",
|
|
||||||
"backgroundData":"#ffffff OR https://www.example.com/image.png",
|
|
||||||
"titleColor":"#ffffff"
|
|
||||||
},
|
|
||||||
"bot":{
|
|
||||||
"name":"DJdj Support Bot",
|
|
||||||
"id":12345678910,
|
|
||||||
"pfp":"https://www.example.com/image.png"
|
|
||||||
},
|
|
||||||
"ticket":{
|
|
||||||
"name":"support-DJj123dj",
|
|
||||||
"id":12345678910,
|
|
||||||
|
|
||||||
"guildname":"DJdj Development",
|
|
||||||
"guildid":12345678910,
|
|
||||||
|
|
||||||
"creatorname":"DJj123dj#1706",
|
|
||||||
"creatorid":12345678910,
|
|
||||||
"closedbyname":"DJj123dj#1706",
|
|
||||||
"closedbyid":12345678910,
|
|
||||||
|
|
||||||
"closedtime":12345678910,
|
|
||||||
"openedtime":12345678910,
|
|
||||||
|
|
||||||
"messages":1,
|
|
||||||
"files":1
|
|
||||||
},
|
|
||||||
"messages":[
|
|
||||||
{
|
|
||||||
"author":{
|
|
||||||
"name":"DJj123dj#1706",
|
|
||||||
"id":12345678910,
|
|
||||||
"color":"#ffffff",
|
|
||||||
"pfp":"https://www.example.com/image.png"
|
|
||||||
},
|
|
||||||
"content":"string or FALSE",
|
|
||||||
"timestamp":12345678910,
|
|
||||||
"embeds":[
|
|
||||||
{
|
|
||||||
"title":"string or FALSE",
|
|
||||||
"description":"string or FALSE",
|
|
||||||
"authorimg":"https://www.example.com/image.png or FALSE",
|
|
||||||
"authortext":"string or FALSE",
|
|
||||||
"footerimg":"https://www.example.com/image.png or FALSE",
|
|
||||||
"footertext":"string or FALSE",
|
|
||||||
"color":"#ffffff",
|
|
||||||
"image":"https://www.example.com/image.png or FALSE",
|
|
||||||
"thumbnail":"https://www.example.com/image.png or FALSE",
|
|
||||||
"url":"https://www.example.com/image.png or FALSE"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"files":[
|
|
||||||
{
|
|
||||||
"name":"image.png",
|
|
||||||
"type":"PNG",
|
|
||||||
"size":"1MB",
|
|
||||||
"url":"https://www.example.com/image.png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const storage = bot.storage
|
|
||||||
const tsconfig = bot.tsconfig
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} name
|
|
||||||
* @param {String} id
|
|
||||||
* @param {Number} rawprocesstime milliseconds
|
|
||||||
* @param {discord.User} user
|
|
||||||
*/
|
|
||||||
exports.beingprocessed = (name,id,rawprocesstime,user) => {
|
|
||||||
|
|
||||||
const newtime = rawprocesstime
|
|
||||||
|
|
||||||
const processtime = "<t:"+newtime.getTime().toString().substring(0,newtime.getTime().toString().length-3)+":R>"
|
|
||||||
|
|
||||||
const embed = new discord.EmbedBuilder()
|
|
||||||
.setTitle("🧾 Transcript")
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
|
|
||||||
.setFooter({text:name})
|
|
||||||
|
|
||||||
.setDescription("`This transcript is being processed...`\nPlease wait!\n\nEstimated time: "+processtime)
|
|
||||||
|
|
||||||
return embed
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} name
|
|
||||||
* @param {String} id
|
|
||||||
* @param {String} url
|
|
||||||
* @param {discord.User} user
|
|
||||||
*/
|
|
||||||
exports.tsready = (name,id,url,user) => {
|
|
||||||
const embed = new discord.EmbedBuilder()
|
|
||||||
.setTitle("🧾 Transcript")
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
|
|
||||||
.setFooter({text:name})
|
|
||||||
.setURL(url)
|
|
||||||
|
|
||||||
.setDescription("\nThe transcript is available [here]("+url+")\n")
|
|
||||||
|
|
||||||
return embed
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} name
|
|
||||||
* @param {String} id
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {undefined|String} err
|
|
||||||
*/
|
|
||||||
exports.tserror = (name,id,user,err) => {
|
|
||||||
const embed = new discord.EmbedBuilder()
|
|
||||||
.setTitle("❌ Transcript")
|
|
||||||
.setColor(discord.Colors.Red)
|
|
||||||
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
|
|
||||||
.setFooter({text:name})
|
|
||||||
|
|
||||||
const errDesc = (typeof err == "string") ? "\n"+err : ""
|
|
||||||
|
|
||||||
embed.setDescription("Something went wrong while creating the HTML transcript.\n\n[possible reasons](https://docs.openticket.dj-dj.be/the-system/transcripts/transcript-errors)"+errDesc)
|
|
||||||
|
|
||||||
return embed
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"version":"1.0.0"
|
|
||||||
}
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
const l = bot.language
|
|
||||||
const storage = bot.storage
|
|
||||||
|
|
||||||
const tsconfig = bot.tsconfig
|
|
||||||
const tsembeds = require("./embeds")
|
|
||||||
const tsdb = require("./tsdb")
|
|
||||||
|
|
||||||
|
|
||||||
const checkAvailability = async () => {
|
|
||||||
const axios = require("axios").default
|
|
||||||
const res = await axios.get("https://transcripts.dj-dj.be/status.txt")
|
|
||||||
if (!res || !(res.status == 200) || !res.data) return false
|
|
||||||
|
|
||||||
if ((res.data == "online") || (res.data == "1") || (res.data == "true")) return true
|
|
||||||
else return false
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.Message[]} messages
|
|
||||||
* @param {discord.Guild} guild
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @param {String|false} reason
|
|
||||||
*/
|
|
||||||
module.exports = async (messages,guild,channel,user,reason) => {
|
|
||||||
require("../api/modules/events").onTranscriptCreation(messages,channel,guild,new Date())
|
|
||||||
const msglist = await channel.messages.fetchPinned()
|
|
||||||
|
|
||||||
const chName = channel.name
|
|
||||||
const chId = channel.id
|
|
||||||
|
|
||||||
/**@param {discord.Collection<string, discord.Message<true>>} msglist*/
|
|
||||||
const asyncmanager = async (msglist) => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
|
|
||||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
|
||||||
const ticketId = hiddendata.data.find(d => d.key == "type")
|
|
||||||
|
|
||||||
const id = hiddendata.data.find(d => d.key == "openerid").value
|
|
||||||
const opentime = new Date(Number(hiddendata.data.find(d => d.key == "createdms").value))
|
|
||||||
|
|
||||||
const ticketopener = client.users.cache.find(u => u.id == id)
|
|
||||||
|
|
||||||
|
|
||||||
const JSONDATA = require("./communication/compileJson").compile(guild,channel,user,messages,{
|
|
||||||
style:{
|
|
||||||
titleColor:tsconfig.style.titleColor,
|
|
||||||
enableCustomBackground:tsconfig.style.background.enableCustomBackground,
|
|
||||||
backgroundModus:tsconfig.style.background.backgroundModus,
|
|
||||||
backgroundData:tsconfig.style.background.backgroundData
|
|
||||||
},
|
|
||||||
bot:{
|
|
||||||
name:client.user.username,
|
|
||||||
id:client.user.id,
|
|
||||||
pfp:client.user.displayAvatarURL()
|
|
||||||
},
|
|
||||||
ticket:{
|
|
||||||
creatorid:ticketopener.id,
|
|
||||||
creatorname:ticketopener.tag,
|
|
||||||
openedtime:opentime.getTime(),
|
|
||||||
closedtime:new Date().getTime()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!await checkAvailability()){
|
|
||||||
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
|
|
||||||
const errembed = tsembeds.tserror(chName,chId,user)
|
|
||||||
|
|
||||||
if (tsconfig.sendTranscripts.enableChannel){
|
|
||||||
/**@type {discord.TextChannel|undefined} */
|
|
||||||
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
|
|
||||||
|
|
||||||
if (!tc) return
|
|
||||||
tc.send({embeds:[errembed],files:[attachment]})
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const TSdata = await require("./communication/index").upload(JSONDATA)
|
|
||||||
if (!TSdata) return false
|
|
||||||
|
|
||||||
if (TSdata.status == "success"){
|
|
||||||
const url = "https://transcripts.dj-dj.be/t/"+TSdata.time+"_"+TSdata.id+".html"
|
|
||||||
|
|
||||||
//calculate estimated time
|
|
||||||
const lastDumpTime = (new Date(TSdata.estimated.lastdump).getTime())
|
|
||||||
const dumpLoopTime = 15000
|
|
||||||
const nextDump = new Date(lastDumpTime+dumpLoopTime)
|
|
||||||
const processtime = TSdata.estimated.processtime+6000 //6sec extra time for overflow
|
|
||||||
|
|
||||||
const finaltime = new Date(nextDump.getTime()+processtime)
|
|
||||||
const duration = finaltime.getTime()-new Date().getTime()
|
|
||||||
|
|
||||||
//waiting
|
|
||||||
if (tsconfig.sendTranscripts.enableChannel){
|
|
||||||
/**@type {discord.TextChannel|undefined} */
|
|
||||||
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
|
|
||||||
|
|
||||||
if (!tc) return
|
|
||||||
const embed = tsembeds.beingprocessed(chName,chId,finaltime,user)
|
|
||||||
var msg = await tc.send({embeds:[embed]})
|
|
||||||
}else {var msg = false}
|
|
||||||
|
|
||||||
//ready
|
|
||||||
setTimeout(() => {
|
|
||||||
if (msg){
|
|
||||||
msg.edit({embeds:[tsembeds.tsready(chName,chId,url,user)]})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tsconfig.sendTranscripts.enableDM){
|
|
||||||
if (!user) return
|
|
||||||
const embed = tsembeds.tsready(chName,chId,url,user)
|
|
||||||
try {
|
|
||||||
user.send({embeds:[embed]})
|
|
||||||
}catch{}
|
|
||||||
}
|
|
||||||
},duration)
|
|
||||||
}else{
|
|
||||||
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
|
|
||||||
const errembed = tsembeds.tserror(chName,chId,user,"`error type: transcript API error`")
|
|
||||||
|
|
||||||
if (tsconfig.sendTranscripts.enableChannel){
|
|
||||||
/**@type {discord.TextChannel|undefined} */
|
|
||||||
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
|
|
||||||
|
|
||||||
if (!tc) return
|
|
||||||
tc.send({embeds:[errembed],files:[attachment]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
asyncmanager(msglist)
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.Message[]} messagecollection
|
|
||||||
* @returns new `discord.attachmentBuilder`
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports.createTranscript = async (messagecollection) => {
|
|
||||||
try {
|
|
||||||
const cd = new Date()
|
|
||||||
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
|
|
||||||
const dateString = cd.getDate()+" "+months[cd.getMonth()-1]+" "+cd.getFullYear()+" - "+cd.getHours()+":"+cd.getMinutes()+":"+cd.getSeconds()
|
|
||||||
const filearray = ["BACKUP TRANSCRIPT:\n"]
|
|
||||||
|
|
||||||
messagecollection.reverse()
|
|
||||||
|
|
||||||
messagecollection.forEach((msg) => {
|
|
||||||
const timestamp = new Date(msg.createdTimestamp)
|
|
||||||
|
|
||||||
if (msg.content){var content = msg.content}else{var content = "*empty message*"}
|
|
||||||
|
|
||||||
const msgstats = "files: "+msg.attachments.size+", embeds: "+msg.embeds.length
|
|
||||||
filearray.push("["+timestamp.getDate()+"/"+timestamp.getMonth()+"/"+timestamp.getFullYear()+", "+timestamp.getHours()+":"+timestamp.getMinutes()+":"+timestamp.getSeconds()+"|"+msg.author.tag+"] ["+msgstats+"]\n"+content+"\n")
|
|
||||||
})
|
|
||||||
|
|
||||||
if (filearray.length < 2) filearray.push("transcript is empty")
|
|
||||||
const filestring = filearray.join("\n")
|
|
||||||
const filebuff = Buffer.from(filestring,"utf-8")
|
|
||||||
return new discord.AttachmentBuilder(filebuff,{name:"backuptranscript.txt",description:"Open Ticket transcript"})
|
|
||||||
}catch{
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
const fs = require("fs")
|
|
||||||
const location = "./storage/tsdatabase.json"
|
|
||||||
|
|
||||||
|
|
||||||
/**@returns {[{category:String, key:String, value:String}]}*/
|
|
||||||
function getData(){
|
|
||||||
if (fs.existsSync(location)){
|
|
||||||
return JSON.parse(fs.readFileSync(location).toString())
|
|
||||||
}else{
|
|
||||||
fs.writeFileSync(location,"[]")
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**@param {[{category:String, key:String, value:String}]} data*/
|
|
||||||
function setData(data){
|
|
||||||
fs.writeFileSync(location,JSON.stringify(data,null,"\t"))
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.set = (category,key,value) => {
|
|
||||||
const currentData = getData()
|
|
||||||
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
|
|
||||||
var newData = []
|
|
||||||
if (exists){
|
|
||||||
currentData.forEach((d,i) => {
|
|
||||||
if (d.category == category && d.key == key){
|
|
||||||
newData.push({category,key,value})
|
|
||||||
}else{
|
|
||||||
newData.push(d)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
currentData.push({category,key,value})
|
|
||||||
newData = currentData
|
|
||||||
}
|
|
||||||
|
|
||||||
setData(newData)
|
|
||||||
return exists
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {String} category
|
|
||||||
* @param {String} key
|
|
||||||
* @returns {String|false}
|
|
||||||
*/
|
|
||||||
exports.get = (category,key) => {
|
|
||||||
const currentData = getData()
|
|
||||||
const tempresult = currentData.find((d) => (d.category == category) && (d.key == key))
|
|
||||||
const result = tempresult ? tempresult.value : false
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {String} category
|
|
||||||
* @param {String} key
|
|
||||||
* @param {String} value
|
|
||||||
*/
|
|
||||||
exports.delete = (category,key) => {
|
|
||||||
const currentData = getData()
|
|
||||||
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
|
|
||||||
var newData = []
|
|
||||||
if (exists){
|
|
||||||
currentData.forEach((d,i) => {
|
|
||||||
if (!(d.category == category && d.key == key)){
|
|
||||||
newData.push(d)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
newData = currentData
|
|
||||||
}
|
|
||||||
|
|
||||||
setData(newData)
|
|
||||||
return exists
|
|
||||||
}
|
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
const bot = require("../../index")
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
//TYPEDEFS:
|
|
||||||
//==================
|
|
||||||
|
|
||||||
//OTTicketOptions
|
|
||||||
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color: "red"|"green"|"blue"|"gray",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, closedCategory:{enable:Boolean,id:String}}} OTTicketOptions */
|
|
||||||
|
|
||||||
//OTRoleOptions
|
|
||||||
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color:"red"|"green"|"blue"|"gray"|"none",roles:String[],mode:"add&remove"|"remove"|"add",enableDmOnOpen:Boolean}} OTRoleOptions */
|
|
||||||
|
|
||||||
//OTWebsiteOptions
|
|
||||||
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",url:String}} OTWebsiteOptions */
|
|
||||||
|
|
||||||
|
|
||||||
//OTConfigMessage
|
|
||||||
/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableThumbnail: boolean, thumbnail: string, enableCustomColor: boolean, color: string, options: string[], other:{enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean, customDropdownPlaceholder:{enable:Boolean,text:String}, customCategoryText:{enable:Boolean,text:String}, embedTitleURL:{enable:Boolean,url:String} } }} OTConfigMessage*/
|
|
||||||
|
|
||||||
//StringOptions
|
|
||||||
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"closedCategory"} OTTicketStringOptions */
|
|
||||||
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDmOnOpen"} OTRoleStringOptions */
|
|
||||||
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} OTWebsiteStringOptions */
|
|
||||||
|
|
||||||
//FUNCTIONS:
|
|
||||||
//==================
|
|
||||||
|
|
||||||
/** @param {String} id the id of the embed @returns {OTConfigMessage}*/
|
|
||||||
exports.getConfigMessage = (id) => {
|
|
||||||
var returned = config.messages.find(a => a.id == id)
|
|
||||||
if (returned){
|
|
||||||
return returned
|
|
||||||
}
|
|
||||||
var result = config.messages[0]
|
|
||||||
if (!result){
|
|
||||||
throw new Error("'messages' object in config.json is empty")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} id
|
|
||||||
* @param {Boolean} withoutOTnewT
|
|
||||||
* @returns {OTTicketOptions|false}
|
|
||||||
*/
|
|
||||||
exports.getTicketById = (id,withoutOTnewT) => {
|
|
||||||
var result = false
|
|
||||||
if (withoutOTnewT){
|
|
||||||
config.options.forEach((option) => {
|
|
||||||
if (option.id == id && option.type == "ticket"){
|
|
||||||
result = option
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
config.options.forEach((option) => {
|
|
||||||
if ("OTnewT"+option.id == id && option.type == "ticket"){
|
|
||||||
result = option
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} id
|
|
||||||
* @param {Boolean} withoutOTnewR
|
|
||||||
* @returns {OTRoleOptions|false}
|
|
||||||
*/
|
|
||||||
exports.getRoleById = (id,withoutOTnewR) => {
|
|
||||||
var result = false
|
|
||||||
if (withoutOTnewR){
|
|
||||||
config.options.forEach((option) => {
|
|
||||||
if (option.id == id && option.type == "role"){
|
|
||||||
result = option
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
config.options.forEach((option) => {
|
|
||||||
if ("OTnewR"+option.id == id && option.type == "role"){
|
|
||||||
result = option
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} id
|
|
||||||
* @returns {OTWebsiteOptions|false}
|
|
||||||
*/
|
|
||||||
exports.getWebsiteById = (id) => {
|
|
||||||
var result = false
|
|
||||||
config.options.forEach((option) => {
|
|
||||||
if (option.id == id && option.type == "website"){
|
|
||||||
result = option
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {OTTicketStringOptions} value
|
|
||||||
* @returns {String[]}
|
|
||||||
*/
|
|
||||||
exports.getTicketValuesArray = (value,idWithoutOTnewT) => {
|
|
||||||
var result = []
|
|
||||||
const prefix = idWithoutOTnewT ? "" : "OTnewT"
|
|
||||||
config.options.forEach((opt) => {
|
|
||||||
if (opt.type == "ticket"){
|
|
||||||
if (value == "id"){
|
|
||||||
result.push(prefix+opt[value])
|
|
||||||
}else{
|
|
||||||
result.push(opt[value])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {OTRoleStringOptions} value
|
|
||||||
* @returns {String[]}
|
|
||||||
*/
|
|
||||||
exports.getRoleValuesArray = (value,idWithoutOTnewR) => {
|
|
||||||
var result = []
|
|
||||||
const prefix = idWithoutOTnewR ? "" : "OTnewR"
|
|
||||||
config.options.forEach((opt) => {
|
|
||||||
if (o.type == "role"){
|
|
||||||
if (value == "id"){
|
|
||||||
result.push(prefix+opt[value])
|
|
||||||
}else{
|
|
||||||
result.push(opt[value])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {OTWebsiteStringOptions} value
|
|
||||||
* @returns {String[]}
|
|
||||||
*/
|
|
||||||
exports.getWebsiteValuesArray = (value) => {
|
|
||||||
var result = []
|
|
||||||
config.options.forEach((opt) => {
|
|
||||||
if (o.type == "website"){
|
|
||||||
result.push(opt[value])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@type {OTTicketOptions} */
|
|
||||||
this.ticketType = {}
|
|
||||||
|
|
||||||
/**@type {OTRoleOptions} */
|
|
||||||
this.roleType = {}
|
|
||||||
|
|
||||||
/**@type {OTWebsiteOptions} */
|
|
||||||
this.websiteType = {}
|
|
||||||
|
|
||||||
/**@type {OTConfigMessage} */
|
|
||||||
this.messageType = {}
|
|
||||||
|
|
||||||
|
|
||||||
//OTAllOptions
|
|
||||||
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color:"red"|"green"|"blue"|"gray"|"none",roles:String[],mode:"add&remove"|"remove"|"add",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, url:String, closedCategory:{enable:Boolean,id:String}}} OTAllOptions */
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} id
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.optionExists = (id) => {
|
|
||||||
var result = false
|
|
||||||
config.options.forEach((option) => {
|
|
||||||
if (option.id == id){
|
|
||||||
result = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
const discord = require("discord.js")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
/**@returns {"DANGER"|"SUCCESS"|"PRIMARY"|"SECONDARY"} */
|
|
||||||
const getColor = (color) => {
|
|
||||||
const b = discord.ButtonStyle
|
|
||||||
if (color.toLowerCase() == "red"){
|
|
||||||
return b.Danger
|
|
||||||
}else if (color.toLowerCase() == "green"){
|
|
||||||
return b.Success
|
|
||||||
}else if (color.toLowerCase() == "blue" || color.toLowerCase() == "blurple"){
|
|
||||||
return b.Primary
|
|
||||||
}else if (color.toLowerCase() == "black" || color.toLowerCase() == "gray" || color.toLowerCase() == "grey"){
|
|
||||||
return b.Secondary
|
|
||||||
}else if (color == "DANGER" || color == "SECONDARY" || color == "SUCCESS" || color == "PRIMARY"){
|
|
||||||
return color
|
|
||||||
}else if (color.toLowerCase() == "none" || color.toLowerCase() == "false" || color.toLowerCase() == ""){
|
|
||||||
return b.Secondary
|
|
||||||
}else return b.Secondary
|
|
||||||
}
|
|
||||||
|
|
||||||
const getOption = (id) => {
|
|
||||||
const result = config.options.find((option) => option.id == id)
|
|
||||||
if (!result){return false}else return result
|
|
||||||
}
|
|
||||||
exports.getOption = getOption
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} id
|
|
||||||
* @returns {discord.ButtonBuilder|false}
|
|
||||||
*/
|
|
||||||
exports.getButton = (id) => {
|
|
||||||
const option = getOption(id)
|
|
||||||
if (!option) return false
|
|
||||||
if (option.type == "ticket"){
|
|
||||||
var button = new discord.ButtonBuilder()
|
|
||||||
.setCustomId("OTnewT"+option.id)
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(getColor(option.color))
|
|
||||||
|
|
||||||
if (option.label){button.setLabel(option.label)}
|
|
||||||
if (option.icon){button.setEmoji(option.icon)}
|
|
||||||
if (!option.label && !option.icon){button.setLabel("no label or emoji")}
|
|
||||||
|
|
||||||
}else if (option.type == "website"){
|
|
||||||
var button = new discord.ButtonBuilder()
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Link)
|
|
||||||
.setURL(option.url)
|
|
||||||
|
|
||||||
if (option.label){button.setLabel(option.label)}
|
|
||||||
if (option.icon){button.setEmoji(option.icon)}
|
|
||||||
if (!option.label && !option.icon){button.setLabel("no label or emoji")}
|
|
||||||
|
|
||||||
}else if (option.type == "role"){
|
|
||||||
var button = new discord.ButtonBuilder()
|
|
||||||
.setCustomId("newR"+option.id)
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(getColor(option.color))
|
|
||||||
|
|
||||||
if (option.label){button.setLabel(option.label)}
|
|
||||||
if (option.icon){button.setEmoji(option.icon)}
|
|
||||||
if (!option.label && !option.icon){button.setLabel("no label or emoji")}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return button
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
exports.rawButtonData = class {
|
|
||||||
constructor() {
|
|
||||||
this.id = ""
|
|
||||||
this.name = ""
|
|
||||||
this.description = ""
|
|
||||||
this.icon = ""
|
|
||||||
this.label = ""
|
|
||||||
this.type = ""
|
|
||||||
|
|
||||||
this.color = ""
|
|
||||||
this.enableDmOnOpen = true
|
|
||||||
this.url = ""
|
|
||||||
this.roles = ["",""]
|
|
||||||
this.mode = ""
|
|
||||||
this.adminroles = ["",""]
|
|
||||||
this.channelprefix = ""
|
|
||||||
this.category = ""
|
|
||||||
this.message = ""
|
|
||||||
this.ticketmessage = ""
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
const discord = require("discord.js")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
const configParser = require("./configParser")
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String[]} ids
|
|
||||||
* @param {String|undefined|false} placeholder
|
|
||||||
* @returns {discord.StringSelectMenuBuilder|false}
|
|
||||||
*/
|
|
||||||
exports.getDropdown = (ids,placeholder) => {
|
|
||||||
const dropdown = new discord.StringSelectMenuBuilder()
|
|
||||||
.setCustomId("OTdropdownMenu")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setMaxValues(1)
|
|
||||||
.setMinValues(1)
|
|
||||||
.setPlaceholder(placeholder || l.messages.chooseATicket)
|
|
||||||
.addOptions(
|
|
||||||
new discord.SelectMenuOptionBuilder()
|
|
||||||
.setDefault(true)
|
|
||||||
.setLabel(placeholder || l.messages.chooseATicket)
|
|
||||||
.setValue("OTChooseTicket")
|
|
||||||
)
|
|
||||||
|
|
||||||
ids.forEach((id) => {
|
|
||||||
const option = configParser.getTicketById(id,true)
|
|
||||||
const roleoption = configParser.getRoleById(id,true)
|
|
||||||
if (option){
|
|
||||||
const selectComponent = new discord.SelectMenuOptionBuilder()
|
|
||||||
.setDefault(false)
|
|
||||||
.setValue("OTnewT"+option.id)
|
|
||||||
|
|
||||||
if (!option.label && !option.icon){
|
|
||||||
selectComponent.setLabel("OT ERROR: no description/emoji")
|
|
||||||
}else{
|
|
||||||
if (option.label) selectComponent.setLabel(option.label)
|
|
||||||
if (option.icon) selectComponent.setEmoji(option.icon)
|
|
||||||
}
|
|
||||||
|
|
||||||
dropdown.addOptions(selectComponent)
|
|
||||||
|
|
||||||
}else if (roleoption){
|
|
||||||
const selectComponent = new discord.SelectMenuOptionBuilder()
|
|
||||||
.setDefault(false)
|
|
||||||
.setValue("OTnewR"+roleoption.id)
|
|
||||||
|
|
||||||
if (!roleoption.label && !roleoption.icon){
|
|
||||||
selectComponent.setLabel("OT ERROR: no description/emoji")
|
|
||||||
}else{
|
|
||||||
if (roleoption.label) selectComponent.setLabel(roleoption.label)
|
|
||||||
if (roleoption.icon) selectComponent.setEmoji(roleoption.icon)
|
|
||||||
}
|
|
||||||
|
|
||||||
dropdown.addOptions(selectComponent)
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
return dropdown
|
|
||||||
}
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const getButton = require("./getButton")
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} id the id from an open-ticket embed
|
|
||||||
* @returns {{embed:discord.EmbedBuilder,componentRows:discord.MessageActionRow[]}} discord embed
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
exports.createEmbed = (id) => {
|
|
||||||
//-----------------------------------
|
|
||||||
//general importing
|
|
||||||
const data = require("./configParser").getConfigMessage(id)
|
|
||||||
/**@type {discord.ButtonBuilder[]}*/
|
|
||||||
var buttons = []
|
|
||||||
/**@type {getButton.rawButtonData[]} */
|
|
||||||
var buttonData = []
|
|
||||||
|
|
||||||
data.options.forEach((option) => {
|
|
||||||
var button = getButton.getButton(option)
|
|
||||||
var localButtonData = getButton.getOption(option)
|
|
||||||
if (button) buttons.push(button)
|
|
||||||
if (localButtonData) buttonData.push(localButtonData)
|
|
||||||
})
|
|
||||||
//-----------------------------------
|
|
||||||
|
|
||||||
//-----------------------------------
|
|
||||||
//create the embed
|
|
||||||
const embed = new discord.EmbedBuilder()
|
|
||||||
.setTitle(data.name)
|
|
||||||
if (data.enableFooter) embed.setFooter({text:data.footer})
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (data.enableThumbnail) embed.setThumbnail(data.thumbnail)
|
|
||||||
}catch{bot.errorLog.log("info","THUMBNAIL FAILED TO LOAD, probably invalid url!")}
|
|
||||||
|
|
||||||
if (data.enableCustomColor){
|
|
||||||
embed.setColor(data.color)
|
|
||||||
}else{
|
|
||||||
embed.setColor(config.main_color)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL)
|
|
||||||
|
|
||||||
var description = data.description
|
|
||||||
if (data.other.enableTicketExplaination){
|
|
||||||
const chooseCategoryMSG = data.other.customCategoryText.enable ? data.other.customCategoryText.text : l.messages.chooseCategory
|
|
||||||
description = description+"\n\n__"+chooseCategoryMSG+"__\n"
|
|
||||||
|
|
||||||
var ticketExplainations = []
|
|
||||||
buttonData.forEach((button) => {
|
|
||||||
var explaination = button.icon+" **"+button.name+":**\n"+button.description
|
|
||||||
ticketExplainations.push(explaination)
|
|
||||||
})
|
|
||||||
|
|
||||||
description = description+ticketExplainations.join("\n\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.other.enableMaxTicketsWarning){
|
|
||||||
description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.max_allowed_tickets)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (description) embed.setDescription(description)
|
|
||||||
|
|
||||||
//-----------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------
|
|
||||||
//create the components IF DROPDOWN IS FALSE
|
|
||||||
if (!data.dropdown){
|
|
||||||
var AmountOfRows = Math.ceil(buttons.length / 4)
|
|
||||||
var currentRow = 0
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {discord.MessageActionRow[]}
|
|
||||||
*/
|
|
||||||
var componentRows = []
|
|
||||||
|
|
||||||
for (let i = AmountOfRows; i > 0; i--){
|
|
||||||
|
|
||||||
componentRows.push(new discord.ActionRowBuilder())
|
|
||||||
}
|
|
||||||
|
|
||||||
buttons.forEach((button,index) => {
|
|
||||||
componentRows[currentRow].addComponents([button])
|
|
||||||
|
|
||||||
if (index == 3 || index == 7 || index == 11 || index == 15 || index == 19 || index == 23 || index == 27 || index == 31 || index == 35 || index == 39){
|
|
||||||
currentRow = currentRow + 1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
//create the component IF DROPDOWN is true
|
|
||||||
}else{
|
|
||||||
const ids = data.options
|
|
||||||
const customPlaceholder = data.other.customDropdownPlaceholder.enable ? data.other.customDropdownPlaceholder.text : false
|
|
||||||
const dropdown = require("./getDropdown").getDropdown(ids,customPlaceholder)
|
|
||||||
var componentRows = [
|
|
||||||
new discord.ActionRowBuilder()
|
|
||||||
.setComponents(dropdown)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
//-----------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//return everything
|
|
||||||
/**
|
|
||||||
* @type {{embed:discord.EmbedBuilder,componentRows:discord.MessageActionRow[]}}
|
|
||||||
*/
|
|
||||||
const returnedData = {embed:embed,componentRows:componentRows}
|
|
||||||
return returnedData
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
|
|
||||||
/**@typedef {{type:String,data:[{key:String,value:String}]}} hiddenData */
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} messageContent
|
|
||||||
* @returns {hiddenData}
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports.readHiddenData = (messageContent) => {
|
|
||||||
//ticketdata//type:123|userid:456)
|
|
||||||
const rawhidden = messageContent.split("[ ](OTDATA|")[1]
|
|
||||||
const rawhidden2 = rawhidden.split("//")
|
|
||||||
|
|
||||||
const datatype = rawhidden2[0]
|
|
||||||
var rawhiddendata = rawhidden2[1]
|
|
||||||
var rawhiddendataArray = rawhiddendata.split("")
|
|
||||||
rawhiddendataArray.pop()
|
|
||||||
|
|
||||||
rawhiddendata = rawhiddendataArray.join("")
|
|
||||||
|
|
||||||
const splittedData = rawhiddendata.split("|")
|
|
||||||
|
|
||||||
const resultData = []
|
|
||||||
splittedData.forEach((data) => {
|
|
||||||
// type:123
|
|
||||||
const dataresult = data.split(":")
|
|
||||||
|
|
||||||
resultData.push({key:dataresult[0],value:dataresult[1]})
|
|
||||||
})
|
|
||||||
|
|
||||||
return {type:datatype,data:resultData}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} type
|
|
||||||
* @param {[{key:String,value:String}]} data
|
|
||||||
* @returns {String}
|
|
||||||
*/
|
|
||||||
exports.writeHiddenData = (type,data) => {
|
|
||||||
const dataValues = []
|
|
||||||
data.forEach((d) => {
|
|
||||||
dataValues.push(d.key+":"+d.value)
|
|
||||||
})
|
|
||||||
|
|
||||||
const datastring = dataValues.join("|")
|
|
||||||
|
|
||||||
const result = "[ ](OTDATA|"+type+"//"+datastring+")"
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} description
|
|
||||||
* @returns {{description:String,hiddenData:hiddenData}}
|
|
||||||
*/
|
|
||||||
exports.removeHiddenData = (description) => {
|
|
||||||
const hiddenData = this.readHiddenData(description)
|
|
||||||
|
|
||||||
const splitted = description.split("[ ](OTDATA")
|
|
||||||
const original = splitted[0]
|
|
||||||
|
|
||||||
return {description:original,hiddenData:hiddenData}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user