Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94f32674cb | ||
|
|
e8eb52e00b | ||
|
|
4efa165949 | ||
|
|
4c3e4ef9a5 | ||
|
|
6355fb5562 | ||
|
|
442c201994 | ||
|
|
b61f9d4d5a | ||
|
|
129053b9f5 | ||
|
|
35a0511b97 | ||
|
|
bae221056c | ||
|
|
9c6e4ccde4 | ||
|
|
ac6845b4d4 | ||
|
|
75770c84b2 | ||
|
|
2281d78896 | ||
|
|
37cc3b794e | ||
|
|
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 | ||
|
|
af35f83291 | ||
|
|
39fec94ead | ||
|
|
1b8468330e | ||
|
|
b698c89a89 | ||
|
|
7ed2d7bcc7 | ||
|
|
f2ddaa5fd4 | ||
|
|
fc50a8e83f | ||
|
|
5bece3357d | ||
|
|
97d1489558 | ||
|
|
a211cef1f6 | ||
|
|
ae002e168b | ||
|
|
86a5a1a2ca | ||
|
|
23ebc14b8b | ||
|
|
3a5768a1b1 | ||
|
|
33c3803ca8 | ||
|
|
f3613fb674 | ||
|
|
f1dc8cbcf5 | ||
|
|
a365c4b69f | ||
|
|
687372481a | ||
|
|
1bc8bde922 | ||
|
|
4b8074c520 | ||
|
|
1d5830975f | ||
|
|
95bc1f4fbf | ||
|
|
bfc02611c7 | ||
|
|
e4c1e2559e | ||
|
|
69b669956e | ||
|
|
893a7c5b1f | ||
|
|
ed9c98e2f0 | ||
|
|
62d950b1a6 | ||
|
|
69de612d1e | ||
|
|
5494e112c0 | ||
|
|
cd2c08303e | ||
|
|
a8619e448a | ||
|
|
c990257c02 |
@@ -0,0 +1,328 @@
|
|||||||
|
//@ts-check
|
||||||
|
const fs = require("fs")
|
||||||
|
|
||||||
|
/*////// OT DOCS GENERATOR ////////
|
||||||
|
What does this file do?:
|
||||||
|
Well, this file will parse the result returned from typedoc (the documentation generator).
|
||||||
|
The resulting file will then be used in the OT Docs markdown generator to generate the Open Ticket API Reference.
|
||||||
|
|
||||||
|
In short:
|
||||||
|
This file generates the documentation for Open Ticket :)
|
||||||
|
|
||||||
|
Contributing:
|
||||||
|
If you want to contribute to the Open Ticket Docs, please run the following command:
|
||||||
|
|
||||||
|
> npm run docs
|
||||||
|
|
||||||
|
This will give you a "result.json" file which can then be used in the OT Docs.
|
||||||
|
Further instructions can be found there.
|
||||||
|
/////////////////////////////////*/
|
||||||
|
|
||||||
|
if (!fs.existsSync(".docs/typedoc-result.json")){
|
||||||
|
console.log("Unable to generate documentation! Run typedoc first!")
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
const result = JSON.parse(fs.readFileSync(".docs/typedoc-result.json").toString())
|
||||||
|
const availableElements = []
|
||||||
|
const skipElementNames = [
|
||||||
|
"#opendiscord-types"
|
||||||
|
]
|
||||||
|
|
||||||
|
const handleFunction = (memberType) => {
|
||||||
|
if (!memberType || !memberType.signatures || !Array.isArray(memberType.signatures)) return {type:"unknown"}
|
||||||
|
|
||||||
|
//try to get signature
|
||||||
|
let signature = memberType.signatures.find((s) => !s.typeParameters)
|
||||||
|
if (!signature) signature = memberType.signatures[0]
|
||||||
|
if (!signature) return {type:"unknown"}
|
||||||
|
|
||||||
|
//try to get comment
|
||||||
|
let comment = signature.comment
|
||||||
|
if (!comment) comment = memberType.signatures.find((s) => s.comment)?.comment
|
||||||
|
if (!comment) comment = null
|
||||||
|
|
||||||
|
const signatureInherited = signature.flags.isInherited ? true : false
|
||||||
|
const signatureComment = comment ? comment.summary?.map((c) => c.text).join("") : null
|
||||||
|
const signatureParameters = signature.parameters?.map((p) => {
|
||||||
|
return {name:p.name,details:handleType(p.type)}
|
||||||
|
}) ?? []
|
||||||
|
const signatureReturns = handleType(signature.type)
|
||||||
|
|
||||||
|
return {type:"function",inherited:signatureInherited,comment:signatureComment,parameters:signatureParameters,returns:signatureReturns}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleObject = (memberType) => {
|
||||||
|
if (!memberType || !memberType.children || !Array.isArray(memberType.children)) return {type:"unknown"}
|
||||||
|
const propertyIds = memberType.groups?.find((g) => g.title == "Properties")?.children ?? []
|
||||||
|
const methodIds = memberType.groups?.find((g) => g.title == "Methods")?.children ?? []
|
||||||
|
|
||||||
|
const objectChildren = []
|
||||||
|
for (const member of (memberType.children ?? [])){
|
||||||
|
const memberName = member.name
|
||||||
|
const memberType = propertyIds.includes(member.id) ? "property" : methodIds.includes(member.id) ? "method" : "other"
|
||||||
|
let memberComment = member.comment?.summary?.map((c) => c.text).join("") ?? null
|
||||||
|
|
||||||
|
const rawMemberSource = member.sources ? (member.sources[0] ?? null) : null
|
||||||
|
let memberSource = rawMemberSource ? rawMemberSource.fileName+":"+rawMemberSource.line+":"+rawMemberSource.character : null
|
||||||
|
|
||||||
|
let memberDetails = null
|
||||||
|
if (memberType == "property"){
|
||||||
|
//INTERFACE => PROPERTY
|
||||||
|
memberDetails = handleType(member.type)
|
||||||
|
}else if (memberType == "method"){
|
||||||
|
//INTERFACE => METHOD
|
||||||
|
memberDetails = handleFunction(member)
|
||||||
|
memberComment = memberDetails.comment
|
||||||
|
}
|
||||||
|
|
||||||
|
objectChildren.push({
|
||||||
|
type:memberType,
|
||||||
|
name:memberName,
|
||||||
|
comment:memberComment,
|
||||||
|
source:memberSource,
|
||||||
|
details:memberDetails
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return {type:"object",children:objectChildren}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleType = (memberType) => {
|
||||||
|
if (!memberType || !memberType.type) return {type:"unknown"}
|
||||||
|
else if (memberType.type == "intrinsic") return {type:"primitive",name:memberType.name}
|
||||||
|
else if (memberType.type == "array") return {type:"array",child:handleType(memberType.elementType)}
|
||||||
|
else if (memberType.type == "union") return {type:"union",children:memberType.types.map((t) => handleType(t))}
|
||||||
|
else if (memberType.type == "intersection") return {type:"intersection",children:memberType.types.map((t) => handleType(t))}
|
||||||
|
else if (memberType.type == "reference"){
|
||||||
|
const referenceTypeArguments = (memberType.typeArguments) ? memberType.typeArguments.map((ta) => handleType(ta)) : null
|
||||||
|
let referenceType = availableElements.find((el) => el.name == memberType.name)?.type ?? null
|
||||||
|
|
||||||
|
if (referenceType){
|
||||||
|
//member is known type (from Open Ticket)
|
||||||
|
return {type:"reference",name:memberType.name,target:referenceType,typeArguments:referenceTypeArguments}
|
||||||
|
}else if (memberType.package){
|
||||||
|
//member is type from node.js or another package
|
||||||
|
if (memberType.package == "typescript") return {type:"internal",name:memberType.name,typeArguments:referenceTypeArguments}
|
||||||
|
if (memberType.package == "open-ticket" && memberType.refersToTypeParameter) return {type:"typeParam",name:memberType.name,typeArguments:referenceTypeArguments}
|
||||||
|
else return {type:"external",package:memberType.package,name:memberType.name,typeArguments:referenceTypeArguments}
|
||||||
|
}else return {type:"unknown"}
|
||||||
|
}
|
||||||
|
else if (memberType.type == "literal") return {type:"literal",name:(typeof memberType.value == "string") ? JSON.stringify(memberType.value) : String(memberType.value)}
|
||||||
|
else if (memberType.type == "typeOperator"){
|
||||||
|
if (memberType.operator == "keyof") return {type:"keyof",child:handleType(memberType.target)}
|
||||||
|
else if (memberType.operator == "readonly") return {type:"readonly",child:handleType(memberType.target)}
|
||||||
|
else if (memberType.operator == "unique") return {type:"unique",child:handleType(memberType.target)}
|
||||||
|
}
|
||||||
|
else if (memberType.type == "conditional") return {type:"conditional",checker:handleType(memberType.checkType),extends:handleType(memberType.extendsType),trueValue:handleType(memberType.trueType),falseValue:handleType(memberType.falseType)}
|
||||||
|
else if (memberType.type == "indexedAccess") return {type:"index",index:handleType(memberType.indexType),object:handleType(memberType.objectType)}
|
||||||
|
else if (memberType.type == "mapped") return {type:"mapped",parameterName:memberType.parameter,parameter:handleType(memberType.parameterType),template:handleType(memberType.templateType)}
|
||||||
|
else if (memberType.type == "optional") return {type:"optional",child:handleType(memberType.elementType)}
|
||||||
|
else if (memberType.type == "predicate") return {type:"predicate",name:memberType.name,target:handleType(memberType.targetType)}
|
||||||
|
else if (memberType.type == "query") return {type:"query",target:handleType(memberType.queryType)}
|
||||||
|
else if (memberType.type == "rest") return {type:"rest",child:handleType(memberType.elementType)}
|
||||||
|
else if (memberType.type == "tuple") return {type:"tuple",children:memberType.elements.map((t) => handleType(t))}
|
||||||
|
else if (memberType.type == "templateLiteral") return {type:"template",head:memberType.head,tails:memberType.tail.map((t) => {
|
||||||
|
return {element:handleType(t[0]),text:t[1]}
|
||||||
|
})}
|
||||||
|
else if (memberType.type == "reflection" && memberType.declaration && memberType.declaration.signatures && memberType.declaration.signatures[0]){
|
||||||
|
return handleFunction(memberType.declaration)
|
||||||
|
}
|
||||||
|
else if (memberType.type == "reflection"){
|
||||||
|
return handleObject(memberType.declaration)
|
||||||
|
}
|
||||||
|
else return {type:"unknown"}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const file of result.children){
|
||||||
|
const classIds = file.groups?.find((g) => g.title == "Classes")?.children ?? []
|
||||||
|
const interfaceIds = file.groups?.find((g) => g.title == "Interfaces")?.children ?? []
|
||||||
|
const typeIds = file.groups?.find((g) => g.title == "Type Aliases")?.children ?? []
|
||||||
|
const enumIds = file.groups?.find((g) => g.title == "Enumerations")?.children ?? []
|
||||||
|
const varIds = file.groups?.find((g) => g.title == "Variables")?.children ?? []
|
||||||
|
const funcIds = file.groups?.find((g) => g.title == "Functions")?.children ?? []
|
||||||
|
|
||||||
|
for (const declaration of file.children){
|
||||||
|
const declarationName = declaration.name
|
||||||
|
const declarationType = classIds.includes(declaration.id) ? "class" : interfaceIds.includes(declaration.id) ? "interface" : typeIds.includes(declaration.id) ? "type" : enumIds.includes(declaration.id) ? "enum" : varIds.includes(declaration.id) ? "variable" : funcIds.includes(declaration.id) ? "function" : "other"
|
||||||
|
availableElements.push({name:declarationName,type:declarationType})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const exported = []
|
||||||
|
for (const file of result.children){
|
||||||
|
const classIds = file.groups?.find((g) => g.title == "Classes")?.children ?? []
|
||||||
|
const interfaceIds = file.groups?.find((g) => g.title == "Interfaces")?.children ?? []
|
||||||
|
const typeIds = file.groups?.find((g) => g.title == "Type Aliases")?.children ?? []
|
||||||
|
const enumIds = file.groups?.find((g) => g.title == "Enumerations")?.children ?? []
|
||||||
|
const varIds = file.groups?.find((g) => g.title == "Variables")?.children ?? []
|
||||||
|
const funcIds = file.groups?.find((g) => g.title == "Functions")?.children ?? []
|
||||||
|
|
||||||
|
for (const declaration of (file.children ?? [])){
|
||||||
|
const declarationName = declaration.name
|
||||||
|
if (skipElementNames.includes(declarationName)) continue
|
||||||
|
|
||||||
|
const declarationType = classIds.includes(declaration.id) ? "class" : interfaceIds.includes(declaration.id) ? "interface" : typeIds.includes(declaration.id) ? "type" : enumIds.includes(declaration.id) ? "enum" : varIds.includes(declaration.id) ? "variable" : funcIds.includes(declaration.id) ? "function" : "other"
|
||||||
|
const declarationTypeParams = (declaration.typeParameters) ? declaration.typeParameters.map((tp) => {
|
||||||
|
return {name:tp.name,type:handleType(tp.type)}
|
||||||
|
}) : null
|
||||||
|
const declarationComment = declaration.comment?.summary?.map((c) => c.text).join("") ?? null
|
||||||
|
const declarationConstant = declaration.flags.isConst ? true : false
|
||||||
|
|
||||||
|
const rawDeclarationSource = declaration.sources ? (declaration.sources[0] ?? null) : null
|
||||||
|
const declarationSource = rawDeclarationSource ? rawDeclarationSource.fileName+":"+rawDeclarationSource.line+":"+rawDeclarationSource.character : null
|
||||||
|
|
||||||
|
const declarationChildren = []
|
||||||
|
if (declarationType == "class"){
|
||||||
|
//CLASS
|
||||||
|
const constructorIds = declaration.groups?.find((g) => g.title == "Constructors")?.children ?? []
|
||||||
|
const propertyIds = declaration.groups?.find((g) => g.title == "Properties")?.children ?? []
|
||||||
|
const methodIds = declaration.groups?.find((g) => g.title == "Methods")?.children ?? []
|
||||||
|
|
||||||
|
for (const member of (declaration.children ?? [])){
|
||||||
|
const memberName = member.name
|
||||||
|
const memberType = constructorIds.includes(member.id) ? "constructor" : propertyIds.includes(member.id) ? "property" : methodIds.includes(member.id) ? "method" : "other"
|
||||||
|
let memberComment = member.comment?.summary?.map((c) => c.text).join("") ?? null
|
||||||
|
|
||||||
|
const rawMemberSource = member.sources ? (member.sources[0] ?? null) : null
|
||||||
|
let memberSource = rawMemberSource ? rawMemberSource.fileName+":"+rawMemberSource.line+":"+rawMemberSource.character : null
|
||||||
|
|
||||||
|
const memberInherited = member.flags.isInherited ? true : false
|
||||||
|
const memberStatic = member.flags.isStatic ? true : false
|
||||||
|
const memberProtected = member.flags.isProtected ? true : false
|
||||||
|
const memberOptional = member.flags.isOptional ? true : false
|
||||||
|
const memberReadonly = member.flags.isReadonly ? true : false
|
||||||
|
|
||||||
|
let memberDetails = null
|
||||||
|
if (memberType == "property"){
|
||||||
|
//CLASS => PROPERTY
|
||||||
|
memberDetails = handleType(member.type)
|
||||||
|
|
||||||
|
}else if (memberType == "method"){
|
||||||
|
//CLASS => METHOD
|
||||||
|
memberDetails = handleFunction(member)
|
||||||
|
memberComment = memberDetails.comment
|
||||||
|
|
||||||
|
}else if (memberType == "constructor"){
|
||||||
|
//CLASS => CONSTRUCTOR
|
||||||
|
memberDetails = handleFunction(member)
|
||||||
|
memberComment = memberDetails.comment
|
||||||
|
}
|
||||||
|
|
||||||
|
declarationChildren.push({
|
||||||
|
type:memberType,
|
||||||
|
name:memberName,
|
||||||
|
comment:memberComment,
|
||||||
|
source:memberSource,
|
||||||
|
details:memberDetails,
|
||||||
|
inherited:memberInherited,
|
||||||
|
static:memberStatic,
|
||||||
|
protected:memberProtected,
|
||||||
|
optional:memberOptional,
|
||||||
|
readonly:memberReadonly
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}else if (declarationType == "interface"){
|
||||||
|
//INTERFACE
|
||||||
|
const propertyIds = declaration.groups?.find((g) => g.title == "Properties")?.children ?? []
|
||||||
|
const methodIds = declaration.groups?.find((g) => g.title == "Methods")?.children ?? []
|
||||||
|
|
||||||
|
for (const member of (declaration.children ?? [])){
|
||||||
|
const memberName = member.name
|
||||||
|
const memberType = propertyIds.includes(member.id) ? "property" : methodIds.includes(member.id) ? "method" : "other"
|
||||||
|
let memberComment = member.comment?.summary?.map((c) => c.text).join("") ?? null
|
||||||
|
|
||||||
|
const rawMemberSource = member.sources ? (member.sources[0] ?? null) : null
|
||||||
|
let memberSource = rawMemberSource ? rawMemberSource.fileName+":"+rawMemberSource.line+":"+rawMemberSource.character : null
|
||||||
|
|
||||||
|
const memberInherited = member.flags.isInherited ? true : false
|
||||||
|
const memberStatic = member.flags.isStatic ? true : false
|
||||||
|
const memberProtected = member.flags.isProtected ? true : false
|
||||||
|
const memberOptional = member.flags.isOptional ? true : false
|
||||||
|
const memberReadonly = member.flags.isReadonly ? true : false
|
||||||
|
|
||||||
|
let memberDetails = null
|
||||||
|
if (memberType == "property"){
|
||||||
|
//INTERFACE => PROPERTY
|
||||||
|
memberDetails = handleType(member.type)
|
||||||
|
}else if (memberType == "method"){
|
||||||
|
//INTERFACE => METHOD
|
||||||
|
memberDetails = handleFunction(member)
|
||||||
|
memberComment = memberDetails.comment
|
||||||
|
}
|
||||||
|
|
||||||
|
declarationChildren.push({
|
||||||
|
type:memberType,
|
||||||
|
name:memberName,
|
||||||
|
comment:memberComment,
|
||||||
|
source:memberSource,
|
||||||
|
details:memberDetails,
|
||||||
|
inherited:memberInherited,
|
||||||
|
static:memberStatic,
|
||||||
|
protected:memberProtected,
|
||||||
|
optional:memberOptional,
|
||||||
|
readonly:memberReadonly
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}else if (declarationType == "type"){
|
||||||
|
//TYPE
|
||||||
|
declarationChildren.push(handleType(declaration.type))
|
||||||
|
}else if (declarationType == "enum"){
|
||||||
|
//ENUM
|
||||||
|
const enumerableIds = declaration.groups?.find((g) => g.title == "Enumeration Members")?.children ?? []
|
||||||
|
|
||||||
|
for (const member of (declaration.children ?? [])){
|
||||||
|
const memberName = member.name
|
||||||
|
const memberType = enumerableIds.includes(member.id) ? "enumerable" : "other"
|
||||||
|
const memberComment = member.comment?.summary?.map((c) => c.text).join("") ?? null
|
||||||
|
|
||||||
|
const rawMemberSource = member.sources ? (member.sources[0] ?? null) : null
|
||||||
|
let memberSource = rawMemberSource ? rawMemberSource.fileName+":"+rawMemberSource.line+":"+rawMemberSource.character : null
|
||||||
|
|
||||||
|
let memberDetails = null
|
||||||
|
if (memberType == "enumerable"){
|
||||||
|
//ENUM => ENUMERABLE
|
||||||
|
memberDetails = handleType(member.type)
|
||||||
|
}
|
||||||
|
|
||||||
|
const memberInherited = member.flags.isInherited ? true : false
|
||||||
|
const memberStatic = member.flags.isStatic ? true : false
|
||||||
|
const memberProtected = member.flags.isProtected ? true : false
|
||||||
|
const memberOptional = member.flags.isOptional ? true : false
|
||||||
|
const memberReadonly = member.flags.isReadonly ? true : false
|
||||||
|
|
||||||
|
declarationChildren.push({
|
||||||
|
type:memberType,
|
||||||
|
name:memberName,
|
||||||
|
comment:memberComment,
|
||||||
|
source:memberSource,
|
||||||
|
details:memberDetails,
|
||||||
|
inherited:memberInherited,
|
||||||
|
static:memberStatic,
|
||||||
|
protected:memberProtected,
|
||||||
|
optional:memberOptional,
|
||||||
|
readonly:memberReadonly
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}else if (declarationType == "variable"){
|
||||||
|
//VARIABLE
|
||||||
|
declarationChildren.push(handleType(declaration.type))
|
||||||
|
|
||||||
|
}else if (declarationType == "function"){
|
||||||
|
//FUNCTION
|
||||||
|
declarationChildren.push(handleFunction(declaration))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
exported.push({
|
||||||
|
type:declarationType,
|
||||||
|
name:declarationName,
|
||||||
|
comment:declarationComment,
|
||||||
|
constant:declarationConstant,
|
||||||
|
source:declarationSource,
|
||||||
|
children:declarationChildren,
|
||||||
|
typeParams:declarationTypeParams
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(".docs/result.json",JSON.stringify(exported,null,"\t"))
|
||||||
|
fs.rmSync(".docs/typedoc-result.json")
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://typedoc.org/schema.json",
|
||||||
|
"entryPoints": [
|
||||||
|
"../src/core/api/modules/",
|
||||||
|
"../src/core/api/defaults/",
|
||||||
|
"../src/core/api/openticket/",
|
||||||
|
"../src/core/api/main.ts",
|
||||||
|
"../src/core/startup/init.ts",
|
||||||
|
],
|
||||||
|
"entryPointStrategy": "expand",
|
||||||
|
"json": "./typedoc-result.json",
|
||||||
|
"basePath": "../"
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# 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.0.3)
|
||||||
|
[](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.0.3.json`**](openticket-egg-v4.0.3.json)
|
||||||
|
- This egg will always use Open Ticket `v4.0.3`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.0.2.json`**](openticket-egg-v4.0.2.json)
|
||||||
|
- This egg will always use Open Ticket `v4.0.2`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.0.1.json`**](openticket-egg-v4.0.1.json)
|
||||||
|
- This egg will always use Open Ticket `v4.0.1`. Open Ticket updates will not have an effect on this egg.
|
||||||
|
|
||||||
|
[**`openticket-egg-v4.0.0.json`**](openticket-egg-v4.0.0.json)
|
||||||
|
- This egg will always use Open Ticket `v4.0.0`. 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) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
|
||||||
|
|
||||||
|
© 2025 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
|
||||||
@@ -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.0)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.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.0.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.0.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.0.1)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.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.0.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.0.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.0.2)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.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.0.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.0.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.0.3)",
|
||||||
|
"author": "support@dj-dj.be",
|
||||||
|
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.3, the most advanced & customisable discord ticket bot that you will ever find! You can customise up to 300+ variables! This includes Html Transcripts, Advanced Plugins, Custom Embeds, Questions\/Modals, Stats & more!",
|
||||||
|
"features": null,
|
||||||
|
"docker_images": {
|
||||||
|
"ghcr.io\/parkervcp\/yolks:nodejs_20": "ghcr.io\/parkervcp\/yolks:nodejs_20"
|
||||||
|
},
|
||||||
|
"file_denylist": [],
|
||||||
|
"startup": "if [[ ! -z ${NODE_PACKAGES} ]]; then npm install ${NODE_PACKAGES}; fi; if [[ ! -z ${UNNODE_PACKAGES} ]]; then npm uninstall ${UNNODE_PACKAGES}; fi; if [ -f \/home\/container\/package.json ]; then npm install; fi; node \"\/home\/container\/index.js\" ${NODE_FLAGS};",
|
||||||
|
"config": {
|
||||||
|
"files": "{}",
|
||||||
|
"startup": "{\r\n \"done\": \"STARTUP INFO:\"\r\n}",
|
||||||
|
"logs": "{}",
|
||||||
|
"stop": "^C"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"installation": {
|
||||||
|
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.0.3)\r\n# Inspired by: Node.js Installation Script\r\n# \u00a9 DJdj Development\r\n\r\necho -e \"[OT INSTALLER] installing dependencies. please wait...\"\r\napt update\r\napt install -y git curl\r\n\r\necho -e \"[OT INSTALLER] updating npm. please wait...\"\r\nnpm install npm@latest --location=global\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\nBRANCH=\"v4.0.3\"\r\n\r\nif [ \"$(ls -A \/mnt\/server)\" ]; then\r\n echo -e \"[OT INSTALLER] \/mnt\/server directory is not empty.\"\r\n if [ -d .git ]; then\r\n echo -e \"[OT INSTALLER] .git directory exists\"\r\n if [ -f .git\/config ]; then\r\n echo -e \"[OT INSTALLER] loading info from git config\"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e \"[OT INSTALLER] files found with no git config\"\r\n echo -e \"[OT INSTALLER] closing out without touching things to not break anything\"\r\n exit 10\r\n fi\r\n fi\r\n\r\n if [ \"${ORIGIN}\" == \"https:\/\/github.com\/open-discord-bots\/open-ticket.git\" ]; then\r\n echo \"pulling latest from github\"\r\n git pull\r\n fi\r\nelse\r\n echo -e \"[OT INSTALLER] \/mnt\/server is empty.\"\r\n echo -e \"[OT INSTALLER] cloning files into repo.\"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e \"[OT INSTALLER] cloning default branch\"\r\n git clone https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n else\r\n echo -e \"[OT INSTALLER] cloning ${BRANCH}'\"\r\n git clone --single-branch --branch ${BRANCH} https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n fi\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing Open Ticket node.js packages.\"\r\nif [ -f \/mnt\/server\/package.json ]; then\r\n \/usr\/local\/bin\/npm install --omit=dev\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing custom node.js packages.\"\r\nif [[ ! -z ${NODE_PACKAGES} ]]; then\r\n \/usr\/local\/bin\/npm install ${NODE_PACKAGES}\r\nfi\r\n\r\necho -e \"[OT INSTALLER] install complete!\"\r\nexit 0",
|
||||||
|
"container": "node:latest",
|
||||||
|
"entrypoint": "bash"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"variables": [
|
||||||
|
{
|
||||||
|
"name": "Additional Npm Packages",
|
||||||
|
"description": "Specify additional npm packages used by Open Ticket plugins. Use spaces to separate.",
|
||||||
|
"env_variable": "NODE_PACKAGES",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Startup Flags",
|
||||||
|
"description": "Start the bot with additional Open Ticket flags. Separate using spaces.\r\nA full reference list can be found in the documentation.",
|
||||||
|
"env_variable": "NODE_FLAGS",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Uninstall Npm Packages",
|
||||||
|
"description": "A list of npm packages to uninstall. Separate by spaces.",
|
||||||
|
"env_variable": "UNNODE_PACKAGES",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": false,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "string|nullable",
|
||||||
|
"field_type": "text"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
support@dj-dj.be.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||||
|
enforcement ladder](https://github.com/mozilla/diversity).
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
https://www.contributor-covenant.org/faq. Translations are available at
|
||||||
|
https://www.contributor-covenant.org/translations.
|
||||||
@@ -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.0.3) [](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) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
|
||||||
|
|
||||||
|
© 2025 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
github: DJj123dj
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
name: Bug Report
|
||||||
|
about: Report bugs to help us improve Open Ticket!
|
||||||
|
title: "Your Bug Name"
|
||||||
|
---
|
||||||
|
|
||||||
|
### Bug Description:
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
### Steps To Reproduce:
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
> Leave empty when you are unable to reproduce the bug!
|
||||||
|
|
||||||
|
### Expected Behaviour:
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
### Screenshots:
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
> This file doesn't contain any credentials or sensitive information!
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
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.
|
||||||
@@ -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,51 @@
|
|||||||
|
# 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.3) [](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)**
|
||||||
|
- ❌ Fully Deprecated
|
||||||
|
|
||||||
|
| Version | Supported | Notes |
|
||||||
|
|------------|-----------|--------------------------------|
|
||||||
|
| 4.1.0 | 🟦 | |
|
||||||
|
| 4.0.3 | ✅ | |
|
||||||
|
| 4.0.2 | ✅ | Major discord.js bug |
|
||||||
|
| 4.0.1 | ✅ | |
|
||||||
|
| 4.0.0 | 🚧 | Supported until May 2025 |
|
||||||
|
| 3.5.9 | 🚧 | Supported until May 2025 (LTS) |
|
||||||
|
| 3.5.8 | 🟧 | Documentation Only |
|
||||||
|
| < 3.5.8 | ❌ | |
|
||||||
|
|
||||||
|
### 🕷️ 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) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
|
||||||
|
|
||||||
|
© 2025 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
|
||||||
+19
-11
@@ -1,14 +1,22 @@
|
|||||||
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/.DS_Store
|
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
|
devconfig/
|
||||||
|
devdatabase/
|
||||||
|
plugins/*
|
||||||
|
!plugins/example-plugin/
|
||||||
|
database/openticket.sqlite
|
||||||
|
dist/
|
||||||
|
|
||||||
|
otdebug.txt
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
*/.DS_Store
|
||||||
|
*/*/.DS_Store
|
||||||
|
*/*/*/.DS_Store
|
||||||
|
**/.DS_Store
|
||||||
|
|
||||||
|
.docs/*
|
||||||
|
!.docs/createDocs.js
|
||||||
|
!.docs/typedoc-config.json
|
||||||
+17
-1
@@ -1,3 +1,7 @@
|
|||||||
|
# Open Ticket (License)
|
||||||
|
© 2025 - DJj123dj & Contributors
|
||||||
|
|
||||||
|
```
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
@@ -70,7 +74,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.
|
||||||
|
|
||||||
@@ -672,3 +676,15 @@ 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
|
||||||
|
The following additional terms apply to the use of this software:
|
||||||
|
|
||||||
|
1. This software may not be used as part of a public Discord bot service 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 part of a public Discord bot service 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,87 +1,234 @@
|
|||||||
## We need translators!
|
> ### 🎥 Content Creators 🎥
|
||||||
If you know a language that isn't already in open ticket and you can write json,
|
> Hey there! We're searching for content creators that would want to create a tutorial or setup guide for Open Ticket!<br>
|
||||||
then is this the job for you!
|
> [📌 More Information](.github/CONTENT_CREATORS.md)
|
||||||
|
---
|
||||||
|
|
||||||
make a ticket in our server to start!
|
<p align="center">
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket" width="650px">
|
||||||
|
<br>Powered By<br>
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/opendiscord/logo.png" alt="Open Ticket" width="170px"><br>
|
||||||
|
<a href="https://discord.com/invite/26vT9wt3n3"><img alt="Discord Invite Link" src="https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord"></img></a>
|
||||||
|
<a href="https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.3"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.0.3-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>
|
||||||
|
<br>
|
||||||
|
<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=".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>
|
||||||
|
|
||||||
*if you translate, you will come in the credits*
|
<p align="center">
|
||||||
|
Open Ticket is the most advanced & customisable discord ticket bot that you will ever find! You can customise up to 300+ variables! This includes <code>Html Transcripts</code>, <code>Advanced Plugins</code>, <code>Custom Embeds</code>, <code>Questions/Modals</code>, <code>Stats</code> & more!
|
||||||
|
You're also able to customise every little aspect of the bot! From embeds to transcripts. Open Ticket is also translated in more than <code>27 Languages</code>! If you need any help, feel free to join our <a href="https://discord.dj-dj.be">discord server</a>!
|
||||||
|
</p>
|
||||||
|
|
||||||
# open-ticket
|
<p align="center"><b>⭐️ Help us grow by giving a star! ⭐️</b></p>
|
||||||
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v2.5.0) [](#packages) [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE)
|
|
||||||
|
|
||||||
This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options!
|
### 📌 Features
|
||||||
|
- **🦇 pterodactyl support** - Open Ticket works perfect on Pterodactyl based panels! [(Download official eggs)](.eggs/README.md)
|
||||||
|
- **💩 no bloat** - Your Open Ticket bot doesn't contain any form of bloat or credits!
|
||||||
|
- **🔒 tested & secure** - Open Ticket has been battletested by thousands of servers and is very secure!
|
||||||
|
- **📈 scalable** - Open Ticket is made to handle huge servers! (Already tested in **servers with 100k members**)
|
||||||
|
- **📄 HTML transcripts** - Make use of the most customisable, beautiful and easy-to-use HTML Transcripts!
|
||||||
|
- **✅ ticket actions** - Close, Reopen, Delete, Claim, Pin, Rename & Move all your tickets!
|
||||||
|
- **🇬🇧 translation** - Open Ticket has been translated in more than **27 languages** by our community!
|
||||||
|
- **🎨 customisation** - Open Ticket has been created around customisation, everything can be customised!
|
||||||
|
- **🖥️ interactions** - The bot has full support for Buttons, Dropdowns, Slash Commands and Modals!
|
||||||
|
- **∞ unlimited** - Create an infinite amount of tickets & panels!
|
||||||
|
- **📝 advanced plugins** - Create advanced plugins or use pre-made ones by our community!
|
||||||
|
- **👥 user management** - Add & Remove users from all tickets!
|
||||||
|
- **📊 detailed stats** - Open Ticket has ticket, user & global staticstics available for everyone!
|
||||||
|
- **🚫 blacklist** - Blacklist users to prevent them from creating a ticket!
|
||||||
|
- **❓ questions** - Let users answer questions in a modal before the ticket is created!
|
||||||
|
- **📦 slash & text** - Open Ticket supports both slash & text commands!
|
||||||
|
- **📥 extra buttons** - The bot also supports Reaction Roles & Url Buttons, because why not ¯\\_(ツ)_/¯
|
||||||
|
- **✨ commands** - The bot contains more than 25 commands!
|
||||||
|
|
||||||
<img src="logo.png" alt="Open Ticket logo" style="height: 200px; width:200px;"/>
|
#### And more using plugins!
|
||||||
|
- **💬 reviews** - Create & customise your own review system!
|
||||||
|
- **📢 feedback** - Collect feedback & create forms for people to answer!
|
||||||
|
- **🏷️ tags** - Create tags & answer questions automatically using keywords!
|
||||||
|
- **📝 forms** - Create advanced forms and ask people for additional details!
|
||||||
|
- **🔄 rotating status** - Create a rotating bot status & use dynamic variables from the bot!
|
||||||
|
- **💾 sqlite database** - Use an `sqlite` database for increased performances!
|
||||||
|
- **🎉 custom embeds** - Create your own embeds and use them in your server!
|
||||||
|
- **⏰ reminders** - Create & manage customisable reminders in your server!
|
||||||
|
- **🎨 customisation** - Yep, you heard it right! Even more customisation!
|
||||||
|
- **😁 And so much more...**
|
||||||
|
|
||||||
[](https://www.github.com/DJj123dj/open-ticket/wiki)
|
> ### 📦 Resources
|
||||||
|
> Not all resources are accurate yet! We are working on this.<br>
|
||||||
|
> <a href="https://www.youtube.com/watch?v=2jK9kAf6ASU"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-tutorial.png" alt="Open Ticket Tutorial" width="180px"></a>
|
||||||
|
> <a href="https://openticket.dj-dj.be/message.html?msg=The%20current%20tutorial%20is%20outdated,%20we%27re%20still%20working%20on%20a%20new%20one!"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-docs.png" alt="Open Ticket Docs" width="180px"></a>
|
||||||
|
> <a href="https://github.com/open-discord-bots/plugins"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-plugins.png" alt="Open Ticket Plugins" width="180px"></a>
|
||||||
|
|
||||||
### Thanks to these people:
|
### ❤️ Sponsors
|
||||||
- DJ-Lite: for doing the administration
|
A big thanks to all our sponsors! Without them, it wouldn't be possible to create this project!
|
||||||
- Sanke: for translation & new ideas
|
|
||||||
- Everyone that reported a bug
|
|
||||||
#### And our translators!
|
|
||||||
- ExothDE: for translation
|
|
||||||
- 1x1: for translation
|
|
||||||
- R0JO: for translation
|
|
||||||
- t0miiis for translation
|
|
||||||
|
|
||||||
## features
|
<table>
|
||||||
- discord interaction buttons
|
<tr>
|
||||||
- slash & text commands
|
<td><img src="https://github.com/roppl3r.png" alt="Profile Picture" width="100px"></td>
|
||||||
- close, delete & re-open tickets
|
</tr>
|
||||||
- translation in 8 different languages
|
<tr>
|
||||||
- dynamic database system
|
<td align="center"><a href="https://github.com/roppl3r"><b>roppl3r</b></a></td>
|
||||||
- transcripts
|
</tr>
|
||||||
- add/remove users from a ticket
|
</table>
|
||||||
- custom colors & name for embeds
|
|
||||||
- customise your ticket
|
|
||||||
- create url buttons for websites
|
|
||||||
- create reaction roles
|
|
||||||
- build with discord.js v14
|
|
||||||
- configure everything per ticket
|
|
||||||
- remove credits if you want :(
|
|
||||||
- unlimited tickets spread over multiple messages
|
|
||||||
|
|
||||||
*comming soon:*
|
**Past Sponsors:**<br>
|
||||||
- dashboard
|
<a href="https://github.com/sponsors/DJj123dj">
|
||||||
- view transcripts in dashboard
|
<img src="https://github.com/SpyEye2.png" alt="SpyEye" width="40px">
|
||||||
- share transcripts
|
<img src="https://github.com/mods-hd.png" alt="Mods HD" width="40px">
|
||||||
- close with reason
|
<img src="https://github.com/DOSEV5.png" alt="DOSEV5" width="40px">
|
||||||
- more translation
|
<img src="https://github.com/BENZORICH.png" alt="BENZORICH" width="40px">
|
||||||
|
</a>
|
||||||
|
|
||||||
## installation
|
### ⏱️ Quick Setup
|
||||||
**You need `node.js 16` to run this project!**
|
> 1. Download the latest version of Open Ticket on [Github](https://github.com/open-discord-bots/open-ticket).
|
||||||
|
> 2. Make sure node.js & npm are installed using `node -v` (minimum `v18`).
|
||||||
|
> 3. Install any required dependencies using `npm install`.
|
||||||
|
> 4. Configure the bot in the `./config/` directory.
|
||||||
|
> 5. Start the bot using `npm start` or `node index.js`
|
||||||
|
> - The bot will let you know any existing config errors.
|
||||||
|
> - Fix these errors and restart the bot.
|
||||||
|
> 6. Enjoy using Open Ticket!
|
||||||
|
> ### [📔 Visit Documentation](https://otdocs.dj-dj.be)
|
||||||
|
|
||||||
### packages
|
## 📸 Preview
|
||||||
- chalk => version `latest`
|
<img alt="An example of a panel." src="https://apis.dj-dj.be/cdn/openticket/preview-v4/panel-examples.png">
|
||||||
- discord.js => version `latest`
|
<img alt="An example of a ticket message." src="https://apis.dj-dj.be/cdn/openticket/preview-v4/ticket-example.png">
|
||||||
- express => version `latest`
|
<img alt="Examples of built-in commands." src="https://apis.dj-dj.be/cdn/openticket/preview-v4/command-examples.png">
|
||||||
- node-localstorage => version `latest`
|
|
||||||
- axios => version `latest`
|
|
||||||
|
|
||||||
You can install all of them by running `npm install`
|
## 🛠️ Contributors
|
||||||
|
### 🖥️ Team & Contributors
|
||||||
|
A list of people that contributed or provided the most support for Open Ticket.
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><img src="https://github.com/DJj123dj.png" alt="Profile Picture" width="80px"></td>
|
||||||
|
<td align="center"><img src="https://github.com/smetsliam.png" alt="Profile Picture" width="80px"></td>
|
||||||
|
<td align="center"><img src="https://github.com/FrankVissers.png" alt="Profile Picture" width="80px"></td>
|
||||||
|
<td align="center"><img src="https://github.com/Sank34.png" alt="Profile Picture" width="80px"></td>
|
||||||
|
<td align="center"><img src="https://github.com/Roppl3r.png" alt="Profile Picture" width="80px"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th><a href="https://github.com/DJj123dj">💻 DJj123dj</a></th>
|
||||||
|
<th><a href="https://github.com/smetsliam">💬 smetsliam</a></th>
|
||||||
|
<th><a href="https://github.com/FrankVissers">💬 Frank Vissers</a></th>
|
||||||
|
<th><a href="https://github.com/Sank34">💬 Sanke</a></th>
|
||||||
|
<th><a href="https://github.com/Roppl3r">🧩 Roppl3r</a></th>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
## running
|
### 💬 Translators
|
||||||
you can run `node index.js` but i would recommend you to use `npm start`
|
Without our translators, it wouldn't be possible to translate Open Ticket in so many languages!
|
||||||
|
- 🟢 Available - 🤖 Made Using AI - 🔴 Unavailable/Outdated
|
||||||
|
|
||||||
if there are any errors, you can open an **issue on github** or **contact me in our discord server**.
|
|🔍 |Language |Maintainer (Github/Discord) |
|
||||||
|
|---|---------------------|----------------------------|
|
||||||
|
|🟢 |🇬🇧 English |djj123dj |
|
||||||
|
|🟢 |🇳🇱 Dutch |djj123dj |
|
||||||
|
|🟢 |🇩🇪 German |benzorich |
|
||||||
|
|🟢 |🇪🇸 Spanish |redactado & josuens |
|
||||||
|
|🟢 |🇵🇹 Portuguese |quiradon |
|
||||||
|
|🟢 |❓ Catalan |guillee3 |
|
||||||
|
|🟢 |🇨🇿 Czech |spyeye_ |
|
||||||
|
|🟢 |🇭🇺 Hungarian |kornel0706 |
|
||||||
|
|🟢 |🇷🇴 Romanian |sankedev |
|
||||||
|
|🟢 |🇺🇦 Ukrainian |anderskiy |
|
||||||
|
|🟢 |🇮🇩 Indonesian |erxg |
|
||||||
|
|🟢 |🇮🇹 Italian |fraden1mvp. |
|
||||||
|
|🟢 |🇩🇰 Danish |the_gamer |
|
||||||
|
|🟢 |🇹🇭 Thai |modshd |
|
||||||
|
|🟢 |🇹🇷 Turkish |palestinian |
|
||||||
|
|🟢 |🇫🇷 French |guillee.3 |
|
||||||
|
|🟢 |🇦🇪 Arabic |palestinian |
|
||||||
|
|🟢 |🇮🇳 Hindi |an_developer |
|
||||||
|
|🟢 |🇱🇹 Lithuanian |tsgindrius |
|
||||||
|
|🟢 |🇵🇱 Polish |danoglez |
|
||||||
|
|🟢 |🇳🇴 Norwegian |NoOneNook |
|
||||||
|
|🟢 |🇸🇪 Swedish |NoOneNook |
|
||||||
|
|🤖 |🇪🇪 Estonian |iamnotmega |
|
||||||
|
|🤖 |🇫🇮 Finnish |iamnotmega |
|
||||||
|
|🤖 |🇷🇺 Russian |NoOneNook |
|
||||||
|
|🤖 |🇱🇻 Latvian |NoOneNook |
|
||||||
|
|🤖 |🇻🇳 Vietnamese |ngocdiep2006 |
|
||||||
|
|🔴 |🇯🇵 Japanese |[⭐ Contribute!](.github/CONTRIBUTING.md)|
|
||||||
|
|🔴 |🇰🇷 Korean |[⭐ Contribute!](.github/CONTRIBUTING.md)|
|
||||||
|
|🔴 |🇨🇳 Simplified Chinese |[⭐ Contribute!](.github/CONTRIBUTING.md)|
|
||||||
|
|🔴 |🇨🇳 Traditional Chinese|[⭐ Contribute!](.github/CONTRIBUTING.md)|
|
||||||
|
|🔴 |🇸🇮 Slovenian |[⭐ Contribute!](.github/CONTRIBUTING.md)|
|
||||||
|
|🔴 |🇬🇷 Greek |[⭐ Contribute!](.github/CONTRIBUTING.md)|
|
||||||
|
|🔴 |❓ Kurdish |[⭐ Contribute!](.github/CONTRIBUTING.md)|
|
||||||
|
|🔴 |❓ Persian |[⭐ Contribute!](.github/CONTRIBUTING.md)|
|
||||||
|
|
||||||
### config
|
## ⭐️ Star History
|
||||||
Our config documentation is moved to another file:
|
Please give this repository a star if you like it.
|
||||||
[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.5.0)
|
This will help us grow and reach even more people!
|
||||||
|
|
||||||
### intents & permissions
|
<a href="https://star-history.com/#open-discord-bots/open-ticket&Date">
|
||||||
In the discord developer portal in the "bot" panel you will find 3 switches under the title "Gateaway Intents". The following switches should always be turned on
|
<picture>
|
||||||
- `SERVER MEMBERS INTENT`
|
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=open-discord-bots/open-ticket&type=Date&theme=dark" />
|
||||||
- `MESSAGE CONTENT INTENT`
|
<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>
|
||||||
|
|
||||||
To work the best, the bot needs `ADMINISTRATOR` permissions.
|
## 🧩 Plugins
|
||||||
You can also configure your own permissions
|
**Download all plugins in our [Official Plugin Repository](https://github.com/open-discord-bots/plugins)!**<br>
|
||||||
|
> #### ⭐ Featured Plugins (Top 5 Most Used)
|
||||||
|
> **[`ot-sqlite-database`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-sqlite-database/),
|
||||||
|
> [`ot-migrate-v3`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-migrate-v3/),
|
||||||
|
> [`ot-reviews`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-reviews/),
|
||||||
|
> [`ot-feedback`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-feedback/),
|
||||||
|
> [`ot-tags`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-tags/)**
|
||||||
|
|
||||||
## information
|
### 📦 Official *(made by DJdj Development)*
|
||||||
|
|Name |Category |Description |
|
||||||
|
|----------------------------------------------------------------------|----------------------------|-------------------------|
|
||||||
|
|[`example-plugin`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/example-plugin/) |📄 Example |This is just an example plugin for people that want to create their own plugin. |
|
||||||
|
|[`example-command`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/example-command/) |📄 Example |Sample custom command using the Open Discord system. |
|
||||||
|
|[`ot-jump-to-top`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-jump-to-top/) |📢 Command |Add a simple command to jump to the top of the ticket. |
|
||||||
|
|[`ot-kill-switch`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-kill-switch/) |📢 Command |Temporarily disable the ticket system using a kill switch. |
|
||||||
|
|[`od-hosting-status`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-hosting-status/) |📢 Command |A simple command to send hosting status updates to a channel. |
|
||||||
|
|[`od-shutdown`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-shutdown/) |📢 Command |A simple command to turn off the bot from a slash command (server & bot owner only). |
|
||||||
|
|[`ot-sqlite-database`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-sqlite-database/) |⚙️ Utility |With this plugin, the database will be an SQLite file. It's a must-have for large servers! |
|
||||||
|
|[`od-no-slash-clear`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-no-slash-clear/) |⚙️ Utility |Disable the automatic removal of slash commands that aren't used by Open Ticket. |
|
||||||
|
|[`ot-migrate-v3`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-migrate-v3/) |⚙️ Utility |Use this plugin to migrate all tickets from Open Ticket v3 to v4. |
|
||||||
|
|[`ot-ticket-message-extras`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-ticket-message-extras/) |🎨 Customisation |A plugin which adds a few little features to the ticket message. |
|
||||||
|
|[`ot-rename-keep-prefix`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-rename-keep-prefix/) |🎨 Customisation |Simple plugin to keep the channel prefix when using the /rename command. |
|
||||||
|
|[`ot-customise-buttons`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-customise-buttons/) |🎨 Customisation |Customise almost all built-in buttons. This includes the claim, reopen, close & delete buttons. |
|
||||||
|
|[`ot-ephemeral-messages`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-ephemeral-messages/) |🎨 Customisation |Customise for every messages if it needs to be ephemeral or not. |
|
||||||
|
|[`ot-footers`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-footers/) |🎨 Customisation |A simple plugin to add footers in all Open Ticket embeds. |
|
||||||
|
|[`od-alt-detector`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-alt-detector/) |💼 Management |Use the discord-alt-detector npm package by DJdj Development in your ticket bot. |
|
||||||
|
|[`ot-embeds`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-embeds/) |💼 Management |Create custom premade embeds in the config or use the command to create one from scratch. |
|
||||||
|
|[`ot-move-actions`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-move-actions/) |💼 Management |Automatically unclaim/unpin a ticket when it's moved using `/move`. |
|
||||||
|
|[`ot-reviews`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-reviews/) |💼 Management |Review system for Open Ticket! It is very customisable and has lots of features. |
|
||||||
|
|[`ot-tags`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-tags/) |💼 Management |Use tags to quickly reply with a pre-existing text. |
|
||||||
|
|[`ot-better-status`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-better-status/) |🤖 Client |An advanced status plugin to rotate between states. It also allows for the use of variables. |
|
||||||
|
|
||||||
_v2.5.0 stable_
|
### ✅ Verified *(made by community)*
|
||||||
|
|Name |Author |Category |Description |
|
||||||
|
|---------------------------------------------------------------------|----------------------------|----------------------------|-------------------------|
|
||||||
|
|[`ot-config-reload`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-config-reload/) |guillee.3 |⚙️ Utility |This plugin adds a new command that allows reloading the Open Ticket config files without the need for a restart. |
|
||||||
|
|[`ot-ticket-forms`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-ticket-forms/) |guillee.3 |💼 Management |An advanced forms plugin for Open Ticket. |
|
||||||
|
|[`ot-feedback`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-feedback/) |an_developer |💼 Management |A plugin to gather feedback of your support service. |
|
||||||
|
|[`ot-assign-role`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-assign-role/) |rapid.fast |💼 Management |This plugin assigns a predefined role to a user upon creating a ticket. |
|
||||||
|
|[`ot-volume-warning`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-volume-warning/) |guillee.3 |💼 Management |Alerts ticket creators when too many tickets are open, indicating possible response delays. |
|
||||||
|
|[`od-reminders`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-reminders/) |guillee.3 |💼 Management |Set reminders that will be sent to a channel every specified time. |
|
||||||
|
|[`ot-translate-cmds`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-translate-cmds/) |guillee.3 |🤖 Client |Translate all built-in command names, descriptions & options. |
|
||||||
|
|
||||||
changelog: [click here](https://www.github.com/DJj123dj/open-ticket/wiki/Changelog)
|
### 📢 Categories
|
||||||
|
- **📄 Example** - These plugins serve as an example or starting template.
|
||||||
|
- **📢 Command** - These plugins add new commands to the bot.
|
||||||
|
- **⚙️ Utility** - These plugins help with backend & systems. You won't notice it in discord itself.
|
||||||
|
- **🎨 Customisation** - These plugins help you customise the bot even further.
|
||||||
|
- **💼 Management** - These plugins add features that help you manage your server.
|
||||||
|
- **🤖 Client** - These plugins add features affecting the discord client or bot itself.
|
||||||
|
|
||||||
© 2022 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms)
|
---
|
||||||
|
<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) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord server](https://discord.dj-dj.be) - [license](./LICENSE.md)<br>
|
||||||
|
|
||||||
|
© 2025 - [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,76 +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")
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
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)]})
|
|
||||||
|
|
||||||
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/getoptions").getOptionsById("OTnewT"+ticketId)
|
|
||||||
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())
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
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)]})
|
|
||||||
|
|
||||||
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/getoptions").getOptionsById("OTnewT"+ticketId)
|
|
||||||
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,73 +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")
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
client.on("messageCreate",msg => {
|
|
||||||
if (!msg.content.startsWith(config.prefix+"close")) 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.closeEmbed(msg.author)],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/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",false,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())
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isChatInputCommand()) return
|
|
||||||
if (interaction.commandName != "close") 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
|
|
||||||
|
|
||||||
interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],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/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,83 +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")
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
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/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())
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
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.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/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,51 +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")
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
const helpEmbed = new discord.EmbedBuilder()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle("❔ "+l.helpMenu.title)
|
|
||||||
|
|
||||||
const prefix = config.prefix
|
|
||||||
const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2
|
|
||||||
helpEmbed.setDescription(header+"`"+prefix+"msg <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+"_`")
|
|
||||||
|
|
||||||
if (config.credits) helpEmbed.setFooter({text:"Open-Ticket by DJdj Development | view on github for source code",iconURL:"https://raw.githubusercontent.com/DJj123dj/open-ticket/main/logo.png"})
|
|
||||||
|
|
||||||
var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix
|
|
||||||
|
|
||||||
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())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
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,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 permsChecker = require("../core/utils/permisssionChecker")
|
|
||||||
|
|
||||||
const APIEvents = require("../core/api/modules/events")
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
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)]})
|
|
||||||
|
|
||||||
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/getoptions").getOptionsById("OTnewT"+ticketId)
|
|
||||||
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())
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
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)]})
|
|
||||||
|
|
||||||
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/getoptions").getOptionsById("OTnewT"+ticketId)
|
|
||||||
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,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")
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
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())
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
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,53 +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")
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
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
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]})
|
|
||||||
|
|
||||||
require("../core/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())
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
|
|
||||||
|
|
||||||
require("../core/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,67 +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")
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
/**@type {String[]} */
|
|
||||||
var msgIds = []
|
|
||||||
config.messages.forEach((msg) => {
|
|
||||||
msgIds.push(msg.id)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
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/ticketMessageEmbed").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())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
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/ticketMessageEmbed").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())
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
-95
@@ -1,95 +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",
|
|
||||||
|
|
||||||
"credits":true,
|
|
||||||
"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",
|
|
||||||
|
|
||||||
"enable_transcript":false,
|
|
||||||
"enable_DM_transcript":false,
|
|
||||||
"transcript_channel":"channel id"
|
|
||||||
},
|
|
||||||
|
|
||||||
"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!",
|
|
||||||
"enableDMMessage":true,
|
|
||||||
"ticketmessage":"The staff will help you soon!\n\n*Click on the button below to close the ticket!*"
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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",
|
|
||||||
"enableDMMessage":true
|
|
||||||
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
"messages":[
|
|
||||||
{
|
|
||||||
"id":"1",
|
|
||||||
"name":"Choose Your Ticket",
|
|
||||||
"description":"You can click one of the buttons below!",
|
|
||||||
|
|
||||||
"enableFooter":false,
|
|
||||||
"footer":"Open Ticket v2.5.0 - I'm a footer!",
|
|
||||||
|
|
||||||
"enableThumbnail":false,
|
|
||||||
"thumbnail":"https://www.example.com/catmemes/cat.png",
|
|
||||||
|
|
||||||
"enableCustomColor":false,
|
|
||||||
"color":"#ffffff",
|
|
||||||
|
|
||||||
"options":["general","apply"],
|
|
||||||
"enableTicketExplaination":true,
|
|
||||||
"enableMaxTicketsWarning":true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"_INFO":{
|
||||||
|
"support":"https://otdocs.dj-dj.be",
|
||||||
|
"discord":"https://discord.dj-dj.be",
|
||||||
|
"version":"open-ticket-v4.0.3"
|
||||||
|
},
|
||||||
|
|
||||||
|
"token":"your bot token here! (or leave empty when using 'tokenFromENV')",
|
||||||
|
"tokenFromENV":false,
|
||||||
|
|
||||||
|
"mainColor":"#f8ba00",
|
||||||
|
"language":"english",
|
||||||
|
"prefix":"!ticket ",
|
||||||
|
"serverId":"discord server id",
|
||||||
|
"globalAdmins":["discord role id"],
|
||||||
|
|
||||||
|
"slashCommands":true,
|
||||||
|
"textCommands":true,
|
||||||
|
|
||||||
|
"status":{
|
||||||
|
"enabled":true,
|
||||||
|
"type":"listening OR watching OR playing OR custom",
|
||||||
|
"text":"/help",
|
||||||
|
"status":"online OR invisible OR idle OR dnd"
|
||||||
|
},
|
||||||
|
|
||||||
|
"system":{
|
||||||
|
"removeParticipantsOnClose":false,
|
||||||
|
"replyOnTicketCreation":true,
|
||||||
|
"replyOnReactionRole":true,
|
||||||
|
"useTranslatedConfigChecker":true,
|
||||||
|
"preferSlashOverText":true,
|
||||||
|
"sendErrorOnUnknownCommand":true,
|
||||||
|
"questionFieldsInCodeBlock":true,
|
||||||
|
"disableVerifyBars":false,
|
||||||
|
"useRedErrorEmbeds":true,
|
||||||
|
"emojiStyle":"before (OR after OR double OR disabled)",
|
||||||
|
|
||||||
|
"enableTicketClaimButtons":true,
|
||||||
|
"enableTicketCloseButtons":true,
|
||||||
|
"enableTicketPinButtons":true,
|
||||||
|
"enableTicketDeleteButtons":true,
|
||||||
|
"enableTicketActionWithReason":true,
|
||||||
|
"enableDeleteWithoutTranscript":true,
|
||||||
|
|
||||||
|
"logs":{
|
||||||
|
"enabled":false,
|
||||||
|
"channel":"discord channel id"
|
||||||
|
},
|
||||||
|
|
||||||
|
"limits":{
|
||||||
|
"enabled":true,
|
||||||
|
"globalMaximum":50,
|
||||||
|
"userMaximum":3
|
||||||
|
},
|
||||||
|
|
||||||
|
"permissions":{
|
||||||
|
"help":"everyone (OR admin OR none OR role id)",
|
||||||
|
"panel":"admin (OR everyone OR none OR role id)",
|
||||||
|
"ticket":"none (OR admin OR everyone OR role id)",
|
||||||
|
"close":"everyone (OR admin OR none OR role id)",
|
||||||
|
"delete":"admin (OR everyone OR none OR role id)",
|
||||||
|
"reopen":"everyone (OR admin OR none OR role id)",
|
||||||
|
"claim":"admin (OR everyone OR none OR role id)",
|
||||||
|
"unclaim":"admin (OR everyone OR none OR role id)",
|
||||||
|
"pin":"admin (OR everyone OR none OR role id)",
|
||||||
|
"unpin":"admin (OR everyone OR none OR role id)",
|
||||||
|
"move":"admin (OR everyone OR none OR role id)",
|
||||||
|
"rename":"admin (OR everyone OR none OR role id)",
|
||||||
|
"add":"admin (OR everyone OR none OR role id)",
|
||||||
|
"remove":"admin (OR everyone OR none OR role id)",
|
||||||
|
"blacklist":"admin (OR everyone OR none OR role id)",
|
||||||
|
"stats":"everyone (OR admin OR none OR role id)",
|
||||||
|
"clear":"admin (OR everyone OR none OR role id)",
|
||||||
|
"autoclose":"admin (OR everyone OR none OR role id)",
|
||||||
|
"autodelete":"admin (OR everyone OR none OR role id)"
|
||||||
|
},
|
||||||
|
|
||||||
|
"messages":{
|
||||||
|
"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},
|
||||||
|
"roleAdding":{"dm":false, "logs":true},
|
||||||
|
"roleRemoving":{"dm":false, "logs":true}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id":"example-ticket",
|
||||||
|
"name":"Question",
|
||||||
|
"description":"Create this ticket if you have a question! (or leave empty)",
|
||||||
|
"type":"ticket",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
"emoji":"🎫 (or leave empty)",
|
||||||
|
"label":"question (or leave empty)",
|
||||||
|
"color":"gray OR red OR green OR blue"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ticketAdmins":["discord role id"],
|
||||||
|
"readonlyAdmins":["discord role id"],
|
||||||
|
"allowCreationByBlacklistedUsers":false,
|
||||||
|
"questions":["example-question-1","example-question-2"],
|
||||||
|
|
||||||
|
"channel":{
|
||||||
|
"prefix":"question-",
|
||||||
|
"suffix":"user-name OR user-id OR random-number OR random-hex OR counter-dynamic OR counter-fixed",
|
||||||
|
"category":"category id (or leave empty)",
|
||||||
|
"closedCategory":"category id (or leave empty)",
|
||||||
|
"backupCategory":"category id (or leave empty)",
|
||||||
|
"claimedCategory":[
|
||||||
|
{"user":"user id","category":"category id"}
|
||||||
|
],
|
||||||
|
"description":"This is a question ticket (or leave empty)"
|
||||||
|
},
|
||||||
|
|
||||||
|
"dmMessage":{
|
||||||
|
"enabled":false,
|
||||||
|
"text":"Thank you for creating a ticket in our server! (or leave empty)",
|
||||||
|
"embed":{
|
||||||
|
"enabled":false,
|
||||||
|
"title":"Embed Title! (or leave empty)",
|
||||||
|
"description":"Description (or leave empty)",
|
||||||
|
"customColor":"#f8ab00 (or leave empty)",
|
||||||
|
|
||||||
|
"image":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"thumbnail":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"fields":[
|
||||||
|
{"name":"field name","value":"field value","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ticketMessage":{
|
||||||
|
"enabled":true,
|
||||||
|
"text":"",
|
||||||
|
"embed":{
|
||||||
|
"enabled":true,
|
||||||
|
"title":"Question Ticket",
|
||||||
|
"description":"Thank you for creating a 'Question' ticket in our server!\nOur support team will help you as soon as possible!",
|
||||||
|
"customColor":"#f8ab00 (or leave empty)",
|
||||||
|
|
||||||
|
"image":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"thumbnail":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"fields":[
|
||||||
|
{"name":"field name","value":"field value","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
},
|
||||||
|
"ping":{
|
||||||
|
"@here":true,
|
||||||
|
"@everyone":false,
|
||||||
|
"custom":["discord role id"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoclose":{
|
||||||
|
"enableInactiveHours":false,
|
||||||
|
"inactiveHours":24,
|
||||||
|
"enableUserLeave":false,
|
||||||
|
"disableOnClaim":false
|
||||||
|
},
|
||||||
|
"autodelete":{
|
||||||
|
"enableInactiveDays":false,
|
||||||
|
"inactiveDays":7,
|
||||||
|
"enableUserLeave":false,
|
||||||
|
"disableOnClaim":false
|
||||||
|
},
|
||||||
|
"cooldown":{
|
||||||
|
"enabled":false,
|
||||||
|
"cooldownMinutes":10
|
||||||
|
},
|
||||||
|
"limits":{
|
||||||
|
"enabled":false,
|
||||||
|
"globalMaximum":20,
|
||||||
|
"userMaximum":3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"example-website",
|
||||||
|
"name":"Website",
|
||||||
|
"description":"Go to our website.",
|
||||||
|
"type":"website",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
"emoji":"😃",
|
||||||
|
"label":"Visit our website"
|
||||||
|
},
|
||||||
|
|
||||||
|
"url":"https://www.dj-dj.be"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"example-role",
|
||||||
|
"name":"Update Ping",
|
||||||
|
"description":"Click here to get notified on updates!",
|
||||||
|
"type":"role",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
"emoji":"📢",
|
||||||
|
"label":"Update Ping",
|
||||||
|
"color":"gray OR red OR green OR blue"
|
||||||
|
},
|
||||||
|
|
||||||
|
"roles":["discord role id"],
|
||||||
|
"mode":"add&remove OR remove OR add",
|
||||||
|
"removeRolesOnAdd":["discord role id"],
|
||||||
|
"addOnMemberJoin":false
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id":"example-embed",
|
||||||
|
"name":"Example Embed",
|
||||||
|
"dropdown":false,
|
||||||
|
"options":["example-ticket","example-website","example-role"],
|
||||||
|
|
||||||
|
"text":"",
|
||||||
|
"embed":{
|
||||||
|
"enabled":true,
|
||||||
|
"title":"Tickets:",
|
||||||
|
"description":"Create a ticket by clicking one of the buttons below!",
|
||||||
|
|
||||||
|
"customColor":"#f8ab00 (or leave empty)",
|
||||||
|
"url":"https://openticket.dj-dj.be (or leave empty)",
|
||||||
|
|
||||||
|
"image":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"thumbnail":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
|
||||||
|
"footer":"Open Ticket v4.0.3 (or leave empty)",
|
||||||
|
"fields":[
|
||||||
|
{"name":"field name","value":"field value","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
},
|
||||||
|
"settings":{
|
||||||
|
"dropdownPlaceholder":"Create a ticket!",
|
||||||
|
|
||||||
|
"enableMaxTicketsWarningInText":false,
|
||||||
|
"enableMaxTicketsWarningInEmbed":true,
|
||||||
|
|
||||||
|
"describeOptionsLayout":"simple OR normal OR detailed",
|
||||||
|
"describeOptionsCustomTitle":"",
|
||||||
|
"describeOptionsInText":false,
|
||||||
|
"describeOptionsInEmbedFields":true,
|
||||||
|
"describeOptionsInEmbedDescription":false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id":"example-question-1",
|
||||||
|
"name":"Example Question 1",
|
||||||
|
"type":"short",
|
||||||
|
|
||||||
|
"required":true,
|
||||||
|
"placeholder":"Insert your short answer here!",
|
||||||
|
"length":{
|
||||||
|
"enabled":false,
|
||||||
|
"min":0,
|
||||||
|
"max":1000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"example-question-2",
|
||||||
|
"name":"Example Question 2",
|
||||||
|
"type":"paragraph",
|
||||||
|
|
||||||
|
"required":false,
|
||||||
|
"placeholder":"Insert your long answer here!",
|
||||||
|
"length":{
|
||||||
|
"enabled":false,
|
||||||
|
"min":0,
|
||||||
|
"max":1000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"general":{
|
||||||
|
"enabled":false,
|
||||||
|
|
||||||
|
"enableChannel":false,
|
||||||
|
"enableCreatorDM":false,
|
||||||
|
"enableParticipantDM":false,
|
||||||
|
"enableActiveAdminDM":false,
|
||||||
|
"enableEveryAdminDM":false,
|
||||||
|
|
||||||
|
"channel":"transcript channel id (or leave empty)",
|
||||||
|
"mode":"html OR text"
|
||||||
|
},
|
||||||
|
"embedSettings":{
|
||||||
|
"customColor":"#f8ab00 (or leave empty)",
|
||||||
|
"listAllParticipants":false,
|
||||||
|
"includeTicketStats":false
|
||||||
|
},
|
||||||
|
"textTranscriptStyle":{
|
||||||
|
"layout":"simple OR normal OR detailed",
|
||||||
|
"includeStats":true,
|
||||||
|
"includeIds":false,
|
||||||
|
"includeEmbeds":true,
|
||||||
|
"includeFiles":true,
|
||||||
|
"includeBotMessages":true,
|
||||||
|
|
||||||
|
"fileMode":"custom OR channel-name OR channel-id OR user-name OR user-id",
|
||||||
|
"customFileName":"this-is-a-transcript (or leave empty)"
|
||||||
|
},
|
||||||
|
"htmlTranscriptStyle":{
|
||||||
|
"background":{
|
||||||
|
"enableCustomBackground":false,
|
||||||
|
"backgroundColor":"#f8ba00 (or leave empty)",
|
||||||
|
"backgroundImage":"https://www.example.com/image.png (or leave empty)"
|
||||||
|
},
|
||||||
|
"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://transcripts.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,46 +0,0 @@
|
|||||||
{
|
|
||||||
"version":"1.0.0",
|
|
||||||
|
|
||||||
|
|
||||||
"disclaimer":"DISABLE doesn't work yet! Below this message!",
|
|
||||||
"disable":{
|
|
||||||
"messages":{
|
|
||||||
"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
|
|
||||||
},
|
|
||||||
"slash":{
|
|
||||||
"help":false,
|
|
||||||
"msg":false,
|
|
||||||
"close":false,
|
|
||||||
"delete":false,
|
|
||||||
"reopen":false,
|
|
||||||
"new":false,
|
|
||||||
"add":false,
|
|
||||||
"remove":false,
|
|
||||||
"rename":false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"checkerjs":{
|
|
||||||
"token":false,
|
|
||||||
"all":false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
//ACTIONS:
|
|
||||||
|
|
||||||
|
|
||||||
//EXPORT ACTIONS:
|
|
||||||
exports.actions = {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +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
|
|
||||||
|
|
||||||
/** FOR DEVELOPERS ONLY!!
|
|
||||||
* Don't change anything in this file, read the api documentation first!
|
|
||||||
* look into "api docs.md" for the docs!
|
|
||||||
*/
|
|
||||||
|
|
||||||
//used when creating plugins!
|
|
||||||
exports.enableApiLogs = false
|
|
||||||
|
|
||||||
|
|
||||||
//DOESN'T WORK YET
|
|
||||||
//this is used when embedding open ticket into another bot
|
|
||||||
exports.embeddedMode = false
|
|
||||||
exports.clientLocation = require("../../../index").client
|
|
||||||
|
|
||||||
/** !! WARNING !!
|
|
||||||
* Only edit or extend the code when you know what you are doing!
|
|
||||||
* If open ticket crashes while you change the code, then we can't help you!
|
|
||||||
*
|
|
||||||
* DO IT ON YOUR OWN RISK!
|
|
||||||
*/
|
|
||||||
@@ -1,361 +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
|
|
||||||
|
|
||||||
|
|
||||||
//EVENT API:
|
|
||||||
const ticketOpenListeners = []
|
|
||||||
const ticketCloseListeners = []
|
|
||||||
const ticketDeleteListeners = []
|
|
||||||
const ticketReopenListeners = []
|
|
||||||
|
|
||||||
const ticketAddListeners = []
|
|
||||||
const ticketRemoveListeners = []
|
|
||||||
|
|
||||||
|
|
||||||
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:Object|false}} 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:Object|false}} 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:Object|false}} 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:Object|false}} 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:Object|false}} 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.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"} 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:Object|false}} 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:Object|false}} 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:Object|false}} 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 {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,
|
|
||||||
onTranscriptCreation,
|
|
||||||
onCommand,
|
|
||||||
onReactionRole,
|
|
||||||
onError
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
const fs = require("fs")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const log = bot.errorLog.log
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
const files = fs.readdirSync("./plugins")
|
|
||||||
|
|
||||||
var totalcount = 0
|
|
||||||
var successcount = 0
|
|
||||||
var failcount = 0
|
|
||||||
files.forEach((file) => {
|
|
||||||
if (file.endsWith(".plugin.js")){
|
|
||||||
try {
|
|
||||||
require("../../plugins/"+file)()
|
|
||||||
|
|
||||||
successcount++
|
|
||||||
totalcount++
|
|
||||||
}catch{
|
|
||||||
failcount++
|
|
||||||
totalcount++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
log("info","loaded plugins",[{key:"success",value:successcount},{key:"error",value:failcount},{key:"total",value:totalcount}])
|
|
||||||
}
|
|
||||||
-366
@@ -1,366 +0,0 @@
|
|||||||
exports.checker = async () => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
const config = require("../config.json")
|
|
||||||
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.includes(" ") || value.length < 40){
|
|
||||||
createError("'auth_token' | your token is invalid")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@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 (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 getButtonClass = require("./utils/getButton").rawButtonData
|
|
||||||
/**@param {getButtonClass} option */
|
|
||||||
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")
|
|
||||||
|
|
||||||
//enableDMmessage
|
|
||||||
checkType(option.enableDMMessage,"boolean",path+"/enableDMMessage")
|
|
||||||
|
|
||||||
//ticketmessage
|
|
||||||
checkType(option.ticketmessage,"string",path+"/ticketmessage")
|
|
||||||
|
|
||||||
}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' | you have no url in this button")
|
|
||||||
}
|
|
||||||
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 maybe blocks 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")
|
|
||||||
}
|
|
||||||
|
|
||||||
//enableDMmessage
|
|
||||||
checkType(option.enableDMMessage,"boolean",path+"/enableDMMessage")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const checkMessage = (input,path) => {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------|
|
|
||||||
//--------------------------|
|
|
||||||
//checker => START HERE |
|
|
||||||
//--------------------------|
|
|
||||||
//--------------------------|
|
|
||||||
|
|
||||||
var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","credits","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")
|
|
||||||
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")){
|
|
||||||
createError("'languagefile' | invalid language, more info in the wiki")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
checkType(config.credits,"boolean","credits")
|
|
||||||
//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!")
|
|
||||||
}
|
|
||||||
if (config.status.text.length < 1 || config.status.text.length > 40){
|
|
||||||
createError("'status/text' | text too long or short!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//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.enable_transcript,"boolean","system/enable_transcript")
|
|
||||||
checkType(config.system.enable_DM_transcript,"boolean","system/enable_DM_transcript")
|
|
||||||
if (config.system.enable_transcript){
|
|
||||||
checkDiscord("channelid",config.system.transcript_channel,"system/transcript_channel")
|
|
||||||
}
|
|
||||||
|
|
||||||
//options
|
|
||||||
|
|
||||||
config.options.forEach((option,index) => {
|
|
||||||
checkOption(option,"options/"+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])
|
|
||||||
}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,331 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
//closebar
|
|
||||||
var closeBar = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("closeTicketTrue")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("closeTicketFalse")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
var deleteBar = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicketTrue")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicketFalse")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
var deleteBar1 = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicketTrue1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicketFalse1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
//closebutton
|
|
||||||
var closeRowNormal = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("closeTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setLabel(l.buttons.close)
|
|
||||||
.setEmoji("🔒")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
var closeRowClosed = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicket1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("sendTranscript")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setLabel(l.buttons.sendTranscript)
|
|
||||||
.setEmoji("📄")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("reopenTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Success)
|
|
||||||
.setLabel(l.buttons.reopen)
|
|
||||||
.setEmoji("✔")
|
|
||||||
)
|
|
||||||
|
|
||||||
var closeRowDisabled = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("closeTicket")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setLabel(l.buttons.close)
|
|
||||||
.setEmoji("🔒")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicket")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(discord.ButtonStyle.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
//NORMAL CLOSE
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "closeTicket") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[closeBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "closeTicketFalse") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[closeRowNormal]})
|
|
||||||
})
|
|
||||||
|
|
||||||
var closeTicketButtonChecker = false
|
|
||||||
client.on("interactionCreate",async interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "closeTicketTrue") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (closeTicketButtonChecker == true) return
|
|
||||||
closeTicketButtonChecker = true
|
|
||||||
|
|
||||||
if (config.system.closeMode == "adminonly"){
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
|
||||||
try {
|
|
||||||
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}catch{
|
|
||||||
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interaction.message.edit({components:[closeRowDisabled]})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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 require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close")
|
|
||||||
closeTicketButtonChecker = false
|
|
||||||
})
|
|
||||||
|
|
||||||
var closeTicket1ButtonChecker = false
|
|
||||||
client.on("interactionCreate",async interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "closeTicketTrue1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (closeTicket1ButtonChecker == true) return
|
|
||||||
closeTicket1ButtonChecker = true
|
|
||||||
|
|
||||||
if (config.system.closeMode == "adminonly"){
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
|
||||||
try {
|
|
||||||
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}catch{
|
|
||||||
return interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const closedButtonDisabled = new discord.ActionRowBuilder()
|
|
||||||
.addComponents([
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("closeTicketTrue1")
|
|
||||||
.setDisabled(true)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("🔒")
|
|
||||||
])
|
|
||||||
interaction.message.edit({components:[closedButtonDisabled]})
|
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then((messages) => {
|
|
||||||
messages.first().edit({components:[closeRowDisabled]})
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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 require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close")
|
|
||||||
closeTicket1ButtonChecker = false
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
//NORMAL DELETE
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "deleteTicket") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[deleteBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "deleteTicketFalse") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[closeRowNormal]})
|
|
||||||
})
|
|
||||||
var deleteTicketButtonChecker = false
|
|
||||||
client.on("interactionCreate",async interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "deleteTicketTrue") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (deleteTicketButtonChecker == true) return
|
|
||||||
deleteTicketButtonChecker = true
|
|
||||||
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
|
||||||
try {
|
|
||||||
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}catch{
|
|
||||||
return interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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 require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete")
|
|
||||||
deleteTicketButtonChecker = false
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//CLOSED DELETE
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "deleteTicket1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[deleteBar1]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "deleteTicketFalse1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[closeRowClosed]})
|
|
||||||
})
|
|
||||||
|
|
||||||
var deleteTicket1ButtonChecker = false
|
|
||||||
client.on("interactionCreate",async interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "deleteTicketTrue1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (deleteTicket1ButtonChecker == true) return
|
|
||||||
deleteTicket1ButtonChecker = true
|
|
||||||
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
|
||||||
try {
|
|
||||||
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}catch{
|
|
||||||
return interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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 require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript")
|
|
||||||
deleteTicket1ButtonChecker = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -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,39 +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
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
//Do not change this without knowing what you are doing!!
|
|
||||||
const databaseFile = "local"
|
|
||||||
//Do not change this without knowing what you are doing!!
|
|
||||||
|
|
||||||
|
|
||||||
try {
|
|
||||||
var db = require("./dynamicfiles/local")
|
|
||||||
}catch{
|
|
||||||
console.log("I couldn't find the database file! (location: ./core/dynamicdatabase/storage.js:2)")
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = db
|
|
||||||
@@ -1,129 +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
|
|
||||||
|
|
||||||
exports.noPermsMessage = new embed()
|
|
||||||
.setColor(c.Red)
|
|
||||||
.setTitle(":x: "+l.errors.noPermsTitle)
|
|
||||||
.setDescription(l.errors.noPermsDescription)
|
|
||||||
|
|
||||||
exports.noPermsDelete = new embed()
|
|
||||||
.setColor(c.Red)
|
|
||||||
.setTitle(":x: "+l.errors.noPermsTitle)
|
|
||||||
.setDescription(l.errors.noPermsDelete)
|
|
||||||
|
|
||||||
/**@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
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {"system"|"command"|"info"|"api"} 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/modules/base").enableApiLogs == true){
|
|
||||||
console.log(chalk.red("[api v"+require("./api/api.json").version+"] ")+message+" "+chalk.yellow(parameters))
|
|
||||||
}
|
|
||||||
ptype = "api v"+require("./api/api.json").version
|
|
||||||
}
|
|
||||||
|
|
||||||
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,116 +0,0 @@
|
|||||||
const bot = require("../index")
|
|
||||||
const config = bot.config
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Number} index
|
|
||||||
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDMMessage"|"ticketmessage"} value
|
|
||||||
*/
|
|
||||||
exports.getTicketValue = (index,value) => {
|
|
||||||
if (value == "id"){
|
|
||||||
return "OTnewT"+config.options[index][value]
|
|
||||||
}
|
|
||||||
return config.options[index][value]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Number} index
|
|
||||||
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} value
|
|
||||||
*/
|
|
||||||
exports.getWebsiteValue = (index,value) => {
|
|
||||||
return config.options[index][value]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Number} index
|
|
||||||
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDMMessage"} value
|
|
||||||
*/
|
|
||||||
exports.getRoleValue = (index,value) => {
|
|
||||||
return config.options[index][value]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDMMessage"|"ticketmessage"} value
|
|
||||||
*/
|
|
||||||
exports.getTicketValues = (value) => {
|
|
||||||
var result = []
|
|
||||||
config.options.forEach((o) => {
|
|
||||||
if (value == "id"){
|
|
||||||
result.push("OTnewT"+o[value])
|
|
||||||
}else{
|
|
||||||
result.push(o[value])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} value
|
|
||||||
*/
|
|
||||||
exports.getWebsiteValues = (value) => {
|
|
||||||
var result = []
|
|
||||||
config.options.forEach((o) => {
|
|
||||||
result.push(o[value])
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDMMessage""} value
|
|
||||||
*/
|
|
||||||
exports.getRoleValues = (value) => {
|
|
||||||
var result = []
|
|
||||||
config.options.forEach((o) => {
|
|
||||||
result.push(o[value])
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
class TicketOptions {
|
|
||||||
constructor() {
|
|
||||||
this.id = ""
|
|
||||||
this.name = ""
|
|
||||||
this.description = ""
|
|
||||||
this.icon = ""
|
|
||||||
this.label = ""
|
|
||||||
this.type = ""
|
|
||||||
this.color = ""
|
|
||||||
this.adminroles = ["",""]
|
|
||||||
this.channelprefix = ""
|
|
||||||
this.category = ""
|
|
||||||
this.message = ""
|
|
||||||
this.enableDMMessage = true
|
|
||||||
this.ticketmessage = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} id
|
|
||||||
* @returns {TicketOptions|false}
|
|
||||||
*/
|
|
||||||
exports.getOptionsById = (id) => {
|
|
||||||
var result = false
|
|
||||||
config.options.forEach((option) => {
|
|
||||||
if ("OTnewT"+option.id == id){
|
|
||||||
result = option
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.exportedOptionClass = class {
|
|
||||||
constructor() {
|
|
||||||
this.id = ""
|
|
||||||
this.name = ""
|
|
||||||
this.description = ""
|
|
||||||
this.icon = ""
|
|
||||||
this.label = ""
|
|
||||||
this.type = ""
|
|
||||||
this.color = ""
|
|
||||||
this.adminroles = ["",""]
|
|
||||||
this.channelprefix = ""
|
|
||||||
this.category = ""
|
|
||||||
this.message = ""
|
|
||||||
this.enableDMMessage = true
|
|
||||||
this.ticketmessage = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,78 +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 getconfigoptions = require("../../getoptions")
|
|
||||||
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("OTsendTranscript")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(bs.Secondary)
|
|
||||||
.setLabel(l.buttons.sendTranscript)
|
|
||||||
.setEmoji("📄")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new button()
|
|
||||||
.setCustomId("OTreopenTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.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,52 +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 getconfigoptions = require("../../getoptions")
|
|
||||||
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,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 getconfigoptions = require("../../getoptions")
|
|
||||||
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("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,107 +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 getconfigoptions = require("../../getoptions")
|
|
||||||
const hiddendata = bot.hiddenData
|
|
||||||
const embed = discord.EmbedBuilder
|
|
||||||
const mc = config.main_color
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} addedUser
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.addEmbed = (addedUser) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username))
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:addedUser.tag,iconURL:addedUser.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} removedUser
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.removeEmbed = (removedUser) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username))
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:removedUser.tag,iconURL:removedUser.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} closer
|
|
||||||
* @returns {discord.EmbedBuilder}
|
|
||||||
*/
|
|
||||||
exports.closeEmbed = (closer) => {
|
|
||||||
return new embed()
|
|
||||||
.setTitle("🔒 "+l.commands.closeTitle)
|
|
||||||
.setColor(mc)
|
|
||||||
.setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @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 {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()})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,62 +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 getconfigoptions = require("../../../getoptions")
|
|
||||||
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
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
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.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("../../../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 getconfigoptions = require("../../../getoptions")
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
|
|
||||||
await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
|
|
||||||
await require("../../../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
|
|
||||||
|
|
||||||
console.log("closed with NO TRANSCRIPT")
|
|
||||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
|
||||||
if (!permissionChecker.sendUserNoDelete(interaction.user)){
|
|
||||||
permissionChecker.sendChannelNoDelete(interaction.channel)
|
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
|
|
||||||
await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true)
|
|
||||||
deleteTicketButtonChecker1 = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,29 +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 getconfigoptions = require("../../../getoptions")
|
|
||||||
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("../../../ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,21 +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 getconfigoptions = require("../../getoptions")
|
|
||||||
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("./sendTranscript")()
|
|
||||||
require("./verifyBars")()
|
|
||||||
|
|
||||||
//accepted
|
|
||||||
require("./accepted/closing")()
|
|
||||||
require("./accepted/reopening")()
|
|
||||||
require("./accepted/deleting")()
|
|
||||||
}
|
|
||||||
@@ -1,45 +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 getconfigoptions = require("../../getoptions")
|
|
||||||
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 = () => {
|
|
||||||
client.on("interactionCreate",async (interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTsendTranscript") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
const tsmsg = await interaction.channel.send({embeds:[bot.embeds.commands.sendTranscriptEmbed(false,interaction.channel,interaction.user)]})
|
|
||||||
|
|
||||||
const channelmessages = await interaction.channel.messages.fetch()
|
|
||||||
|
|
||||||
channelmessages.sweep((msgSweep) => {
|
|
||||||
return msgSweep.author.id == client.user.id
|
|
||||||
})
|
|
||||||
|
|
||||||
var fileattachment = await require("../../transcript").createTranscript(channelmessages,interaction.channel)
|
|
||||||
|
|
||||||
if (fileattachment == false){
|
|
||||||
log("system","internal error: transcript is not created!")
|
|
||||||
tsmsg.edit({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
tsmsg.edit({embeds:[bot.embeds.commands.sendTranscriptEmbed(true,interaction.channel,interaction.user)],files:[fileattachment]})
|
|
||||||
}catch{}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,69 +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 getconfigoptions = require("../../getoptions")
|
|
||||||
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
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTcloseTicketFalse") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
|
|
||||||
})
|
|
||||||
|
|
||||||
//DELETE
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicket") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicketFalse") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
|
|
||||||
})
|
|
||||||
|
|
||||||
//DELETE NO TRANSCRIPT
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicket1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "OTdeleteTicketFalse1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[bot.buttons.close.closeCommandRow]})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
const index = require("../index")
|
|
||||||
|
|
||||||
if (index.developerMode){
|
|
||||||
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")
|
|
||||||
|
|
||||||
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,75 +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()) return
|
|
||||||
if (!interaction.customId.startsWith("newR")) return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (interaction.customId.startsWith("newR")){
|
|
||||||
const optionid = interaction.customId.split("newR")[1]
|
|
||||||
if (!optionid){
|
|
||||||
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.roleDoesntExist)]})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
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.remove(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.add(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,24 +0,0 @@
|
|||||||
const discord = require("discord.js")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const client = require("../../index").client
|
|
||||||
const config = bot.config
|
|
||||||
const getoptions = require("../getoptions")
|
|
||||||
|
|
||||||
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,198 +0,0 @@
|
|||||||
const discord = require("discord.js")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const client = require("../../index").client
|
|
||||||
const config = bot.config
|
|
||||||
const getoptions = require("../getoptions")
|
|
||||||
|
|
||||||
const act = discord.ApplicationCommandType
|
|
||||||
const acot = discord.ApplicationCommandOptionType
|
|
||||||
|
|
||||||
module.exports = async () => {
|
|
||||||
const chalk = (await import("chalk")).default
|
|
||||||
const sid = config.server_id
|
|
||||||
|
|
||||||
const ids = getoptions.getTicketValues("id")
|
|
||||||
/**@type {[{name:String,value:String}]} */
|
|
||||||
var choices = []
|
|
||||||
ids.forEach((id) => {
|
|
||||||
const option = getoptions.getOptionsById(id)
|
|
||||||
if (option.type == "ticket"){
|
|
||||||
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 10")+" commands ready! (this can take up to 40 seconds)")
|
|
||||||
if (readystats >= 10){
|
|
||||||
console.log(chalk.green("\nready!"))
|
|
||||||
console.log(chalk.bgBlue("you can now start the bot with 'npm start'!"))
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
},100)
|
|
||||||
|
|
||||||
//create a ticket (/new or /ticket)
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"ticket",
|
|
||||||
description:"Create a ticket!",
|
|
||||||
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,
|
|
||||||
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:"The help menu",
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
//close
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"close",
|
|
||||||
description:"Close the current ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//delete
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"delete",
|
|
||||||
description:"Delete the current ticket.",
|
|
||||||
defaultPermission:true,
|
|
||||||
type:act.ChatInput
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
//msg
|
|
||||||
client.application.commands.create({
|
|
||||||
name:"message",
|
|
||||||
description:"Create a ticket message.",
|
|
||||||
defaultPermission:true,
|
|
||||||
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,
|
|
||||||
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,
|
|
||||||
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,
|
|
||||||
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,
|
|
||||||
type:act.ChatInput
|
|
||||||
},sid).then(() => {
|
|
||||||
readystats++
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,346 +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")
|
|
||||||
|
|
||||||
exports.runThis = () => {
|
|
||||||
client.on("interactionCreate",async (interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "sendTranscript") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
const channelmessages = await interaction.channel.messages.fetch()
|
|
||||||
|
|
||||||
channelmessages.sweep((msgSweep) => {
|
|
||||||
return msgSweep.author.id == client.user.id
|
|
||||||
})
|
|
||||||
|
|
||||||
var fileattachment = await require("./transcript").createTranscript(channelmessages,interaction.channel)
|
|
||||||
|
|
||||||
if (fileattachment == false){
|
|
||||||
log("system","internal error: transcript is not created!")
|
|
||||||
interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
interaction.channel.send({content:"**"+l.messages.hereIsTheTranscript+"**",files:[fileattachment]})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @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 channelmessages = await channel.messages.fetch()
|
|
||||||
|
|
||||||
const newReason = reason ? reason : "none"
|
|
||||||
|
|
||||||
//start code
|
|
||||||
|
|
||||||
//remove ot bot from transcript
|
|
||||||
channelmessages.sweep((msgSweep) => {return msgSweep.author.id == client.user.id})
|
|
||||||
|
|
||||||
/**@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"){
|
|
||||||
//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}])
|
|
||||||
|
|
||||||
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
|
|
||||||
|
|
||||||
//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.value
|
|
||||||
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
if (!id) return false
|
|
||||||
|
|
||||||
try{
|
|
||||||
if (config.system.enable_DM_Messages){
|
|
||||||
member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch{log("system","can't send DM to member, member doesn't allow dm's")}
|
|
||||||
})
|
|
||||||
|
|
||||||
}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("./getoptions").getOptionsById("OTnewT"+ticketId)
|
|
||||||
|
|
||||||
if (!ticketData) return
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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("OTsendTranscript")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setLabel(l.buttons.sendTranscript)
|
|
||||||
.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("./getoptions").getOptionsById("OTnewT"+ticketId)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
try{
|
|
||||||
if (config.system.enable_DM_Messages){
|
|
||||||
member.send({embeds:[bot.errorLog.custom(l.messages.closedTicketDmTitle,l.messages.closedTicketDmDescription+"\n\n**reason:** "+newReason,":ticket:",config.main_color)]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch{log("system","can't send DM to member, member doesn't allow dm's")}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
}else if (mode == "deletenotranscript"){
|
|
||||||
//delete with no transcript
|
|
||||||
//check perms
|
|
||||||
if (!guild) return
|
|
||||||
if (!permsChecker.command(user.id,guild.id)){
|
|
||||||
permsChecker.sendUserNoPerms(user)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//start delete proccess
|
|
||||||
enableTranscript = false
|
|
||||||
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}])
|
|
||||||
|
|
||||||
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
|
|
||||||
|
|
||||||
//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("./getoptions").getOptionsById("OTnewT"+ticketId)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
if (!id) return false
|
|
||||||
|
|
||||||
try{
|
|
||||||
if (config.system.enable_DM_Messages){
|
|
||||||
member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch{log("system","can't send DM to member, member doesn't allow dm's")}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (enableTranscript == true && mode != "deletenotranscript"){
|
|
||||||
|
|
||||||
const transcriptReason = (mode == "close") ? "**reason:** "+newReason : "**reason:** none"
|
|
||||||
|
|
||||||
if (config.system.enable_transcript || config.system.enable_DM_transcript){
|
|
||||||
var fileattachment = await require("./transcript").createTranscript(channelmessages,channel)
|
|
||||||
|
|
||||||
if (fileattachment == false){log("system","internal error: transcript is not created!");return}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.system.enable_transcript){
|
|
||||||
const transcriptEmbed = new discord.EmbedBuilder()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle("📄 "+l.messages.newTranscriptTitle)
|
|
||||||
.setDescription(transcriptReason)
|
|
||||||
.setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()})
|
|
||||||
|
|
||||||
guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({
|
|
||||||
embeds:[transcriptEmbed],
|
|
||||||
files:[fileattachment]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.system.enable_DM_transcript){
|
|
||||||
const transcriptEmbed = new discord.EmbedBuilder()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle("📄 "+l.messages.newTranscriptTitle)
|
|
||||||
.setDescription(transcriptReason)
|
|
||||||
.setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()})
|
|
||||||
|
|
||||||
if (!isDatabaseError) ticketOpener.send({
|
|
||||||
embeds:[transcriptEmbed],
|
|
||||||
files:[fileattachment]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (deleteRequired){
|
|
||||||
//const timer = () => {return new Promise((resolve,reject) => {
|
|
||||||
// setTimeout(() => {resolve(true)},7000)
|
|
||||||
//})}
|
|
||||||
//await timer()
|
|
||||||
|
|
||||||
setTimeout(async () => {
|
|
||||||
await channel.delete()
|
|
||||||
},6000)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = bot.config
|
|
||||||
const getButton = require("./utils/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("./utils/getTicketMessages").getTicketMessage(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})
|
|
||||||
if (data.enableThumbnail) embed.setThumbnail(data.thumbnail)
|
|
||||||
|
|
||||||
if (data.enableCustomColor){
|
|
||||||
embed.setColor(data.color)
|
|
||||||
}else{
|
|
||||||
embed.setColor(config.main_color)
|
|
||||||
}
|
|
||||||
|
|
||||||
var description = data.description
|
|
||||||
if (data.enableTicketExplaination){
|
|
||||||
description = description+"\n\n__"+l.messages.chooseCategory+"__\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.enableMaxTicketsWarning){
|
|
||||||
description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.max_allowed_tickets)
|
|
||||||
}
|
|
||||||
|
|
||||||
embed.setDescription(description)
|
|
||||||
//-----------------------------------
|
|
||||||
|
|
||||||
//-----------------------------------
|
|
||||||
//create the components
|
|
||||||
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
|
|
||||||
}
|
|
||||||
})
|
|
||||||
//-----------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//return everything
|
|
||||||
/**
|
|
||||||
* @type {{embed:discord.EmbedBuilder,componentRows:discord.MessageActionRow[]}}
|
|
||||||
*/
|
|
||||||
const returnedData = {embed:embed,componentRows:componentRows}
|
|
||||||
return returnedData
|
|
||||||
}
|
|
||||||
@@ -1,198 +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 getconfigoptions = require("./getoptions")
|
|
||||||
const storage = bot.storage
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
var closeButton = bot.buttons.firstmsg.firstmsgRowNormal
|
|
||||||
|
|
||||||
//ticket button click / create ticket
|
|
||||||
client.on("interactionCreate",(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 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 (getconfigoptions.getTicketValues("id").includes(customId)){
|
|
||||||
|
|
||||||
//ticketoptions from config
|
|
||||||
const currentTicketOptions = getconfigoptions.getOptionsById(customId)
|
|
||||||
|
|
||||||
if (currentTicketOptions == false || currentTicketOptions.type != "ticket") return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]})
|
|
||||||
|
|
||||||
if (interaction.isButton()){
|
|
||||||
interaction.deferUpdate()
|
|
||||||
}else if (interaction.isChatInputCommand()){
|
|
||||||
interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)]})
|
|
||||||
}
|
|
||||||
|
|
||||||
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 (config.system.enable_DM_Messages){
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
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,214 +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
|
|
||||||
|
|
||||||
exports.runThis = () => {
|
|
||||||
var closeRowNormal = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("closeTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setLabel(l.buttons.close)
|
|
||||||
.setEmoji("🔒")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
|
|
||||||
var closeRowClosed = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("deleteTicket1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Danger)
|
|
||||||
.setLabel(l.buttons.delete)
|
|
||||||
.setEmoji("✖️")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("sendTranscript")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setLabel(l.buttons.sendTranscript)
|
|
||||||
.setEmoji("📄")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("reopenTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Success)
|
|
||||||
.setLabel(l.buttons.reopen)
|
|
||||||
.setEmoji("✔")
|
|
||||||
)
|
|
||||||
|
|
||||||
var reopenBar = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("reopenTicketTrue")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("reopenTicketFalse")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
|
|
||||||
var reopenBar1 = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("reopenTicketTrue1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("reopenTicketFalse1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
|
|
||||||
var reopenCommandBar = new discord.ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new discord.ButtonBuilder()
|
|
||||||
.setCustomId("reopenTicket1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(discord.ButtonStyle.Secondary)
|
|
||||||
.setEmoji("🔓")
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//NORMAL WAY
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "reopenTicket") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[reopenBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "reopenTicketFalse") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[closeRowClosed]})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "reopenTicketTrue") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
const embed = new discord.EmbedBuilder()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle(":unlock: "+l.messages.reopenTitle+" :unlock:")
|
|
||||||
.setDescription(l.messages.reopenDescription)
|
|
||||||
|
|
||||||
interaction.message.edit({embeds:[embed],components:[closeRowNormal]})
|
|
||||||
|
|
||||||
reopenTicket(interaction.guild,interaction.channel,interaction.user)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
//COMMAND WAY
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "reopenTicket1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[reopenBar1]})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "reopenTicketFalse1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[reopenCommandBar]})
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("interactionCreate",(interaction) => {
|
|
||||||
if (!interaction.isButton()) return
|
|
||||||
if (interaction.customId != "reopenTicketTrue1") return
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
const embed = new discord.EmbedBuilder()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle(":unlock: "+l.messages.reopenTitle+" :unlock:")
|
|
||||||
.setDescription(l.messages.reopenDescription)
|
|
||||||
|
|
||||||
interaction.message.edit({content:null,embeds:[embed],components:[closeRowNormal]})
|
|
||||||
|
|
||||||
reopenTicket(interaction.guild,interaction.channel,interaction.user)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,75 +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.TextBasedChannel} channel @returns {Promise<{ticketname:String,ticketopener:{discordjsuser:discord.User,name:String,id:String}>} */
|
|
||||||
const getUserInfo = (channel) => {
|
|
||||||
return new Promise((promiseresolve,reject) => {
|
|
||||||
//getID
|
|
||||||
var result = {
|
|
||||||
ticketopener:{
|
|
||||||
discordjsuser:"",
|
|
||||||
id:"/",
|
|
||||||
name:"/"
|
|
||||||
},
|
|
||||||
ticketname:"/"
|
|
||||||
}
|
|
||||||
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")
|
|
||||||
|
|
||||||
const id = hiddendata.data.find(d => d.key == "openerid").value
|
|
||||||
|
|
||||||
result.ticketopener.id = id
|
|
||||||
|
|
||||||
const ticketopener = client.users.cache.find(u => u.id == id)
|
|
||||||
const name = ticketopener.tag
|
|
||||||
|
|
||||||
const channelname = channel.name
|
|
||||||
|
|
||||||
promiseresolve({ticketname:channelname,ticketopener:{discordjsuser:ticketopener,name:name,id:id}})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.Message[]} messagecollection
|
|
||||||
* @param {discord.Channel} channel
|
|
||||||
* @returns new `discord.attachmentBuilder`
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports.createTranscript = async (messagecollection,channel) => {
|
|
||||||
const ticketuserdata = await getUserInfo(channel)
|
|
||||||
|
|
||||||
require("./api/modules/events").onTranscriptCreation(messagecollection,channel,channel.guild,new Date())
|
|
||||||
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.getSeconds()+":"+cd.getMinutes()+":"+cd.getHours()
|
|
||||||
const filearray = ["open ticket transcript:\ntranscript creation: "+dateString+"\nticket name: "+ticketuserdata.ticketname+"\nticket opener: "+ticketuserdata.ticketopener.name,"\nTRANSCRIPT START:"]
|
|
||||||
|
|
||||||
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:"transcript_"+ticketuserdata.ticketname+".txt",description:"An Open Ticket transcript"})
|
|
||||||
}catch(err){
|
|
||||||
console.log("[error] "+err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
const discord = require("discord.js")
|
|
||||||
const bot = require("../../index")
|
|
||||||
const config = bot.config
|
|
||||||
const getoptions = require("../getoptions")
|
|
||||||
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.enableDMMessage = true
|
|
||||||
this.url = ""
|
|
||||||
this.roles = ["",""]
|
|
||||||
this.mode = ""
|
|
||||||
this.adminroles = ["",""]
|
|
||||||
this.channelprefix = ""
|
|
||||||
this.category = ""
|
|
||||||
this.message = ""
|
|
||||||
this.ticketmessage = ""
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
const bot = require("../../index")
|
|
||||||
const config = bot.config
|
|
||||||
const l = bot.language
|
|
||||||
|
|
||||||
exports.getTicketMessage = (input) => {
|
|
||||||
var returned = config.messages.find(a => a.id == input)
|
|
||||||
if (returned){
|
|
||||||
return returned
|
|
||||||
}
|
|
||||||
var result = config.messages[0]
|
|
||||||
if (!result){
|
|
||||||
throw new Error("'messages' object in config.json is empty")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
@@ -1,52 +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
|
|
||||||
}
|
|
||||||
@@ -1,104 +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
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} memberid
|
|
||||||
* @param {String} guildid
|
|
||||||
* @returns {Boolean} has permissions?
|
|
||||||
*/
|
|
||||||
exports.command = (memberid,guildid) => {
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
|
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
|
||||||
return false
|
|
||||||
}else {return true}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.sendUserNoPerms = (user) => {
|
|
||||||
try {
|
|
||||||
user.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
return true
|
|
||||||
}catch{
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.sendUserNoTicket = (user) => {
|
|
||||||
try {
|
|
||||||
user.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
return true
|
|
||||||
}catch{
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.User} user
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.sendUserNoDelete = (user) => {
|
|
||||||
try {
|
|
||||||
user.send({embeds:[bot.errorLog.noPermsDelete]})
|
|
||||||
return true
|
|
||||||
}catch{
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.sendChannelNoPerms = (channel) => {
|
|
||||||
try {
|
|
||||||
channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
return true
|
|
||||||
}catch{
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.sendChannelNoTicket = (channel) => {
|
|
||||||
try {
|
|
||||||
channel.send({embeds:[bot.errorLog.notInATicket]})
|
|
||||||
return true
|
|
||||||
}catch{
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {discord.TextChannel} channel
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
exports.sendChannelNoDelete = (channel) => {
|
|
||||||
try {
|
|
||||||
channel.send({embeds:[bot.errorLog.noPermsDelete]})
|
|
||||||
return true
|
|
||||||
}catch{
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +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 loadChalk = async () => {
|
|
||||||
return await (await import("chalk")).default
|
|
||||||
}
|
|
||||||
|
|
||||||
//ENABLE message for when there is too less translation
|
|
||||||
const enableNoTranslationMessage = true
|
|
||||||
|
|
||||||
module.exports = async () => {
|
|
||||||
const chalk = await loadChalk()
|
|
||||||
if (enableNoTranslationMessage){
|
|
||||||
console.log(chalk.red("[warning]"),"WARNING!!\n"+chalk.blue("We have a small problem with translation atm, so it can be that "+chalk.redBright("some translations are in English!")+"\n\nYou can help us if you want by joining our server!\n"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Docker Compose for Open Ticket v4
|
||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
openticket:
|
||||||
|
build: .
|
||||||
|
volumes:
|
||||||
|
- openticket:/home/container
|
||||||
|
restart: no
|
||||||
|
container_name: open-ticket
|
||||||
|
volumes:
|
||||||
|
openticket:
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
# Docker File for Open Ticket v4
|
||||||
|
# Use the official Node.js 20 image from Docker Hub
|
||||||
|
FROM node:20-alpine
|
||||||
|
|
||||||
|
# Set pterodactyl working directory inside the container
|
||||||
|
WORKDIR /home/container
|
||||||
|
|
||||||
|
# Copy package.json and package-lock.json into the container
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
# Copy the rest of your app's source code into the container
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Run the bot from index.js
|
||||||
|
CMD ["node", "index.js"]
|
||||||
@@ -1,197 +1,137 @@
|
|||||||
// __________ __________ ___________ ____ ____
|
/////////////// STARTUP FLAGS ///////////////
|
||||||
// / ____ \ / ______ \ / | | \ | |
|
const flags = [
|
||||||
// | / \ | | | | | | |_______| | \ | |
|
// Edit flags here when being unable to use the flags in the command prompt.
|
||||||
// | | | | | |____| | | | | |\ \ | |
|
//PTERODACTYL PANEL
|
||||||
// | | | | | ________/ | |______ | | \ \ | |
|
//add startup flags here (e.g. "--no-compile") when running via the panel
|
||||||
// | | | | | | | _____| | | \ \ | |
|
]
|
||||||
// | | | | | | | | | | \ \ | |
|
process.argv.push(...flags)
|
||||||
// | | | | | | | |________ | | \ \| |
|
/////////////// STARTUP FLAGS ///////////////
|
||||||
// | \____/ | | | | | | | \ |
|
|
||||||
// \__________/ |__| \__________| |__| \___|
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
██████╗ ██████╗ ███████╗███╗ ██╗ ████████╗██╗ ██████╗██╗ ██╗███████╗████████╗
|
||||||
|
██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ╚══██╔══╝██║██╔════╝██║ ██╔╝██╔════╝╚══██╔══╝
|
||||||
|
██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██║ ██║██║ █████╔╝ █████╗ ██║
|
||||||
|
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
|
||||||
|
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
|
||||||
|
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
|
||||||
|
v4.0.3 - Made by DJj123dj & Contributors
|
||||||
|
|
||||||
const discord = require('discord.js')
|
Discord: https://discord.dj-dj.be
|
||||||
const fs = require('fs')
|
Docs: https://otdocs.dj-dj.be
|
||||||
const {GatewayIntentBits,Partials} = discord
|
Support Us: https://github.com/sponsors/DJj123dj/
|
||||||
const client = new discord.Client({
|
|
||||||
intents:[
|
|
||||||
GatewayIntentBits.DirectMessages,
|
|
||||||
GatewayIntentBits.GuildInvites,
|
|
||||||
GatewayIntentBits.GuildMembers,
|
|
||||||
GatewayIntentBits.GuildMessages,
|
|
||||||
GatewayIntentBits.Guilds,
|
|
||||||
GatewayIntentBits.MessageContent
|
|
||||||
],
|
|
||||||
partials:[Partials.Channel,Partials.Message]
|
|
||||||
})
|
|
||||||
exports.client = client
|
|
||||||
|
|
||||||
client.setMaxListeners(50)
|
*/
|
||||||
|
///////////////////////////////////////////
|
||||||
|
////////// COMPILATION + STARTUP //////////
|
||||||
|
///////////////////////////////////////////
|
||||||
|
const fs = require("fs")
|
||||||
|
const ts = require("typescript")
|
||||||
|
const {createHash,Hash} = require("crypto")
|
||||||
|
const nodepath = require('path')
|
||||||
|
|
||||||
if (process.argv[2]){
|
/** ## What is this?
|
||||||
if (process.argv[2].endsWith("d")){
|
* This is a function which compares `./src/` with a hash stored in `./dist/hash.txt`.
|
||||||
var isDev = true
|
* The hash is based on the modified date & file metadata of all files in `./src/`.
|
||||||
console.log("starting in dev mode...")
|
*
|
||||||
}else{var isDev = false}
|
* If the hash is different, the bot will automatically re-compile.
|
||||||
}else{var isDev = false}
|
* This will help you save CPU resources because the bot shouldn't re-compile when nothing has been changed :)
|
||||||
|
*
|
||||||
|
* @param {string} dir
|
||||||
|
* @param {Hash|null} upperHash
|
||||||
|
*/
|
||||||
|
function computeSourceHash(dir,upperHash){
|
||||||
|
const hash = upperHash ? upperHash : createHash("sha256")
|
||||||
|
const info = fs.readdirSync(dir,{withFileTypes:true})
|
||||||
|
|
||||||
exports.developerMode = isDev
|
for (const file of info) {
|
||||||
const language = require("./core/languageManager").language
|
const fullPath = nodepath.join(dir,file.name)
|
||||||
exports.language = language
|
if (file.isFile() && [".js",".ts",".jsx",".tsx"].some((ext) => file.name.endsWith(ext))){
|
||||||
|
const statInfo = fs.statSync(fullPath)
|
||||||
|
//compute hash using file metadata
|
||||||
|
const fileInfo = `${fullPath}:${statInfo.size}:${statInfo.mtimeMs}`
|
||||||
|
hash.update(fileInfo)
|
||||||
|
|
||||||
if (isDev){
|
}else if (file.isDirectory()){
|
||||||
try {
|
//recursively compute all folders
|
||||||
var config = require('./devConfig.json')
|
computeSourceHash(fullPath,hash)
|
||||||
}catch{
|
}
|
||||||
console.log("devConfig.json not found! Trying the normal config...")
|
}
|
||||||
var config = require("./config.json")
|
//return when not being called recursively
|
||||||
|
if (!upperHash) {
|
||||||
|
return hash.digest("hex")
|
||||||
}
|
}
|
||||||
}else{var config = require('./config.json')}
|
|
||||||
exports.config = config
|
|
||||||
exports.storage = require('./core/dynamicdatabase/storage')
|
|
||||||
|
|
||||||
exports.errorLog = require("./core/errorLogSystem")
|
|
||||||
const log = this.errorLog.log
|
|
||||||
|
|
||||||
exports.hiddenData = require("./core/utils/hiddendata")
|
|
||||||
|
|
||||||
exports.embeds = {
|
|
||||||
commands:require("./core/interactionHandlers/embeds/commands")
|
|
||||||
}
|
}
|
||||||
exports.buttons = {
|
function requiresCompilation(){
|
||||||
close:require("./core/interactionHandlers/buttons/close"),
|
//check hashes when not using "--compile-only" flag
|
||||||
firstmsg:require("./core/interactionHandlers/buttons/firstmsg"),
|
if (process.argv.includes("--compile-only")) return true
|
||||||
verifybars:require("./core/interactionHandlers/buttons/verifyBars")
|
|
||||||
|
console.log("OT: Comparing prebuilds with source...")
|
||||||
|
const sourceHash = computeSourceHash("./src/")
|
||||||
|
const pluginHash = computeSourceHash("./plugins/")
|
||||||
|
const hash = sourceHash+":"+pluginHash
|
||||||
|
|
||||||
|
if (fs.existsSync("./dist/hash.txt")){
|
||||||
|
const distHash = fs.readFileSync("./dist/hash.txt").toString()
|
||||||
|
if (distHash === hash) return false
|
||||||
|
else return true
|
||||||
|
}else return true
|
||||||
|
}
|
||||||
|
function saveNewCompilationHash(){
|
||||||
|
const sourceHash = computeSourceHash("./src/")
|
||||||
|
const pluginHash = computeSourceHash("./plugins/")
|
||||||
|
const hash = sourceHash+":"+pluginHash
|
||||||
|
fs.writeFileSync("./dist/hash.txt",hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
client.on('ready',async () => {
|
if (!process.argv.includes("--no-compile")){
|
||||||
var statusSet = false
|
if (requiresCompilation()){
|
||||||
const setStatus = (type,text) => {
|
console.log("OT: Compilation Required...")
|
||||||
if (statusSet == true) return
|
|
||||||
const getTypeEnum = (text) => {
|
|
||||||
if (text.toLowerCase() == "playing") return discord.ActivityType.Playing
|
|
||||||
else if (text.toLowerCase() == "listening") return discord.ActivityType.Listening
|
|
||||||
else if (text.toLowerCase() == "watching") return discord.ActivityType.Watching
|
|
||||||
else return discord.ActivityType.Listening
|
|
||||||
}
|
|
||||||
client.user.setActivity(text,{type:getTypeEnum(type)})
|
|
||||||
statusSet = true
|
|
||||||
log("system","loaded status",[{key:"type",value:type},{key:"text",value:text}])
|
|
||||||
}
|
|
||||||
|
|
||||||
const chalk = await (await import("chalk")).default
|
//REMOVE EXISTING BUILDS
|
||||||
|
console.log("OT: Removing Prebuilds...")
|
||||||
|
fs.rmSync("./dist",{recursive:true,force:true})
|
||||||
|
|
||||||
if (!process.argv[2]){
|
//COMPILE TYPESCRIPT
|
||||||
console.log(chalk.red("WELCOME TO OPEN TICKET!"))
|
console.log("OT: Compiling Typescript...")
|
||||||
log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}])
|
const configPath = nodepath.resolve('./tsconfig.json')
|
||||||
require("./core/utils/warningManager")()
|
const configFile = ts.readConfigFile(configPath,ts.sys.readFile)
|
||||||
|
|
||||||
console.log(chalk.blue("\n\nlogs:")+"\n============")
|
//check for tsconfig errors
|
||||||
if (config.status.enabled){
|
if (configFile.error){
|
||||||
setStatus(config.status.type,config.status.text)
|
const message = ts.formatDiagnosticsWithColorAndContext([configFile.error],ts.createCompilerHost({}))
|
||||||
}
|
console.error(message)
|
||||||
|
|
||||||
log("system","bot logged in!")
|
|
||||||
|
|
||||||
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.argv[2] == "d"){
|
|
||||||
if (config.status.enabled){
|
|
||||||
setStatus(config.status.type,config.status.text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.argv[2].startsWith("slash")){
|
|
||||||
console.log(chalk.red("WELCOME TO OPEN TICKET!"))
|
|
||||||
log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}])
|
|
||||||
require("./core/utils/warningManager")()
|
|
||||||
|
|
||||||
console.log(chalk.blue("\n\nlogs:")+"\n============")
|
|
||||||
if (config.status.enabled){
|
|
||||||
setStatus(config.status.type,config.status.text)
|
|
||||||
}
|
|
||||||
|
|
||||||
log("system","bot logged in!")
|
|
||||||
|
|
||||||
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch()
|
|
||||||
}else{
|
|
||||||
console.log(chalk.red("STARTING IN ")+chalk.blue("SLASH MODE")+chalk.red("..."))
|
|
||||||
console.log("logs:\n================")
|
|
||||||
console.log("client logged in...")
|
|
||||||
console.log("loading files...")
|
|
||||||
if (process.argv[3] == "enable"){
|
|
||||||
console.log(chalk.green("switching to slashEnable.js"))
|
|
||||||
require("./core/slashSystem/slashEnable")()
|
|
||||||
}else if (process.argv[3] == "disable"){
|
|
||||||
console.log(chalk.green("switching to slashDisable.js"))
|
|
||||||
require("./core/slashSystem/slashDisable")()
|
|
||||||
}else{
|
|
||||||
console.log(chalk.red("Internal Error: unknown slash mode!"))
|
|
||||||
process.exit(1)
|
process.exit(1)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//load plugins
|
//parse tsconfig file
|
||||||
require("./core/api/pluginlauncher")()
|
const parsedConfig = ts.parseJsonConfigFileContent(configFile.config,ts.sys,nodepath.dirname(configPath))
|
||||||
})
|
|
||||||
|
|
||||||
if (!isDev){
|
//create program/compiler
|
||||||
require("./core/checker").checker()
|
const program = ts.createProgram({
|
||||||
|
rootNames:parsedConfig.fileNames,
|
||||||
|
options:parsedConfig.options
|
||||||
|
})
|
||||||
|
|
||||||
|
//emit all compiled files
|
||||||
|
const emitResult = program.emit()
|
||||||
|
|
||||||
|
//print emit errors/warnings (type errors)
|
||||||
|
const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics)
|
||||||
|
const formattedDiagnostics = ts.formatDiagnosticsWithColorAndContext(allDiagnostics, ts.createCompilerHost(parsedConfig.options))
|
||||||
|
console.log(formattedDiagnostics)
|
||||||
|
|
||||||
|
if (emitResult.emitSkipped || allDiagnostics.find((d) => d.category == ts.DiagnosticCategory.Error || d.category == ts.DiagnosticCategory.Warning)){
|
||||||
|
console.log("OT: Compilation Failed!")
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
}else console.log("OT: No Compilation Required...")
|
||||||
|
|
||||||
|
//save new compilation hash
|
||||||
|
saveNewCompilationHash()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.argv[2] && process.argv[2].startsWith("slash")){
|
//START BOT
|
||||||
//do nothing
|
console.log("OT: Compilation Succeeded!")
|
||||||
}else{
|
if (process.argv.includes("--compile-only")) process.exit(0) //exit when only compile is required!
|
||||||
|
console.log("OT: Starting Bot!")
|
||||||
//commands
|
require("./dist/src/index.js")
|
||||||
require('./commands/ticket')()
|
|
||||||
require("./commands/help")()
|
|
||||||
require("./commands/close")()
|
|
||||||
require("./commands/delete")()
|
|
||||||
require("./commands/rename")()
|
|
||||||
require("./commands/add")()
|
|
||||||
require("./commands/remove")()
|
|
||||||
require("./commands/reopen")()
|
|
||||||
|
|
||||||
//core
|
|
||||||
require('./core/ticketOpener')()
|
|
||||||
require("./core/ticketCloser").runThis()
|
|
||||||
//require("./core/closebuttons")() // => everything is now in ./core/interactionHandlers/
|
|
||||||
require("./core/reactionRoles")()
|
|
||||||
require("./core/ticketReopener").runThis()
|
|
||||||
|
|
||||||
//InteractionHandlers
|
|
||||||
require("./core/interactionHandlers/handlers/handlers")()
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
const APIEvents = require("./core/api/modules/events")
|
|
||||||
|
|
||||||
const debugLog = (debugString) => {
|
|
||||||
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
|
|
||||||
fs.writeFileSync("./openticketdebug.txt",content+"\nDEBUG: "+debugString)
|
|
||||||
}
|
|
||||||
const errorLog = (errorString,stack) => {
|
|
||||||
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
|
|
||||||
fs.writeFileSync("./openticketdebug.txt",content+"\nERROR: "+errorString+" STACK: "+stack)
|
|
||||||
}
|
|
||||||
|
|
||||||
client.on("debug", async (message) => {
|
|
||||||
if (message.startsWith("Provided token:")){
|
|
||||||
debugLog("Provided token: ***********bot token is invisible**************...")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
debugLog(message)
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on("uncaughtException",async (error,origin) => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
console.log(chalk.red("\nOPEN TICKET ERROR: ")+error+"\n"+chalk.green("\nCreate a ticket in our support server for more information!\nIf you do this, you might help us to avoid a future bug!\n"))
|
|
||||||
errorLog(error.name+": "+error.message+" | origin: "+origin,error.stack)
|
|
||||||
|
|
||||||
APIEvents.onError(error.name+": "+error.message,new Date())
|
|
||||||
})
|
|
||||||
|
|
||||||
client.login(config.auth_token)
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"حجج باطلة",
|
|
||||||
"missingArgsDescription":"حجة مفقودة",
|
|
||||||
"noPermsTitle":"ليس لديك إذن",
|
|
||||||
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
|
|
||||||
"noPermsDelete":"Only admins can delete a ticket!",
|
|
||||||
"chooseFromListTitle":"بطاقة التعريف غير صالحة",
|
|
||||||
"chooseFromListDescription":"اختر أحد المعرفات أدناه:",
|
|
||||||
"boterror":"مشكلة في الروبوت",
|
|
||||||
"notInTicketTitle":"أنت لست في تذكرة!",
|
|
||||||
"notInTicketDescription":"هذا الأمر لا يعمل خارج التذاكر!",
|
|
||||||
"ticketDoesntExist":"هذه التذكرة لم تعد موجودة!",
|
|
||||||
"roleDoesntExist":"هذا الدور لم يعد موجودًا!",
|
|
||||||
"anotherOption":"هذا الخيار ليس تذكرة بل نوع آخر!",
|
|
||||||
"maxAmountTitle":"بلغ الحد الأقصى!",
|
|
||||||
"maxAmountDescription":"لقد وصلت إلى الحد الأقصى لعدد التذاكر المسموح بها!\nلذلك لا يمكنك إنشاء واحدة جديدة!",
|
|
||||||
"somethingWentWrong":"**هناك خطأ ما!**\nالرجاء المحاولة مرة أخرى!",
|
|
||||||
"somethingWentWrongTranscript":"**حدث خطأ ما أثناء كتابة النص!**\nالرجاء المحاولة مرة أخرى!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"Added {0} to this ticket!",
|
|
||||||
"userRemovedTitle":"Removed {0} from this ticket!",
|
|
||||||
"renameTitle":"Changed the name to {0}!",
|
|
||||||
"closeTitle":"Closed this ticket!",
|
|
||||||
"deleteTitle":"Deleting this ticket...",
|
|
||||||
"reopenTitle":"Re-Opened this ticket!",
|
|
||||||
|
|
||||||
"ticketWarning":"The embed is in the message below!",
|
|
||||||
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Available Commands:",
|
|
||||||
"header1":"**اذهب إلى {0} لإنشاء تذكرة!**\n\n",
|
|
||||||
"header2":"**قم بتشغيل الأمر `/new` أو `/ticket` لإنشاء تذكرة!**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"تفرخ تضمين مع الأزرار. (المسؤولون فقط)",
|
|
||||||
"renameCmd":"إعادة تسمية تذكرة. (بدون مسافات)",
|
|
||||||
"closeCmd":"أغلق التذكرة.",
|
|
||||||
"deleteCmd":"حذف التذكرة.",
|
|
||||||
"addCmd":"أضف مستخدمًا إلى التذكرة.",
|
|
||||||
"removeCmd":"إزالة مستخدم من التذكرة.",
|
|
||||||
"reopenCmd":"أعد فتح التذكرة بعد إغلاقه."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"إغلاق التذكرة",
|
|
||||||
"delete":"حذف التذكرة",
|
|
||||||
"reopen":"إعادة فتح التذكرة",
|
|
||||||
"sendTranscript":"إرسال ملف النص"
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"أعيد فتح هذه التذكرة!",
|
|
||||||
"reopenDescription":"لا تتردد في التحدث مرة أخرى!",
|
|
||||||
"closedTitle":"أغلقت هذه التذكرة!",
|
|
||||||
"closedDescription":"يمكن للمسؤولين فقط التحدث في هذه التذكرة الآن!\n\n*انقر فوق الزر أدناه لحذف هذه التذكرة أو إعادة فتحها!*",
|
|
||||||
"createdTitle":"تم إنشاء التذكرة!",
|
|
||||||
"createdDescription":"تم إنشاء تذكرتك ، يمكنك اكتشافها عن طريق ping",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"تذكرة جديدة!",
|
|
||||||
"closedTicketDmTitle":"تم إغلاق التذكرة!",
|
|
||||||
"deletedTicketDmTitle":"تم حذف التذكرة!",
|
|
||||||
"closedTicketDmDescription":"تم إغلاق تذكرتك!",
|
|
||||||
"deletedTicketDmDescription":"تم حذف تذكرتك!",
|
|
||||||
"reopenTicketDmTitle":"أعيد فتح التذكرة!",
|
|
||||||
"reopenTicketDmDescription":"تم إعادة فتح تذكرتك!",
|
|
||||||
"newTranscriptTitle":"نسخة جديدة هنا!",
|
|
||||||
"hereIsTheTranscript":"هذا هو النص:",
|
|
||||||
|
|
||||||
"chooseCategory":"اختر فئة:",
|
|
||||||
"gettingdeleted":"...يتم حذف التذكرة",
|
|
||||||
|
|
||||||
"none":"none",
|
|
||||||
"reason":"reason"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"Invalid Arguments!",
|
|
||||||
"missingArgsDescription":"Missing Argument",
|
|
||||||
"noPermsTitle":"No Permissions!",
|
|
||||||
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
|
|
||||||
"noPermsDelete":"Only admins can delete a ticket!",
|
|
||||||
"chooseFromListTitle":"Invalid ID",
|
|
||||||
"chooseFromListDescription":"Choose one of the id's below:",
|
|
||||||
"boterror":"Bot Error!",
|
|
||||||
"notInTicketTitle":"You are not in a ticket!",
|
|
||||||
"notInTicketDescription":"This command doesn't work outside tickets!",
|
|
||||||
"ticketDoesntExist":"This ticket doesn't exist anymore!",
|
|
||||||
"roleDoesntExist":"This role doesn't exist anymore!",
|
|
||||||
"anotherOption":"This option is not a ticket but another type!",
|
|
||||||
"maxAmountTitle":"Max amount reached!",
|
|
||||||
"maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!",
|
|
||||||
"somethingWentWrong":"**Something went wrong!**\nPlease try again another time!",
|
|
||||||
"somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"Added {0} to this ticket!",
|
|
||||||
"userRemovedTitle":"Removed {0} from this ticket!",
|
|
||||||
"renameTitle":"Changed the name to {0}!",
|
|
||||||
"closeTitle":"Closed this ticket!",
|
|
||||||
"deleteTitle":"Deleting this ticket...",
|
|
||||||
"reopenTitle":"Re-Opened this ticket!",
|
|
||||||
|
|
||||||
"ticketWarning":"The embed is in the message below!",
|
|
||||||
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Available Commands:",
|
|
||||||
"header1":"**Go to {0} to create a ticket!**\n\n",
|
|
||||||
"header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"Spawn an embed with buttons. (admins only)",
|
|
||||||
"renameCmd":"Rename a ticket. (no spaces)",
|
|
||||||
"closeCmd":"Close a ticket.",
|
|
||||||
"deleteCmd":"Delete a ticket.",
|
|
||||||
"addCmd":"Add a user to the ticket.",
|
|
||||||
"removeCmd":"Remove a user from the ticket.",
|
|
||||||
"reopenCmd":"Re-Open a ticket after it was closed."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"Close Ticket",
|
|
||||||
"delete":"Delete Ticket",
|
|
||||||
"reopen":"Re-Open Ticket",
|
|
||||||
"sendTranscript":"Transcript"
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"Re-Opened this ticket!",
|
|
||||||
"reopenDescription":"Feel free to talk again!",
|
|
||||||
"closedTitle":"Closed this ticket!",
|
|
||||||
"closedDescription":"Only admins can talk in this ticket now!\n\n*Click on the button below to delete or to re-open this ticket!*",
|
|
||||||
"createdTitle":"Ticket Created!",
|
|
||||||
"createdDescription":"Your ticket is created, you can detect it by a ping!",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"New Ticket!",
|
|
||||||
"closedTicketDmTitle":"Ticket Closed!",
|
|
||||||
"deletedTicketDmTitle":"Ticket Deleted!",
|
|
||||||
"closedTicketDmDescription":"Your ticket is closed!",
|
|
||||||
"deletedTicketDmDescription":"Your ticket is deleted!",
|
|
||||||
"reopenTicketDmTitle":"Ticket Re-opened!",
|
|
||||||
"reopenTicketDmDescription":"Your ticket is re-opened!",
|
|
||||||
"newTranscriptTitle":"A new transcript is here!",
|
|
||||||
"hereIsTheTranscript":"Here is the transcript:",
|
|
||||||
|
|
||||||
"chooseCategory":"choose a category:",
|
|
||||||
"gettingdeleted":"Ticket is getting deleted...",
|
|
||||||
|
|
||||||
"none":"none",
|
|
||||||
"reason":"reason"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"Neplatné argumenty",
|
|
||||||
"missingArgsDescription":"Chybí argumenty",
|
|
||||||
"noPermsTitle":"Nemáš práva!",
|
|
||||||
"noPermsDescription":"Nemáš dostatečné práva na tento příkaz!\n Potřebuješ ADMINISTRATOR aby jsi mohl provést příkaz!",
|
|
||||||
"noPermsDelete":"Pouze admin může smazat ticket!",
|
|
||||||
"chooseFromListTitle":"Neplatné ID",
|
|
||||||
"chooseFromListDescription":"Vyber si z těchto ID:",
|
|
||||||
"boterror":"Error!",
|
|
||||||
"notInTicketTitle":"Nejsi v ticketu!",
|
|
||||||
"notInTicketDescription":"Tento příkaz nefunguje mimo tickety!",
|
|
||||||
"ticketDoesntExist":"Tento ticket už bohužel neexistuje!",
|
|
||||||
"roleDoesntExist":"Tato role bohužel neexistuje!",
|
|
||||||
"anotherOption":"Tato možnost není ticket ale něco jiného!",
|
|
||||||
"maxAmountTitle":"Maximální počet ticketů dosažen!",
|
|
||||||
"maxAmountDescription":"Dosáhl jsi maximálního povoleného počtu ticketů!\n Nemůžeš si vytvořit nový!",
|
|
||||||
"somethingWentWrong":"**Něco je špatně**\nProsím zkus to příště znovu!",
|
|
||||||
"somethingWentWrongTranscript":"Něco je špatně s transcriptem!**\nProsím zkus to příště znovu!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"{0} byl přidán do ticketu!",
|
|
||||||
"userRemovedTitle":"{0} byl odebrám z ticketu!",
|
|
||||||
"renameTitle":"Jméno bylo změněno!",
|
|
||||||
"closeTitle":"Zavři tento ticket!",
|
|
||||||
"deleteTitle":"Smaž tento ticket!",
|
|
||||||
"reopenTitle":"Znovu otevři ticket!",
|
|
||||||
|
|
||||||
"ticketWarning":"The embed is in the message below!",
|
|
||||||
"maxTicketWarning":"**Varovaní:** _Můžeš si vytvořit použe {0} ticket(s) v jednu chvíli!_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Příkazy:",
|
|
||||||
"header1":"**Běž {0} vytvořit si ticket!**\n\n",
|
|
||||||
"header2":"**Použij příkaz `/new` nebo `/ticket` k vytvoření ticketu!**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"Vytvoř možnost otevírat tickety přes tlačítko. (ADMIN)",
|
|
||||||
"renameCmd":"Přejmenovat ticket. (Žádné mezery)",
|
|
||||||
"closeCmd":"Zavři ticket.",
|
|
||||||
"deleteCmd":"Smaž ticket.",
|
|
||||||
"addCmd":"Přidej člena do ticketu.",
|
|
||||||
"removeCmd":"Odebere člena z ticketu.",
|
|
||||||
"reopenCmd":"Znovu otevři ticket po uzavření."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"Zavři ticket",
|
|
||||||
"delete":"Smaž ticket",
|
|
||||||
"reopen":"Znovu otevři ticket",
|
|
||||||
"sendTranscript":"Odešli log ticketu"
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"Ticket znovu otevřen!",
|
|
||||||
"reopenDescription":"Cítím se skvěle že si můžeme zase povídat!",
|
|
||||||
"closedTitle":"Zavřený ticket!",
|
|
||||||
"closedDescription":"Pouze admin team zde může nyní komunikovat!\n\n*Klikni na tlačítko níže pro smazání nebo znovu otevření ticketu!*",
|
|
||||||
"createdTitle":"Ticket vytvořen!",
|
|
||||||
"createdDescription":"Váš tiket je vytvořen, můžete ho zjistit pomocí pingu!",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"Nový ticket!",
|
|
||||||
"closedTicketDmTitle":"Ticket uzavřen!",
|
|
||||||
"deletedTicketDmTitle":"Ticket smazán!",
|
|
||||||
"closedTicketDmDescription":"Tvůj ticket byl uzavřen!",
|
|
||||||
"deletedTicketDmDescription":"Tvůj ticket byl smazán!",
|
|
||||||
"reopenTicketDmTitle":"Ticket znovu otevřen!",
|
|
||||||
"reopenTicketDmDescription":"Tvůj ticket byl znovu otevřen!",
|
|
||||||
"newTranscriptTitle":"Nový log ticketu je zde!",
|
|
||||||
"hereIsTheTranscript":"Zde je log:",
|
|
||||||
|
|
||||||
"chooseCategory":"Vyber kategorii:",
|
|
||||||
"gettingdeleted":"Ticket bude smazán",
|
|
||||||
|
|
||||||
"none":"nic",
|
|
||||||
"reason":"důvod"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"Onjuiste parameters!",
|
|
||||||
"missingArgsDescription":"Er missen parameters",
|
|
||||||
"noPermsTitle":"Geen permissies!",
|
|
||||||
"noPermsDescription":"Je hebt de `ADMINISTRATOR` permissie nodig of je moet in de lijst van toegestane users staan!",
|
|
||||||
"noPermsDelete":"Alleen admins kunnen een ticket verwijderen!",
|
|
||||||
"chooseFromListTitle":"Onjuist ID",
|
|
||||||
"chooseFromListDescription":"Kies een van de id's hier onder:",
|
|
||||||
"boterror":"Bot Error!",
|
|
||||||
"notInTicketTitle":"Je bent niet in een ticket!",
|
|
||||||
"notInTicketDescription":"Deze command werkt niet buiten tickets!",
|
|
||||||
"ticketDoesntExist":"Dit ticket bestaat niet meer!",
|
|
||||||
"roleDoesntExist":"Deze rol bestaat niet meer!",
|
|
||||||
"anotherOption":"Deze optie is niet een ticket, maar een ander type!",
|
|
||||||
"maxAmountTitle":"Maximum numer bereikt!",
|
|
||||||
"maxAmountDescription":"Je hebt het maximum aantal openstaande tickets bereikt!\nDus je kan geen nieuwe meer maken!",
|
|
||||||
"somethingWentWrong":"**Iets ging fout!**\nProbeer een andere keer opnieuw!",
|
|
||||||
"somethingWentWrongTranscript":"Iets ging fout terwijl het transcript gemaakt werd!**\nProbeer een andere keer opnieuw!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"{0} is toegevoegd aan dit ticket!",
|
|
||||||
"userRemovedTitle":"{0} is verwijderd van dit ticket!",
|
|
||||||
"renameTitle":"De naam is veranderd naar {0}!",
|
|
||||||
"closeTitle":"Ticket gesloten!",
|
|
||||||
"deleteTitle":"Ticket aan het verwijderen...",
|
|
||||||
"reopenTitle":"Ticket heropend!",
|
|
||||||
|
|
||||||
"ticketWarning":"De embed is in het bericht hier onder!",
|
|
||||||
"maxTicketWarning":"**Waarschuwing:** _Je kan maar {0} ticket(s) tegelijkertijd maken!_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Beschikbare Commands:",
|
|
||||||
"header1":"**Ga naar {0} om een ticket te maken!**\n\n",
|
|
||||||
"header2":"**Run de command `/new` of `/ticket` om een ticket te maken!**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"Spawn een embed met knoppen. (alleen admins)",
|
|
||||||
"renameCmd":"Hernoem een ticket. (geen spaties)",
|
|
||||||
"closeCmd":"Sluit een ticket.",
|
|
||||||
"deleteCmd":"Verijder een ticket.",
|
|
||||||
"addCmd":"Voeg een user aan een ticket.",
|
|
||||||
"removeCmd":"Verwijder een user van een ticket.",
|
|
||||||
"reopenCmd":"Heropen een ticket nadat het gesloten is."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"Sluit Ticket",
|
|
||||||
"delete":"Verwijder Ticket",
|
|
||||||
"reopen":"Heropen Ticket",
|
|
||||||
"sendTranscript":"Transcript"
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"Ticket heropend!",
|
|
||||||
"reopenDescription":"Voel vrij om weer te praten!",
|
|
||||||
"closedTitle":"Ticket gesloten!",
|
|
||||||
"closedDescription":"Alleen admins kunnen nog praten.\n\n*Klik op de knoppen hieronder voor meer acties!*",
|
|
||||||
"createdTitle":"Ticket Aangemaakt!",
|
|
||||||
"createdDescription":"U ticket is gemaakt, je kan het detecteren bij een ping!",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"Nieuw Ticket!",
|
|
||||||
"closedTicketDmTitle":"Ticket Gesloten!",
|
|
||||||
"deletedTicketDmTitle":"Ticket Verwijderd!",
|
|
||||||
"closedTicketDmDescription":"Je ticket is gesloten!",
|
|
||||||
"deletedTicketDmDescription":"Je ticket is verwijderd!",
|
|
||||||
"reopenTicketDmTitle":"Ticket Heropend!",
|
|
||||||
"reopenTicketDmDescription":"Je ticket is heropend!",
|
|
||||||
"newTranscriptTitle":"Er is een nieuw transcript!",
|
|
||||||
"hereIsTheTranscript":"Hier is het transcript:",
|
|
||||||
|
|
||||||
"chooseCategory":"kies een categorie:",
|
|
||||||
"gettingdeleted":"Ticket wordt verwijderd...",
|
|
||||||
|
|
||||||
"none":"geen",
|
|
||||||
"reason":"reden"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"Invalid Arguments!",
|
|
||||||
"missingArgsDescription":"Missing Argument",
|
|
||||||
"noPermsTitle":"No Permissions!",
|
|
||||||
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
|
|
||||||
"noPermsDelete":"Only admins can delete a ticket!",
|
|
||||||
"chooseFromListTitle":"Invalid ID",
|
|
||||||
"chooseFromListDescription":"Choose one of the id's below:",
|
|
||||||
"boterror":"Bot Error!",
|
|
||||||
"notInTicketTitle":"You are not in a ticket!",
|
|
||||||
"notInTicketDescription":"This command doesn't work outside tickets!",
|
|
||||||
"ticketDoesntExist":"This ticket doesn't exist anymore!",
|
|
||||||
"roleDoesntExist":"This role doesn't exist anymore!",
|
|
||||||
"anotherOption":"This option is not a ticket but another type!",
|
|
||||||
"maxAmountTitle":"Max amount reached!",
|
|
||||||
"maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!",
|
|
||||||
"somethingWentWrong":"**Something went wrong!**\nPlease try again another time!",
|
|
||||||
"somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"Added {0} to this ticket!",
|
|
||||||
"userRemovedTitle":"Removed {0} from this ticket!",
|
|
||||||
"renameTitle":"Changed the name to {0}!",
|
|
||||||
"closeTitle":"Closed this ticket!",
|
|
||||||
"deleteTitle":"Deleting this ticket...",
|
|
||||||
"reopenTitle":"Re-Opened this ticket!",
|
|
||||||
|
|
||||||
"ticketWarning":"The embed is in the message below!",
|
|
||||||
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Available Commands:",
|
|
||||||
"header1":"**Go to {0} to create a ticket!**\n\n",
|
|
||||||
"header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"Spawn an embed with buttons. (admins only)",
|
|
||||||
"renameCmd":"Rename a ticket. (no spaces)",
|
|
||||||
"closeCmd":"Close a ticket.",
|
|
||||||
"deleteCmd":"Delete a ticket.",
|
|
||||||
"addCmd":"Add a user to the ticket.",
|
|
||||||
"removeCmd":"Remove a user from the ticket.",
|
|
||||||
"reopenCmd":"Re-Open a ticket after it was closed."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"Close Ticket",
|
|
||||||
"delete":"Delete Ticket",
|
|
||||||
"reopen":"Re-Open Ticket",
|
|
||||||
"sendTranscript":"Transcript"
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"Re-Opened this ticket!",
|
|
||||||
"reopenDescription":"Feel free to talk again!",
|
|
||||||
"closedTitle":"Closed this ticket!",
|
|
||||||
"closedDescription":"Only admins can talk in this ticket now!\n\n*Click on the button below to delete or to re-open this ticket!*",
|
|
||||||
"createdTitle":"Ticket Created!",
|
|
||||||
"createdDescription":"Your ticket is created, you can detect it by a ping!",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"New Ticket!",
|
|
||||||
"closedTicketDmTitle":"Ticket Closed!",
|
|
||||||
"deletedTicketDmTitle":"Ticket Deleted!",
|
|
||||||
"closedTicketDmDescription":"Your ticket is closed!",
|
|
||||||
"deletedTicketDmDescription":"Your ticket is deleted!",
|
|
||||||
"reopenTicketDmTitle":"Ticket Re-opened!",
|
|
||||||
"reopenTicketDmDescription":"Your ticket is re-opened!",
|
|
||||||
"newTranscriptTitle":"A new transcript is here!",
|
|
||||||
"hereIsTheTranscript":"Here is the transcript:",
|
|
||||||
|
|
||||||
"chooseCategory":"choose a category:",
|
|
||||||
"gettingdeleted":"Ticket is getting deleted...",
|
|
||||||
|
|
||||||
"none":"none",
|
|
||||||
"reason":"reason"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"Arguments invalides!",
|
|
||||||
"missingArgsDescription":"Argument manquant",
|
|
||||||
"noPermsTitle":"Pas de permissions!",
|
|
||||||
"noPermsDescription":"Vous avez besoin de la permission `ADMINISTRATOR` ou être dans la liste des rôles autorisés!",
|
|
||||||
"noPermsDelete":"Seuls les administrateurs peuvent supprimer un ticket!",
|
|
||||||
"chooseFromListTitle":"Invalid ID",
|
|
||||||
"chooseFromListDescription":"Choisissez l'un des identifiants ci-dessous:",
|
|
||||||
"boterror":"Bot Error!",
|
|
||||||
"notInTicketTitle":"Vous n'êtes pas dans un ticket!",
|
|
||||||
"notInTicketDescription":"Cette commande ne fonctionne pas en dehors des tickets!",
|
|
||||||
"ticketDoesntExist":"Ce ticket n'existe plus!",
|
|
||||||
"roleDoesntExist":"Ce rôle n'existe plus!",
|
|
||||||
"anotherOption":"Cette option n'est pas un ticket mais un autre type!",
|
|
||||||
"maxAmountTitle":"Montant maximum atteint!",
|
|
||||||
"maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés!\nVous ne pouvez donc pas en créer un nouveau!",
|
|
||||||
"somethingWentWrong":"**Quelque chose s'est mal passé!**\nVeuillez réessayer une autre fois!",
|
|
||||||
"somethingWentWrongTranscript":"Une erreur s'est produite lors de la création de la transcription!**\nVeuillez réessayer une autre fois!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"{0} a été ajouté à ce ticket!",
|
|
||||||
"userRemovedTitle":"Supprimé {0} de ce ticket!",
|
|
||||||
"renameTitle":"Changement du nom en {0}!",
|
|
||||||
"closeTitle":"Fermé ce ticket!",
|
|
||||||
"deleteTitle":"Suppression de ce ticket...",
|
|
||||||
"reopenTitle":"A rouvert ce ticket!",
|
|
||||||
|
|
||||||
"ticketWarning":"L'intégration est dans le message ci-dessous!",
|
|
||||||
"maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} ticket(s) à la fois !_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Commandes disponibles :",
|
|
||||||
"header1":"**Allez à {0} pour créer un ticket !**\n\n",
|
|
||||||
"header2":"**Exécutez la commande `/new` ou `/ticket` pour créer un ticket !**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"Faire apparaître une intégration avec des boutons. (administrateurs uniquement)",
|
|
||||||
"renameCmd":"Renommer un ticket. (sans espaces)",
|
|
||||||
"closeCmd":"Fermer un ticket.",
|
|
||||||
"deleteCmd":"Supprimer un billet.",
|
|
||||||
"addCmd":"Ajouter un utilisateur au ticket.",
|
|
||||||
"removeCmd":"Supprimer un utilisateur du ticket.",
|
|
||||||
"reopenCmd":"Rouvrir un ticket après sa clôture."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"Fermer le ticket",
|
|
||||||
"delete":"Supprimer le billet",
|
|
||||||
"reopen":"Billet de réouverture",
|
|
||||||
"sendTranscript":"Transcript"
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"A rouvert ce ticket!",
|
|
||||||
"reopenDescription":"N'hésitez pas à reparler!",
|
|
||||||
"closedTitle":"Fermé ce ticket!",
|
|
||||||
"closedDescription":"Seuls les administrateurs peuvent parler dans ce ticket maintenant !\n\n*Cliquez sur le bouton ci-dessous pour supprimer ou rouvrir ce ticket !*",
|
|
||||||
"createdTitle":"Ticket créé !",
|
|
||||||
"createdDescription":"Votre ticket est créé, vous pouvez le détecter par un ping !",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"Nouveau billet!",
|
|
||||||
"closedTicketDmTitle":"Billet fermé!",
|
|
||||||
"deletedTicketDmTitle":"Billet supprimé !",
|
|
||||||
"closedTicketDmDescription":"Votre billet est fermé !",
|
|
||||||
"deletedTicketDmDescription":"Votre billet est supprimé !",
|
|
||||||
"reopenTicketDmTitle":"Billet rouvert!",
|
|
||||||
"reopenTicketDmDescription":"Votre billet est rouvert !",
|
|
||||||
"newTranscriptTitle":"Une nouvelle transcription est ici!",
|
|
||||||
"hereIsTheTranscript":"Voici la transcription :",
|
|
||||||
|
|
||||||
"chooseCategory":"choisissez une catégorie:",
|
|
||||||
"gettingdeleted":"Le ticket est en cours de suppression...",
|
|
||||||
|
|
||||||
"none":"rien",
|
|
||||||
"reason":"raison"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"Ungültiges Argument!",
|
|
||||||
"missingArgsDescription":"Fehlendes Argument!",
|
|
||||||
"noPermsTitle":"Du hast keine Rechte!",
|
|
||||||
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
|
|
||||||
"noPermsDelete":"Only admins can delete a ticket!",
|
|
||||||
"chooseFromListTitle":"Ungültige ID",
|
|
||||||
"chooseFromListDescription":"Wählen Sie eine der folgenden ID:",
|
|
||||||
"boterror":"Bot Fehler!",
|
|
||||||
"notInTicketTitle":"Du bist ein kein Ticket!",
|
|
||||||
"notInTicketDescription":"Der Befehl funktioniert nicht außerhalb eines Tickets!",
|
|
||||||
"ticketDoesntExist":"Das Ticket Exisitert nicht mehr!",
|
|
||||||
"roleDoesntExist":"Die Rolle Exisitiert nicht mehr!",
|
|
||||||
"anotherOption":"Diese Option ist kein Ticket, sondern eine andere Art!",
|
|
||||||
"maxAmountTitle":"Das Limit wurde erreicht!",
|
|
||||||
"maxAmountDescription":"Sie haben die maximal zulässige Anzahl von Tickets erreicht!\nSie können also keine neue erstellen.!",
|
|
||||||
"somethingWentWrong":"**Etwas ist schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!",
|
|
||||||
"somethingWentWrongTranscript":"Bei der Erstellung der Transcript ist etwas schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"Added {0} to this ticket!",
|
|
||||||
"userRemovedTitle":"Removed {0} from this ticket!",
|
|
||||||
"renameTitle":"Changed the name to {0}!",
|
|
||||||
"closeTitle":"Closed this ticket!",
|
|
||||||
"deleteTitle":"Deleting this ticket...",
|
|
||||||
"reopenTitle":"Re-Opened this ticket!",
|
|
||||||
|
|
||||||
"ticketWarning":"The embed is in the message below!",
|
|
||||||
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Available Commands:",
|
|
||||||
"header1":"**Gehe zu {0} um ein Ticket zu erstellen!**\n\n",
|
|
||||||
"header2":"**Führen Sie den Befehl `/new` oder `/ticket` um ein Ticket zu erstellen!**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"Eine Einbettung mit Schaltflächen erzeugen. (nur admins)",
|
|
||||||
"renameCmd":"Ein Ticket umbenennen. (keine Leerzeichen)",
|
|
||||||
"closeCmd":"Schließen Sie ein Ticket.",
|
|
||||||
"deleteCmd":"Ein Ticket löschen.",
|
|
||||||
"addCmd":"Fügen Sie dem Ticket einen Benutzer hinzu.",
|
|
||||||
"removeCmd":"Entfernen eines Benutzers aus dem Ticket.",
|
|
||||||
"reopenCmd":"Öffnen Sie ein Ticket erneut, nachdem es geschlossen wurde."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"Ticket schließen",
|
|
||||||
"delete":"Ticket löschen",
|
|
||||||
"reopen":"Ticket wieder öffnen",
|
|
||||||
"sendTranscript":"Transcript-Datei senden"
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"Dieses Ticket wiedereröffnet!",
|
|
||||||
"reopenDescription":"Sie können gerne weiterreden!",
|
|
||||||
"closedTitle":"Dieses Ticket geschlossen!",
|
|
||||||
"closedDescription":"Nur Admins können jetzt in diesem Ticket sprechen!\n\n*Klicken Sie auf die Schaltfläche unten, um dieses Ticket zu löschen oder erneut zu öffnen!*",
|
|
||||||
"createdTitle":"Ticket erstellt!",
|
|
||||||
"createdDescription":"Ihr Ticket ist erstellt, Sie können es durch einen Ping erkennen!",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"Neues Ticket!",
|
|
||||||
"closedTicketDmTitle":"Ticket schließen!",
|
|
||||||
"deletedTicketDmTitle":"Ticket löschen!",
|
|
||||||
"closedTicketDmDescription":"Ihr Ticket ist geschlossen!",
|
|
||||||
"deletedTicketDmDescription":"Ihr Ticket ist gelöscht!",
|
|
||||||
"reopenTicketDmTitle":"Ticket neu Eröffnen!",
|
|
||||||
"reopenTicketDmDescription":"Dein Ticket ist Neu eröffnet!",
|
|
||||||
"newTranscriptTitle":"Eine neue Transscript finden Sie hier!",
|
|
||||||
"hereIsTheTranscript":"Hier ist das Transscript:",
|
|
||||||
|
|
||||||
"chooseCategory":"Wähle eine Kategorie:",
|
|
||||||
"gettingdeleted":"Ticket wird gelöscht...",
|
|
||||||
|
|
||||||
"none":"none",
|
|
||||||
"reason":"reason"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"Argumente Invalide",
|
|
||||||
"missingArgsDescription":"Argument Lipsa",
|
|
||||||
"noPermsTitle":"Nu ai permisiunea necesara!",
|
|
||||||
"noPermsDescription":"Ai nevoie de permisiunea de `ADMINISTRATOR`!",
|
|
||||||
"noPermsDelete":"Doar adminii pot inchide un ticket!",
|
|
||||||
"chooseFromListTitle":"Invalid ID",
|
|
||||||
"chooseFromListDescription":"Alege unul dintre id-urile urmatoare:",
|
|
||||||
"boterror":"Eroare bot!",
|
|
||||||
"notInTicketTitle":"Nu esti intr-un ticket!",
|
|
||||||
"notInTicketDescription":"Aceasta comanda nu merge inafara unui ticket!",
|
|
||||||
"ticketDoesntExist":"Acest ticket nu mai exista!",
|
|
||||||
"roleDoesntExist":"Acest rol nu mai exista!",
|
|
||||||
"anotherOption":"Aceasta optiune este altceva decat un tip de ticket!",
|
|
||||||
"maxAmountTitle":"Limita atinsa!",
|
|
||||||
"maxAmountDescription":"Ai atins limita de tickets!\nAsa ca nu mai poti creea altele noi!",
|
|
||||||
"somethingWentWrong":"**Ceva nu a mers bine!**\nTe rugam sa incerci mai tarziu!",
|
|
||||||
"somethingWentWrongTranscript":"Ceva nu aa mers bine in timpul creeari transcript-ului!**\nTe rugam sa incerci mai tarziu!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"{0} a fost adaugat in acest ticket!",
|
|
||||||
"userRemovedTitle":"{0} a fost scos din acest ticket!",
|
|
||||||
"renameTitle":"Nume schimbat in {0}!",
|
|
||||||
"closeTitle":"Ticket inchis!",
|
|
||||||
"deleteTitle":"Se sterge ticket-ul...",
|
|
||||||
"reopenTitle":"Ticket Re-deschis!",
|
|
||||||
|
|
||||||
"ticketWarning":"Embed-ul se afla in mesajul de mai jos!",
|
|
||||||
"maxTicketWarning":"**Avertizare:** _Poti creea doar {0} tickete active!_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Comenzi disponibile:",
|
|
||||||
"header1":"**Mergi la {0} pentru a creea un ticket!**\n\n",
|
|
||||||
"header2":"**Ruleaza comanda `/new` ori `/ticket` pentru a creea un ticket!**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"Trimite embed-ul cu tickete. (doar admini)",
|
|
||||||
"renameCmd":"Redenumeste un ticket. (fara spatii)",
|
|
||||||
"closeCmd":"Inchide un ticket.",
|
|
||||||
"deleteCmd":"Sterge un ticket.",
|
|
||||||
"addCmd":"Adauga un utilizator in ticket.",
|
|
||||||
"removeCmd":"Sterge un utilizator din ticket.",
|
|
||||||
"reopenCmd":"Re-deschide un ticket dupa ce a fost deschis."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"Inchide ticket-ul",
|
|
||||||
"delete":"Sterge ticket-ul",
|
|
||||||
"reopen":"Re-deschide un ticket",
|
|
||||||
"sendTranscript":"Transcript"
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"Ticket Re-deschis!",
|
|
||||||
"reopenDescription":"Poti vorbi din nou!",
|
|
||||||
"closedTitle":"Ticket inchis!",
|
|
||||||
"closedDescription":"Doar adminii pot vorbi in acest ticket acum!\n\n*Apasa pe butonul de mai jos pentru a re-deschide ori sterge ticket-ul!*",
|
|
||||||
"createdTitle":"Ticket Creat!",
|
|
||||||
"createdDescription":"Ticket-ul tau a fost creat, poti sa il vezi in canalul pe care ai fost mentionat!",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"Ticket nou!",
|
|
||||||
"closedTicketDmTitle":"Ticket Inchis!",
|
|
||||||
"deletedTicketDmTitle":"Ticket Sters!",
|
|
||||||
"closedTicketDmDescription":"Ticket-ul tau este inchis!",
|
|
||||||
"deletedTicketDmDescription":"Ticket-ul tau este sters!",
|
|
||||||
"reopenTicketDmTitle":"Ticket Re-deschis!",
|
|
||||||
"reopenTicketDmDescription":"Ticket-ul tau este re-deschis!",
|
|
||||||
"newTranscriptTitle":"Un nou transcript este aici!",
|
|
||||||
"hereIsTheTranscript":"Aici este transcriptul:",
|
|
||||||
|
|
||||||
"chooseCategory":"Alege o categorie:",
|
|
||||||
"gettingdeleted":"Ticket-ul se sterge...",
|
|
||||||
|
|
||||||
"none":"niciunul",
|
|
||||||
"reason":"Motiv"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"errors":{
|
|
||||||
"missingArgsTitle":"¡Argumentos inválidos!",
|
|
||||||
"missingArgsDescription":"Argumento faltante.",
|
|
||||||
"noPermsTitle":"¡Sin permisos!",
|
|
||||||
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
|
|
||||||
"noPermsDelete":"Only admins can delete a ticket!",
|
|
||||||
"chooseFromListTitle":"ID Invalida",
|
|
||||||
"chooseFromListDescription":"Elije una de las ID de abajo:",
|
|
||||||
"boterror":"¡Error del bot!",
|
|
||||||
"notInTicketTitle":"¡No te encuentras en un ticket!",
|
|
||||||
"notInTicketDescription":"¡Este comando no funciona fuera de los tickets!",
|
|
||||||
"ticketDoesntExist":"¡Este ticket no existe!",
|
|
||||||
"roleDoesntExist":"¡Este rol no existe!",
|
|
||||||
"anotherOption":"¡Esta opción no es un ticket, si no otra cosa!",
|
|
||||||
"maxAmountTitle":"¡Máxima cantidad alcanzada!",
|
|
||||||
"maxAmountDescription":"¡Has alcanzado la máxima cantidad de tickets permitida!\n¡Por lo que no puedes crear otro!",
|
|
||||||
"somethingWentWrong":"**¡Algo salió mal!**\n¡Prueba dentro de un rato!",
|
|
||||||
"somethingWentWrongTranscript":"**¡Algo salió mal al hacer el transcript!**\n¡Prueba en otro momento!"
|
|
||||||
},
|
|
||||||
"commands":{
|
|
||||||
"userAddedTitle":"Added {0} to this ticket!",
|
|
||||||
"userRemovedTitle":"Removed {0} from this ticket!",
|
|
||||||
"renameTitle":"Changed the name to {0}!",
|
|
||||||
"closeTitle":"Closed this ticket!",
|
|
||||||
"deleteTitle":"Deleting this ticket...",
|
|
||||||
"reopenTitle":"Re-Opened this ticket!",
|
|
||||||
|
|
||||||
"ticketWarning":"The embed is in the message below!",
|
|
||||||
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
|
|
||||||
},
|
|
||||||
"helpMenu":{
|
|
||||||
"title":"Available Commands:",
|
|
||||||
"header1":"**¡Dirígete a {0} para crear un nuevo ticket!**\n\n",
|
|
||||||
"header2":"**¡Ejecuta el comando `/new` o `/ticket` para crear un ticket!**\n\n",
|
|
||||||
|
|
||||||
"msgCmd":"Generar un embed con botones. (Solo admins)",
|
|
||||||
"renameCmd":"Renombrar un ticket. (Sin espacios)",
|
|
||||||
"closeCmd":"Cerrar un ticket.",
|
|
||||||
"deleteCmd":"Eliminar un ticket.",
|
|
||||||
"addCmd":"Agregar un usuario al ticket.",
|
|
||||||
"removeCmd":"Eliminar un usuario del ticket.",
|
|
||||||
"reopenCmd":"Re-Abre un ticket después de que este se vea cerrado."
|
|
||||||
},
|
|
||||||
"buttons":{
|
|
||||||
"close":"Cerrar ticket.",
|
|
||||||
"delete":"Eliminar ticket",
|
|
||||||
"reopen":"Re-Abrir ticket",
|
|
||||||
"sendTranscript":"Obtener transcript."
|
|
||||||
},
|
|
||||||
"messages":{
|
|
||||||
"reopenTitle":"¡Ticket Re-Abierto!",
|
|
||||||
"reopenDescription":"¡Siéntete libre de hablar de nuevo!",
|
|
||||||
"closedTitle":"¡Ticket cerrado!",
|
|
||||||
"closedDescription":"¡Solo admins pueden hablar ahora en este ticket!\n\n*¡Presiona en el botón de abajo para eliminar o re-abrir el ticket!*",
|
|
||||||
"createdTitle":"¡Ticket creado!",
|
|
||||||
"createdDescription":"¡Ticket creado, también te he mencionado en él!",
|
|
||||||
|
|
||||||
"newTicketDmTitle":"¡Nuevo ticket!",
|
|
||||||
"closedTicketDmTitle":"¡Ticket cerrado!",
|
|
||||||
"deletedTicketDmTitle":"¡Ticket eliminado!",
|
|
||||||
"closedTicketDmDescription":"¡Tu ticket fué cerrado!",
|
|
||||||
"deletedTicketDmDescription":"¡Tu ticket fué eliminado!",
|
|
||||||
"reopenTicketDmTitle":"¡Ticket re-abierto!",
|
|
||||||
"reopenTicketDmDescription":"¡Tu ticket se vió abierto de nuevo!",
|
|
||||||
"newTranscriptTitle":"¡Un nuevo transcript está aquí!",
|
|
||||||
"hereIsTheTranscript":"Aquí está el transcript:",
|
|
||||||
|
|
||||||
"chooseCategory":"elije una categoría:",
|
|
||||||
"gettingdeleted":"El ticket se está viendo eliminado...",
|
|
||||||
|
|
||||||
"none":"none",
|
|
||||||
"reason":"reason"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,478 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION": {
|
||||||
|
"otversion": "v4.0.3",
|
||||||
|
"translators": ["palestinian"],
|
||||||
|
"lastedited": "06/12/2024",
|
||||||
|
"language": "Arabic",
|
||||||
|
"automated": false
|
||||||
|
},
|
||||||
|
"checker": {
|
||||||
|
"system": {
|
||||||
|
"typeError": "[خطأ]",
|
||||||
|
"headerOpenTicket": "فتح تذكرة",
|
||||||
|
"typeWarning": "[تحذير]",
|
||||||
|
"typeInfo": "[معلومات]",
|
||||||
|
"headerConfigChecker": "مدقق التكوين",
|
||||||
|
"headerDescription": "تحقق من الأخطاء في ملفات التكوين الخاصة بك!",
|
||||||
|
"footerError": "لن يبدأ البوت حتى يتم إصلاح جميع {0}!",
|
||||||
|
"footerWarning": "من المستحسن إصلاح جميع {0} قبل البدء!",
|
||||||
|
"footerSupport": "الدعم: {0} - الوثائق: {1}",
|
||||||
|
"compactInformation": "استخدم {0} لمزيد من المعلومات!",
|
||||||
|
"dataPath": "المسار",
|
||||||
|
"dataDocs": "الوثائق",
|
||||||
|
"dataMessages": "الرسالة"
|
||||||
|
},
|
||||||
|
"messages": {
|
||||||
|
"stringTooShort": "لا يمكن أن تكون هذه السلسلة أقصر من {0} حرفًا!",
|
||||||
|
"stringTooLong": "لا يمكن أن تكون هذه السلسلة أطول من {0} حرفًا!",
|
||||||
|
"stringLengthInvalid": "يجب أن تكون هذه السلسلة بطول {0} حرفًا!",
|
||||||
|
"stringStartsWith": "يجب أن تبدأ هذه السلسلة بـ {0}!",
|
||||||
|
"stringEndsWith": "يجب أن تنتهي هذه السلسلة بـ {0}!",
|
||||||
|
"stringContains": "يجب أن تحتوي هذه السلسلة على {0}!",
|
||||||
|
"stringChoices": "يمكن أن تكون هذه السلسلة واحدة فقط من القيم التالية: {0}!",
|
||||||
|
"stringRegex": "هذه السلسلة غير صالحة!",
|
||||||
|
|
||||||
|
"numberTooShort": "لا يمكن أن يكون هذا الرقم أقصر من {0} حرفًا!",
|
||||||
|
"numberTooLong": "لا يمكن أن يكون هذا الرقم أطول من {0} حرفًا!",
|
||||||
|
"numberLengthInvalid": "يجب أن يكون هذا الرقم بطول {0} حرفًا!",
|
||||||
|
"numberTooSmall": "يجب أن يكون هذا الرقم على الأقل {0}!",
|
||||||
|
"numberTooLarge": "يجب أن يكون هذا الرقم على الأكثر {0}!",
|
||||||
|
"numberNotEqual": "يجب أن يكون هذا الرقم {0}!",
|
||||||
|
"numberStep": "يجب أن يكون هذا الرقم مضاعفًا لـ {0}!",
|
||||||
|
"numberStepOffset": "يجب أن يكون هذا الرقم مضاعفًا لـ {0} بدءًا من {1}!",
|
||||||
|
"numberStartsWith": "يجب أن يبدأ هذا الرقم بـ {0}!",
|
||||||
|
"numberEndsWith": "يجب أن ينتهي هذا الرقم بـ {0}!",
|
||||||
|
"numberContains": "يجب أن يحتوي هذا الرقم على {0}!",
|
||||||
|
"numberChoices": "يمكن أن يكون هذا الرقم واحدًا فقط من القيم التالية: {0}!",
|
||||||
|
"numberFloat": "لا يمكن أن يكون هذا الرقم عددًا عشريًا!",
|
||||||
|
"numberNegative": "لا يمكن أن يكون هذا الرقم سالبًا!",
|
||||||
|
"numberPositive": "لا يمكن أن يكون هذا الرقم موجبًا!",
|
||||||
|
"numberZero": "لا يمكن أن يكون هذا الرقم صفرًا!",
|
||||||
|
|
||||||
|
"booleanTrue": "لا يمكن أن تكون هذه القيمة صحيحة!",
|
||||||
|
"booleanFalse": "لا يمكن أن تكون هذه القيمة خاطئة!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled": "لا يُسمح أن تكون هذه المصفوفة فارغة!",
|
||||||
|
"arrayEmptyRequired": "هذه المصفوفة مطلوبة أن تكون فارغة!",
|
||||||
|
"arrayTooShort": "يجب أن تحتوي هذه المصفوفة على طول لا يقل عن {0}!",
|
||||||
|
"arrayTooLong": "يجب أن تحتوي هذه المصفوفة على طول لا يزيد عن {0}!",
|
||||||
|
"arrayLengthInvalid": "يجب أن تحتوي هذه المصفوفة على طول {0}!",
|
||||||
|
"arrayInvalidTypes": "يمكن أن تحتوي هذه المصفوفة فقط على الأنواع التالية: {0}!",
|
||||||
|
"arrayDouble": "لا تسمح هذه المصفوفة بنفس القيمة مرتين!",
|
||||||
|
|
||||||
|
"discordInvalidId": "هذا هو معرف {0} غير صالح!",
|
||||||
|
"discordInvalidIdOptions": "هذا هو معرف {0} غير صالح! يمكنك أيضًا استخدام واحد من هؤلاء: {1}!",
|
||||||
|
"discordInvalidToken": "هذا هو رمز ديسكورد غير صالح (من الناحية التركيبية)!",
|
||||||
|
"colorInvalid": "هذا هو لون سداسي غير صالح!",
|
||||||
|
"emojiTooShort": "يجب أن تحتوي هذه السلسلة على ما لا يقل عن {0} رموز تعبيرية!",
|
||||||
|
"emojiTooLong": "يجب أن تحتوي هذه السلسلة على ما لا يزيد عن {0} رموز تعبيرية!",
|
||||||
|
"emojiCustom": "لا يمكن أن تكون هذه الرموز التعبيرية رمزًا مخصصًا لديسكورد!",
|
||||||
|
"emojiInvalid": "هذه الرموز التعبيرية غير صالحة!",
|
||||||
|
"urlInvalid": "هذا الرابط غير صالح!",
|
||||||
|
"urlInvalidHttp": "يمكن أن يستخدم هذا الرابط بروتوكول https:// فقط!",
|
||||||
|
"urlInvalidProtocol": "يمكن أن يستخدم هذا الرابط بروتوكولات http:// و https:// فقط!",
|
||||||
|
"urlInvalidHostname": "هذا الرابط يحتوي على اسم مضيف غير مسموح به!",
|
||||||
|
"urlInvalidExtension": "هذا الرابط يحتوي على امتداد غير صالح! اختر بين: {0}!",
|
||||||
|
"urlInvalidPath": "هذا الرابط يحتوي على مسار غير صالح!",
|
||||||
|
"idNotUnique": "هذا المعرف ليس فريدًا، استخدم معرفًا آخر بدلاً من ذلك!",
|
||||||
|
"idNonExistent": "المعرف {0} غير موجود!",
|
||||||
|
|
||||||
|
"invalidType": "تحتاج هذه الخاصية إلى أن تكون من النوع: {0}!",
|
||||||
|
"propertyMissing": "الخاصية {0} مفقودة من هذا الكائن!",
|
||||||
|
"propertyOptional": "الخاصية {0} اختيارية في هذا الكائن!",
|
||||||
|
"objectDisabled": "هذا الكائن معطل، قم بتمكينه باستخدام {0}!",
|
||||||
|
"nullInvalid": "لا يمكن أن تكون هذه الخاصية فارغة!",
|
||||||
|
"switchInvalidType": "يجب أن تكون واحدة من الأنواع التالية: {0}!",
|
||||||
|
"objectSwitchInvalid": "يجب أن يكون هذا الكائن واحدًا من الأنواع التالية: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage": "هذه لغة غير صالحة!",
|
||||||
|
"invalidButton": "يجب أن تحتوي هذه الزر على {0} أو {1} على الأقل!",
|
||||||
|
"unusedOption": "الخيار {0} غير مستخدم في أي مكان!",
|
||||||
|
"unusedQuestion": "السؤال {0} غير مستخدم في أي مكان!",
|
||||||
|
"dropdownOption": "يمكن أن تحتوي لوحة مع تمكين القائمة المنسدلة على خيارات من نوع 'تذكرة' فقط!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"buttons": {
|
||||||
|
"create": "زيارة التذكرة",
|
||||||
|
"close": "إغلاق التذكرة",
|
||||||
|
"delete": "حذف التذكرة",
|
||||||
|
"reopen": "إعادة فتح التذكرة",
|
||||||
|
"claim": "مطالبة بالتذكرة",
|
||||||
|
"unclaim": "إلغاء المطالبة بالتذكرة",
|
||||||
|
"pin": "تثبيت التذكرة",
|
||||||
|
"unpin": "إلغاء تثبيت التذكرة",
|
||||||
|
"clear": "حذف التذاكر",
|
||||||
|
"helpSwitchSlash": "عرض أوامر الشريحة",
|
||||||
|
"helpSwitchText": "عرض أوامر النص",
|
||||||
|
"helpPage": "صفحة {0}",
|
||||||
|
"withReason": "مع سبب",
|
||||||
|
"withoutTranscript": "بدون نص"
|
||||||
|
},
|
||||||
|
"titles": {
|
||||||
|
"created": "تم إنشاء التذكرة",
|
||||||
|
"close": "تم إغلاق التذكرة",
|
||||||
|
"delete": "تم حذف التذكرة",
|
||||||
|
"reopen": "تم إعادة فتح التذكرة",
|
||||||
|
"claim": "تم المطالبة بالتذكرة",
|
||||||
|
"unclaim": "تم إلغاء المطالبة بالتذكرة",
|
||||||
|
"pin": "تم تثبيت التذكرة",
|
||||||
|
"unpin": "تم إلغاء تثبيت التذكرة",
|
||||||
|
"rename": "تم إعادة تسمية التذكرة",
|
||||||
|
"move": "تم نقل التذكرة",
|
||||||
|
"add": "تم إضافة مستخدم إلى التذكرة",
|
||||||
|
"remove": "تم إزالة مستخدم من التذكرة",
|
||||||
|
|
||||||
|
"help": "الأوامر المتاحة",
|
||||||
|
"statsReset": "إعادة تعيين الإحصائيات",
|
||||||
|
"blacklistAdd": "تم حظر المستخدم",
|
||||||
|
"blacklistRemove": "تم الإفراج عن المستخدم",
|
||||||
|
"blacklistGet": "المستخدم المحظور",
|
||||||
|
"blacklistView": "القائمة السوداء الحالية",
|
||||||
|
"blacklistAddDm": "تمت إضافتك إلى القائمة السوداء",
|
||||||
|
"blacklistRemoveDm": "تمت إزالتك من القائمة السوداء",
|
||||||
|
"clear": "تم مسح التذاكر",
|
||||||
|
"roles": "تم تحديث الأدوار",
|
||||||
|
|
||||||
|
"autoclose": "تم إغلاق التذكرة تلقائيًا",
|
||||||
|
"autocloseEnabled": "تم تمكين الإغلاق التلقائي",
|
||||||
|
"autocloseDisabled": "تم تعطيل الإغلاق التلقائي",
|
||||||
|
"autodelete": "تم حذف التذكرة تلقائيًا",
|
||||||
|
"autodeleteEnabled": "تم تمكين الحذف التلقائي",
|
||||||
|
"autodeleteDisabled": "تم تعطيل الحذف التلقائي"
|
||||||
|
},
|
||||||
|
"descriptions": {
|
||||||
|
"create": "تم إنشاء تذكرتك. انقر على الزر أدناه للوصول إليها!",
|
||||||
|
"close": "تم إغلاق التذكرة بنجاح!",
|
||||||
|
"delete": "تم حذف التذكرة بنجاح!",
|
||||||
|
"reopen": "تم إعادة فتح التذكرة بنجاح!",
|
||||||
|
"claim": "تم المطالبة بالتذكرة بنجاح!",
|
||||||
|
"unclaim": "تم إلغاء المطالبة بالتذكرة بنجاح!",
|
||||||
|
"pin": "تم تثبيت التذكرة بنجاح!",
|
||||||
|
"unpin": "تم إلغاء تثبيت التذكرة بنجاح!",
|
||||||
|
"rename": "تم إعادة تسمية التذكرة إلى {0} بنجاح!",
|
||||||
|
"move": "تم نقل التذكرة إلى {0} بنجاح!",
|
||||||
|
"add": "{0} تم إضافته إلى التذكرة بنجاح!",
|
||||||
|
"remove": "{0} تم إزالته من التذكرة بنجاح!",
|
||||||
|
|
||||||
|
"helpExplanation": "`<name>` => معلمة مطلوبة\n`[name]` => معلمة اختيارية",
|
||||||
|
"statsReset": "تم إعادة تعيين إحصائيات البوت بنجاح!",
|
||||||
|
"statsError": "تعذر عرض إحصائيات التذكرة!\n{0} ليست تذكرة!",
|
||||||
|
"blacklistAdd": "{0} تم حظره بنجاح!",
|
||||||
|
"blacklistRemove": "{0} تم الإفراج عنه بنجاح!",
|
||||||
|
"blacklistGetSuccess": "{0} محظور حاليًا!",
|
||||||
|
"blacklistGetEmpty": "{0} غير محظور حاليًا!",
|
||||||
|
"blacklistViewEmpty": "لم يتم حظر أي شخص بعد!",
|
||||||
|
"blacklistViewTip": "استخدم \"/blacklist add\" لحظر مستخدم!",
|
||||||
|
"clearVerify": "هل أنت متأكد أنك تريد حذف عدة تذاكر؟\nلا يمكن التراجع عن هذا الإجراء!",
|
||||||
|
"clearReady": "{0} تذاكر تم حذفها بنجاح!",
|
||||||
|
"rolesEmpty": "لم يتم تحديث أي أدوار!",
|
||||||
|
|
||||||
|
"autocloseLeave": "تم إغلاق هذه التذكرة تلقائيًا لأن المنشئ غادر الخادم!",
|
||||||
|
"autocloseTimeout": "تم إغلاق هذه التذكرة تلقائيًا لأنها كانت غير نشطة لأكثر من `{0} ساعة`!",
|
||||||
|
"autodeleteLeave": "تم حذف هذه التذكرة تلقائيًا لأن المنشئ غادر الخادم!",
|
||||||
|
"autodeleteTimeout": "تم حذف هذه التذكرة تلقائيًا لأنها كانت غير نشطة لأكثر من `{0} يوم`!",
|
||||||
|
"autocloseEnabled": "تم تمكين الإغلاق التلقائي في هذه التذكرة!\nسيتم إغلاقها عندما تكون غير نشطة لأكثر من `{0} ساعة`!",
|
||||||
|
"autocloseDisabled": "تم تعطيل الإغلاق التلقائي في هذه التذكرة!\nلن يتم إغلاقها تلقائيًا بعد الآن!",
|
||||||
|
"autodeleteEnabled": "تم تمكين الحذف التلقائي في هذه التذكرة!\nسيتم حذفها عندما تكون غير نشطة لأكثر من `{0} يوم`!",
|
||||||
|
"autodeleteDisabled": "تم تعطيل الحذف التلقائي في هذه التذكرة!\nلن يتم حذفها تلقائيًا بعد الآن!",
|
||||||
|
|
||||||
|
"ticketMessageLimit": "يمكنك فقط إنشاء {0} تذكرة(ات) في نفس الوقت!",
|
||||||
|
"ticketMessageAutoclose": "ستغلق هذه التذكرة تلقائيًا عندما تكون غير نشطة لمدة {0} ساعة!",
|
||||||
|
"ticketMessageAutodelete": "ستحذف هذه التذكرة تلقائيًا عندما تكون غير نشطة لمدة {0} يوم!",
|
||||||
|
"panelReady": "يمكنك العثور على اللوحة أدناه!\nيمكن الآن حذف هذه الرسالة!"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"closePlaceholder": "لماذا أغلقت هذه التذكرة؟",
|
||||||
|
"deletePlaceholder": "لماذا حذفت هذه التذكرة؟",
|
||||||
|
"reopenPlaceholder": "لماذا أعادت فتح هذه التذكرة؟",
|
||||||
|
"claimPlaceholder": "لماذا طالبت بهذه التذكرة؟",
|
||||||
|
"unclaimPlaceholder": "لماذا ألغيت المطالبة بهذه التذكرة؟",
|
||||||
|
"pinPlaceholder": "لماذا ثبتت هذه التذكرة؟",
|
||||||
|
"unpinPlaceholder": "لماذا ألغيت تثبيت هذه التذكرة؟"
|
||||||
|
},
|
||||||
|
"logs": {
|
||||||
|
"createLog": "تم إنشاء تذكرة جديدة بواسطة {0}!",
|
||||||
|
"closeLog": "تم إغلاق هذه التذكرة بواسطة {0}!",
|
||||||
|
"closeDm": "تم إغلاق تذكرتك في خادمنا!",
|
||||||
|
"deleteLog": "تم حذف هذه التذكرة بواسطة {0}!",
|
||||||
|
"deleteDm": "تم حذف تذكرتك في خادمنا!",
|
||||||
|
"reopenLog": "تم إعادة فتح هذه التذكرة بواسطة {0}!",
|
||||||
|
"reopenDm": "تم إعادة فتح تذكرتك في خادمنا!",
|
||||||
|
"claimLog": "تم المطالبة بهذه التذكرة بواسطة {0}!",
|
||||||
|
"claimDm": "تم المطالبة بتذكرتك في خادمنا!",
|
||||||
|
"unclaimLog": "تم إلغاء المطالبة بهذه التذكرة بواسطة {0}!",
|
||||||
|
"unclaimDm": "تم إلغاء المطالبة بتذكرتك في خادمنا!",
|
||||||
|
"pinLog": "تم تثبيت هذه التذكرة بواسطة {0}!",
|
||||||
|
"pinDm": "تم تثبيت تذكرتك في خادمنا!",
|
||||||
|
"unpinLog": "تم إلغاء تثبيت هذه التذكرة بواسطة {0}!",
|
||||||
|
"unpinDm": "تم إلغاء تثبيت تذكرتك في خادمنا!",
|
||||||
|
"renameLog": "تم إعادة تسمية هذه التذكرة إلى {0} بواسطة {1}!",
|
||||||
|
"renameDm": "تمت إعادة تسمية تذكرتك إلى {0} في خادمنا!",
|
||||||
|
"moveLog": "تم نقل هذه التذكرة إلى {0} بواسطة {1}!",
|
||||||
|
"moveDm": "تم نقل تذكرتك إلى {0} في خادمنا!",
|
||||||
|
"addLog": "{0} تم إضافته إلى هذه التذكرة بواسطة {1}!",
|
||||||
|
"addDm": "{0} تم إضافته إلى تذكرتك في خادمنا!",
|
||||||
|
"removeLog": "{0} تم إزالته من هذه التذكرة بواسطة {1}!",
|
||||||
|
"removeDm": "{0} تم إزالته من تذكرتك في خادمنا!",
|
||||||
|
|
||||||
|
"blacklistAddLog": "{0} تم حظره بواسطة {1}!",
|
||||||
|
"blacklistRemoveLog": "{0} تم إزالته من القائمة السوداء بواسطة {1}!",
|
||||||
|
"blacklistAddDm": "لقد تم حظرك في خادمنا!\nمن الآن فصاعدًا، لا يمكنك إنشاء تذكرة!",
|
||||||
|
"blacklistRemoveDm": "تمت إزالتك من القائمة السوداء في خادمنا!\nالآن يمكنك إنشاء تذاكر مرة أخرى!",
|
||||||
|
"clearLog": "{0} تذاكر تم حذفها بواسطة {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts": {
|
||||||
|
"success": {
|
||||||
|
"visit": "زيارة النص",
|
||||||
|
"ready": "تم إنشاء النص",
|
||||||
|
"textFileDescription": "هذا هو النص النصي لتذكرة محذوفة!",
|
||||||
|
"htmlProgress": "يرجى الانتظار بينما يتم معالجة هذا النص html...",
|
||||||
|
|
||||||
|
"createdChannel": "تم إنشاء نص جديد من نوع {0} في الخادم!",
|
||||||
|
"createdCreator": "تم إنشاء نص جديد من نوع {0} لأحد تذاكرك!",
|
||||||
|
"createdParticipant": "تم إنشاء نص جديد من نوع {0} في إحدى التذاكر التي شاركت فيها!",
|
||||||
|
"createdActiveAdmin": "تم إنشاء نص جديد من نوع {0} في إحدى التذاكر التي كنت مشرفًا فيها!",
|
||||||
|
"createdEveryAdmin": "تم إنشاء نص جديد من نوع {0} في إحدى التذاكر التي كنت مشرفًا فيها!",
|
||||||
|
"createdOther": "تم إنشاء نص جديد من نوع {0}!"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"retry": "إعادة المحاولة",
|
||||||
|
"continue": "حذف بدون نص",
|
||||||
|
"backup": "إنشاء نص احتياطي",
|
||||||
|
"error": "حدث خطأ أثناء محاولة إنشاء النص.\nماذا تريد أن تفعل؟\n\nلن يتم حذف هذه التذكرة حتى تضغط على أحد هذه الأزرار."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"titles": {
|
||||||
|
"internalError": "خطأ داخلي",
|
||||||
|
"optionMissing": "خيار الأمر مفقود",
|
||||||
|
"optionInvalid": "خيار الأمر غير صالح",
|
||||||
|
"unknownCommand": "أمر غير معروف",
|
||||||
|
"noPermissions": "لا توجد أذونات",
|
||||||
|
"unknownTicket": "تذكرة غير معروفة",
|
||||||
|
"deprecatedTicket": "تذكرة قديمة",
|
||||||
|
"unknownOption": "خيار غير معروف",
|
||||||
|
"unknownPanel": "لوحة غير معروفة",
|
||||||
|
"notInGuild": "غير موجود في الخادم",
|
||||||
|
"channelRename": "غير قادر على إعادة تسمية القناة",
|
||||||
|
"busy": "التذكرة مشغولة"
|
||||||
|
},
|
||||||
|
"descriptions": {
|
||||||
|
"askForInfo": "اتصل بمالك هذا البوت لمزيد من المعلومات!",
|
||||||
|
"askForInfoResolve": "اتصل بمالك هذا البوت إذا لم تحل هذه المشكلة بعد عدة محاولات.",
|
||||||
|
"internalError": "فشل في الاستجابة لهذا {0} بسبب خطأ داخلي!",
|
||||||
|
"optionMissing": "معلمة مطلوبة مفقودة في هذا الأمر!",
|
||||||
|
"optionInvalid": "معلمة في هذا الأمر غير صالحة!",
|
||||||
|
"optionInvalidChoose": "اختر بين",
|
||||||
|
"unknownCommand": "حاول زيارة قائمة المساعدة لمزيد من المعلومات!",
|
||||||
|
"noPermissions": "ليس لديك إذن لاستخدام هذا {0}!",
|
||||||
|
"noPermissionsList": "الأذونات المطلوبة: (واحد منها)",
|
||||||
|
"noPermissionsCooldown": "ليس لديك إذن لاستخدام هذا {0} لأن لديك فترة انتظار!",
|
||||||
|
"noPermissionsBlacklist": "ليس لديك إذن لاستخدام هذا {0} لأنك محظور!",
|
||||||
|
"noPermissionsLimitGlobal": "ليس لديك إذن لإنشاء تذكرة لأن الخادم وصل إلى الحد الأقصى من التذاكر!",
|
||||||
|
"noPermissionsLimitGlobalUser ": "ليس لديك إذن لإنشاء تذكرة لأنك وصلت إلى الحد الأقصى من التذاكر!",
|
||||||
|
"noPermissionsLimitOption": "ليس لديك إذن لإنشاء تذكرة لأن الخادم وصل إلى الحد الأقصى من التذاكر لهذا الخيار!",
|
||||||
|
"noPermissionsLimitOptionUser ": "ليس لديك إذن لإنشاء تذكرة لأنك وصلت إلى الحد الأقصى من التذاكر لهذا الخيار!",
|
||||||
|
"unknownTicket": "حاول هذا الأمر مرة أخرى في تذكرة صالحة!",
|
||||||
|
"deprecatedTicket": "القناة الحالية ليست تذكرة صالحة! قد تكون تذكرة من إصدار قديم من Open Ticket!",
|
||||||
|
"notInGuild": "هذا {0} لا يعمل في DM! يرجى المحاولة مرة أخرى في خادم!",
|
||||||
|
"channelRename": "بسبب حدود معدل ديسكورد، من المستحيل حاليًا على البوت إعادة تسمية القناة. سيتم إعادة تسمية القناة تلقائيًا بعد 10 دقائق إذا لم يتم إعادة تشغيل البوت.",
|
||||||
|
"channelRenameSource": "مصدر هذا الخطأ هو: {0}",
|
||||||
|
"busy": "غير قادر على استخدام هذا {0}!\nالتذكرة قيد المعالجة حاليًا بواسطة البوت.\n\nيرجى المحاولة مرة أخرى بعد بضع ثوانٍ!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons": {
|
||||||
|
"stringRegex": "القيمة لا تتطابق مع النمط!",
|
||||||
|
"stringMinLength": "تحتاج القيمة إلى أن تكون على الأقل {0} حرفًا!",
|
||||||
|
"stringMaxLength": "تحتاج القيمة إلى أن تكون على الأكثر {0} حرفًا!",
|
||||||
|
"numberInvalid": "رقم غير صالح!",
|
||||||
|
"numberMin": "يحتاج الرقم إلى أن يكون على الأقل {0}!",
|
||||||
|
"numberMax": "يحتاج الرقم إلى أن يكون على الأكثر {0}!",
|
||||||
|
"numberDecimal": "الرقم غير مسموح به كعدد عشري!",
|
||||||
|
"numberNegative": "الرقم غير مسموح به كعدد سالب!",
|
||||||
|
"numberPositive": "الرقم غير مسموح به كعدد موجب!",
|
||||||
|
"numberZero": "الرقم غير مسموح به كعدد صفر!",
|
||||||
|
"channelNotFound": "غير قادر على العثور على القناة!",
|
||||||
|
"userNotFound": "غير قادر على العثور على المستخدم!",
|
||||||
|
"roleNotFound": "غير قادر على العثور على الدور!",
|
||||||
|
"memberNotFound": "غير قادر على العثور على المستخدم!",
|
||||||
|
"mentionableNotFound": "غير قادر على العثور على مستخدم أو دور!",
|
||||||
|
"channelType": "نوع القناة غير صالح!",
|
||||||
|
"notInGuild": "يتطلب هذا الخيار أن تكون في خادم!"
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"developer": "تحتاج إلى أن تكون مطور البوت.",
|
||||||
|
"owner": "تحتاج إلى أن تكون مالك الخادم.",
|
||||||
|
"admin": "تحتاج إلى أن تكون مشرف الخادم.",
|
||||||
|
"moderator": "تحتاج إلى أن تكون مشرفًا.",
|
||||||
|
"support": "تحتاج إلى أن تكون في فريق الدعم.",
|
||||||
|
"member": "تحتاج إلى أن تكون عضوًا.",
|
||||||
|
"discord-administrator": "تحتاج إلى الحصول على إذن `ADMINISTRATOR`."
|
||||||
|
},
|
||||||
|
"actionInvalid": {
|
||||||
|
"close": "التذكرة مغلقة بالفعل!",
|
||||||
|
"reopen": "التذكرة لم تُغلق بعد!",
|
||||||
|
"claim": "التذكرة مُطالبة بالفعل!",
|
||||||
|
"unclaim": "التذكرة لم تُطالب بعد!",
|
||||||
|
"pin": "التذكرة مثبتة بالفعل!",
|
||||||
|
"unpin": "التذكرة لم تُثبت بعد!",
|
||||||
|
"add": "هذا المستخدم لديه بالفعل إمكانية الوصول إلى التذكرة!",
|
||||||
|
"remove": "غير قادر على إزالة هذا المستخدم من التذكرة!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"uppercase": {
|
||||||
|
"ticket": "تذكرة",
|
||||||
|
"tickets": "تذاكر",
|
||||||
|
"reason": "سبب",
|
||||||
|
"creator": "المنشئ",
|
||||||
|
"remaining": "الوقت المتبقي",
|
||||||
|
"added": "تمت الإضافة",
|
||||||
|
"removed": "تمت الإزالة",
|
||||||
|
"filter": "تصفية",
|
||||||
|
"claimedBy": "مطالب بها من قبل {0}",
|
||||||
|
"method": "طريقة",
|
||||||
|
"type": "نوع",
|
||||||
|
"blacklisted": "محظور",
|
||||||
|
"panel": "لوحة",
|
||||||
|
"command": "أمر",
|
||||||
|
"system": "نظام",
|
||||||
|
"true": "صحيح",
|
||||||
|
"false": "خطأ",
|
||||||
|
"syntax": "بناء الجملة",
|
||||||
|
"originalName": "الاسم الأصلي",
|
||||||
|
"newName": "الاسم الجديد",
|
||||||
|
"until": "حتى",
|
||||||
|
"validOptions": "خيارات صالحة",
|
||||||
|
"validPanels": "لوحات صالحة",
|
||||||
|
"autoclose": "إغلاق تلقائي",
|
||||||
|
"autodelete": "حذف تلقائي",
|
||||||
|
"startupDate": "تاريخ بدء التشغيل",
|
||||||
|
"version": "إصدار",
|
||||||
|
"name": "اسم",
|
||||||
|
"role": "دور",
|
||||||
|
"status": "حالة",
|
||||||
|
"claimed": "مطالب بها",
|
||||||
|
"pinned": "مثبتة",
|
||||||
|
"creationDate": "تاريخ الإنشاء"
|
||||||
|
},
|
||||||
|
"lowercase": {
|
||||||
|
"text": "نص",
|
||||||
|
"html": "html",
|
||||||
|
"command": "أمر",
|
||||||
|
"modal": "نموذج",
|
||||||
|
"button": "زر",
|
||||||
|
"dropdown": "قائمة منسدلة",
|
||||||
|
"method": "طريقة"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands": {
|
||||||
|
"reason": "حدد سببًا اختياريًا سيكون مرئيًا في السجلات.",
|
||||||
|
"help": "احصل على قائمة بجميع الأوامر المتاحة.",
|
||||||
|
"panel": "قم بإنشاء رسالة مع قائمة منسدلة أو أزرار (لإنشاء تذكرة).",
|
||||||
|
"panelId": "معرف اللوحة التي تريد إنشائها.",
|
||||||
|
"panelAutoUpdate": "هل تريد أن يتم تحديث هذه اللوحة تلقائيًا عند تعديلها؟",
|
||||||
|
"ticket": "قم بإنشاء تذكرة على الفور.",
|
||||||
|
"ticketId": "معرف التذكرة التي تريد إنشائها.",
|
||||||
|
"close": "أغلق تذكرة.",
|
||||||
|
"delete": "احذف تذكرة.",
|
||||||
|
"deleteNoTranscript": "احذف هذه التذكرة دون إنشاء نص.",
|
||||||
|
"reopen": "أعد فتح تذكرة.",
|
||||||
|
"claim": "اطلب تذكرة.",
|
||||||
|
"claimUser ": "اطلب هذه التذكرة لشخص آخر بدلاً من نفسك.",
|
||||||
|
"unclaim": "ألغِ مطالبة بتذكرة.",
|
||||||
|
"pin": "ثبّت تذكرة.",
|
||||||
|
"unpin": "ألغِ تثبيت تذكرة.",
|
||||||
|
"move": "انقل تذكرة.",
|
||||||
|
"moveId": "معرف الخيار الذي تريد الانتقال إليه.",
|
||||||
|
"rename": "أعد تسمية تذكرة.",
|
||||||
|
"renameName": "الاسم الجديد لهذه التذكرة.",
|
||||||
|
"add": "أضف مستخدمًا إلى تذكرة.",
|
||||||
|
"addUser ": "المستخدم الذي تريد إضافته.",
|
||||||
|
"remove": "إزالة مستخدم من تذكرة.",
|
||||||
|
"removeUser ": "المستخدم الذي تريد إزالته.",
|
||||||
|
"blacklist": "إدارة القائمة السوداء للتذاكر.",
|
||||||
|
"blacklistView": "عرض قائمة بالمستخدمين المحظورين حاليًا.",
|
||||||
|
"blacklistAdd": "إضافة مستخدم إلى القائمة السوداء.",
|
||||||
|
"blacklistRemove": "إزالة مستخدم من القائمة السوداء.",
|
||||||
|
"blacklistGet": "احصل على تفاصيل من مستخدم محظور.",
|
||||||
|
"blacklistGetUser ": "المستخدم الذي تريد الحصول على تفاصيل منه.",
|
||||||
|
"stats": "عرض إحصائيات من البوت، أو عضو، أو تذكرة.",
|
||||||
|
"statsReset": "إعادة تعيين جميع إحصائيات البوت (والبدء من الصفر).",
|
||||||
|
"statsGlobal": "عرض الإحصائيات العالمية.",
|
||||||
|
"statsUser ": "عرض إحصائيات مستخدم في الخادم.",
|
||||||
|
"statsUser User": "المستخدم الذي تريد عرض إحصائياته.",
|
||||||
|
"statsTicket": "عرض إحصائيات تذكرة في الخادم.",
|
||||||
|
"statsTicketTicket": "التذكرة التي تريد عرض إحصائياتها.",
|
||||||
|
"clear": "احذف عدة تذاكر في نفس الوقت.",
|
||||||
|
"clearFilter": "الفلتر لحذف التذاكر.",
|
||||||
|
"clearFilters": {
|
||||||
|
"all": "الكل",
|
||||||
|
"open": "مفتوحة",
|
||||||
|
"close": "مغلقة",
|
||||||
|
"claim": "مطالب بها",
|
||||||
|
"unclaim": "غير مطلوبة",
|
||||||
|
"pin": "مثبتة",
|
||||||
|
"unpin": "غير مثبتة",
|
||||||
|
"autoclose": "مغلقة تلقائيًا"
|
||||||
|
},
|
||||||
|
"autoclose": "إدارة الإغلاق التلقائي في تذكرة.",
|
||||||
|
"autocloseDisable": "تعطيل الإغلاق التلقائي في هذه التذكرة.",
|
||||||
|
"autocloseEnable": "تمكين الإغلاق التلقائي في هذه التذكرة.",
|
||||||
|
"autocloseEnableTime": "عدد الساعات التي تحتاجها هذه التذكرة لتكون غير نشطة لإغلاقها.",
|
||||||
|
"autodelete": "إدارة الحذف التلقائي في تذكرة.",
|
||||||
|
"autodeleteDisable": "تعطيل الحذف التلقائي في هذه التذكرة.",
|
||||||
|
"autodeleteEnable": "تمكين الحذف التلقائي في هذه التذكرة.",
|
||||||
|
"autodeleteEnableTime": "عدد الأيام التي تحتاجها هذه التذكرة لتكون غير نشطة لحذفها."
|
||||||
|
},
|
||||||
|
"helpMenu": {
|
||||||
|
"help": "احصل على قائمة بجميع الأوامر المتاحة.",
|
||||||
|
"ticket": "قم بإنشاء تذكرة على الفور.",
|
||||||
|
"close": "أغلق تذكرة، هذا يعطل الكتابة في هذه القناة.",
|
||||||
|
"delete": "احذف تذكرة، هذا ينشئ نصًا عند تمكينه.",
|
||||||
|
"reopen": "أعد فتح تذكرة، هذا يمكّن الكتابة في هذه القناة مرة أخرى.",
|
||||||
|
"pin": "ثبّت تذكرة. سيؤدي ذلك إلى نقل التذكرة إلى الأعلى وإضافة رمز '📌' إلى الاسم.",
|
||||||
|
"unpin": "ألغِ تثبيت تذكرة. ستبقى التذكرة في مكانها ولكن ستفقد رمز '📌'.",
|
||||||
|
"move": "انقل تذكرة. سيؤدي ذلك إلى تغيير نوع هذه التذكرة.",
|
||||||
|
"rename": "أعد تسمية تذكرة. سيؤدي ذلك إلى تغيير اسم القناة لهذه التذكرة.",
|
||||||
|
"claim": "اطلب تذكرة. باستخدام هذا، يمكنك إبلاغ فريقك أنك تتعامل مع هذه التذكرة.",
|
||||||
|
"unclaim": "ألغِ مطالبة بتذكرة. باستخدام هذا، يمكنك إبلاغ فريقك أن هذه التذكرة متاحة مرة أخرى.",
|
||||||
|
"add": "أضف مستخدمًا إلى تذكرة. سيسمح ذلك للمستخدم بقراءة وكتابة في هذه التذكرة.",
|
||||||
|
"remove": "إزالة مستخدم من تذكرة. سيؤدي ذلك إلى إزالة القدرة على القراءة والكتابة لمستخدم في هذه التذكرة.",
|
||||||
|
"panel": "قم بإنشاء رسالة مع قائمة منسدلة أو أزرار (لإنشاء تذكرة).",
|
||||||
|
"blacklistView": "عرض قائمة بالمستخدمين المحظورين حاليًا.",
|
||||||
|
"blacklistAdd": "إضافة مستخدم إلى القائمة السوداء.",
|
||||||
|
"blacklistRemove": "إزالة مستخدم من القائمة السوداء.",
|
||||||
|
"blacklistGet": "احصل على تفاصيل من مستخدم محظور.",
|
||||||
|
"statsGlobal": "عرض الإحصائيات العالمية.",
|
||||||
|
"statsTicket": "عرض إحصائيات تذكرة في الخادم.",
|
||||||
|
"statsUser ": "عرض إحصائيات مستخدم في الخادم.",
|
||||||
|
"statsReset": "إعادة تعيين جميع إحصائيات البوت (والبدء من الصفر).",
|
||||||
|
"autocloseDisable": "تعطيل الإغلاق التلقائي في هذه التذكرة.",
|
||||||
|
"autocloseEnable": "تمكين الإغلاق التلقائي في هذه الت ذكرة.",
|
||||||
|
"autodeleteDisable": "تعطيل الحذف التلقائي في هذه التذكرة.",
|
||||||
|
"autodeleteEnable": "تمكين الحذف التلقائي في هذه التذكرة."
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"scopes": {
|
||||||
|
"global": "إحصائيات عالمية",
|
||||||
|
"system": "إحصائيات النظام",
|
||||||
|
"user": "إحصائيات المستخدم",
|
||||||
|
"ticket": "إحصائيات التذكرة",
|
||||||
|
"participants": "المشاركون"
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"ticketsCreated": "التذاكر التي تم إنشاؤها",
|
||||||
|
"ticketsClosed": "التذاكر المغلقة",
|
||||||
|
"ticketsDeleted": "التذاكر المحذوفة",
|
||||||
|
"ticketsReopened": "التذاكر المعاد فتحها",
|
||||||
|
"ticketsAutoclosed": "التذاكر المغلقة تلقائيًا",
|
||||||
|
"ticketsClaimed": "التذاكر المطالب بها",
|
||||||
|
"ticketsPinned": "التذاكر المثبتة",
|
||||||
|
"ticketsMoved": "التذاكر المنقولة",
|
||||||
|
"usersBlacklisted": "المستخدمون المحظورون",
|
||||||
|
"transcriptsCreated": "النصوص التي تم إنشاؤها"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,478 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.3",
|
||||||
|
"translators":["guillee3"],
|
||||||
|
"lastedited":"21/08/2024",
|
||||||
|
"language":"Catalan",
|
||||||
|
"automated":false
|
||||||
|
},
|
||||||
|
"checker":{
|
||||||
|
"system":{
|
||||||
|
"typeError":"[ERROR]",
|
||||||
|
"headerOpenTicket":"OPEN TICKET",
|
||||||
|
"typeWarning":"[AVÍS]",
|
||||||
|
"typeInfo":"[INFO]",
|
||||||
|
"headerConfigChecker":"VERIFICADOR DE CONFIGURACIÓ",
|
||||||
|
"headerDescription":"comprova si existeixen errors als teus fitxers de configuració!",
|
||||||
|
"footerError":"el bot no s'iniciarà fins que tots els {0} es solucionin!",
|
||||||
|
"footerWarning":"es recomana solucionar tots els {0} abans de començar!",
|
||||||
|
"footerSupport":"SUPORT: {0} - DOCUMENTACIÓ: {1}",
|
||||||
|
"compactInformation":"utilitza {0} per obtenir més informació!",
|
||||||
|
"dataPath":"ruta",
|
||||||
|
"dataDocs":"documents",
|
||||||
|
"dataMessages":"missatge"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"stringTooShort":"Aquesta cadena no pot tenir menys de {0} caràcters!",
|
||||||
|
"stringTooLong":"Aquesta cadena no pot tenir més de {0} caràcters!",
|
||||||
|
"stringLengthInvalid":"Aquesta cadena ha de tenir {0} caràcters!",
|
||||||
|
"stringStartsWith":"Aquesta cadena ha de començar amb {0}!",
|
||||||
|
"stringEndsWith":"Aquesta cadena ha d'acabar amb {0}!",
|
||||||
|
"stringContains":"Aquesta cadena ha de contenir {0}!",
|
||||||
|
"stringChoices":"Aquesta cadena només pot ser un dels valors següents: {0}!",
|
||||||
|
"stringRegex":"Aquesta cadena és invàlida!",
|
||||||
|
|
||||||
|
"numberTooShort":"Aquest nombre no pot tenir menys de {0} caràcters!",
|
||||||
|
"numberTooLong":"Aquest nombre no pot tenir més de {0} caràcters!",
|
||||||
|
"numberLengthInvalid":"Aquest nombre ha de tenir {0} caràcters!",
|
||||||
|
"numberTooSmall":"Aquest nombre ha de ser almenys {0}!",
|
||||||
|
"numberTooLarge":"Aquest nombre ha de ser com a màxim {0}!",
|
||||||
|
"numberNotEqual":"Aquest nombre ha de ser {0}!",
|
||||||
|
"numberStep":"Aquest nombre ha de ser un múltiple de {0}!",
|
||||||
|
"numberStepOffset":"Aquest nombre ha de ser un múltiple de {0} començant amb {1}!",
|
||||||
|
"numberStartsWith":"Aquest nombre ha de començar amb {0}!",
|
||||||
|
"numberEndsWith":"Aquest nombre ha d'acabar amb {0}!",
|
||||||
|
"numberContains":"Aquest nombre ha de contenir {0}!",
|
||||||
|
"numberChoices":"Aquest nombre només pot ser un dels valors següents: {0}!",
|
||||||
|
"numberFloat":"Aquest nombre no pot ser un decimal!",
|
||||||
|
"numberNegative":"Aquest nombre no pot ser negatiu!",
|
||||||
|
"numberPositive":"Aquest nombre no pot ser positiu!",
|
||||||
|
"numberZero":"Aquest nombre no pot ser zero!",
|
||||||
|
|
||||||
|
"booleanTrue":"Aquest booleà no pot ser veritable!",
|
||||||
|
"booleanFalse":"Aquest booleà no pot ser fals!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled":"Aquest array no pot estar buit!",
|
||||||
|
"arrayEmptyRequired":"Aquest array ha d'estar buit!",
|
||||||
|
"arrayTooShort":"Aquest array ha de tenir una longitud d'almenys {0}!",
|
||||||
|
"arrayTooLong":"Aquest array ha de tenir una longitud màxima de {0}!",
|
||||||
|
"arrayLengthInvalid":"Aquest array ha de tenir una longitud de {0}!",
|
||||||
|
"arrayInvalidTypes":"Aquest array només pot contenir els tipus següents: {0}!",
|
||||||
|
"arrayDouble":"Aquest array no permet el mateix valor dues vegades!",
|
||||||
|
|
||||||
|
"discordInvalidId":"Aquest és un id de {0} de discord invàlid!",
|
||||||
|
"discordInvalidIdOptions":"Aquest és un id de {0} de discord invàlid! També en pots utilitzar un d'aquests: {1}!",
|
||||||
|
"discordInvalidToken":"Aquest és un token de discord invàlid (sintàcticament)!",
|
||||||
|
"colorInvalid":"Aquest és un color hex invàlid!",
|
||||||
|
"emojiTooShort":"Aquesta cadena ha de tenir almenys {0} emojis!",
|
||||||
|
"emojiTooLong":"Aquesta cadena ha de tenir com a màxim {0} emojis!",
|
||||||
|
"emojiCustom":"Aquest emoji no pot ser un emoji personalitzat de discord!",
|
||||||
|
"emojiInvalid":"Aquest és un emoji invàlid!",
|
||||||
|
"urlInvalid":"Aquesta url és invàlida!",
|
||||||
|
"urlInvalidHttp":"Aquesta url només pot utilitzar el protocol https://!",
|
||||||
|
"urlInvalidProtocol":"Aquesta url només pot utilitzar els protocols http:// i https://!",
|
||||||
|
"urlInvalidHostname":"Aquesta url té un nom de domini no permès!",
|
||||||
|
"urlInvalidExtension":"Aquesta url té una extensió invàlida! Tria entre: {0}!",
|
||||||
|
"urlInvalidPath":"Aquesta url té un camí invàlid!",
|
||||||
|
"idNotUnique":"Aquest id no és únic, utilitza un altre id!",
|
||||||
|
"idNonExistent":"L'id {0} no existeix!",
|
||||||
|
|
||||||
|
"invalidType":"Aquesta propietat ha de ser del tipus: {0}!",
|
||||||
|
"propertyMissing":"La propietat {0} falta en aquest objecte!",
|
||||||
|
"propertyOptional":"La propietat {0} és opcional en aquest objecte!",
|
||||||
|
"objectDisabled":"Aquest objecte està desactivat, activa'l utilitzant {0}!",
|
||||||
|
"nullInvalid":"Aquesta propietat no pot ser nul·la!",
|
||||||
|
"switchInvalidType":"Això ha de ser d'un dels tipus següents: {0}!",
|
||||||
|
"objectSwitchInvalid":"Aquest objecte ha de ser d'un dels tipus següents: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage":"Aquest és un idioma invàlid!",
|
||||||
|
"invalidButton":"Aquest botó ha de tenir almenys un {0} o {1}!",
|
||||||
|
"unusedOption":"L'opció {0} no s'utilitza enlloc!",
|
||||||
|
"unusedQuestion":"La pregunta {0} no s'utilitza enlloc!",
|
||||||
|
"dropdownOption":"Un panell amb desplegable activat només pot contenir opcions del tipus 'ticket'!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions":{
|
||||||
|
"buttons":{
|
||||||
|
"create":"Veure Ticket",
|
||||||
|
"close":"Tancar Ticket",
|
||||||
|
"delete":"Eliminar Ticket",
|
||||||
|
"reopen":"Reobrir Ticket",
|
||||||
|
"claim":"Reclamar Ticket",
|
||||||
|
"unclaim":"Alliberar Ticket",
|
||||||
|
"pin":"Fixar Ticket",
|
||||||
|
"unpin":"Desfixar Ticket",
|
||||||
|
"clear":"Eliminar Tickets",
|
||||||
|
"helpSwitchSlash":"Veure Comandes Slash",
|
||||||
|
"helpSwitchText":"Veure Comandes de Text",
|
||||||
|
"helpPage":"Pàgina {0}",
|
||||||
|
"withReason":"Amb Motiu",
|
||||||
|
"withoutTranscript":"Sense Transcripció"
|
||||||
|
},
|
||||||
|
"titles":{
|
||||||
|
"created":"Ticket Creat",
|
||||||
|
"close":"Ticket Tancat",
|
||||||
|
"delete":"Ticket Eliminat",
|
||||||
|
"reopen":"Ticket Reobert",
|
||||||
|
"claim":"Ticket Reclamat",
|
||||||
|
"unclaim":"Ticket Alliberat",
|
||||||
|
"pin":"Ticket Fixat",
|
||||||
|
"unpin":"Ticket Desfixat",
|
||||||
|
"rename":"Ticket Renomenat",
|
||||||
|
"move":"Ticket Mogut",
|
||||||
|
"add":"Usuari Afegit al Ticket",
|
||||||
|
"remove":"Usuari Eliminat del Ticket",
|
||||||
|
|
||||||
|
"help":"Comandes Disponibles",
|
||||||
|
"statsReset":"Restablir Estadístiques",
|
||||||
|
"blacklistAdd":"Usuari a la Llista Negra",
|
||||||
|
"blacklistRemove":"Usuari Alliberat",
|
||||||
|
"blacklistGet":"Usuari a la Llista Negra",
|
||||||
|
"blacklistView":"Llista Negra Actual",
|
||||||
|
"blacklistAddDm":"Afegit a la Llista Negra",
|
||||||
|
"blacklistRemoveDm":"Eliminat de la Llista Negra",
|
||||||
|
"clear":"Tickets Netejats",
|
||||||
|
"roles":"Rols Actualitzats",
|
||||||
|
|
||||||
|
"autoclose":"Ticket Tancat Automàticament",
|
||||||
|
"autocloseEnabled":"Tancament Automàtic Activat",
|
||||||
|
"autocloseDisabled":"Tancament Automàtic Desactivat",
|
||||||
|
"autodelete":"Ticket Eliminat Automàticament",
|
||||||
|
"autodeleteEnabled":"Eliminació Automàtica Activada",
|
||||||
|
"autodeleteDisabled":"Eliminació Automàtica Desactivada"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"create":"El teu ticket ha estat creat. Fes clic al botó a continuació per accedir-hi!",
|
||||||
|
"close":"El ticket ha estat tancat amb èxit!",
|
||||||
|
"delete":"El ticket ha estat eliminat amb èxit!",
|
||||||
|
"reopen":"El ticket ha estat reobert amb èxit!",
|
||||||
|
"claim":"El ticket ha estat reclamat amb èxit!",
|
||||||
|
"unclaim":"El ticket ha estat alliberat amb èxit!",
|
||||||
|
"pin":"El ticket ha estat fixat amb èxit!",
|
||||||
|
"unpin":"El ticket ha estat desfixat amb èxit!",
|
||||||
|
"rename":"El ticket ha estat renomenat a {0} amb èxit!",
|
||||||
|
"move":"El ticket ha estat mogut a {0} amb èxit!",
|
||||||
|
"add":"{0} ha estat afegit al ticket amb èxit!",
|
||||||
|
"remove":"{0} ha estat eliminat del ticket amb èxit!",
|
||||||
|
|
||||||
|
"helpExplanation":"`<nom>` => paràmetre requerit\n`[nom]` => paràmetre opcional",
|
||||||
|
"statsReset":"Les estadístiques del bot s'han restablert correctament!",
|
||||||
|
"statsError":"No es poden veure les estadístiques del ticket!\n{0} no és un ticket!",
|
||||||
|
"blacklistAdd":"{0} ha estat afegit a la llista negra amb èxit!",
|
||||||
|
"blacklistRemove":"{0} ha estat alliberat amb èxit!",
|
||||||
|
"blacklistGetSuccess":"{0} està actualment a la llista negra!",
|
||||||
|
"blacklistGetEmpty":"{0} actualment no està a la llista negra!",
|
||||||
|
"blacklistViewEmpty":"Encara no hi ha ningú a la llista negra!",
|
||||||
|
"blacklistViewTip":"Utilitza \"/blacklist add\" per afegir un usuari a la llista negra!",
|
||||||
|
"clearVerify":"Estàs segur que vols eliminar múltiples tickets?\nAquesta acció no es pot desfer!",
|
||||||
|
"clearReady":"{0} tickets han estat eliminats amb èxit!",
|
||||||
|
"rolesEmpty":"No s'han actualitzat rols!",
|
||||||
|
|
||||||
|
"autocloseLeave":"Aquest ticket ha estat tancat automàticament perquè el creador ha abandonat el servidor!",
|
||||||
|
"autocloseTimeout":"Aquest ticket ha estat tancat automàticament perquè ha estat inactiu durant més de `{0}h`!",
|
||||||
|
"autodeleteLeave":"Aquest ticket ha estat eliminat automàticament perquè el creador ha abandonat el servidor!",
|
||||||
|
"autodeleteTimeout":"Aquest ticket ha estat eliminat automàticament perquè ha estat inactiu durant més de `{0} dies`!",
|
||||||
|
"autocloseEnabled":"El tancament automàtic ha estat activat en aquest ticket!\nEs tancarà quan estigui inactiu durant més de `{0}h`!",
|
||||||
|
"autocloseDisabled":"El tancament automàtic ha estat desactivat en aquest ticket!\nJa no es tancarà automàticament!",
|
||||||
|
"autodeleteEnabled":"L'eliminació automàtica ha estat activada en aquest ticket!\nS'eliminarà quan estigui inactiu durant més de `{0} dies`!",
|
||||||
|
"autodeleteDisabled":"L'eliminació automàtica ha estat desactivada en aquest ticket!\nJa no s'eliminarà automàticament!",
|
||||||
|
|
||||||
|
"ticketMessageLimit":"Només pots crear {0} ticket(s) al mateix temps!",
|
||||||
|
"ticketMessageAutoclose":"Aquest ticket es tancarà automàticament quan estigui inactiu durant {0}h!",
|
||||||
|
"ticketMessageAutodelete":"Aquest ticket es eliminarà automàticament quan estigui inactiu durant {0} dies!",
|
||||||
|
"panelReady":"Pots trobar el panell a continuació!\nAquest missatge ara es pot eliminar!"
|
||||||
|
},
|
||||||
|
"modal":{
|
||||||
|
"closePlaceholder":"Per què has tancat aquest ticket?",
|
||||||
|
"deletePlaceholder":"Per què has eliminat aquest ticket?",
|
||||||
|
"reopenPlaceholder":"Per què has reobert aquest ticket?",
|
||||||
|
"claimPlaceholder":"Per què has reclamat aquest ticket?",
|
||||||
|
"unclaimPlaceholder":"Per què has alliberat aquest ticket?",
|
||||||
|
"pinPlaceholder":"Per què has fixat aquest ticket?",
|
||||||
|
"unpinPlaceholder":"Per què has desfixat aquest ticket?"
|
||||||
|
},
|
||||||
|
"logs":{
|
||||||
|
"createLog":"Un nou ticket ha estat creat per {0}!",
|
||||||
|
"closeLog":"Aquest ticket ha estat tancat per {0}!",
|
||||||
|
"closeDm":"El teu ticket ha estat tancat al nostre servidor!",
|
||||||
|
"deleteLog":"Aquest ticket ha estat eliminat per {0}!",
|
||||||
|
"deleteDm":"El teu ticket ha estat eliminat al nostre servidor!",
|
||||||
|
"reopenLog":"Aquest ticket ha estat reobert per {0}!",
|
||||||
|
"reopenDm":"El teu ticket ha estat reobert al nostre servidor!",
|
||||||
|
"claimLog":"Aquest ticket ha estat reclamat per {0}!",
|
||||||
|
"claimDm":"El teu ticket ha estat reclamat al nostre servidor!",
|
||||||
|
"unclaimLog":"Aquest ticket ha estat alliberat per {0}!",
|
||||||
|
"unclaimDm":"El teu ticket ha estat alliberat al nostre servidor!",
|
||||||
|
"pinLog":"Aquest ticket ha estat fixat per {0}!",
|
||||||
|
"pinDm":"El teu ticket ha estat fixat al nostre servidor!",
|
||||||
|
"unpinLog":"Aquest ticket ha estat desfixat per {0}!",
|
||||||
|
"unpinDm":"El teu ticket ha estat desfixat al nostre servidor!",
|
||||||
|
"renameLog":"Aquest ticket ha estat renombrat a {0} per {1}!",
|
||||||
|
"renameDm":"El teu ticket ha estat renombrat a {0} al nostre servidor!",
|
||||||
|
"moveLog":"Aquest ticket ha estat mogut a {0} per {1}!",
|
||||||
|
"moveDm":"El teu ticket ha estat mogut a {0} al nostre servidor!",
|
||||||
|
"addLog":"{0} ha estat afegit a aquest ticket per {1}!",
|
||||||
|
"addDm":"{0} ha estat afegit al teu ticket al nostre servidor!",
|
||||||
|
"removeLog":"{0} ha estat eliminat d'aquest ticket per {1}!",
|
||||||
|
"removeDm":"{0} ha estat eliminat del teu ticket al nostre servidor!",
|
||||||
|
|
||||||
|
"blacklistAddLog":"{0} ha estat afegit a la llista negra per {1}!",
|
||||||
|
"blacklistRemoveLog":"{0} ha estat eliminat de la llista negra per {1}!",
|
||||||
|
"blacklistAddDm":"Has estat afegit a la llista negra al nostre servidor!\nA partir d'ara, no pots crear cap ticket!",
|
||||||
|
"blacklistRemoveDm":"Has estat eliminat de la llista negra al nostre servidor!\nAra pots crear tickets de nou!",
|
||||||
|
"clearLog":"{0} tickets han estat eliminats per {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"success":{
|
||||||
|
"visit":"Veure Transcripció",
|
||||||
|
"ready":"Transcripció Creada",
|
||||||
|
"textFileDescription":"Aquesta és la transcripció de text d'un ticket eliminat!",
|
||||||
|
"htmlProgress":"Si us plau, espera mentre aquesta transcripció html es processa...",
|
||||||
|
|
||||||
|
"createdChannel":"S'ha creat una nova transcripció tipus {0} al servidor!",
|
||||||
|
"createdCreator":"S'ha creat una nova transcripció tipus {0} per un dels teus tickets!",
|
||||||
|
"createdParticipant":"S'ha creat una nova transcripció tipus {0} en un dels tickets on has participat!",
|
||||||
|
"createdActiveAdmin":"S'ha creat una nova transcripció tipus {0} en un dels tickets on has participat com a administrador!",
|
||||||
|
"createdEveryAdmin":"S'ha creat una nova transcripció tipus {0} en un dels tickets on eres administrador!",
|
||||||
|
"createdOther":"S'ha creat una nova transcripció tipus {0}!"
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"retry":"Torna-ho a intentar",
|
||||||
|
"continue":"Elimina Sense Transcripció",
|
||||||
|
"backup":"Crea Transcripció de Backup",
|
||||||
|
"error":"Alguna cosa ha anat malament mentre intentàvem crear la transcripció.\nQuè t'agradaria fer?\n\nAquest ticket no s'eliminarà fins que facis clic en un d'aquests botons."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"titles":{
|
||||||
|
"internalError":"Error Intern",
|
||||||
|
"optionMissing":"Opció de Comanda Absent",
|
||||||
|
"optionInvalid":"Opció de Comanda Invàlida",
|
||||||
|
"unknownCommand":"Comanda Desconeguda",
|
||||||
|
"noPermissions":"No Tens Permisos",
|
||||||
|
"unknownTicket":"Ticket Desconegut",
|
||||||
|
"deprecatedTicket":"Ticket Obsolet",
|
||||||
|
"unknownOption":"Opció Desconeguda",
|
||||||
|
"unknownPanel":"Panell Desconegut",
|
||||||
|
"notInGuild":"No Ets Al Servidor",
|
||||||
|
"channelRename":"No Es Pot Canviar El Nom Del Canal",
|
||||||
|
"busy":"El Ticket Està Ocupat"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"askForInfo":"Contacta amb el propietari d'aquest bot per obtenir més informació!",
|
||||||
|
"askForInfoResolve":"Contacta amb el propietari del bot si aquest problema no es resol després de diversos intents.",
|
||||||
|
"internalError":"No s'ha pogut respondre a aquest {0} a causa d'un error intern!",
|
||||||
|
"optionMissing":"Falta un paràmetre requerit en aquesta comanda!",
|
||||||
|
"optionInvalid":"Un paràmetre d'aquesta comanda és invàlid!",
|
||||||
|
"optionInvalidChoose":"Tria entre",
|
||||||
|
"unknownCommand":"Prova de visitar el menú d'ajuda per obtenir més informació!",
|
||||||
|
"noPermissions":"No tens permís per utilitzar aquest {0}!",
|
||||||
|
"noPermissionsList":"Permisos Requerits: (un d'ells)",
|
||||||
|
"noPermissionsCooldown":"No tens permís per utilitzar aquest {0} perquè tens un temps de refredament!",
|
||||||
|
"noPermissionsBlacklist":"No tens permís per utilitzar aquest {0} perquè estàs a la llista negra!",
|
||||||
|
"noPermissionsLimitGlobal":"No tens permís per crear un ticket perquè el servidor ha arribat al límit màxim de tickets!",
|
||||||
|
"noPermissionsLimitGlobalUser":"No tens permís per crear un ticket perquè has arribat al límit màxim de tickets!",
|
||||||
|
"noPermissionsLimitOption":"No tens permís per crear un ticket perquè el servidor ha arribat al límit màxim de tickets per aquesta opció!",
|
||||||
|
"noPermissionsLimitOptionUser":"No tens permís per crear un ticket perquè has arribat al límit màxim de tickets per aquesta opció!",
|
||||||
|
"unknownTicket":"Torna a intentar aquesta comanda en un ticket vàlid!",
|
||||||
|
"deprecatedTicket":"El canal actual no és un ticket vàlid! Pot ser que fos un ticket d'una versió antiga de Open Ticket!",
|
||||||
|
"notInGuild":"Aquest {0} no funciona en DM! Si us plau, torna a intentar-ho en un servidor!",
|
||||||
|
"channelRename":"Degut a les limitacions de discord, actualment és impossible per al bot canviar el nom del canal. El canal es canviarà automàticament en 10 minuts si el bot no es reinicia.",
|
||||||
|
"channelRenameSource":"La font d'aquest error és: {0}",
|
||||||
|
"busy":"No es pot utilitzar aquest {0}!\nEl ticket està sent processat pel bot.\n\nSi us plau, torna a intentar-ho en uns segons!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons":{
|
||||||
|
"stringRegex":"El valor no coincideix amb el patró!",
|
||||||
|
"stringMinLength":"El valor ha de tenir almenys {0} caràcters!",
|
||||||
|
"stringMaxLength":"El valor ha de tenir com a màxim {0} caràcters!",
|
||||||
|
"numberInvalid":"Nombre invàlid!",
|
||||||
|
"numberMin":"El nombre ha de ser almenys {0}!",
|
||||||
|
"numberMax":"El nombre ha de ser com a màxim {0}!",
|
||||||
|
"numberDecimal":"El nombre no pot ser decimal!",
|
||||||
|
"numberNegative":"El nombre no pot ser negatiu!",
|
||||||
|
"numberPositive":"El nombre no pot ser positiu!",
|
||||||
|
"numberZero":"El nombre no pot ser zero!",
|
||||||
|
"channelNotFound":"No es pot trobar el canal!",
|
||||||
|
"userNotFound":"No es pot trobar l'usuari!",
|
||||||
|
"roleNotFound":"No es pot trobar el rol!",
|
||||||
|
"memberNotFound":"No es pot trobar l'usuari!",
|
||||||
|
"mentionableNotFound":"No es pot trobar l'usuari o el rol!",
|
||||||
|
"channelType":"Tipus de canal invàlid!",
|
||||||
|
"notInGuild":"Aquesta opció requereix que siguis en un servidor!"
|
||||||
|
},
|
||||||
|
"permissions":{
|
||||||
|
"developer":"Has de ser el desenvolupador del bot.",
|
||||||
|
"owner":"Has de ser el propietari del servidor.",
|
||||||
|
"admin":"Has de ser un administrador del servidor.",
|
||||||
|
"moderator":"Has de ser un moderador.",
|
||||||
|
"support":"Has de formar part de l'equip de suport.",
|
||||||
|
"member":"Has de ser un membre.",
|
||||||
|
"discord-administrator":"Has de tenir el permís `ADMINISTRADOR`."
|
||||||
|
},
|
||||||
|
"actionInvalid":{
|
||||||
|
"close":"El ticket ja està tancat!",
|
||||||
|
"reopen":"El ticket encara no està tancat!",
|
||||||
|
"claim":"El ticket ja està reclamat!",
|
||||||
|
"unclaim":"El ticket encara no està reclamat!",
|
||||||
|
"pin":"El ticket ja està fixat!",
|
||||||
|
"unpin":"El ticket encara no està fixat!",
|
||||||
|
"add":"Aquest usuari ja té accés al ticket!",
|
||||||
|
"remove":"No es pot eliminar aquest usuari del ticket!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"uppercase":{
|
||||||
|
"ticket":"Ticket",
|
||||||
|
"tickets":"Tickets",
|
||||||
|
"reason":"Motiu",
|
||||||
|
"creator":"Creador",
|
||||||
|
"remaining":"Temps Restant",
|
||||||
|
"added":"Afegit",
|
||||||
|
"removed":"Eliminat",
|
||||||
|
"filter":"Filtre",
|
||||||
|
"claimedBy":"Reclamat Per {0}",
|
||||||
|
"method":"Mètode",
|
||||||
|
"type":"Tipus",
|
||||||
|
"blacklisted":"Llista Negra",
|
||||||
|
"panel":"Panell",
|
||||||
|
"command":"Comanda",
|
||||||
|
"system":"Sistema",
|
||||||
|
"true":"Cert",
|
||||||
|
"false":"Fals",
|
||||||
|
"syntax":"Sintaxi",
|
||||||
|
"originalName":"Nom Original",
|
||||||
|
"newName":"Nom Nou",
|
||||||
|
"until":"Fins a",
|
||||||
|
"validOptions":"Opcions Vàlides",
|
||||||
|
"validPanels":"Panells Vàlids",
|
||||||
|
"autoclose":"Tancament Automàtic",
|
||||||
|
"autodelete":"Eliminació Automàtica",
|
||||||
|
"startupDate":"Data d'Inici",
|
||||||
|
"version":"Versió",
|
||||||
|
"name":"Nom",
|
||||||
|
"role":"Rol",
|
||||||
|
"status":"Estat",
|
||||||
|
"claimed":"Reclamat",
|
||||||
|
"pinned":"Fixat",
|
||||||
|
"creationDate":"Data de Creació"
|
||||||
|
},
|
||||||
|
"lowercase":{
|
||||||
|
"text":"text",
|
||||||
|
"html":"html",
|
||||||
|
"command":"comanda",
|
||||||
|
"modal":"modal",
|
||||||
|
"button":"botó",
|
||||||
|
"dropdown":"desplegable",
|
||||||
|
"method":"mètode"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"reason":"Especifica una raó opcional que serà visible als registres.",
|
||||||
|
"help":"Obtingues una llista de totes les comandes disponibles.",
|
||||||
|
"panel":"Genera un missatge amb un desplegable o botons (per a la creació de tickets).",
|
||||||
|
"panelId":"L'identificador del panell que vols generar.",
|
||||||
|
"panelAutoUpdate":"Vols que aquest panell s'actualitzi automàticament quan s'edita?",
|
||||||
|
"ticket":"Crea instantàniament un ticket.",
|
||||||
|
"ticketId":"L'identificador del ticket que vols crear.",
|
||||||
|
"close":"Tanca un ticket.",
|
||||||
|
"delete":"Elimina un ticket.",
|
||||||
|
"deleteNoTranscript":"Elimina aquest ticket sense crear una transcripció.",
|
||||||
|
"reopen":"Reobre un ticket.",
|
||||||
|
"claim":"Reclama un ticket.",
|
||||||
|
"claimUser":"Reclama aquest ticket per a una altra persona en lloc de tu mateix.",
|
||||||
|
"unclaim":"Allibera un ticket.",
|
||||||
|
"pin":"Fixa un ticket.",
|
||||||
|
"unpin":"Desfixa un ticket.",
|
||||||
|
"move":"Mou un ticket.",
|
||||||
|
"moveId":"L'identificador de l'opció a la qual vols moure't.",
|
||||||
|
"rename":"Renomena un ticket.",
|
||||||
|
"renameName":"El nou nom per aquest ticket.",
|
||||||
|
"add":"Afegeix un usuari a un ticket.",
|
||||||
|
"addUser":"L'usuari a afegir.",
|
||||||
|
"remove":"Elimina un usuari d'un ticket.",
|
||||||
|
"removeUser":"L'usuari a eliminar.",
|
||||||
|
"blacklist":"Gestiona la llista negra de tickets.",
|
||||||
|
"blacklistView":"Veure una llista de l'actual llista negra.",
|
||||||
|
"blacklistAdd":"Afegeix un usuari a la llista negra.",
|
||||||
|
"blacklistRemove":"Elimina un usuari de la llista negra.",
|
||||||
|
"blacklistGet":"Obtingues els detalls d'un usuari a la llista negra.",
|
||||||
|
"blacklistGetUser":"L'usuari dels qual vols obtenir detalls.",
|
||||||
|
"stats":"Veure estadístiques del bot, d'un membre o d'un ticket.",
|
||||||
|
"statsReset":"Restablir totes les estadístiques del bot (i començar a comptar des de zero).",
|
||||||
|
"statsGlobal":"Veure les estadístiques globals.",
|
||||||
|
"statsUser":"Veure les estadístiques d'un usuari al servidor.",
|
||||||
|
"statsUserUser":"L'usuari del qual vols veure les estadístiques.",
|
||||||
|
"statsTicket":"Veure les estadístiques d'un ticket al servidor.",
|
||||||
|
"statsTicketTicket":"El ticket que vols veure.",
|
||||||
|
"clear":"Elimina múltiples tickets al mateix temps.",
|
||||||
|
"clearFilter":"El filtre per a la neteja de tickets.",
|
||||||
|
"clearFilters":{
|
||||||
|
"all":"Tots",
|
||||||
|
"open":"Oberts",
|
||||||
|
"close":"Tancats",
|
||||||
|
"claim":"Reclamats",
|
||||||
|
"unclaim":"Alliberats",
|
||||||
|
"pin":"Fixats",
|
||||||
|
"unpin":"Desfixats",
|
||||||
|
"autoclose":"Tancat Automàticaments"
|
||||||
|
},
|
||||||
|
"autoclose":"Gestiona el tancament automàtic en un ticket.",
|
||||||
|
"autocloseDisable":"Desactiva el tancament automàtic en aquest ticket.",
|
||||||
|
"autocloseEnable":"Activa el tancament automàtic en aquest ticket.",
|
||||||
|
"autocloseEnableTime":"La quantitat d'hores que aquest ticket ha d'estar inactiu per tancar-lo.",
|
||||||
|
"autodelete":"Gestiona l'eliminació automàtica en un ticket.",
|
||||||
|
"autodeleteDisable":"Desactiva l'eliminació automàtica en aquest ticket.",
|
||||||
|
"autodeleteEnable":"Activa l'eliminació automàtica en aquest ticket.",
|
||||||
|
"autodeleteEnableTime":"La quantitat de dies que aquest ticket ha d'estar inactiu per eliminar-lo."
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"help":"Obtingues una llista de totes les comandes disponibles.",
|
||||||
|
"ticket":"Crea instantàniament un ticket.",
|
||||||
|
"close":"Tanca un ticket, això desactiva l'escriptura en aquest canal.",
|
||||||
|
"delete":"Elimina un ticket, això crea una transcripció quan està activat.",
|
||||||
|
"reopen":"Reobre un ticket, això permet escriure de nou en aquest canal.",
|
||||||
|
"pin":"Fixar un ticket. Això mou el ticket a la part superior i afegeix un emoji '📌' al nom.",
|
||||||
|
"unpin":"Desfixar un ticket. El ticket romandrà a la seva posició però perdrà l'emoji '📌'.",
|
||||||
|
"move":"Mou un ticket. Això canvia el tipus d'aquest ticket.",
|
||||||
|
"rename":"Renomena un ticket. Això canvia el nom del canal d'aquest ticket.",
|
||||||
|
"claim":"Reclama un ticket. Amb això, pots fer saber al teu equip que estàs gestionant aquest ticket.",
|
||||||
|
"unclaim":"Allibera un ticket. Amb això, pots fer saber al teu equip que aquest ticket està lliure de nou.",
|
||||||
|
"add":"Afegeix un usuari a un ticket. Això permetrà a l'usuari llegir i escriure en aquest ticket.",
|
||||||
|
"remove":"Elimina un usuari d'un ticket. Això eliminarà la capacitat de llegir i escriure per a un usuari en aquest ticket.",
|
||||||
|
"panel":"Genera un missatge amb un desplegable o botons (per a la creació de tickets).",
|
||||||
|
"blacklistView":"Veure una la llista negra actual.",
|
||||||
|
"blacklistAdd":"Afegeix un usuari a la llista negra.",
|
||||||
|
"blacklistRemove":"Elimina un usuari de la llista negra.",
|
||||||
|
"blacklistGet":"Obtingues els detalls d'un usuari de la llista negra.",
|
||||||
|
"statsGlobal":"Veure les estadístiques globals.",
|
||||||
|
"statsTicket":"Veure les estadístiques d'un ticket al servidor.",
|
||||||
|
"statsUser":"Veure les estadístiques d'un usuari al servidor.",
|
||||||
|
"statsReset":"Restablir totes les estadístiques del bot (i començar a comptar des de zero).",
|
||||||
|
"autocloseDisable":"Desactiva el tancament automàtic en aquest ticket.",
|
||||||
|
"autocloseEnable":"Activa el tancament automàtic en aquest ticket.",
|
||||||
|
"autodeleteDisable":"Desactiva l'eliminació automàtica en aquest ticket.",
|
||||||
|
"autodeleteEnable":"Activa l'eliminació automàtica en aquest ticket."
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"scopes":{
|
||||||
|
"global":"Estadístiques Globals",
|
||||||
|
"system":"Estadístiques del Sistema",
|
||||||
|
"user":"Estadístiques d'Usuari",
|
||||||
|
"ticket":"Estadístiques de Ticket",
|
||||||
|
"participants":"Participants"
|
||||||
|
},
|
||||||
|
"properties":{
|
||||||
|
"ticketsCreated":"Tickets Creats",
|
||||||
|
"ticketsClosed":"Tickets Tancats",
|
||||||
|
"ticketsDeleted":"Tickets Eliminats",
|
||||||
|
"ticketsReopened":"Tickets Reoberts",
|
||||||
|
"ticketsAutoclosed":"Tickets Tancats Automàticament",
|
||||||
|
"ticketsClaimed":"Tickets Reclamats",
|
||||||
|
"ticketsPinned":"Tickets Fixats",
|
||||||
|
"ticketsMoved":"Tickets Moguts",
|
||||||
|
"usersBlacklisted":"Usuaris a la Llista Negra",
|
||||||
|
"transcriptsCreated":"Transcripcions Creades"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,478 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.3",
|
||||||
|
"translators":["DJj123dj"],
|
||||||
|
"lastedited":"21/08/2024",
|
||||||
|
"language":"Custom",
|
||||||
|
"automated":false
|
||||||
|
},
|
||||||
|
"checker":{
|
||||||
|
"system":{
|
||||||
|
"typeError":"[ERROR]",
|
||||||
|
"headerOpenTicket":"OPEN TICKET",
|
||||||
|
"typeWarning":"[WARNING]",
|
||||||
|
"typeInfo":"[INFO]",
|
||||||
|
"headerConfigChecker":"CONFIG CHECKER",
|
||||||
|
"headerDescription":"check for errors in your config files!",
|
||||||
|
"footerError":"the bot won't start until all {0}'s are fixed!",
|
||||||
|
"footerWarning":"it's recommended to fix all {0}'s before starting!",
|
||||||
|
"footerSupport":"SUPPORT: {0} - DOCS: {1}",
|
||||||
|
"compactInformation":"use {0} for more information!",
|
||||||
|
"dataPath":"path",
|
||||||
|
"dataDocs":"docs",
|
||||||
|
"dataMessages":"message"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"stringTooShort":"This string can't be shorter than {0} characters!",
|
||||||
|
"stringTooLong":"This string can't be longer than {0} characters!",
|
||||||
|
"stringLengthInvalid":"This string needs to be {0} characters long!",
|
||||||
|
"stringStartsWith":"This string needs to start with {0}!",
|
||||||
|
"stringEndsWith":"This string needs to end with {0}!",
|
||||||
|
"stringContains":"This string needs to contain {0}!",
|
||||||
|
"stringChoices":"This string can only be one of the following values: {0}!",
|
||||||
|
"stringRegex":"This string is invalid!",
|
||||||
|
|
||||||
|
"numberTooShort":"This number can't be shorter than {0} characters!",
|
||||||
|
"numberTooLong":"This number can't be longer than {0} characters!",
|
||||||
|
"numberLengthInvalid":"This number needs to be {0} characters long!",
|
||||||
|
"numberTooSmall":"This number needs to be at least {0}!",
|
||||||
|
"numberTooLarge":"This number needs to be at most {0}!",
|
||||||
|
"numberNotEqual":"This number needs to be {0}!",
|
||||||
|
"numberStep":"This number needs to be a multiple of {0}!",
|
||||||
|
"numberStepOffset":"This number needs to be a multiple of {0} starting with {1}!",
|
||||||
|
"numberStartsWith":"This number needs to start with {0}!",
|
||||||
|
"numberEndsWith":"This number needs to end with {0}!",
|
||||||
|
"numberContains":"This number needs to contain {0}!",
|
||||||
|
"numberChoices":"This number can only be one of the following values: {0}!",
|
||||||
|
"numberFloat":"This number can't be a decimal!",
|
||||||
|
"numberNegative":"This number can't be negative!",
|
||||||
|
"numberPositive":"This number can't be positive!",
|
||||||
|
"numberZero":"This number can't be zero!",
|
||||||
|
|
||||||
|
"booleanTrue":"This boolean can't be true!",
|
||||||
|
"booleanFalse":"This boolean can't be false!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled":"This array isn't allowed to be empty!",
|
||||||
|
"arrayEmptyRequired":"This array is required to be empty!",
|
||||||
|
"arrayTooShort":"This array needs to have a length of at least {0}!",
|
||||||
|
"arrayTooLong":"This array needs to have a length of at most {0}!",
|
||||||
|
"arrayLengthInvalid":"This array needs to have a length of {0}!",
|
||||||
|
"arrayInvalidTypes":"This array can only contain the following types: {0}!",
|
||||||
|
"arrayDouble":"This array doesn't allow the same value twice!",
|
||||||
|
|
||||||
|
"discordInvalidId":"This is an invalid discord {0} id!",
|
||||||
|
"discordInvalidIdOptions":"This is an invalid discord {0} id! You can also use one of these: {1}!",
|
||||||
|
"discordInvalidToken":"This is an invalid discord token (syntactically)!",
|
||||||
|
"colorInvalid":"This is an invalid hex color!",
|
||||||
|
"emojiTooShort":"This string needs to have at least {0} emoji's!",
|
||||||
|
"emojiTooLong":"This string needs to have at most {0} emoji's!",
|
||||||
|
"emojiCustom":"This emoji can't be a custom discord emoji!",
|
||||||
|
"emojiInvalid":"This is an invalid emoji!",
|
||||||
|
"urlInvalid":"This url is invalid!",
|
||||||
|
"urlInvalidHttp":"This url can only use the https:// protocol!",
|
||||||
|
"urlInvalidProtocol":"This url can only use the http:// & https:// protocols!",
|
||||||
|
"urlInvalidHostname":"This url has a disallowed hostname!",
|
||||||
|
"urlInvalidExtension":"This url has an invalid extension! Choose between: {0}!",
|
||||||
|
"urlInvalidPath":"This url has an invalid path!",
|
||||||
|
"idNotUnique":"This id isn't unique, use another id instead!",
|
||||||
|
"idNonExistent":"The id {0} doesn't exist!",
|
||||||
|
|
||||||
|
"invalidType":"This property needs to be the type: {0}!",
|
||||||
|
"propertyMissing":"The property {0} is missing from this object!",
|
||||||
|
"propertyOptional":"The property {0} is optional in this object!",
|
||||||
|
"objectDisabled":"This object is disabled, enable it using {0}!",
|
||||||
|
"nullInvalid":"This property can't be null!",
|
||||||
|
"switchInvalidType":"This needs to be one of the following types: {0}!",
|
||||||
|
"objectSwitchInvalid":"This object needs to be one of the following types: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage":"This is an invalid language!",
|
||||||
|
"invalidButton":"This button needs to have at least an {0} or {1}!",
|
||||||
|
"unusedOption":"The option {0} isn't used anywhere!",
|
||||||
|
"unusedQuestion":"The question {0} isn't used anywhere!",
|
||||||
|
"dropdownOption":"A panel with dropdown enabled can only contain options of the 'ticket' type!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions":{
|
||||||
|
"buttons":{
|
||||||
|
"create":"Visit Ticket",
|
||||||
|
"close":"Close Ticket",
|
||||||
|
"delete":"Delete Ticket",
|
||||||
|
"reopen":"Reopen Ticket",
|
||||||
|
"claim":"Claim Ticket",
|
||||||
|
"unclaim":"Unclaim Ticket",
|
||||||
|
"pin":"Pin Ticket",
|
||||||
|
"unpin":"Unpin Ticket",
|
||||||
|
"clear":"Delete Tickets",
|
||||||
|
"helpSwitchSlash":"View Slash Commands",
|
||||||
|
"helpSwitchText":"View Text Commands",
|
||||||
|
"helpPage":"Page {0}",
|
||||||
|
"withReason":"With Reason",
|
||||||
|
"withoutTranscript":"Without Transcript"
|
||||||
|
},
|
||||||
|
"titles":{
|
||||||
|
"created":"Ticket Created",
|
||||||
|
"close":"Ticket Closed",
|
||||||
|
"delete":"Ticket Deleted",
|
||||||
|
"reopen":"Ticket Reopened",
|
||||||
|
"claim":"Ticket Claimed",
|
||||||
|
"unclaim":"Ticket Unclaimed",
|
||||||
|
"pin":"Ticket Pinned",
|
||||||
|
"unpin":"Ticket Unpinned",
|
||||||
|
"rename":"Ticket Renamed",
|
||||||
|
"move":"Ticket Moved",
|
||||||
|
"add":"Ticket User Added",
|
||||||
|
"remove":"Ticket User Removed",
|
||||||
|
|
||||||
|
"help":"Available Commands",
|
||||||
|
"statsReset":"Reset Stats",
|
||||||
|
"blacklistAdd":"User Blacklisted",
|
||||||
|
"blacklistRemove":"User Released",
|
||||||
|
"blacklistGet":"Blacklisted User",
|
||||||
|
"blacklistView":"Current Blacklist",
|
||||||
|
"blacklistAddDm":"Added To Blacklist",
|
||||||
|
"blacklistRemoveDm":"Removed From Blacklist",
|
||||||
|
"clear":"Tickets Cleared",
|
||||||
|
"roles":"Roles Updated",
|
||||||
|
|
||||||
|
"autoclose":"Ticket Autoclosed",
|
||||||
|
"autocloseEnabled":"Autoclose Enabled",
|
||||||
|
"autocloseDisabled":"Autoclose Disabled",
|
||||||
|
"autodelete":"Ticket Autodeleted",
|
||||||
|
"autodeleteEnabled":"Autodelete Enabled",
|
||||||
|
"autodeleteDisabled":"Autodelete Disabled"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"create":"Your ticket has been created. Click the button below to access it!",
|
||||||
|
"close":"The ticket has been closed successfully!",
|
||||||
|
"delete":"The ticket has been deleted successfully!",
|
||||||
|
"reopen":"The ticket has been reopened successfully!",
|
||||||
|
"claim":"The ticket has been claimed successfully!",
|
||||||
|
"unclaim":"The ticket has been unclaimed successfully!",
|
||||||
|
"pin":"The ticket has been pinned successfully!",
|
||||||
|
"unpin":"The ticket has been unpinned successfully!",
|
||||||
|
"rename":"The ticket has been renamed to {0} successfully!",
|
||||||
|
"move":"The ticket has been moved to {0} successfully!",
|
||||||
|
"add":"{0} has been added to the ticket successfully!",
|
||||||
|
"remove":"{0} has been removed from the ticket successfully!",
|
||||||
|
|
||||||
|
"helpExplanation":"`<name>` => required parameter\n`[name]` => optional parameter",
|
||||||
|
"statsReset":"The bot stats have been reset successfully!",
|
||||||
|
"statsError":"Unable to view ticket stats!\n{0} is not a ticket!",
|
||||||
|
"blacklistAdd":"{0} has been blacklisted successfully!",
|
||||||
|
"blacklistRemove":"{0} has been released successfully!",
|
||||||
|
"blacklistGetSuccess":"{0} is currently blacklisted!",
|
||||||
|
"blacklistGetEmpty":"{0} is currently not blacklisted!",
|
||||||
|
"blacklistViewEmpty":"No-one has been blacklisted yet!",
|
||||||
|
"blacklistViewTip":"Use \"/blacklist add\" to blacklist a user!",
|
||||||
|
"clearVerify":"Are you sure you want to delete multiple tickets?\nThis action can't be undone!",
|
||||||
|
"clearReady":"{0} tickets have been deleted successfully!",
|
||||||
|
"rolesEmpty":"No roles have been updated!",
|
||||||
|
|
||||||
|
"autocloseLeave":"This ticket has been autoclosed because the creator left the server!",
|
||||||
|
"autocloseTimeout":"This ticket has been autoclosed because it has been inactive for more than `{0}h`!",
|
||||||
|
"autodeleteLeave":"This ticket has been autodeleted because the creator left the server!",
|
||||||
|
"autodeleteTimeout":"This ticket has been autodeleted because it has been inactive for more than `{0} days`!",
|
||||||
|
"autocloseEnabled":"Autoclose has been enabled in this ticket!\nIt will be closed when it is inactive for more than `{0}h`!",
|
||||||
|
"autocloseDisabled":"Autoclose has been disabled in this ticket!\nIt won't be closed automatically anymore!",
|
||||||
|
"autodeleteEnabled":"Autodelete has been enabled in this ticket!\nIt will be deleted when it is inactive for more than `{0} days`!",
|
||||||
|
"autodeleteDisabled":"Autodelete has been disabled in this ticket!\nIt won't be deleted automatically anymore!",
|
||||||
|
|
||||||
|
"ticketMessageLimit":"You can only create {0} ticket(s) at the same time!",
|
||||||
|
"ticketMessageAutoclose":"This ticket will be autoclosed when inactive for {0}h!",
|
||||||
|
"ticketMessageAutodelete":"This ticket will be autodeleted when inactive for {0} days!",
|
||||||
|
"panelReady":"You can find the panel below!\nThis message can now be deleted!"
|
||||||
|
},
|
||||||
|
"modal":{
|
||||||
|
"closePlaceholder":"Why did you close this ticket?",
|
||||||
|
"deletePlaceholder":"Why did you delete this ticket?",
|
||||||
|
"reopenPlaceholder":"Why did you reopen this ticket?",
|
||||||
|
"claimPlaceholder":"Why did you claim this ticket?",
|
||||||
|
"unclaimPlaceholder":"Why did you unclaim this ticket?",
|
||||||
|
"pinPlaceholder":"Why did you pin this ticket?",
|
||||||
|
"unpinPlaceholder":"Why did you unpin this ticket?"
|
||||||
|
},
|
||||||
|
"logs":{
|
||||||
|
"createLog":"A new ticket got created by {0}!",
|
||||||
|
"closeLog":"This ticket has been closed by {0}!",
|
||||||
|
"closeDm":"Your ticket has been closed in our server!",
|
||||||
|
"deleteLog":"This ticket has been deleted by {0}!",
|
||||||
|
"deleteDm":"Your ticket has been deleted in our server!",
|
||||||
|
"reopenLog":"This ticket has been reopened by {0}!",
|
||||||
|
"reopenDm":"Your ticket has been reopened in our server!",
|
||||||
|
"claimLog":"This ticket has been claimed by {0}!",
|
||||||
|
"claimDm":"Your ticket has been claimed in our server!",
|
||||||
|
"unclaimLog":"This ticket has been unclaimed by {0}!",
|
||||||
|
"unclaimDm":"Your ticket has been unclaimed in our server!",
|
||||||
|
"pinLog":"This ticket has been pinned by {0}!",
|
||||||
|
"pinDm":"Your ticket has been pinned in our server!",
|
||||||
|
"unpinLog":"This ticket has been unpinned by {0}!",
|
||||||
|
"unpinDm":"Your ticket has been unpinned in our server!",
|
||||||
|
"renameLog":"This ticket has been renamed to {0} by {1}!",
|
||||||
|
"renameDm":"Your ticket has been renamed to {0} in our server!",
|
||||||
|
"moveLog":"This ticket has been moved to {0} by {1}!",
|
||||||
|
"moveDm":"Your ticket has been moved to {0} in our server!",
|
||||||
|
"addLog":"{0} has been added to this ticket by {1}!",
|
||||||
|
"addDm":"{0} has been added to your ticket in our server!",
|
||||||
|
"removeLog":"{0} has been removed from this ticket by {1}!",
|
||||||
|
"removeDm":"{0} has been removed from your ticket in our server!",
|
||||||
|
|
||||||
|
"blacklistAddLog":"{0} was blacklisted by {1}!",
|
||||||
|
"blacklistRemoveLog":"{0} was removed from the blacklist by {1}!",
|
||||||
|
"blacklistAddDm":"You have been blacklisted in our server!\nFrom now on, you are unable to create a ticket!",
|
||||||
|
"blacklistRemoveDm":"You have been removed from the blacklist in our server!\nNow you can create tickets again!",
|
||||||
|
"clearLog":"{0} tickets have been deleted by {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"success":{
|
||||||
|
"visit":"Visit Transcript",
|
||||||
|
"ready":"Transcript Created",
|
||||||
|
"textFileDescription":"This is the text transcript of a deleted ticket!",
|
||||||
|
"htmlProgress":"Please wait while this html transcript is getting processed...",
|
||||||
|
|
||||||
|
"createdChannel":"A new {0} transcript has been created in the server!",
|
||||||
|
"createdCreator":"A new {0} transcript has been created for one of your tickets!",
|
||||||
|
"createdParticipant":"A new {0} transcript has been created in one of the tickets you participated in!",
|
||||||
|
"createdActiveAdmin":"A new {0} transcript has been created in one of the tickets you participated as admin!",
|
||||||
|
"createdEveryAdmin":"A new {0} transcript has been created in one of the tickets you were admin in!",
|
||||||
|
"createdOther":"A new {0} transcript has been created!"
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"retry":"Retry",
|
||||||
|
"continue":"Delete Without Transcript",
|
||||||
|
"backup":"Create Backup Transcript",
|
||||||
|
"error":"Something went wrong while trying to create the transcript.\nWhat would you like to do?\n\nThis ticket won't be deleted until you click one of these buttons."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"titles":{
|
||||||
|
"internalError":"Internal Error",
|
||||||
|
"optionMissing":"Command Option Missing",
|
||||||
|
"optionInvalid":"Command Option Invalid",
|
||||||
|
"unknownCommand":"Unknown Command",
|
||||||
|
"noPermissions":"No Permissions",
|
||||||
|
"unknownTicket":"Unknown Ticket",
|
||||||
|
"deprecatedTicket":"Deprecated Ticket",
|
||||||
|
"unknownOption":"Unknown Option",
|
||||||
|
"unknownPanel":"Unknown Panel",
|
||||||
|
"notInGuild":"Not In Server",
|
||||||
|
"channelRename":"Unable To Rename Channel",
|
||||||
|
"busy":"Ticket Is Busy"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"askForInfo":"Contact the owner of this bot for more info!",
|
||||||
|
"askForInfoResolve":"Contact the bot owner of this bot if this issue doesn't resolve after a few tries.",
|
||||||
|
"internalError":"Failed to respond to this {0} due to an internal error!",
|
||||||
|
"optionMissing":"A required parameter is missing in this command!",
|
||||||
|
"optionInvalid":"A parameter in this command is invalid!",
|
||||||
|
"optionInvalidChoose":"Choose between",
|
||||||
|
"unknownCommand":"Try visiting the help menu for more info!",
|
||||||
|
"noPermissions":"You are not allowed to use this {0}!",
|
||||||
|
"noPermissionsList":"Required Permissions: (one of them)",
|
||||||
|
"noPermissionsCooldown":"You are not allowed to use this {0} because you have a cooldown!",
|
||||||
|
"noPermissionsBlacklist":"You are not allowed to use this {0} because you have been blacklisted!",
|
||||||
|
"noPermissionsLimitGlobal":"You are not allowed to create a ticket because the server reached the max tickets limit!",
|
||||||
|
"noPermissionsLimitGlobalUser":"You are not allowed to create a ticket because you reached the max tickets limit!",
|
||||||
|
"noPermissionsLimitOption":"You are not allowed to create a ticket because the server reached the max tickets limit for this option!",
|
||||||
|
"noPermissionsLimitOptionUser":"You are not allowed to create a ticket because you reached the max tickets limit for this option!",
|
||||||
|
"unknownTicket":"Try this command again in a valid ticket!",
|
||||||
|
"deprecatedTicket":"The current channel is not a valid ticket! It might have been a ticket from an old Open Ticket version!",
|
||||||
|
"notInGuild":"This {0} doesn't work in DM! Please try it again in a server!",
|
||||||
|
"channelRename":"Due to discord ratelimits, it's currently impossible for the bot to rename the channel. The channel will automatically be renamed over 10 minutes if the bot isn't rebooted.",
|
||||||
|
"channelRenameSource":"The source of this error is: {0}",
|
||||||
|
"busy":"Unable to use this {0}!\nThe ticket is currently being processed by the bot.\n\nPlease try again in a few seconds!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons":{
|
||||||
|
"stringRegex":"Value doesn't match pattern!",
|
||||||
|
"stringMinLength":"Value needs to be at least {0} characters!",
|
||||||
|
"stringMaxLength":"Value needs to be at most {0} characters!",
|
||||||
|
"numberInvalid":"Invalid number!",
|
||||||
|
"numberMin":"Number needs to be at least {0}!",
|
||||||
|
"numberMax":"Number needs to be at most {0}!",
|
||||||
|
"numberDecimal":"Number is not allowed to be a decimal!",
|
||||||
|
"numberNegative":"Number is not allowed to be negative!",
|
||||||
|
"numberPositive":"Number is not allowed to be positive!",
|
||||||
|
"numberZero":"Number is not allowed to be zero!",
|
||||||
|
"channelNotFound":"Unable to find channel!",
|
||||||
|
"userNotFound":"Unable to find user!",
|
||||||
|
"roleNotFound":"Unable to find role!",
|
||||||
|
"memberNotFound":"Unable to find user!",
|
||||||
|
"mentionableNotFound":"Unable to find user or role!",
|
||||||
|
"channelType":"Invalid channel type!",
|
||||||
|
"notInGuild":"This option requires you to be in a server!"
|
||||||
|
},
|
||||||
|
"permissions":{
|
||||||
|
"developer":"You need to be the developer of the bot.",
|
||||||
|
"owner":"You need to be the server owner.",
|
||||||
|
"admin":"You need to be a server admin.",
|
||||||
|
"moderator":"You need to be a moderator.",
|
||||||
|
"support":"You need to be in the support team.",
|
||||||
|
"member":"You need to be a member.",
|
||||||
|
"discord-administrator":"You need to have the `ADMINISTRATOR` permission."
|
||||||
|
},
|
||||||
|
"actionInvalid":{
|
||||||
|
"close":"Ticket is already closed!",
|
||||||
|
"reopen":"Ticket is not closed yet!",
|
||||||
|
"claim":"Ticket is already claimed!",
|
||||||
|
"unclaim":"Ticket is not claimed yet!",
|
||||||
|
"pin":"Ticket is already pinned!",
|
||||||
|
"unpin":"Ticket is not pinned yet!",
|
||||||
|
"add":"This user is already able to access the ticket!",
|
||||||
|
"remove":"Unable to remove this user from the ticket!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"uppercase":{
|
||||||
|
"ticket":"Ticket",
|
||||||
|
"tickets":"Tickets",
|
||||||
|
"reason":"Reason",
|
||||||
|
"creator":"Creator",
|
||||||
|
"remaining":"Time Remaining",
|
||||||
|
"added":"Added",
|
||||||
|
"removed":"Removed",
|
||||||
|
"filter":"Filter",
|
||||||
|
"claimedBy":"Claimed By {0}",
|
||||||
|
"method":"Method",
|
||||||
|
"type":"Type",
|
||||||
|
"blacklisted":"Blacklisted",
|
||||||
|
"panel":"Panel",
|
||||||
|
"command":"Command",
|
||||||
|
"system":"System",
|
||||||
|
"true":"True",
|
||||||
|
"false":"False",
|
||||||
|
"syntax":"Syntax",
|
||||||
|
"originalName":"Original Name",
|
||||||
|
"newName":"New Name",
|
||||||
|
"until":"Until",
|
||||||
|
"validOptions":"Valid Options",
|
||||||
|
"validPanels":"Valid Panels",
|
||||||
|
"autoclose":"Autoclose",
|
||||||
|
"autodelete":"Autodelete",
|
||||||
|
"startupDate":"Startup Date",
|
||||||
|
"version":"Version",
|
||||||
|
"name":"Name",
|
||||||
|
"role":"Role",
|
||||||
|
"status":"Status",
|
||||||
|
"claimed":"Claimed",
|
||||||
|
"pinned":"Pinned",
|
||||||
|
"creationDate":"Creation Date"
|
||||||
|
},
|
||||||
|
"lowercase":{
|
||||||
|
"text":"text",
|
||||||
|
"html":"html",
|
||||||
|
"command":"command",
|
||||||
|
"modal":"modal",
|
||||||
|
"button":"button",
|
||||||
|
"dropdown":"dropdown",
|
||||||
|
"method":"method"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"reason":"Specify an optional reason that will be visible in logs.",
|
||||||
|
"help":"Get a list of all the available commands.",
|
||||||
|
"panel":"Spawn a message with a dropdown or buttons (for ticket creation).",
|
||||||
|
"panelId":"The identifier of the panel that you want to spawn.",
|
||||||
|
"panelAutoUpdate":"Do you want this panel to automatically update when edited?",
|
||||||
|
"ticket":"Instantly create a ticket.",
|
||||||
|
"ticketId":"The identifier of the ticket that you want to create.",
|
||||||
|
"close":"Close a ticket.",
|
||||||
|
"delete":"Delete a ticket.",
|
||||||
|
"deleteNoTranscript":"Delete this ticket without creating a transcript.",
|
||||||
|
"reopen":"Reopen a ticket.",
|
||||||
|
"claim":"Claim a ticket.",
|
||||||
|
"claimUser":"Claim this ticket to someone else instead of yourself.",
|
||||||
|
"unclaim":"Unclaim a ticket.",
|
||||||
|
"pin":"Pin a ticket.",
|
||||||
|
"unpin":"Unpin a ticket.",
|
||||||
|
"move":"Move a ticket.",
|
||||||
|
"moveId":"The identifier of the option that you want to move to.",
|
||||||
|
"rename":"Rename a ticket.",
|
||||||
|
"renameName":"The new name for this ticket.",
|
||||||
|
"add":"Add a user to a ticket.",
|
||||||
|
"addUser":"The user to add.",
|
||||||
|
"remove":"Remove a user from a ticket.",
|
||||||
|
"removeUser":"The user to remove.",
|
||||||
|
"blacklist":"Manage the ticket blacklist.",
|
||||||
|
"blacklistView":"View a list of the current blacklist.",
|
||||||
|
"blacklistAdd":"Add a user to the blacklist.",
|
||||||
|
"blacklistRemove":"Remove a user from the blacklist.",
|
||||||
|
"blacklistGet":"Get the details from a blacklisted user.",
|
||||||
|
"blacklistGetUser":"The user to get details from.",
|
||||||
|
"stats":"View statistics from the bot, a member or a ticket.",
|
||||||
|
"statsReset":"Reset all the stats of the bot (and start counting from zero).",
|
||||||
|
"statsGlobal":"View the global stats.",
|
||||||
|
"statsUser":"View the stats from a user in the server.",
|
||||||
|
"statsUserUser":"The user to view.",
|
||||||
|
"statsTicket":"View the stats of a ticket in the server.",
|
||||||
|
"statsTicketTicket":"The ticket to view.",
|
||||||
|
"clear":"Delete multiple tickets at the same time.",
|
||||||
|
"clearFilter":"The filter for clearing tickets.",
|
||||||
|
"clearFilters":{
|
||||||
|
"all":"All",
|
||||||
|
"open":"Open",
|
||||||
|
"close":"Closed",
|
||||||
|
"claim":"Claimed",
|
||||||
|
"unclaim":"Unclaimed",
|
||||||
|
"pin":"Pinned",
|
||||||
|
"unpin":"Unpinned",
|
||||||
|
"autoclose":"Autoclosed"
|
||||||
|
},
|
||||||
|
"autoclose":"Manage autoclose in a ticket.",
|
||||||
|
"autocloseDisable":"Disable autoclose in this ticket.",
|
||||||
|
"autocloseEnable":"Enable autoclose in this ticket.",
|
||||||
|
"autocloseEnableTime":"The amount of hours this ticket needs to be inactive to close it.",
|
||||||
|
"autodelete":"Manage autodelete in a ticket.",
|
||||||
|
"autodeleteDisable":"Disable autodelete in this ticket.",
|
||||||
|
"autodeleteEnable":"Enable autodelete in this ticket.",
|
||||||
|
"autodeleteEnableTime":"The amount of days this ticket needs to be inactive to delete it."
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"help":"Get a list of all the available commands.",
|
||||||
|
"ticket":"Instantly create a ticket.",
|
||||||
|
"close":"Close a ticket, this disables writing in this channel.",
|
||||||
|
"delete":"Delete a ticket, this creates a transcript when enabled.",
|
||||||
|
"reopen":"Reopen a ticket, this enables writing in this channel again.",
|
||||||
|
"pin":"Pin a ticket. This will move the ticket to the top and will add a '📌' emoij to the name.",
|
||||||
|
"unpin":"Unpin a ticket. The ticket will stay on it's position but will lose the '📌' emoij.",
|
||||||
|
"move":"Move a ticket. This will change the type of this ticket.",
|
||||||
|
"rename":"Rename a ticket. This will change the channel name of this ticket.",
|
||||||
|
"claim":"Claim a ticket. With this, you can let your team know you are handling this ticket.",
|
||||||
|
"unclaim":"Unclaim a ticket. With this, you can let your team know that this ticket is free again.",
|
||||||
|
"add":"Add a user to a ticket. This will allow the user to read & write in this ticket.",
|
||||||
|
"remove":"Remove a user from a ticket. This will remove the ability to read & write for a user in this ticket.",
|
||||||
|
"panel":"Spawn a message with a dropdown or buttons (for ticket creation).",
|
||||||
|
"blacklistView":"View a list of the current blacklist.",
|
||||||
|
"blacklistAdd":"Add a user to the blacklist.",
|
||||||
|
"blacklistRemove":"Remove a user from the blacklist.",
|
||||||
|
"blacklistGet":"Get the details from a blacklisted user.",
|
||||||
|
"statsGlobal":"View the global stats.",
|
||||||
|
"statsTicket":"View the stats of a ticket in the server.",
|
||||||
|
"statsUser":"View the stats from a user in the server.",
|
||||||
|
"statsReset":"Reset all the stats of the bot (and start counting from zero).",
|
||||||
|
"autocloseDisable":"Disable autoclose in this ticket.",
|
||||||
|
"autocloseEnable":"Enable autoclose in this ticket.",
|
||||||
|
"autodeleteDisable":"Disable autodelete in this ticket.",
|
||||||
|
"autodeleteEnable":"Enable autodelete in this ticket."
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"scopes":{
|
||||||
|
"global":"Global Stats",
|
||||||
|
"system":"System Stats",
|
||||||
|
"user":"User Stats",
|
||||||
|
"ticket":"Ticket Stats",
|
||||||
|
"participants":"Participants"
|
||||||
|
},
|
||||||
|
"properties":{
|
||||||
|
"ticketsCreated":"Tickets Created",
|
||||||
|
"ticketsClosed":"Tickets Closed",
|
||||||
|
"ticketsDeleted":"Tickets Deleted",
|
||||||
|
"ticketsReopened":"Tickets Reopened",
|
||||||
|
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||||
|
"ticketsClaimed":"Tickets Claimed",
|
||||||
|
"ticketsPinned":"Tickets Pinned",
|
||||||
|
"ticketsMoved":"Tickets Moved",
|
||||||
|
"usersBlacklisted":"Users Blacklisted",
|
||||||
|
"transcriptsCreated":"Transcripts Created"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,478 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.3",
|
||||||
|
"translators":["spyeye_"],
|
||||||
|
"lastedited":"21/08/2024",
|
||||||
|
"language":"Czech",
|
||||||
|
"automated":false
|
||||||
|
},
|
||||||
|
"checker":{
|
||||||
|
"system":{
|
||||||
|
"typeError":"[ERROR]",
|
||||||
|
"headerOpenTicket":"OPEN TICKET",
|
||||||
|
"typeWarning":"[WARNING]",
|
||||||
|
"typeInfo":"[INFO]",
|
||||||
|
"headerConfigChecker":"CONFIG CHECKER",
|
||||||
|
"headerDescription":"kontrola chyb v konfiguračních souborech!",
|
||||||
|
"footerError":"Bot se nespustí, dokud všechny {0} nebudou opraveny!",
|
||||||
|
"footerWarning":"Doporučejeme opravit všechny {0} před spuštěním!",
|
||||||
|
"footerSupport":"PODPORA: {0} - DOKUMENTACE: {1}",
|
||||||
|
"compactInformation":"Použij {0} pro více informací!",
|
||||||
|
"dataPath":"path",
|
||||||
|
"dataDocs":"docs",
|
||||||
|
"dataMessages":"message"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"stringTooShort":"Tento string nesmí být kratší než {0} znaků!",
|
||||||
|
"stringTooLong":"Tento string nesmí být delší než {0} znaků!",
|
||||||
|
"stringLengthInvalid":"Tento string musí mít délku {0} znaků!",
|
||||||
|
"stringStartsWith":"Tento string musí začínat {0}!",
|
||||||
|
"stringEndsWith":"Tento string musí končit {0}!",
|
||||||
|
"stringContains":"Tento string musí obsahovat {0}!",
|
||||||
|
"stringChoices":"Tento string může být pouze jednou z následujících možností: {0}!",
|
||||||
|
"stringRegex":"Tento string je neplatný!",
|
||||||
|
|
||||||
|
"numberTooShort":"Toto číslo nesmí být kratší než {0} znaků!",
|
||||||
|
"numberTooLong":"Toto číslo nesmí být delší než {0} znaků.!",
|
||||||
|
"numberLengthInvalid":"Toto číslo musí mít délku {0} znaků.!",
|
||||||
|
"numberTooSmall":"Toto číslo musí být alespoň {0}.!",
|
||||||
|
"numberTooLarge":"Toto číslo musí být nejvýše {0}!",
|
||||||
|
"numberNotEqual":"Toto číslo musí být {0}!",
|
||||||
|
"numberStep":"Toto číslo musí být násobkem {0}.!",
|
||||||
|
"numberStepOffset":"Toto číslo musí být násobkem {0} žačínající {1}.!",
|
||||||
|
"numberStartsWith":"Toto číslo musí začínat {0}!",
|
||||||
|
"numberEndsWith":"Toto číslo musí končit {0}!",
|
||||||
|
"numberContains":"Toto číslo musí obsahovat {0}!",
|
||||||
|
"numberChoices":"Toto číslo může být pouze jedno z následujících hodnot: {0}!",
|
||||||
|
"numberFloat":"Toto číslo nemůže být desetinné!",
|
||||||
|
"numberNegative":"Toto číslo nemůže být záporné!",
|
||||||
|
"numberPositive":"Toto číslo nemůže být kladné!",
|
||||||
|
"numberZero":"Toto číslo nemůže být nula!",
|
||||||
|
|
||||||
|
"booleanTrue":"Tento boolean nemůže být true!",
|
||||||
|
"booleanFalse":"Tento boolean nemůže být false!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled":"Toto pole nesmí být prázdné.!",
|
||||||
|
"arrayEmptyRequired":"Toto pole musí být prázdné!",
|
||||||
|
"arrayTooShort":"Toto pole musí mít délku alespoň {0}!",
|
||||||
|
"arrayTooLong":"Toto pole musí mít délku maximálně {0}!",
|
||||||
|
"arrayLengthInvalid":"Toto pole musí mít délku {0}!",
|
||||||
|
"arrayInvalidTypes":"Toto pole může obsahovat pouze následující typy: {0}!",
|
||||||
|
"arrayDouble":"Toto pole neumožňuje zadat stejnou hodnotu dvakrát.!",
|
||||||
|
|
||||||
|
"discordInvalidId":"Toto je neplatné discord {0} id!",
|
||||||
|
"discordInvalidIdOptions":"Toto je neplatné Discord ID {0}! Můžete také použít jeden z těchto: {1}!",
|
||||||
|
"discordInvalidToken":"Toto je neplatný discord token (syntakticky)!",
|
||||||
|
"colorInvalid":"Toto je neplatná hex barva!",
|
||||||
|
"emojiTooShort":"Tento string musí obsahovat alespoň {0} emotikonů.!",
|
||||||
|
"emojiTooLong":"Tento string musí obsahovat nejvýše {0} emotikonů.!",
|
||||||
|
"emojiCustom":"Tento emotikon nemůže být custom emotikon!",
|
||||||
|
"emojiInvalid":"Toto je neplatný emotikon!",
|
||||||
|
"urlInvalid":"Tato url adresa je neplatná!",
|
||||||
|
"urlInvalidHttp":"Tato url může používat pouze protokol https://!",
|
||||||
|
"urlInvalidProtocol":"Tato url může používat pouze protokoly http:// a https://!",
|
||||||
|
"urlInvalidHostname":"Tato url má zakázané hostitelské jméno!",
|
||||||
|
"urlInvalidExtension":"Tato url má neplatnou příponu! Vyberte si mezi: {0}!",
|
||||||
|
"urlInvalidPath":"Tato url má neplatnou cestu!",
|
||||||
|
"idNotUnique":"Toto id není jedinečné, místo něj použijte jiné id!",
|
||||||
|
"idNonExistent":"Id {0} neexistuje!",
|
||||||
|
|
||||||
|
"invalidType":"Toto nastavení musí být typu: {0}!",
|
||||||
|
"propertyMissing":"U tohoto objektu chybí vlastnost {0}!",
|
||||||
|
"propertyOptional":"Vlastnost {0} je v tomto objektu nepovinná!",
|
||||||
|
"objectDisabled":"Tento objekt je zakázán, povolte jej pomocí {0}!",
|
||||||
|
"nullInvalid":"Tato vlastnost nemůže být nulová!",
|
||||||
|
"switchInvalidType":"Musí se jednat o jeden z následujících typů: {0}!",
|
||||||
|
"objectSwitchInvalid":"Tento objekt musí být jednoho z následujících typů: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage":"Jedná se o neplatný jazyk!",
|
||||||
|
"invalidButton":"Toto tlačítko musí mít alespoň {0} nebo {1}!",
|
||||||
|
"unusedOption":"Možnost {0} se nikde nepoužívá!",
|
||||||
|
"unusedQuestion":"Otázka {0} není nikde použita!",
|
||||||
|
"dropdownOption":"Panel s povoleným rozevíracím seznamem může obsahovat pouze možnosti typu „ticketu“!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions":{
|
||||||
|
"buttons":{
|
||||||
|
"create":"Zobrazit ticket",
|
||||||
|
"close":"Uzavřít ticket",
|
||||||
|
"delete":"Vymazat ticket",
|
||||||
|
"reopen":"Znovu otevřít ticket",
|
||||||
|
"claim":"Převzít ticket",
|
||||||
|
"unclaim":"Zrušit převzetí ticketu",
|
||||||
|
"pin":"Připnout ticket",
|
||||||
|
"unpin":"Odepnout ticket",
|
||||||
|
"clear":"Vymazat tickety",
|
||||||
|
"helpSwitchSlash":"Zobrazit slash příkazy",
|
||||||
|
"helpSwitchText":"Zobrazit textové příkazy",
|
||||||
|
"helpPage":"Strana {0}",
|
||||||
|
"withReason":"S důvodem",
|
||||||
|
"withoutTranscript":"Bez důvodu"
|
||||||
|
},
|
||||||
|
"titles":{
|
||||||
|
"created":"Ticket vytvořen",
|
||||||
|
"close":"Ticket uzavřen",
|
||||||
|
"delete":"Ticket vymazán",
|
||||||
|
"reopen":"Ticket znovu otevřen",
|
||||||
|
"claim":"Ticket převzat",
|
||||||
|
"unclaim":"Ticket již není převezmut",
|
||||||
|
"pin":"Ticket připnut",
|
||||||
|
"unpin":"Ticket odepnut",
|
||||||
|
"rename":"Ticket přejmenován",
|
||||||
|
"move":"Ticket přesunut",
|
||||||
|
"add":"Uživatel přidán",
|
||||||
|
"remove":"Uživatel odebrán",
|
||||||
|
|
||||||
|
"help":"Dostupné příkazy:",
|
||||||
|
"statsReset":"Resetovat statistiky",
|
||||||
|
"blacklistAdd":"Uživatel blacklistován",
|
||||||
|
"blacklistRemove":"Uživatel odebrán z blacklistu",
|
||||||
|
"blacklistGet":"Uživatel na blacklistu",
|
||||||
|
"blacklistView":"Aktuální blacklist",
|
||||||
|
"blacklistAddDm":"Přidán na blacklistu",
|
||||||
|
"blacklistRemoveDm":"Odebrán z blacklistu",
|
||||||
|
"clear":"Tickety vyčištěny",
|
||||||
|
"roles":"Role aktualizovány",
|
||||||
|
|
||||||
|
"autoclose":"Ticket automaticky uzavřen",
|
||||||
|
"autocloseEnabled":"Automatické uzavření povoleno",
|
||||||
|
"autocloseDisabled":"Automatické uzavření zakázáno",
|
||||||
|
"autodelete":"Ticket automaticky vymazán",
|
||||||
|
"autodeleteEnabled":"Automatické mazání povoleno",
|
||||||
|
"autodeleteDisabled":"Automatické mazání zakázáno"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"create":"Tvůj ticket byl vytvořen. Klikni na tlačítko pod zprávou pro zobrazení!",
|
||||||
|
"close":"Ticket byl úspěšně uzavřen!",
|
||||||
|
"delete":"Ticket byl úspěšně vymazán!",
|
||||||
|
"reopen":"Ticket byl úspěšně znovu otevřen!",
|
||||||
|
"claim":"Ticket byl úspěšně převzat!",
|
||||||
|
"unclaim":"Ticket již není převezmut!",
|
||||||
|
"pin":"Ticket byl úspěšně připnut!",
|
||||||
|
"unpin":"Ticket byl úspěšně odepnut!",
|
||||||
|
"rename":"Ticket byl úspěšně přejmenován na {0}!",
|
||||||
|
"move":"Ticket byl úspěšně přesunut do {0}!",
|
||||||
|
"add":"{0} byl úspěšně přidán do ticketu!",
|
||||||
|
"remove":"{0} byl úspěšně odstraněn z ticketu!",
|
||||||
|
|
||||||
|
"helpExplanation":"`<name>` => povinný parametr\n`[name]` => nepovinný parametr",
|
||||||
|
"statsReset":"Statistiky bota byly úspěšně resetovány!",
|
||||||
|
"statsError":"Nelze zobrazit statistiky ticketu!\n{0} není ticket!",
|
||||||
|
"blacklistAdd":"{0} byl přídán na blacklist!",
|
||||||
|
"blacklistRemove":"{0} byl odebrán z blacklistu!",
|
||||||
|
"blacklistGetSuccess":"{0} je nyní na blacklistu!",
|
||||||
|
"blacklistGetEmpty":"{0} nyní není na blacklistu!",
|
||||||
|
"blacklistViewEmpty":"Na blacklistu ještě nikdo není",
|
||||||
|
"blacklistViewTip":"Použij \"/blacklist add\" pro přidání uživatele na blacklist!",
|
||||||
|
"clearVerify":"Opravdu chcete smazat více ticketů?\nTuto akci nelze vrátit zpět!",
|
||||||
|
"clearReady":"{0} ticketů bylo úspěšně smazány!",
|
||||||
|
"rolesEmpty":"Žádné role nebyly aktualizovány!",
|
||||||
|
|
||||||
|
"autocloseLeave":"Tento ticket byl automaticky uzavřen, protože jeho autor opustil server.!",
|
||||||
|
"autocloseTimeout":"Tento ticket byl automaticky uzavřen, protože byl neaktivní déle než `{0}h`!",
|
||||||
|
"autodeleteLeave":"Tento ticket byl automaticky smazán, protože jeho autor opustil server!",
|
||||||
|
"autodeleteTimeout":"Tento ticket byl automaticky smazán, protože je neaktivní déle než `{0} dní`!",
|
||||||
|
"autocloseEnabled":"U tohoto ticketu bylo povoleno automatické uzavření!\nTicket bude uzavřen, pokud bude neaktivní déle než `{0}h`!",
|
||||||
|
"autocloseDisabled":"U tohoto ticketu bylo vypnuto automatické zavírání!\nUž se nebude automaticky zavírat!",
|
||||||
|
"autodeleteEnabled":"U tohoto ticketu bylo povoleno automatické mazání!\nBude smazán, pokud je neaktivní déle než `{0} dní`!",
|
||||||
|
"autodeleteDisabled":"Automatické mazání bylo v tomto zakázáno!\nUž se nebude automaticky mazat!",
|
||||||
|
|
||||||
|
"ticketMessageLimit":"Současně lze vytvořit pouze {0} ticketu!",
|
||||||
|
"ticketMessageAutoclose":"Tento ticket se automaticky uzavře, pokud je neaktivní po dobu {0}h!",
|
||||||
|
"ticketMessageAutodelete":"Tento ticket bude automaticky smazán, pokud bude neaktivní po dobu {0} dnů!",
|
||||||
|
"panelReady":"Panel najdete níže!\nTuto zprávu lze nyní smazat!"
|
||||||
|
},
|
||||||
|
"modal":{
|
||||||
|
"closePlaceholder":"Proč jste tento ticket uzavřel?",
|
||||||
|
"deletePlaceholder":"Proč jste tento ticket smazali?",
|
||||||
|
"reopenPlaceholder":"Proč jste tento ticket znovu otevřeli?",
|
||||||
|
"claimPlaceholder":"Proč jste si vyžádal tento ticket?",
|
||||||
|
"unclaimPlaceholder":"Proč jste zrušili převzetí tohoto ticketu?",
|
||||||
|
"pinPlaceholder":"Proč jste připnuli tento ticket?",
|
||||||
|
"unpinPlaceholder":"Proč jste odepnuli tento ticket?"
|
||||||
|
},
|
||||||
|
"logs":{
|
||||||
|
"createLog":"Nový ticket byl vytvořen uživatelem {0}!",
|
||||||
|
"closeLog":"Tento ticket byl uzavřen uživatelem {0}!",
|
||||||
|
"closeDm":"Tvůj ticket byl uzavřen na našem serveru!",
|
||||||
|
"deleteLog":"Tento ticket byl smazán uživatelem {0}!",
|
||||||
|
"deleteDm":"Tvůj ticket byl smazán na našem serveru!",
|
||||||
|
"reopenLog":"Tento ticket byl znovu otevřen uživatelem {0}!",
|
||||||
|
"reopenDm":"Tvůj ticket byl znovu otevřen na našem serveru!",
|
||||||
|
"claimLog":"Tento ticket byl přidělen uživatelem {0}!",
|
||||||
|
"claimDm":"Tvůj ticket byl přidělen na našem serveru!",
|
||||||
|
"unclaimLog":"Tento ticket byl odhlášen uživatelem {0}!",
|
||||||
|
"unclaimDm":"Tvůj ticket byl odhlášen na našem serveru!",
|
||||||
|
"pinLog":"Tento ticket byl připnut uživatelem {0}!",
|
||||||
|
"pinDm":"Tvůj ticket byl připnut na našem serveru!",
|
||||||
|
"unpinLog":"Tento ticket byl odepnut uživatelem {0}!",
|
||||||
|
"unpinDm":"Tvůj ticket byl odepnut na našem serveru!",
|
||||||
|
"renameLog":"Tento ticket byl přejmenován na {0} uživatelem {1}!",
|
||||||
|
"renameDm":"Tvůj ticket byl přejmenován na {0} na našem serveru!",
|
||||||
|
"moveLog":"Tento ticket byl přesunut do {0} uživatelem {1}!",
|
||||||
|
"moveDm":"Tvůj ticket byl přesunut do {0} na našem serveru!",
|
||||||
|
"addLog":"{0} byl přidán do tohoto ticketu uživatelem {1}!",
|
||||||
|
"addDm":"{0} byl přidán do tvého ticketu na našem serveru!",
|
||||||
|
"removeLog":"{0} byl odstraněn z tohoto ticketu uživatelem {1}!",
|
||||||
|
"removeDm":"{0} byl odstraněn z tvého ticketu na našem serveru!",
|
||||||
|
|
||||||
|
"blacklistAddLog":"{0} byl přidán na blacklist uživatelem {1}!",
|
||||||
|
"blacklistRemoveLog":"{0} byl odstraněn z blacklistu uživatelem {1}!",
|
||||||
|
"blacklistAddDm":"Byl jsi přidán na blacklist na našem serveru!\nOd teď nemůžeš vytvářet tickety!",
|
||||||
|
"blacklistRemoveDm":"Byl jsi odstraněn z blacklistu na našem serveru!\nNyní můžeš opět vytvářet tickety!",
|
||||||
|
"clearLog":"{0} ticketů bylo smazáno uživatelem {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"success":{
|
||||||
|
"visit":"Zobrazit přepis",
|
||||||
|
"ready":"Přepis vytvořen",
|
||||||
|
"textFileDescription":"Toto je textový přepis smazaného ticketu!",
|
||||||
|
"htmlProgress":"Prosím, počkejte, zatímco se zpracovává HTML přepis...",
|
||||||
|
|
||||||
|
"createdChannel":"Na serveru byl vytvořen nový přepis {0}!",
|
||||||
|
"createdCreator":"Byl vytvořen nový přepis {0} pro jeden z tvých ticketů!",
|
||||||
|
"createdParticipant":"Byl vytvořen nový přepis {0} v jednom z ticketů, kterých ses účastnil!",
|
||||||
|
"createdActiveAdmin":"Byl vytvořen nový přepis {0} v jednom z ticketů, kterých ses účastnil jako admin!",
|
||||||
|
"createdEveryAdmin":"Byl vytvořen nový přepis {0} v jednom z ticketů, kde jsi byl adminem!",
|
||||||
|
"createdOther":"Byl vytvořen nový přepis {0}!"
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"retry":"Zkusit Znovu",
|
||||||
|
"continue":"Vymazat bez přepisu",
|
||||||
|
"backup":"Vytvořit záložní přepis",
|
||||||
|
"error":"Při pokusu o vytvoření přepisu se něco pokazilo.\nCo chcete udělat?\n\nTento ticket nebude smazán, dokud nekliknete na jedno z těchto tlačítek."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"titles":{
|
||||||
|
"internalError":"Interní chyba",
|
||||||
|
"optionMissing":"Chybějící možnost příkazu",
|
||||||
|
"optionInvalid":"Neplatná možnost příkazu",
|
||||||
|
"unknownCommand":"Neznámý příkaz",
|
||||||
|
"noPermissions":"Nemáš oprávnění",
|
||||||
|
"unknownTicket":"Neznámý ticket",
|
||||||
|
"deprecatedTicket":"Zastaralý ticket",
|
||||||
|
"unknownOption":"Neznámá možnost",
|
||||||
|
"unknownPanel":"Neznámý panel",
|
||||||
|
"notInGuild":"Nejsi na serveru",
|
||||||
|
"channelRename":"Nepodařilo se přejmenovat kanál",
|
||||||
|
"busy":"Ticket je zaneprázdněn"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"askForInfo":"Pro více informací kontaktuj vlastníka tohoto bota!",
|
||||||
|
"askForInfoResolve":"Kontaktuj vlastníka tohoto bota, pokud se tento problém nevyřeší po několika pokusech.",
|
||||||
|
"internalError":"Nepodařilo se odpovědět na tento {0} kvůli interní chybě!",
|
||||||
|
"optionMissing":"V tomto příkazu chybí požadovaný parametr!",
|
||||||
|
"optionInvalid":"V tomto příkazu je neplatný parametr!",
|
||||||
|
"optionInvalidChoose":"Vyber z",
|
||||||
|
"unknownCommand":"Zkus navštívit nabídku nápovědy pro více informací!",
|
||||||
|
"noPermissions":"Nemáš oprávnění k použití tohoto {0}!",
|
||||||
|
"noPermissionsList":"Požadovaná oprávnění: (jedno z nich)",
|
||||||
|
"noPermissionsCooldown":"Nemáš oprávnění k použití tohoto {0}, protože máš cooldown!",
|
||||||
|
"noPermissionsBlacklist":"Nemáš oprávnění k použití tohoto {0}, protože jsi byl přidán na blacklist!",
|
||||||
|
"noPermissionsLimitGlobal":"Nemáš oprávnění vytvořit ticket, protože server dosáhl maximálního limitu ticketů!",
|
||||||
|
"noPermissionsLimitGlobalUser":"Nemáš oprávnění vytvořit ticket, protože jsi dosáhl maximálního limitu ticketů!",
|
||||||
|
"noPermissionsLimitOption":"Nemáš oprávnění vytvořit ticket, protože server dosáhl maximálního limitu ticketů pro tuto možnost!",
|
||||||
|
"noPermissionsLimitOptionUser":"Nemáš oprávnění vytvořit ticket, protože jsi dosáhl maximálního limitu ticketů pro tuto možnost!",
|
||||||
|
"unknownTicket":"Zkus tento příkaz znovu v platném ticketu!",
|
||||||
|
"deprecatedTicket":"Aktuální kanál není platný ticket! Může se jednat o ticket ze starší verze Open Ticketu!",
|
||||||
|
"notInGuild":"Tento {0} nefunguje v DM! Zkus to znovu na serveru!",
|
||||||
|
"channelRename":"Kvůli ratelimitům Discordu není momentálně možné, aby bot přejmenoval kanál. Kanál bude automaticky přejmenován do 10 minut, pokud nedojde k restartu bota.",
|
||||||
|
"channelRenameSource":"Zdroj této chyby je: {0}",
|
||||||
|
"busy":"Nelze použít tento {0}!\nTicket je momentálně zpracováván botem.\n\nZkus to prosím znovu za několik sekund!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons":{
|
||||||
|
"stringRegex":"Hodnota neodpovídá vzoru!",
|
||||||
|
"stringMinLength":"Hodnota musí mít alespoň {0} znaků!",
|
||||||
|
"stringMaxLength":"Hodnota může mít maximálně {0} znaků!",
|
||||||
|
"numberInvalid":"Neplatné číslo!",
|
||||||
|
"numberMin":"Číslo musí být alespoň {0}!",
|
||||||
|
"numberMax":"Číslo může být maximálně {0}!",
|
||||||
|
"numberDecimal":"Číslo nesmí být desetinné!",
|
||||||
|
"numberNegative":"Číslo nesmí být záporné!",
|
||||||
|
"numberPositive":"Číslo nesmí být kladné!",
|
||||||
|
"numberZero":"Číslo nesmí být nula!",
|
||||||
|
"channelNotFound":"Nelze najít kanál!",
|
||||||
|
"userNotFound":"Nelze najít uživatele!",
|
||||||
|
"roleNotFound":"Nelze najít roli!",
|
||||||
|
"memberNotFound":"Nelze najít uživatele!",
|
||||||
|
"mentionableNotFound":"Nelze najít uživatele nebo roli!",
|
||||||
|
"channelType":"Neplatný typ kanálu!",
|
||||||
|
"notInGuild":"Tato možnost vyžaduje, abys byl na serveru!"
|
||||||
|
},
|
||||||
|
"permissions":{
|
||||||
|
"developer":"Musíš být vývojářem tohoto bota.",
|
||||||
|
"owner":"Musíš být vlastníkem serveru.",
|
||||||
|
"admin":"Musíš být adminem serveru.",
|
||||||
|
"moderator":"Musíš být moderátorem.",
|
||||||
|
"support":"Musíš být členem týmu podpory.",
|
||||||
|
"member":"Musíš být členem.",
|
||||||
|
"discord-administrator":"Musíš mít oprávnění `ADMINISTRATOR`."
|
||||||
|
},
|
||||||
|
"actionInvalid":{
|
||||||
|
"close":"Ticket je již uzavřený!",
|
||||||
|
"reopen":"Ticket ještě není uzavřený!",
|
||||||
|
"claim":"Ticket je již přidělený!",
|
||||||
|
"unclaim":"Ticket ještě není přidělený!",
|
||||||
|
"pin":"Ticket je již připnutý!",
|
||||||
|
"unpin":"Ticket ještě není připnutý!",
|
||||||
|
"add":"Tento uživatel už má k ticketu přístup!",
|
||||||
|
"remove":"Tohoto uživatele nelze z ticketu odstranit!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"uppercase":{
|
||||||
|
"ticket":"Ticket",
|
||||||
|
"tickets":"Tickety",
|
||||||
|
"reason":"Důvod",
|
||||||
|
"creator":"Tvůrce",
|
||||||
|
"remaining":"Zbývající čas",
|
||||||
|
"added":"Přidáno",
|
||||||
|
"removed":"Odstraněno",
|
||||||
|
"filter":"Filtr",
|
||||||
|
"claimedBy":"Přiděleno uživatelem {0}",
|
||||||
|
"method":"Metoda",
|
||||||
|
"type":"Typ",
|
||||||
|
"blacklisted":"Na blacklistu",
|
||||||
|
"panel":"Panel",
|
||||||
|
"command":"Příkaz",
|
||||||
|
"system":"Systém",
|
||||||
|
"true":"true",
|
||||||
|
"false":"false",
|
||||||
|
"syntax":"Syntaxe",
|
||||||
|
"originalName":"Původní jméno",
|
||||||
|
"newName":"Nové jméno",
|
||||||
|
"until":"Do",
|
||||||
|
"validOptions":"Platné možnosti",
|
||||||
|
"validPanels":"Platné panely",
|
||||||
|
"autoclose":"Automatické uzavření",
|
||||||
|
"autodelete":"Automatické smazání",
|
||||||
|
"startupDate":"Datum spuštění",
|
||||||
|
"version":"Verze",
|
||||||
|
"name":"Jméno",
|
||||||
|
"role":"Role",
|
||||||
|
"status":"Stav",
|
||||||
|
"claimed":"Přiděleno",
|
||||||
|
"pinned":"Připnuto",
|
||||||
|
"creationDate":"Datum vytvoření"
|
||||||
|
},
|
||||||
|
"lowercase":{
|
||||||
|
"text":"text",
|
||||||
|
"html":"html",
|
||||||
|
"command":"příkaz",
|
||||||
|
"modal":"modal",
|
||||||
|
"button":"tlačítko",
|
||||||
|
"dropdown":"roletka",
|
||||||
|
"method":"metoda"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"reason":"Zadej nepovinný důvod, který bude viditelný v logu.",
|
||||||
|
"help":"Získej seznam všech dostupných příkazů.",
|
||||||
|
"panel":"Vytvoř zprávu s roletkou nebo tlačítky (pro vytvoření ticketu).",
|
||||||
|
"panelId":"Identifikátor panelu, který chceš vytvořit.",
|
||||||
|
"panelAutoUpdate":"Chceš, aby se tento panel automaticky aktualizoval při úpravách?",
|
||||||
|
"ticket":"Okamžitě vytvoř ticket.",
|
||||||
|
"ticketId":"Identifikátor ticketu, který chceš vytvořit.",
|
||||||
|
"close":"Uzavři ticket.",
|
||||||
|
"delete":"Smaž ticket.",
|
||||||
|
"deleteNoTranscript":"Smaž tento ticket bez vytvoření přepisu.",
|
||||||
|
"reopen":"Znovu otevři ticket.",
|
||||||
|
"claim":"Přiděl ticket.",
|
||||||
|
"claimUser":"Přiděl tento ticket někomu jinému místo sebe.",
|
||||||
|
"unclaim":"Odeber přidělení ticketu.",
|
||||||
|
"pin":"Připni ticket.",
|
||||||
|
"unpin":"Odepni ticket.",
|
||||||
|
"move":"Přesuň ticket.",
|
||||||
|
"moveId":"Identifikátor možnost, na který chceš přesunout.",
|
||||||
|
"rename":"Přejmenuj ticket.",
|
||||||
|
"renameName":"Nový název pro tento ticket.",
|
||||||
|
"add":"Přidej uživatele k ticketu.",
|
||||||
|
"addUser":"Uživatel k přidání.",
|
||||||
|
"remove":"Odstraň uživatele z ticketu.",
|
||||||
|
"removeUser":"Uživatel k odstranění.",
|
||||||
|
"blacklist":"Spravuj blacklist ticketů.",
|
||||||
|
"blacklistView":"Zobraz seznam aktuálního blacklistu.",
|
||||||
|
"blacklistAdd":"Přidej uživatele na blacklist.",
|
||||||
|
"blacklistRemove":"Odstraň uživatele z blacklistu.",
|
||||||
|
"blacklistGet":"Získej detaily o uživateli na blacklistu.",
|
||||||
|
"blacklistGetUser":"Uživatel, o kterém chceš získat detaily.",
|
||||||
|
"stats":"Zobraz statistiky bota, člena nebo ticketu.",
|
||||||
|
"statsReset":"Resetuj všechny statistiky bota (a začni počítat od nuly).",
|
||||||
|
"statsGlobal":"Zobraz globální statistiky.",
|
||||||
|
"statsUser":"Zobraz statistiky uživatele na serveru.",
|
||||||
|
"statsUserUser":"Uživatel, jehož statistiky chceš zobrazit.",
|
||||||
|
"statsTicket":"Zobraz statistiky ticketu na serveru.",
|
||||||
|
"statsTicketTicket":"Ticket, jehož statistiky chceš zobrazit.",
|
||||||
|
"clear":"Smaž více ticketů najednou. Lze zadat volitelný filtr.",
|
||||||
|
"clearFilter":"Filtr pro vymazání tiketů.",
|
||||||
|
"clearFilters":{
|
||||||
|
"all":"Vše",
|
||||||
|
"open":"Otevřené",
|
||||||
|
"close":"Uzavřené",
|
||||||
|
"claim":"Přidělené",
|
||||||
|
"unclaim":"Nepřidělené",
|
||||||
|
"pin":"Připnuté",
|
||||||
|
"unpin":"Nepřipnuté",
|
||||||
|
"autoclose":"Automaticky uzavřené"
|
||||||
|
},
|
||||||
|
"autoclose":"Spravuj automatické uzavření ticketu.",
|
||||||
|
"autocloseDisable":"Deaktivuj automatické uzavření v tomto ticketu.",
|
||||||
|
"autocloseEnable":"Aktivuj automatické uzavření v tomto ticketu.",
|
||||||
|
"autocloseEnableTime":"Počet hodin neaktivity, po kterých se ticket uzavře.",
|
||||||
|
"autodelete":"Spravuj automatické smazání ticketu.",
|
||||||
|
"autodeleteDisable":"Deaktivuj automatické smazání v tomto ticketu.",
|
||||||
|
"autodeleteEnable":"Aktivuj automatické smazání v tomto ticketu.",
|
||||||
|
"autodeleteEnableTime":"Počet dnů neaktivity, po kterých se ticket smaže."
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"help":"Získej seznam všech dostupných příkazů.",
|
||||||
|
"ticket":"Okamžitě vytvoř ticket.",
|
||||||
|
"close":"Uzavři ticket, čímž se zakáže psaní v tomto kanálu.",
|
||||||
|
"delete":"Smaž ticket, čímž se vytvoří přepis, pokud je to povoleno.",
|
||||||
|
"reopen":"Znovu otevři ticket, což opět umožní psaní v tomto kanálu.",
|
||||||
|
"pin":"Připni ticket. Tento ticket se přesune na začátek a bude mít ve jménu emoji '📌'.",
|
||||||
|
"unpin":"Odepni ticket. Ticket zůstane na svém místě, ale ztratí emoji '📌'.",
|
||||||
|
"move":"Přesuň ticket. Tím se změní typ tohoto ticketu.",
|
||||||
|
"rename":"Přejmenuj ticket. Tím se změní název kanálu tohoto ticketu.",
|
||||||
|
"claim":"Přiděl ticket. Tím dáš svému týmu najevo, že tento ticket řešíš.",
|
||||||
|
"unclaim":"Odeber přidělení ticketu. Tím dáš svému týmu najevo, že je tento ticket znovu volný.",
|
||||||
|
"add":"Přidej uživatele k ticketu. Tímto uživateli umožníš číst a psát v tomto ticketu.",
|
||||||
|
"remove":"Odstraň uživatele z ticketu. Tímto uživateli odebereš možnost číst a psát v tomto ticketu.",
|
||||||
|
"panel":"Vytvoř zprávu s roletkou nebo tlačítky (pro vytvoření ticketu).",
|
||||||
|
"blacklistView":"Zobraz seznam aktuálního blacklistu.",
|
||||||
|
"blacklistAdd":"Přidej uživatele na blacklist.",
|
||||||
|
"blacklistRemove":"Odstraň uživatele z blacklistu.",
|
||||||
|
"blacklistGet":"Získej detaily o uživateli na blacklistu.",
|
||||||
|
"statsGlobal":"Zobraz globální statistiky.",
|
||||||
|
"statsTicket":"Zobraz statistiky ticketu na serveru.",
|
||||||
|
"statsUser":"Zobraz statistiky uživatele na serveru.",
|
||||||
|
"statsReset":"Resetuj všechny statistiky bota (a začni počítat od nuly).",
|
||||||
|
"autocloseDisable":"Deaktivuj automatické uzavření v tomto ticketu.",
|
||||||
|
"autocloseEnable":"Aktivuj automatické uzavření v tomto ticketu.",
|
||||||
|
"autodeleteDisable":"Deaktivuj automatické smazání v tomto ticketu.",
|
||||||
|
"autodeleteEnable":"Aktivuj automatické smazání v tomto ticketu."
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"scopes":{
|
||||||
|
"global":"Globální statistiky",
|
||||||
|
"system":"Statistiky systému",
|
||||||
|
"user":"Statistiky uživatele",
|
||||||
|
"ticket":"Statistiky ticketu",
|
||||||
|
"participants":"Účastníci"
|
||||||
|
},
|
||||||
|
"properties":{
|
||||||
|
"ticketsCreated":"Vytvořené tickety",
|
||||||
|
"ticketsClosed":"Uzavřené tickety",
|
||||||
|
"ticketsDeleted":"Smazané tickety",
|
||||||
|
"ticketsReopened":"Znovu otevřené tickety",
|
||||||
|
"ticketsAutoclosed":"Automaticky uzavřené tickety",
|
||||||
|
"ticketsClaimed":"Přidělené tickety",
|
||||||
|
"ticketsPinned":"Připnuté tickety",
|
||||||
|
"ticketsMoved":"Přesunuté tickety",
|
||||||
|
"usersBlacklisted":"Uživatelé na blacklistu",
|
||||||
|
"transcriptsCreated":"Vytvořené přepisy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,478 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.3",
|
||||||
|
"translators":["the_gamer"],
|
||||||
|
"lastedited":"26/09/2024",
|
||||||
|
"language":"Danish",
|
||||||
|
"automated":false
|
||||||
|
},
|
||||||
|
"checker": {
|
||||||
|
"system": {
|
||||||
|
"typeError": "[FEJL]",
|
||||||
|
"headerOpenTicket": "ÅBEN TICKET",
|
||||||
|
"typeWarning": "[ADVARSEL]",
|
||||||
|
"typeInfo": "[INFO]",
|
||||||
|
"headerConfigChecker": "CONFIG CHECKER",
|
||||||
|
"headerDescription": "tjek efter fejl i din config!",
|
||||||
|
"footerError": "botten vil ikke fikse før alle {0}'s are fixed!",
|
||||||
|
"footerWarning": "it's recommended to fix all {0}'s before starting!",
|
||||||
|
"footerSupport": "SUPPORT: {0} - DOCS: {1}",
|
||||||
|
"compactInformation": "brug {0} for mere information!",
|
||||||
|
"dataPath": "path",
|
||||||
|
"dataDocs": "docs",
|
||||||
|
"dataMessages": "besked"
|
||||||
|
},
|
||||||
|
"messages": {
|
||||||
|
"stringTooShort": "Denne linje kan ikke være kortere end {0} karaktere!",
|
||||||
|
"stringTooLong": "Denne linke kan ikke være længere end {0} karaktere!",
|
||||||
|
"stringLengthInvalid": "Denne linje skal være {0} karaktere lang!",
|
||||||
|
"stringStartsWith": "Denne linje skal starte med {0}!",
|
||||||
|
"stringEndsWith": "Denne linje skal ende med {0}!",
|
||||||
|
"stringContains": "Denne tekst skal indeholde {0}!",
|
||||||
|
"stringChoices": "Denne tekst kan kun være en af følgende værdier: {0}!",
|
||||||
|
"stringRegex": "Denne tekst er ugyldig!",
|
||||||
|
|
||||||
|
"numberTooShort": "Dette nummer kan ikke være kortere end {0} tegn!",
|
||||||
|
"numberTooLong": "Dette nummer kan ikke være længere end {0} tegn!",
|
||||||
|
"numberLengthInvalid": "Dette nummer skal være {0} tegn langt!",
|
||||||
|
"numberTooSmall": "Dette nummer skal være mindst {0}!",
|
||||||
|
"numberTooLarge": "Dette nummer skal være højst {0}!",
|
||||||
|
"numberNotEqual": "Dette nummer skal være {0}!",
|
||||||
|
"numberStep": "Dette nummer skal være et multiplum af {0}!",
|
||||||
|
"numberStepOffset": "Dette nummer skal være et multiplum af {0}, startende med {1}!",
|
||||||
|
"numberStartsWith": "Dette nummer skal starte med {0}!",
|
||||||
|
"numberEndsWith": "Dette nummer skal ende med {0}!",
|
||||||
|
"numberContains": "Dette nummer skal indeholde {0}!",
|
||||||
|
"numberChoices": "Dette nummer kan kun være en af følgende værdier: {0}!",
|
||||||
|
"numberFloat": "Dette nummer kan ikke være et decimaltal!",
|
||||||
|
"numberNegative": "Dette nummer kan ikke være negativt!",
|
||||||
|
"numberPositive": "Dette nummer kan ikke være positivt!",
|
||||||
|
"numberZero": "Dette nummer kan ikke være nul!",
|
||||||
|
|
||||||
|
"booleanTrue": "Denne boolean kan ikke være sand!",
|
||||||
|
"booleanFalse": "Denne boolean kan ikke være falsk!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled": "Dette array må ikke være tomt!",
|
||||||
|
"arrayEmptyRequired": "Dette array skal være tomt!",
|
||||||
|
"arrayTooShort": "Dette array skal have en længde på mindst {0}!",
|
||||||
|
"arrayTooLong": "Dette array skal have en længde på højst {0}!",
|
||||||
|
"arrayLengthInvalid": "Dette array skal have en længde på {0}!",
|
||||||
|
"arrayInvalidTypes": "Dette array kan kun indeholde følgende typer: {0}!",
|
||||||
|
"arrayDouble": "Dette array tillader ikke den samme værdi to gange!",
|
||||||
|
|
||||||
|
"discordInvalidId": "Dette er et ugyldigt Discord {0} id!",
|
||||||
|
"discordInvalidIdOptions": "Dette er et ugyldigt Discord {0} id! Du kan også bruge en af disse: {1}!",
|
||||||
|
"discordInvalidToken": "Dette er et ugyldigt Discord token (syntaktisk)!",
|
||||||
|
"colorInvalid": "Dette er en ugyldig hex-farve!",
|
||||||
|
"emojiTooShort": "Denne tekst skal have mindst {0} emojis!",
|
||||||
|
"emojiTooLong": "Denne tekst skal have højst {0} emojis!",
|
||||||
|
"emojiCustom": "Denne emoji kan ikke være en brugerdefineret Discord-emoji!",
|
||||||
|
"emojiInvalid": "Dette er en ugyldig emoji!",
|
||||||
|
"urlInvalid": "Denne URL er ugyldig!",
|
||||||
|
"urlInvalidHttp": "Denne URL kan kun bruge https:// protokollen!",
|
||||||
|
"urlInvalidProtocol": "Denne URL kan kun bruge http:// & https:// protokoller!",
|
||||||
|
"urlInvalidHostname": "Denne URL har et ikke-tilladt hostname!",
|
||||||
|
"urlInvalidExtension": "Denne URL har en ugyldig filendelse! Vælg mellem: {0}!",
|
||||||
|
"urlInvalidPath": "Denne URL har en ugyldig sti!",
|
||||||
|
"idNotUnique": "Dette id er ikke unikt, brug et andet id i stedet!",
|
||||||
|
"idNonExistent": "Id'et {0} eksisterer ikke!",
|
||||||
|
|
||||||
|
"invalidType": "Denne egenskab skal være typen: {0}!",
|
||||||
|
"propertyMissing": "Egenskaben {0} mangler i dette objekt!",
|
||||||
|
"propertyOptional": "Egenskaben {0} er valgfri i dette objekt!",
|
||||||
|
"objectDisabled": "Dette objekt er deaktiveret, aktiver det ved at bruge {0}!",
|
||||||
|
"nullInvalid": "Denne egenskab kan ikke være null!",
|
||||||
|
"switchInvalidType": "Dette skal være en af følgende typer: {0}!",
|
||||||
|
"objectSwitchInvalid": "Dette objekt skal være en af følgende typer: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage": "Dette er et ugyldigt sprog!",
|
||||||
|
"invalidButton": "Denne knap skal have mindst en {0} eller {1}!",
|
||||||
|
"unusedOption": "Muligheden {0} bruges ikke nogen steder!",
|
||||||
|
"unusedQuestion": "Spørgsmålet {0} bruges ikke nogen steder!",
|
||||||
|
"dropdownOption": "Et panel med dropdown aktiveret kan kun indeholde muligheder af typen 'ticket'!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"buttons": {
|
||||||
|
"create": "Opret Ticket",
|
||||||
|
"close": "Luk Ticket",
|
||||||
|
"delete": "Slet Ticket",
|
||||||
|
"reopen": "Genåbn Ticket",
|
||||||
|
"claim": "Tag Ticket",
|
||||||
|
"unclaim": "Fraskriv Ticket",
|
||||||
|
"pin": "Fastgør Ticket",
|
||||||
|
"unpin": "Fjern Fastgørelse af Ticket",
|
||||||
|
"clear": "Slet Tickets",
|
||||||
|
"helpSwitchSlash": "Vis Slash Kommandoer",
|
||||||
|
"helpSwitchText": "Vis Tekst Kommandoer",
|
||||||
|
"helpPage": "Side {0}",
|
||||||
|
"withReason": "Med Årsag",
|
||||||
|
"withoutTranscript": "Uden Transkript"
|
||||||
|
},
|
||||||
|
"titles": {
|
||||||
|
"created": "Ticket Oprettet",
|
||||||
|
"close": "Ticket Lukket",
|
||||||
|
"delete": "Ticket Slettet",
|
||||||
|
"reopen": "Ticket Genåbnet",
|
||||||
|
"claim": "Ticket Taget",
|
||||||
|
"unclaim": "Ticket Fraskrevet",
|
||||||
|
"pin": "Ticket Fastgjort",
|
||||||
|
"unpin": "Ticket Fjernet fra Fastgørelse",
|
||||||
|
"rename": "Ticket Omdøbt",
|
||||||
|
"move": "Ticket Flyttet",
|
||||||
|
"add": "Bruger Tilføjet til Ticket",
|
||||||
|
"remove": "Bruger Fjernet fra Ticket",
|
||||||
|
|
||||||
|
"help": "Tilgængelige Kommandoer",
|
||||||
|
"statsReset": "Nulstil Statistik",
|
||||||
|
"blacklistAdd": "Bruger Blacklistet",
|
||||||
|
"blacklistRemove": "Bruger Fjernet fra Blacklist",
|
||||||
|
"blacklistGet": "Blacklistet Bruger",
|
||||||
|
"blacklistView": "Nuværende Blacklist",
|
||||||
|
"blacklistAddDm": "Tilføjet til Blacklist",
|
||||||
|
"blacklistRemoveDm": "Fjernet fra Blacklist",
|
||||||
|
"clear": "Tickets Renset",
|
||||||
|
"roles": "Roller Opdateret",
|
||||||
|
|
||||||
|
"autoclose": "Ticket Autolukket",
|
||||||
|
"autocloseEnabled": "Autolukning Aktiveret",
|
||||||
|
"autocloseDisabled": "Autolukning Deaktiveret",
|
||||||
|
"autodelete": "Ticket Autoslettet",
|
||||||
|
"autodeleteEnabled": "Autosletning Aktiveret",
|
||||||
|
"autodeleteDisabled": "Autosletning Deaktiveret"
|
||||||
|
},
|
||||||
|
"descriptions": {
|
||||||
|
"create": "Din ticket er blevet oprettet. Klik på knappen nedenfor for at få adgang til den!",
|
||||||
|
"close": "ticket er blevet lukket succesfuldt!",
|
||||||
|
"delete": "ticket er blevet slettet succesfuldt!",
|
||||||
|
"reopen": "ticket er blevet genåbnet succesfuldt!",
|
||||||
|
"claim": "ticket er blevet taget succesfuldt!",
|
||||||
|
"unclaim": "ticket er blevet fraskrevet succesfuldt!",
|
||||||
|
"pin": "ticket er blevet fastgjort succesfuldt!",
|
||||||
|
"unpin": "ticket er blevet fjernet fra fastgørelse succesfuldt!",
|
||||||
|
"rename": "ticket er blevet omdøbt til {0} succesfuldt!",
|
||||||
|
"move": "ticket er blevet flyttet til {0} succesfuldt!",
|
||||||
|
"add": "{0} er blevet tilføjet til ticketten succesfuldt!",
|
||||||
|
"remove": "{0} er blevet fjernet fra ticketten succesfuldt!",
|
||||||
|
|
||||||
|
"helpExplanation": "`<name>` => påkrævet parameter\n`[name]` => valgfri parameter",
|
||||||
|
"statsReset": "Bot-statistikken er blevet nulstillet succesfuldt!",
|
||||||
|
"statsError": "Kan ikke vise ticketstatistik!\n{0} er ikke en ticket!",
|
||||||
|
"blacklistAdd": "{0} er blevet blacklistet succesfuldt!",
|
||||||
|
"blacklistRemove": "{0} er blevet frigivet succesfuldt!",
|
||||||
|
"blacklistGetSuccess": "{0} er i øjeblikket blacklistet!",
|
||||||
|
"blacklistGetEmpty": "{0} er i øjeblikket ikke blacklistet!",
|
||||||
|
"blacklistViewEmpty": "Ingen har endnu været blacklistet!",
|
||||||
|
"blacklistViewTip": "Brug \"/blacklist add\" for at blacklist en bruger!",
|
||||||
|
"clearVerify": "Er du sikker på, at du vil slette flere tickets?\nDenne handling kan ikke fortrydes!",
|
||||||
|
"clearReady": "{0} tickets er blevet slettet succesfuldt!",
|
||||||
|
"rolesEmpty": "Ingen roller er blevet opdateret!",
|
||||||
|
|
||||||
|
"autocloseLeave": "Denne ticket er blevet autolukket, fordi skaberen forlod serveren!",
|
||||||
|
"autocloseTimeout": "Denne ticket er blevet autolukket, fordi den har været inaktiv i mere end `{0}h`!",
|
||||||
|
"autodeleteLeave": "Denne ticket er blevet autoslettet, fordi skaberen forlod serveren!",
|
||||||
|
"autodeleteTimeout": "Denne ticket er blevet autoslettet, fordi den har været inaktiv i mere end `{0} dage`!",
|
||||||
|
"autocloseEnabled": "Autolukning er blevet aktiveret i denne ticket!\nDen vil blive lukket, når den er inaktiv i mere end `{0}h`!",
|
||||||
|
"autocloseDisabled": "Autolukning er blevet deaktiveret i denne ticket!\nDen vil ikke blive lukket automatisk længere!",
|
||||||
|
"autodeleteEnabled": "Autosletning er blevet aktiveret i denne ticket!\nDen vil blive slettet, når den er inaktiv i mere end `{0} dage`!",
|
||||||
|
"autodeleteDisabled": "Autosletning er blevet deaktiveret i denne ticket!\nDen vil ikke blive slettet automatisk længere!",
|
||||||
|
|
||||||
|
"ticketMessageLimit": "Du kan kun oprette {0} ticket(ter) ad gangen!",
|
||||||
|
"ticketMessageAutoclose": "Denne ticket vil blive autolukket, når den er inaktiv i {0}h!",
|
||||||
|
"ticketMessageAutodelete": "Denne ticket vil blive autoslettet, når den er inaktiv i {0} dage!",
|
||||||
|
"panelReady": "Du kan finde panelet nedenfor!\nDenne besked kan nu slettes!"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"closePlaceholder": "Hvorfor lukkede du denne ticket?",
|
||||||
|
"deletePlaceholder": "Hvorfor slettede du denne ticket?",
|
||||||
|
"reopenPlaceholder": "Hvorfor genåbnede du denne ticket?",
|
||||||
|
"claimPlaceholder": "Hvorfor tog du denne ticket?",
|
||||||
|
"unclaimPlaceholder": "Hvorfor fraskrev du denne ticket?",
|
||||||
|
"pinPlaceholder": "Hvorfor fastgjorde du denne ticket?",
|
||||||
|
"unpinPlaceholder": "Hvorfor fjernede du fastgørelsen af denne ticket?"
|
||||||
|
},
|
||||||
|
"logs": {
|
||||||
|
"createLog": "En ny ticket er blevet oprettet af {0}!",
|
||||||
|
"closeLog": "Denne ticket er blevet lukket af {0}!",
|
||||||
|
"closeDm": "Din ticket er blevet lukket på vores server!",
|
||||||
|
"deleteLog": "Denne ticket er blevet slettet af {0}!",
|
||||||
|
"deleteDm": "Din ticket er blevet slettet på vores server!",
|
||||||
|
"reopenLog": "Denne ticket er blevet genåbnet af {0}!",
|
||||||
|
"reopenDm": "Din ticket er blevet genåbnet på vores server!",
|
||||||
|
"claimLog": "Denne ticket er blevet taget af {0}!",
|
||||||
|
"claimDm": "Din ticket er blevet taget på vores server!",
|
||||||
|
"unclaimLog": "Denne ticket er blevet fraskrevet af {0}!",
|
||||||
|
"unclaimDm": "Din ticket er blevet fraskrevet på vores server!",
|
||||||
|
"pinLog": "Denne ticket er blevet fastgjort af {0}!",
|
||||||
|
"pinDm": "Din ticket er blevet fastgjort på vores server!",
|
||||||
|
"unpinLog": "Denne ticket er blevet fjernet fra fastgørelse af {0}!",
|
||||||
|
"unpinDm": "Din ticket er blevet fjernet fra fastgørelse på vores server!",
|
||||||
|
"renameLog": "Denne ticket er blevet omdøbt til {0} af {1}!",
|
||||||
|
"renameDm": "Din ticket er blevet omdøbt til {0} på vores server!",
|
||||||
|
"moveLog": "Denne ticket er blevet flyttet til {0} af {1}!",
|
||||||
|
"moveDm": "Din ticket er blevet flyttet til {0} på vores server!",
|
||||||
|
"addLog": "{0} er blevet tilføjet til denne ticket af {1}!",
|
||||||
|
"addDm": "{0} er blevet tilføjet til din ticket på vores server!",
|
||||||
|
"removeLog": "{0} er blevet fjernet fra denne ticket af {1}!",
|
||||||
|
"removeDm": "{0} er blevet fjernet fra din ticket på vores server!",
|
||||||
|
|
||||||
|
"blacklistAddLog": "{0} er blevet blacklistet af {1}!",
|
||||||
|
"blacklistRemoveLog": "{0} er blevet fjernet fra blacklisten af {1}!",
|
||||||
|
"blacklistAddDm": "Du er blevet blacklistet på vores server!\nFra nu af kan du ikke oprette en ticket!",
|
||||||
|
"blacklistRemoveDm": "Du er blevet fjernet fra blacklisten på vores server!\nNu kan du igen oprette ticketter!",
|
||||||
|
"clearLog": "{0} ticketter er blevet slettet af {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts": {
|
||||||
|
"success": {
|
||||||
|
"visit": "Besøg Transkript",
|
||||||
|
"ready": "Transkript Oprettet",
|
||||||
|
"textFileDescription": "Dette er teksttranskriptet af en slettet billet!",
|
||||||
|
"htmlProgress": "Vent venligst mens dette HTML-transkript bliver behandlet...",
|
||||||
|
|
||||||
|
"createdChannel": "Et nyt {0} transkript er blevet oprettet på serveren!",
|
||||||
|
"createdCreator": "Et nyt {0} transkript er blevet oprettet for en af dine billetter!",
|
||||||
|
"createdParticipant": "Et nyt {0} transkript er blevet oprettet i en af de billetter, du deltog i!",
|
||||||
|
"createdActiveAdmin": "Et nyt {0} transkript er blevet oprettet i en af de billetter, hvor du deltog som administrator!",
|
||||||
|
"createdEveryAdmin": "Et nyt {0} transkript er blevet oprettet i en af de billetter, hvor du var administrator!",
|
||||||
|
"createdOther": "Et nyt {0} transkript er blevet oprettet!"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"retry": "Prøv igen",
|
||||||
|
"continue": "Slet uden transkript",
|
||||||
|
"backup": "Opret backup-transkript",
|
||||||
|
"error": "Noget gik galt, da vi forsøgte at oprette transkriptet.\nHvad vil du gerne gøre?\n\nDenne ticket bliver ikke slettet, før du klikker på en af disse knapper."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"titles": {
|
||||||
|
"internalError": "Intern fejl",
|
||||||
|
"optionMissing": "Kommandoindstilling mangler",
|
||||||
|
"optionInvalid": "Ugyldig kommandoindstilling",
|
||||||
|
"unknownCommand": "Ukendt kommando",
|
||||||
|
"noPermissions": "Ingen tilladelser",
|
||||||
|
"unknownTicket": "Ukendt ticket",
|
||||||
|
"deprecatedTicket": "Forældet ticket",
|
||||||
|
"unknownOption": "Ukendt indstilling",
|
||||||
|
"unknownPanel": "Ukendt panel",
|
||||||
|
"notInGuild": "Ikke på server",
|
||||||
|
"channelRename": "Kan ikke omdøbe kanalen",
|
||||||
|
"busy": "Ticket er optaget"
|
||||||
|
},
|
||||||
|
"descriptions": {
|
||||||
|
"askForInfo": "Kontakt ejeren af denne bot for mere info!",
|
||||||
|
"askForInfoResolve": "Kontakt ejeren af denne bot, hvis problemet ikke løses efter et par forsøg.",
|
||||||
|
"internalError": "Kunne ikke svare på denne {0} på grund af en intern fejl!",
|
||||||
|
"optionMissing": "Der mangler en påkrævet parameter i denne kommando!",
|
||||||
|
"optionInvalid": "En parameter i denne kommando er ugyldig!",
|
||||||
|
"optionInvalidChoose": "Vælg mellem",
|
||||||
|
"unknownCommand": "Prøv at besøge hjælpe-menuen for mere info!",
|
||||||
|
"noPermissions": "Du har ikke tilladelse til at bruge denne {0}!",
|
||||||
|
"noPermissionsList": "Påkrævede tilladelser: (en af dem)",
|
||||||
|
"noPermissionsCooldown": "Du har ikke tilladelse til at bruge denne {0}, fordi du har en nedkølingsperiode!",
|
||||||
|
"noPermissionsBlacklist": "Du har ikke tilladelse til at bruge denne {0}, fordi du er blevet sortlistet!",
|
||||||
|
"noPermissionsLimitGlobal": "Du har ikke tilladelse til at oprette en ticket, fordi serveren har nået det maksimale antal tickets!",
|
||||||
|
"noPermissionsLimitGlobalUser": "Du har ikke tilladelse til at oprette en ticket, fordi du har nået det maksimale antal tickets!",
|
||||||
|
"noPermissionsLimitOption": "Du har ikke tilladelse til at oprette en ticket, fordi serveren har nået det maksimale antal tickets for denne indstilling!",
|
||||||
|
"noPermissionsLimitOptionUser": "Du har ikke tilladelse til at oprette en ticket, fordi du har nået det maksimale antal tickets for denne indstilling!",
|
||||||
|
"unknownTicket": "Prøv denne kommando igen i en gyldig ticket!",
|
||||||
|
"deprecatedTicket": "Den aktuelle kanal er ikke en gyldig ticket! Det kan være en ticket fra en ældre version af Open Ticket!",
|
||||||
|
"notInGuild": "Denne {0} virker ikke i DM! Prøv igen på en server!",
|
||||||
|
"channelRename": "På grund af Discord-ratelimits er det i øjeblikket umuligt for botten at omdøbe kanalen. Kanalen vil automatisk blive omdøbt inden for 10 minutter, hvis botten ikke genstartes.",
|
||||||
|
"channelRenameSource": "Kilden til denne fejl er: {0}",
|
||||||
|
"busy": "Kan ikke bruge denne {0}!\nTicketen bliver i øjeblikket behandlet af botten.\n\nPrøv igen om et par sekunder!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons": {
|
||||||
|
"stringRegex": "Værdien matcher ikke mønsteret!",
|
||||||
|
"stringMinLength": "Værdien skal være mindst {0} tegn!",
|
||||||
|
"stringMaxLength": "Værdien skal være højst {0} tegn!",
|
||||||
|
"numberInvalid": "Ugyldigt tal!",
|
||||||
|
"numberMin": "Tallet skal være mindst {0}!",
|
||||||
|
"numberMax": "Tallet skal være højst {0}!",
|
||||||
|
"numberDecimal": "Tallet må ikke være et decimaltal!",
|
||||||
|
"numberNegative": "Tallet må ikke være negativt!",
|
||||||
|
"numberPositive": "Tallet må ikke være positivt!",
|
||||||
|
"numberZero": "Tallet må ikke være nul!",
|
||||||
|
"channelNotFound": "Kan ikke finde kanalen!",
|
||||||
|
"userNotFound": "Kan ikke finde brugeren!",
|
||||||
|
"roleNotFound": "Kan ikke finde rollen!",
|
||||||
|
"memberNotFound": "Kan ikke finde brugeren!",
|
||||||
|
"mentionableNotFound": "Kan ikke finde brugeren eller rollen!",
|
||||||
|
"channelType": "Ugyldig kanaltype!",
|
||||||
|
"notInGuild": "Denne mulighed kræver, at du er på en server!"
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"developer": "Du skal være udvikler af botten.",
|
||||||
|
"owner": "Du skal være serverejer.",
|
||||||
|
"admin": "Du skal være serveradministrator.",
|
||||||
|
"moderator": "Du skal være moderator.",
|
||||||
|
"support": "Du skal være en del af supportteamet.",
|
||||||
|
"member": "Du skal være medlem.",
|
||||||
|
"discord-administrator": "Du skal have `ADMINISTRATOR` tilladelsen."
|
||||||
|
},
|
||||||
|
"actionInvalid": {
|
||||||
|
"close": "Ticket er allerede lukket!",
|
||||||
|
"reopen": "Ticket er ikke lukket endnu!",
|
||||||
|
"claim": "Ticket er allerede gjort krav på!",
|
||||||
|
"unclaim": "Ticket er ikke gjort krav på endnu!",
|
||||||
|
"pin": "Ticket er allerede fastgjort!",
|
||||||
|
"unpin": "Ticket er ikke fastgjort endnu!",
|
||||||
|
"add": "Denne bruger har allerede adgang til ticketen!",
|
||||||
|
"remove": "Kan ikke fjerne denne bruger fra ticketen!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"uppercase": {
|
||||||
|
"ticket": "Ticket",
|
||||||
|
"tickets": "Tickets",
|
||||||
|
"reason": "Årsag",
|
||||||
|
"creator": "Skaber",
|
||||||
|
"remaining": "Tid tilbage",
|
||||||
|
"added": "Tilføjet",
|
||||||
|
"removed": "Fjernet",
|
||||||
|
"filter": "Filter",
|
||||||
|
"claimedBy": "Gjort krav på af {0}",
|
||||||
|
"method": "Metode",
|
||||||
|
"type": "Type",
|
||||||
|
"blacklisted": "Sortlistet",
|
||||||
|
"panel": "Panel",
|
||||||
|
"command": "Kommando",
|
||||||
|
"system": "System",
|
||||||
|
"true": "Sand",
|
||||||
|
"false": "Falsk",
|
||||||
|
"syntax": "Syntaks",
|
||||||
|
"originalName": "Originalt navn",
|
||||||
|
"newName": "Nyt navn",
|
||||||
|
"until": "Indtil",
|
||||||
|
"validOptions": "Gyldige indstillinger",
|
||||||
|
"validPanels": "Gyldige paneler",
|
||||||
|
"autoclose": "Auto-lukning",
|
||||||
|
"autodelete": "Auto-sletning",
|
||||||
|
"startupDate": "Startdato",
|
||||||
|
"version": "Version",
|
||||||
|
"name": "Navn",
|
||||||
|
"role": "Rolle",
|
||||||
|
"status": "Status",
|
||||||
|
"claimed": "Gjort krav på",
|
||||||
|
"pinned": "Fastgjort",
|
||||||
|
"creationDate": "Oprettelsesdato"
|
||||||
|
},
|
||||||
|
"lowercase": {
|
||||||
|
"text": "tekst",
|
||||||
|
"html": "html",
|
||||||
|
"command": "kommando",
|
||||||
|
"modal": "modal",
|
||||||
|
"button": "knap",
|
||||||
|
"dropdown": "dropdown",
|
||||||
|
"method": "metode"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands": {
|
||||||
|
"reason": "Angiv en valgfri årsag, der vil være synlig i loggene.",
|
||||||
|
"help": "Få en liste over alle tilgængelige kommandoer.",
|
||||||
|
"panel": "Opret en besked med en dropdown eller knapper (til ticket-oprettelse).",
|
||||||
|
"panelId": "Identifikatoren for panelet, som du vil oprette.",
|
||||||
|
"panelAutoUpdate": "Vil du have, at dette panel automatisk opdateres, når det redigeres?",
|
||||||
|
"ticket": "Opret en ticket med det samme.",
|
||||||
|
"ticketId": "Identifikatoren for ticketen, som du vil oprette.",
|
||||||
|
"close": "Luk en ticket.",
|
||||||
|
"delete": "Slet en ticket.",
|
||||||
|
"deleteNoTranscript": "Slet denne ticket uden at oprette et transkript.",
|
||||||
|
"reopen": "Genåbn en ticket.",
|
||||||
|
"claim": "Gør krav på en ticket.",
|
||||||
|
"claimUser": "Gør krav på denne ticket til en anden bruger i stedet for dig selv.",
|
||||||
|
"unclaim": "Afstå fra krav på en ticket.",
|
||||||
|
"pin": "Fastgør en ticket.",
|
||||||
|
"unpin": "Frigør en fastgjort ticket.",
|
||||||
|
"move": "Flyt en ticket.",
|
||||||
|
"moveId": "Identifikatoren for den indstilling, du vil flytte til.",
|
||||||
|
"rename": "Omdøb en ticket.",
|
||||||
|
"renameName": "Det nye navn for denne ticket.",
|
||||||
|
"add": "Tilføj en bruger til en ticket.",
|
||||||
|
"addUser": "Brugeren, der skal tilføjes.",
|
||||||
|
"remove": "Fjern en bruger fra en ticket.",
|
||||||
|
"removeUser": "Brugeren, der skal fjernes.",
|
||||||
|
"blacklist": "Administrer ticket-blacklisten.",
|
||||||
|
"blacklistView": "Se en liste over den nuværende blacklist.",
|
||||||
|
"blacklistAdd": "Tilføj en bruger til blacklisten.",
|
||||||
|
"blacklistRemove": "Fjern en bruger fra blacklisten.",
|
||||||
|
"blacklistGet": "Få detaljer fra en sortlistet bruger.",
|
||||||
|
"blacklistGetUser": "Brugeren at få detaljer fra.",
|
||||||
|
"stats": "Se statistik fra botten, en bruger eller en ticket.",
|
||||||
|
"statsReset": "Nulstil al statistik for botten (og start tælling fra nul).",
|
||||||
|
"statsGlobal": "Se de globale statistikker.",
|
||||||
|
"statsUser": "Se statistik fra en bruger på serveren.",
|
||||||
|
"statsUserUser": "Brugeren, der skal vises.",
|
||||||
|
"statsTicket": "Se statistik for en ticket på serveren.",
|
||||||
|
"statsTicketTicket": "Ticketen, der skal vises.",
|
||||||
|
"clear": "Slet flere tickets på samme tid.",
|
||||||
|
"clearFilter": "Filteret til at rydde tickets.",
|
||||||
|
"clearFilters": {
|
||||||
|
"all": "Alle",
|
||||||
|
"open": "Åbne",
|
||||||
|
"close": "Lukkede",
|
||||||
|
"claim": "Gjort krav på",
|
||||||
|
"unclaim": "Ikke gjort krav på",
|
||||||
|
"pin": "Fastgjort",
|
||||||
|
"unpin": "Ikke fastgjort",
|
||||||
|
"autoclose": "Auto-lukket"
|
||||||
|
},
|
||||||
|
"autoclose": "Administrer auto-lukning i en ticket.",
|
||||||
|
"autocloseDisable": "Deaktiver auto-lukning i denne ticket.",
|
||||||
|
"autocloseEnable": "Aktiver auto-lukning i denne ticket.",
|
||||||
|
"autocloseEnableTime": "Antal timer, denne ticket skal være inaktiv for at lukke den.",
|
||||||
|
"autodelete": "Administrer auto-sletning i en ticket.",
|
||||||
|
"autodeleteDisable": "Deaktiver auto-sletning i denne ticket.",
|
||||||
|
"autodeleteEnable": "Aktiver auto-sletning i denne ticket.",
|
||||||
|
"autodeleteEnableTime": "Antal dage, denne ticket skal være inaktiv for at slette den."
|
||||||
|
},
|
||||||
|
"helpMenu": {
|
||||||
|
"help": "Få en liste over alle de tilgængelige kommandoer.",
|
||||||
|
"ticket": "Opret en ticket med det samme.",
|
||||||
|
"close": "Luk en ticket, dette deaktiverer skrivning i denne kanal.",
|
||||||
|
"delete": "Slet en ticket, dette opretter et transkript, når det er aktiveret.",
|
||||||
|
"reopen": "Genåbn en ticket, dette aktiverer skrivning i denne kanal igen.",
|
||||||
|
"pin": "Fastgør en ticket. Dette vil flytte ticketen til toppen og tilføje en '📌' emoji til navnet.",
|
||||||
|
"unpin": "Frigør en ticket. Ticketen forbliver på sin position, men mister '📌' emoji.",
|
||||||
|
"move": "Flyt en ticket. Dette vil ændre typen af denne ticket.",
|
||||||
|
"rename": "Omdøb en ticket. Dette vil ændre kanalnavnet på denne ticket.",
|
||||||
|
"claim": "Gør krav på en ticket. Med dette kan du lade dit team vide, at du håndterer denne ticket.",
|
||||||
|
"unclaim": "Afstå fra krav på en ticket. Med dette kan du lade dit team vide, at denne ticket er fri igen.",
|
||||||
|
"add": "Tilføj en bruger til en ticket. Dette vil give brugeren mulighed for at læse og skrive i denne ticket.",
|
||||||
|
"remove": "Fjern en bruger fra en ticket. Dette vil fjerne muligheden for at læse og skrive for en bruger i denne ticket.",
|
||||||
|
"panel": "Opret en besked med en dropdown eller knapper (til ticket-oprettelse).",
|
||||||
|
"blacklistView": "Se en liste over den nuværende blacklist.",
|
||||||
|
"blacklistAdd": "Tilføj en bruger til blacklisten.",
|
||||||
|
"blacklistRemove": "Fjern en bruger fra blacklisten.",
|
||||||
|
"blacklistGet": "Få detaljerne fra en sortlistet bruger.",
|
||||||
|
"statsGlobal": "Se de globale statistikker.",
|
||||||
|
"statsTicket": "Se statistikken for en ticket på serveren.",
|
||||||
|
"statsUser": "Se statistikken fra en bruger på serveren.",
|
||||||
|
"statsReset": "Nulstil al statistik for botten (og start tælling fra nul).",
|
||||||
|
"autocloseDisable": "Deaktiver auto-lukning i denne ticket.",
|
||||||
|
"autocloseEnable": "Aktiver auto-lukning i denne ticket.",
|
||||||
|
"autodeleteDisable": "Deaktiver auto-sletning i denne ticket.",
|
||||||
|
"autodeleteEnable": "Aktiver auto-sletning i denne ticket."
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"scopes": {
|
||||||
|
"global": "Globale Statistikker",
|
||||||
|
"system": "Systemstatistikker",
|
||||||
|
"user": "Brugerstatistikker",
|
||||||
|
"ticket": "Ticketstatistikker",
|
||||||
|
"participants": "Deltagere"
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"ticketsCreated": "Oprettede Tickets",
|
||||||
|
"ticketsClosed": "Lukkede Tickets",
|
||||||
|
"ticketsDeleted": "Slettede Tickets",
|
||||||
|
"ticketsReopened": "Genåbnede Tickets",
|
||||||
|
"ticketsAutoclosed": "Auto-lukkede Tickets",
|
||||||
|
"ticketsClaimed": "Gjorte krav på Tickets",
|
||||||
|
"ticketsPinned": "Fastgjorte Tickets",
|
||||||
|
"ticketsMoved": "Flyttede Tickets",
|
||||||
|
"usersBlacklisted": "Sortlistede Brugere",
|
||||||
|
"transcriptsCreated": "Oprettede Transkripter"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user