@mostfeatured/dbi 0.0.30 → 0.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.gitattributes CHANGED
@@ -1,2 +1,2 @@
1
- # Auto detect text files and perform LF normalization
2
- * text=auto
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
@@ -1 +1 @@
1
- {"version":3,"file":"customId.d.ts","sourceRoot":"","sources":["../../src/utils/customId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAG7B,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,EAAC,MAAM,GAAG,MAAM,CAiB9F;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAA;CAAC,CAYrF"}
1
+ {"version":3,"file":"customId.d.ts","sourceRoot":"","sources":["../../src/utils/customId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAG7B,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,EAAC,MAAM,GAAG,MAAM,CAkB9F;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAA;CAAC,CAYrF"}
@@ -20,6 +20,8 @@ function customIdBuilder(dbi, name, customData, ttl) {
20
20
  return `¤${id}`;
21
21
  })
22
22
  ].join("—");
23
+ if (!dbi.config.strict)
24
+ customId = customId.slice(0, 100);
23
25
  if (customId.length > 100)
24
26
  throw new Error("Custom id cannot be longer than 100 characters.");
25
27
  return customId;
@@ -1 +1 @@
1
- {"version":3,"file":"customId.js","sourceRoot":"","sources":["../../src/utils/customId.ts"],"names":[],"mappings":";;;;AACA,uDAAiC;AAEjC,SAAgB,eAAe,CAAC,GAAQ,EAAE,IAAY,EAAE,UAAiB,EAAE,GAAW;IACpF,IAAI,QAAQ,GAAG;QACb,IAAI;QACJ,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,OAAO,KAAK,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC3C,IAAI,OAAO,KAAK,IAAI,QAAQ;gBAAE,OAAO,IAAI,KAAK,EAAE,CAAC;YACjD,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBACnB,IAAI,EAAE,EAAE;gBACR,MAAM,KAAK,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAC9C,CAAC,CAAA;YACF,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACtD,OAAO,IAAI,EAAE,EAAE,CAAC;QAClB,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAC7F,OAAO,QAAQ,CAAC;AAClB,CAAC;AAjBD,0CAiBC;AAED,SAAgB,aAAa,CAAC,GAAQ,EAAE,QAAgB;IACtD,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC9B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO;QACL,IAAI;QACJ,IAAI;KACL,CAAA;AACH,CAAC;AAZD,sCAYC","sourcesContent":["import { DBI } from \"../DBI\";\r\nimport * as stuffs from \"stuffs\";\r\n\r\nexport function customIdBuilder(dbi: DBI, name: string, customData: any[], ttl?:number): string {\r\n let customId = [\r\n name,\r\n ...customData.map(value => {\r\n if (typeof value == \"string\") return value;\r\n if (typeof value == \"number\") return `π${value}`;\r\n let id = stuffs.randomString(8);\r\n Object.assign(value, {\r\n $ref: id,\r\n $unRef() { return dbi.data.refs.delete(id); },\r\n })\r\n dbi.data.refs.set(id, { at: Date.now(), value, ttl });\r\n return `¤${id}`;\r\n })\r\n ].join(\"—\");\r\n if (customId.length > 100) throw new Error(\"Custom id cannot be longer than 100 characters.\")\r\n return customId;\r\n}\r\n\r\nexport function parseCustomId(dbi: DBI, customId: string): {name: string, data: any[]} {\r\n let splitted = customId.split(\"—\");\r\n let name = splitted.shift();\r\n let data = splitted.map(value => {\r\n if (value.startsWith(\"π\")) return Number(value.slice(1));\r\n if (value.startsWith(\"¤\")) return dbi.data.refs.get(value.slice(1))?.value;\r\n return value;\r\n });\r\n return {\r\n name,\r\n data\r\n }\r\n}"]}
1
+ {"version":3,"file":"customId.js","sourceRoot":"","sources":["../../src/utils/customId.ts"],"names":[],"mappings":";;;;AACA,uDAAiC;AAEjC,SAAgB,eAAe,CAAC,GAAQ,EAAE,IAAY,EAAE,UAAiB,EAAE,GAAW;IACpF,IAAI,QAAQ,GAAG;QACb,IAAI;QACJ,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,OAAO,KAAK,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC3C,IAAI,OAAO,KAAK,IAAI,QAAQ;gBAAE,OAAO,IAAI,KAAK,EAAE,CAAC;YACjD,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBACnB,IAAI,EAAE,EAAE;gBACR,MAAM,KAAK,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAC9C,CAAC,CAAA;YACF,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACtD,OAAO,IAAI,EAAE,EAAE,CAAC;QAClB,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM;QAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAC7F,OAAO,QAAQ,CAAC;AAClB,CAAC;AAlBD,0CAkBC;AAED,SAAgB,aAAa,CAAC,GAAQ,EAAE,QAAgB;IACtD,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC9B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO;QACL,IAAI;QACJ,IAAI;KACL,CAAA;AACH,CAAC;AAZD,sCAYC","sourcesContent":["import { DBI } from \"../DBI\";\r\nimport * as stuffs from \"stuffs\";\r\n\r\nexport function customIdBuilder(dbi: DBI, name: string, customData: any[], ttl?:number): string {\r\n let customId = [\r\n name,\r\n ...customData.map(value => {\r\n if (typeof value == \"string\") return value;\r\n if (typeof value == \"number\") return `π${value}`;\r\n let id = stuffs.randomString(8);\r\n Object.assign(value, {\r\n $ref: id,\r\n $unRef() { return dbi.data.refs.delete(id); },\r\n })\r\n dbi.data.refs.set(id, { at: Date.now(), value, ttl });\r\n return `¤${id}`;\r\n })\r\n ].join(\"—\");\r\n if (!dbi.config.strict) customId = customId.slice(0, 100);\r\n if (customId.length > 100) throw new Error(\"Custom id cannot be longer than 100 characters.\")\r\n return customId;\r\n}\r\n\r\nexport function parseCustomId(dbi: DBI, customId: string): {name: string, data: any[]} {\r\n let splitted = customId.split(\"—\");\r\n let name = splitted.shift();\r\n let data = splitted.map(value => {\r\n if (value.startsWith(\"π\")) return Number(value.slice(1));\r\n if (value.startsWith(\"¤\")) return dbi.data.refs.get(value.slice(1))?.value;\r\n return value;\r\n });\r\n return {\r\n name,\r\n data\r\n }\r\n}"]}
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "stuffs": "^0.1.17"
10
10
  },
11
11
  "name": "@mostfeatured/dbi",
12
- "version": "0.0.30",
12
+ "version": "0.0.31",
13
13
  "main": "dist/index.js",
14
14
  "type": "commonjs",
15
15
  "private": false,
package/readme.md CHANGED
@@ -1,34 +1,282 @@
1
- # DiscordBotInfrastructure
1
+ # DiscordBotInfrastructure - [Turkish]
2
2
 
3
- Büyük ihtimalle internette bulabileceğiniz kullanımı basit ve en kullanışlı altyapı bu olabilir.
3
+ İnternet üzerinde bulabileceğiniz en gelişmiş, güncel ve kullanımı basit Discord bot altyapısı.
4
4
 
5
- ## Hemen Kullanımına Geçelim
6
- Unutmadan söyleyeyim bu altyapı diğer alışık olduğunuz altyapılar gibi kendi halinde bir proje değil, bir NPM modülüdür. Bu yüzden kullanmaya başlamak için bir klasör açıyoruz ve içerisine `npm install @mostfeatured/dbi` komutunu kullanarak altyapıyı indiriyoruz.
5
+ # Kullanım Senaryosu
7
6
 
8
- Önce `3 dosya` ve `1 klasöre` ihitiyacımız var. Bu yapı tamamen sizin keyfinize kalmış bir durumda ancak ben bu şekilde kullanıyorum ve tavsiye ediyorum.
7
+ MostFeatured/DiscordBotInfrastructure projesi diğer alışık olduğunuz altyapılar gibi kendi halinde bir proje değil, bir NPM modülüdür. Bu bağlamda kullanmaya başlamadan önce bir klasör açmanız ve içerisine `npm install @mostfeatured/dbi discord.js` komutunu girerek altyapıyı ve discord.js'i indirmeniz gerekmektedir.
9
8
 
10
- Neyse, açacağamız dosyalar ve klasörler şunlar; `dbi.js`, `login.js`, `publish.js` dosyaları ve `src` klasörü.
9
+ # Başlarken
11
10
 
12
- İlk olarak `dbi.js` adındaki dosyamı açıyorum ve içerisine altyapının temellerini atıyorum.
13
- ![1](https://i.imgur.com/I3NV7MD.png)
11
+ İlk olarak `3 dosya` ve `1 klasöre` ihitiyacımız olacak. Bu yapı tamamen sizin çalışma düzeninize uygun olarak konfigüre edilebilmektedir. Lakin bizim önerdiğimiz senaryo aşağıdaki gibidir.
14
12
 
15
- `createDBI()` fonksiyonu ile altyapıyı başlatıyorum. Fonksiyonun ilk parametresi botunuzun `kodAdı`, ikinci parametresi ise botunuzun konfigürasyonudur.
13
+ Açılması gereken dosyalar ve klasörler; `dbi.js`, `login.js`, `publish.js` dosyaları ve `src` klasörü.
16
14
 
15
+ 1. adım olarak `dbi.js` adındaki dosyamızı açıyoruz ve içerisine altyapının temellerini atıyoruz.
16
+ ```js
17
+ const { createDBI } = require("@mostfeatured/dbi");
17
18
 
19
+ let dbi = createDBI("xd", {
20
+ strict: true,
21
+ discord: {
22
+ token: "<yourTokenHere>",
23
+ options: {
24
+ intents: [
25
+ "Guilds"
26
+ ]
27
+ }
28
+ },
29
+ defaults: {
30
+ locale: "en",
31
+ defaultMemberPermissions: ["SendMessages"],
32
+ directMessages: false
33
+ },
34
+ references: {
35
+ autoClear: {
36
+ ttl: 60 * 1000 * 60,
37
+ check: 60 * 1000
38
+ }
39
+ }
40
+ });
18
41
 
19
- İkinci olarak `login.js` dosyamı açıyorum ve içerisine botu açmak için kullanacağım kod gurubunu yazıyorum.
20
- ![2](https://i.imgur.com/Kn9ELps.png)
42
+ module.exports = dbi;
43
+ ```
21
44
 
22
- İçeriye `recursiveImport()` fonksiyonunu alıyorum. Bu fonksiyon ile sonsuz bir şekilde `x` klasöründeki bütün dosyaları `import`/`require` edebiliyoruz, bu sayede altyapı bu dosyalardan haberdar oluyor.
23
- Ana `dbi.js` dosyamdan altyapıma ulaşıyorum. Ve `async` bir ortam oluşturup ilk önce tüm proje dosylarını altyapıya tanımlıyorum. Tanımlamanın ardından tanımladığım tüm özellikleri altyapıya `load()` fonksiyonunu ile yüklüyorum. Hemen ardından `login()` fonksiyonu ile Discord'a giriş sağlıyorum.
45
+ `createDBI()` fonksiyonu ile altyapıyı başlatıyoruz. Fonksiyonun ilk parametresi botunuzun `kodAdı`, ikinci parametresi ise botunuzun konfigürasyonudur.
24
46
 
47
+ 2. adım olarak `login.js` dosyamızı açıyoruz ve içerisine botu açmak için kullanacağımız kod gurubunu yazıyoruz.
48
+ ```js
49
+ const { recursiveImport } = require("@mostfeatured/dbi");
50
+ const dbi = require("./dbi");
25
51
 
26
- Üçüncü olarak `publish.js` dosyamı açıyorum ve ikinci aşamada yaptığım tüm herşeyi tekrardan yapıyorum.
27
- ![3](https://i.imgur.com/p2VI6Js.png)
52
+ (async () => {
53
+ await recursiveImport("./src");
28
54
 
29
- Ancak `login()` fonksiyonunu çağırmak yerine, `publish()` fonksiyonunu çağrıyorum bu fonksiyon ile botumun komutlarını istediğim yere tanıtıyorum.
55
+ await dbi.load();
56
+ await dbi.login();
30
57
 
58
+ await dbi.client.user.setActivity({
59
+ name: "MostFeatured ❤️ TheArmagan"
60
+ });
31
61
 
32
- <sub>Devamı gelecek..</sub>
62
+ console.log(`Logged in! ${dbi.client.user.tag} (${dbi.client.user.id})`);
63
+ })();
64
+ ```
33
65
 
66
+ İçeriye `recursiveImport()` fonksiyonunu alıyoruz. Bu fonksiyon ile sonsuz bir şekilde `x` klasöründeki bütün dosyaları `import`/`require` edebiliyoruz. Bu sayede altyapı bu dosyalardan haberdar oluyor.
67
+ Ana `dbi.js` dosyamızdan altyapımıza ulaşıyoruz ve `async` bir ortam oluşturup ilk önce tüm proje dosylarını altyapıya tanımlıyoruz. Tanımlamanın ardından tanımladığımız tüm özellikleri altyapıya `load()` fonksiyonunu ile yüklüyoruz. Hemen ardından `login()` fonksiyonu ile Discord'a giriş sağlıyoruz.
34
68
 
69
+
70
+ 3. adım olarak `publish.js` dosyamızı açıyoruz ve ikinci aşamada yaptığımız tüm işlemleri tekrardan uyguluyoruz.
71
+ ```js
72
+ const { recursiveImport } = require("@mostfeatured/dbi");
73
+ const dbi = require("./dbi");
74
+
75
+ (async () => {
76
+ await recursiveImport("./src");
77
+
78
+ await dbi.load();
79
+ await dbi.publish("Guild", "<yourGuildId>");
80
+ // await dbi.publish("Global");
81
+ await dbi.unload();
82
+
83
+ console.log("Published!");
84
+ })();
85
+ ```
86
+
87
+ Ancak `login()` fonksiyonunu çağırmak yerine, `publish()` fonksiyonunu çağrıyoruz ve bu fonksiyon ile botumuzun komutlarını istediğimiz yere tanıtıyoruz.
88
+
89
+ # Harika!
90
+
91
+ Artık altyapıyı kullanabilmek için gerekli olan bütün dosyalara sahibiz. (Bilgilendirme: Detaylı bir şekilde anlattığımız bu adımlar size karmaşık ve zor geliyorsa üzgünüz ki bu altyapı size uygun değil.)
92
+
93
+ # Detaylı Kullanım Senaryosu
94
+
95
+ Özel olarak geliştirdiğimiz ve v14'ü eksiksiz bir şekilde destekleyen altyapımız ile Discord'un her türlü özelliğini tam anlamıyla kullanabiliyorsunuz. (`ChatInput`, `Event`, `Locale`, `Button`, `SelectMenu`, `MessageContextMenu`, `UserContextMenu`, `Modal`, `InteractionLocale`)
96
+
97
+ Şimdi sizlere altyapıya özellik tanımlamayı göstermek istiyoruz. Örnek: (ChatInput/Button vb.)
98
+
99
+ İlk olarak ilgili özelliği altyapımıza dahil ediyoruz.
100
+ ```js
101
+ const dbi = require("../dbi");
102
+ ```
103
+ Ve devamında altyapının üzerindeki `register()` fonksiyonunu çağırıp içerisine bir `callback` fonksiyonu koyuyoruz. Bu `callback` fonksiyonu ilk parametre olarak size altyapı üzerine tanımlayabilceğiniz tüm her şeyi bir obje olarak sunuyor. Bu obje içerisinden istediğiniz özellik fonksiyonunu çağırarak altyapıya tanımlama işlemini gerçekleştirebiliyorsunuz.
104
+ ```js
105
+ dbi.register(({ ChatInput, Event })=>{
106
+ ChatInput({ ... });
107
+ Event({ ... });
108
+ })
109
+ ```
110
+ Unutmayın ki aynı anda istediğiniz kadar özelliği çağırabilirsiniz!
111
+
112
+ #ChatInput & ChatInputOptions
113
+
114
+ `ChatInput` sizin anlayacağınız şekilde "Slash Komut" olarak tanımlanmaktadır.
115
+
116
+ <sub>`src/chatInput.js` dosyası:</sub>
117
+
118
+ ```js
119
+ const dbi = require("../dbi");
120
+ const Discord = require("discord.js");
121
+
122
+ dbi.register(({ ChatInput, ChatInputOptions })=>{
123
+ ChatInput({
124
+ name: "cinsiyet seç",
125
+ description: "Cinsiyet seçmenizi sağlar.",
126
+ onExecute({ interaction, locale }) {
127
+ let gender = interaction.options.get("cinsiyet").value;
128
+ let genderNames = locale.user.data.genders;
129
+ let genderText = locale.user.data.genderText(interaction.user, genderNames[gender]());
130
+ interaction.reply({
131
+ content: genderText,
132
+ components: [
133
+ {
134
+ type: Discord.ComponentType.ActionRow,
135
+ components: [
136
+ dbi.interaction("viewGender").toJSON({ gender }),
137
+ ]
138
+ }
139
+ ]
140
+ });
141
+ },
142
+ options: [
143
+ ChatInputOptions.stringChoices({
144
+ name: "cinsiyet",
145
+ description: "Seçeceğiniz cinsiyet.",
146
+ required: true,
147
+ choices: [
148
+ { name: "Erkek", value: "erkek" },
149
+ { name: "Kadın", value: "kadın" },
150
+ { name: "Diğer", value: "diğer" },
151
+ ]
152
+ })
153
+ ],
154
+ });
155
+ });
156
+ ```
157
+ Genel olarak `ChatInput`'un yapısı gözünüze `options` dışında tanıdık gelmiş olabilir. Direkt olarak options içerisine bir şey doldurmaya çalıştığınızda otomatik tamamlama alamayacaksınız. Çünkü options içerisinde ChatInputOptions class'ındaki statik fonksiyonlardan beklemekte. Fonksiyonlar ise şunlara benzemekte; `stringChoices`, `user`, `numberAutocomplete` vb.
158
+ Ayrıca yukarıda göstermiş olduğumuz Locale ve Component sisteminin nasıl kullanıldığıyla ilgili örnek gösterim için aşağıdan daha fazla örneğe ulaşabilirsiniz.
159
+
160
+ # Event
161
+
162
+ <sub>`src/event.js` dosyası:</sub>
163
+
164
+ ```js
165
+ const dbi = require("../dbi");
166
+
167
+ dbi.register(({ Event })=>{
168
+ Event({
169
+ name: "ready",
170
+ id: "botIsReady",
171
+ onExecute() {
172
+ console.log(`Bot ready!`);
173
+ }
174
+ });
175
+ });
176
+ ```
177
+ Event yani olay tanımlarken `name` kısmına istediğiniz olayın ismini yazabilirsiniz. Ancak eğer aynı olaydan birden fazla açmak istiyorsanız o olaya bir `id` tanımlamanız gerekmektedir.
178
+
179
+ # Locale
180
+
181
+ <sub>`src/locales.js` dosyası:</sub>
182
+
183
+ ```js
184
+ const dbi = require("../dbi");
185
+
186
+ dbi.register(({ Locale })=>{
187
+ Locale({
188
+ name: "tr",
189
+ data: {
190
+ genders: {
191
+ erkek: "Erkek",
192
+ kadın: "Kadın",
193
+ diğer: "Diğer"
194
+ },
195
+ genderText: "{0} adlı üye {1} cinsiyetini seçti."
196
+ }
197
+ });
198
+
199
+ Locale({
200
+ name: "en",
201
+ data: {
202
+ genders: {
203
+ erkek: "Male",
204
+ kadın: "Female",
205
+ diğer: "Other"
206
+ },
207
+ genderText: "{0}, picked {1} gender."
208
+ }
209
+ });
210
+ });
211
+ ```
212
+
213
+ Locale sayesinde her interaksiyon içerisinde kullanıcının veya sunucunun diline göre cevap vermenizi kolaylaştıracak bilgiler bulunmakta. Locale içerisindeki `name` hangi dil için tanımlama yaptığınız `data` kısmı ise tutmak istediğiniz değerleri içermekte. Yazı içerisindeki `{0}` ve `{1}` işaretleri aynı şekilde yazı içerisindeki değişkenlerimiz. Locale kullanırken istediğimiz değeri alıp onu bir fonksiyon gibi çağırabiliyoruz. Ve içerisine sırasıyla parametreleri veriyoruz. Örneğin `locale.data.genderText(user, gender)`.
214
+
215
+ # Button & SelectMenu & Modal
216
+
217
+ Bu bölümde ise üç adet özelliğimize bakacağız. (Aslında arka planda hepsi aynı özellik.)
218
+
219
+ <sub>`src/components.js` dosyası:</sub>
220
+
221
+ ```js
222
+ const dbi = require("../dbi");
223
+ const Discord = require("discord.js");
224
+
225
+ dbi.register(({ Button, SelectMenu, Modal })=>{
226
+ Button({
227
+ name: "viewGender",
228
+ onExecute({ interaction, data }) {
229
+ interaction.reply(`\`${data[0].gender}\``);
230
+ },
231
+ options: {
232
+ style: Discord.ButtonStyle.Primary,
233
+ label: "View Gender"
234
+ }
235
+ });
236
+ });
237
+ ```
238
+ Button & SelectMenu & Modal hakkında çok güzel ve havalı bir özelliği sizlerle buluşturuyoruz. Artık bunların üzerinde istediğiniz değeri taşıyabilirsiniz. (Referans/Obje veya yazı/sayı gibi.) Örneğin `dbi.interaction("viewGender").toJSON("male")` bize Discord.js tarafından desteklenen geçerli bir component sunacaktır. Ve to json içerisinde sunulan değere hem `options` kısmını bir fonksiyona çevirerek ulaşabilir hem de interaksiyonun kendisi çağırıldığında ulaşabilirsiniz. Bu konuyla ilgili unutmamanız gereken bir şey var. Eğer düz yazı veya sayı taşıyacaksanız bu yazı veya sayıların toplam uzunluğu 100 karakteri geçmemeli. Çünkü bu değerler direkt olarak düğmenin üzerinde taşınmakta ve siz botu kapatıp açsanız bile orada kalacak şekilde çalışmaktadırlar.
239
+
240
+ # MessageContextMenu & UserContextMenu
241
+
242
+ `ChatInput` ile birebir aynı özelliklere sahip ancak `options` değeri almamaktadır.
243
+
244
+ # InteractionLocale
245
+
246
+ Bir eşsiz özelliği daha sizlere sunuyoruz. Artık her kullanıcıya özel komut dili tanımlamanızı sağlayabilirsiniz.
247
+ Örneğin Türk bir kullanıcıya `/cinsiyet seç` şeklinde gözüken komut yabancı bir kullanıcıya `/select gender` olarak gözükebilir. (Dilediğiniz gibi konfigüre edebilirsiniz.)
248
+
249
+ <sub>`src/interactionlocales.js` dosyası:</sub>
250
+
251
+ ```js
252
+ dbi.register(({ InteractionLocale })=>{
253
+ InteractionLocale({
254
+ name: "cinsiyet seç",
255
+ data: {
256
+ en: {
257
+ name: "select gender",
258
+ description: "Allows you to select a gender.",
259
+ options: {
260
+ cinsiyet: {
261
+ name: "gender",
262
+ description: "Select your gender correctly.",
263
+ choices: {
264
+ "Erkek": "Male",
265
+ "Kadın": "Female",
266
+ "Diğer": "Other"
267
+ }
268
+ }
269
+ }
270
+ }
271
+ }
272
+ });
273
+ });
274
+ ```
275
+
276
+ Son not: `InteractionLocale` için `name` değeri sizin tanımladığınız diğer interaksiyonlardan birinin ismi olacaktır. Örneğin `cinsiyet seç`. Data'nın yapısını en basit hale getirmeye çalıştık. ilk önce istediğiniz dili seçiyorsunuz ve sonrasında içerisini örnekteki gibi uygun bir şekilde dolduruyorsunuz. İçerisine aynı anda istediğin kadar dilde nasıl gözükeceğini ekleyebilirsiniz.
277
+
278
+ Karşılacağınız hatalar ya da benzer konular için Discord üzerinden tarafıma ulaşabilirsiniz. (Armagan#4869)
279
+
280
+ Unutmayın ki: "Yeryüzünde her zaman ücretsiz ve değerli bir şeyler olacaktır."
281
+
282
+ <sub>12.09.2022: Orjinal metin TheArmagan tarafından yazıldı, Maschera tarafından düzenlendi. </sub>
@@ -16,6 +16,7 @@ export function customIdBuilder(dbi: DBI, name: string, customData: any[], ttl?:
16
16
  return `¤${id}`;
17
17
  })
18
18
  ].join("—");
19
+ if (!dbi.config.strict) customId = customId.slice(0, 100);
19
20
  if (customId.length > 100) throw new Error("Custom id cannot be longer than 100 characters.")
20
21
  return customId;
21
22
  }