@takaro/modules 0.0.1

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.
Files changed (227) hide show
  1. package/README.md +3 -0
  2. package/dist/BuiltinModule.d.ts +49 -0
  3. package/dist/BuiltinModule.js +194 -0
  4. package/dist/BuiltinModule.js.map +1 -0
  5. package/dist/dto/base.d.ts +6 -0
  6. package/dist/dto/base.js +28 -0
  7. package/dist/dto/base.js.map +1 -0
  8. package/dist/dto/discordEvents.d.ts +31 -0
  9. package/dist/dto/discordEvents.js +92 -0
  10. package/dist/dto/discordEvents.js.map +1 -0
  11. package/dist/dto/gameEvents.d.ts +84 -0
  12. package/dist/dto/gameEvents.js +190 -0
  13. package/dist/dto/gameEvents.js.map +1 -0
  14. package/dist/dto/index.d.ts +37 -0
  15. package/dist/dto/index.js +18 -0
  16. package/dist/dto/index.js.map +1 -0
  17. package/dist/dto/takaroEvents.d.ts +150 -0
  18. package/dist/dto/takaroEvents.js +422 -0
  19. package/dist/dto/takaroEvents.js.map +1 -0
  20. package/dist/main.d.ts +4 -0
  21. package/dist/main.js +31 -0
  22. package/dist/main.js.map +1 -0
  23. package/dist/modules/chatBridge/hooks/DiscordToGame.d.ts +1 -0
  24. package/dist/modules/chatBridge/hooks/DiscordToGame.js +18 -0
  25. package/dist/modules/chatBridge/hooks/DiscordToGame.js.map +1 -0
  26. package/dist/modules/chatBridge/hooks/GameToDiscord.d.ts +1 -0
  27. package/dist/modules/chatBridge/hooks/GameToDiscord.js +14 -0
  28. package/dist/modules/chatBridge/hooks/GameToDiscord.js.map +1 -0
  29. package/dist/modules/chatBridge/hooks/PlayerConnected.d.ts +1 -0
  30. package/dist/modules/chatBridge/hooks/PlayerConnected.js +9 -0
  31. package/dist/modules/chatBridge/hooks/PlayerConnected.js.map +1 -0
  32. package/dist/modules/chatBridge/hooks/PlayerDisconnected.d.ts +1 -0
  33. package/dist/modules/chatBridge/hooks/PlayerDisconnected.js +9 -0
  34. package/dist/modules/chatBridge/hooks/PlayerDisconnected.js.map +1 -0
  35. package/dist/modules/chatBridge/index.d.ts +4 -0
  36. package/dist/modules/chatBridge/index.js +54 -0
  37. package/dist/modules/chatBridge/index.js.map +1 -0
  38. package/dist/modules/economyUtils/commands/balance.d.ts +1 -0
  39. package/dist/modules/economyUtils/commands/balance.js +7 -0
  40. package/dist/modules/economyUtils/commands/balance.js.map +1 -0
  41. package/dist/modules/economyUtils/commands/confirmTransfer.d.ts +1 -0
  42. package/dist/modules/economyUtils/commands/confirmTransfer.js +38 -0
  43. package/dist/modules/economyUtils/commands/confirmTransfer.js.map +1 -0
  44. package/dist/modules/economyUtils/commands/grantCurrency.d.ts +1 -0
  45. package/dist/modules/economyUtils/commands/grantCurrency.js +31 -0
  46. package/dist/modules/economyUtils/commands/grantCurrency.js.map +1 -0
  47. package/dist/modules/economyUtils/commands/revokeCurrency.d.ts +1 -0
  48. package/dist/modules/economyUtils/commands/revokeCurrency.js +31 -0
  49. package/dist/modules/economyUtils/commands/revokeCurrency.js.map +1 -0
  50. package/dist/modules/economyUtils/commands/topCurrency.d.ts +1 -0
  51. package/dist/modules/economyUtils/commands/topCurrency.js +22 -0
  52. package/dist/modules/economyUtils/commands/topCurrency.js.map +1 -0
  53. package/dist/modules/economyUtils/commands/transfer.d.ts +1 -0
  54. package/dist/modules/economyUtils/commands/transfer.js +55 -0
  55. package/dist/modules/economyUtils/commands/transfer.js.map +1 -0
  56. package/dist/modules/economyUtils/index.d.ts +4 -0
  57. package/dist/modules/economyUtils/index.js +117 -0
  58. package/dist/modules/economyUtils/index.js.map +1 -0
  59. package/dist/modules/geoBlock/hooks/IPDetected.d.ts +1 -0
  60. package/dist/modules/geoBlock/hooks/IPDetected.js +50 -0
  61. package/dist/modules/geoBlock/hooks/IPDetected.js.map +1 -0
  62. package/dist/modules/geoBlock/index.d.ts +8 -0
  63. package/dist/modules/geoBlock/index.js +321 -0
  64. package/dist/modules/geoBlock/index.js.map +1 -0
  65. package/dist/modules/gimme/commands/gimme.d.ts +1 -0
  66. package/dist/modules/gimme/commands/gimme.js +23 -0
  67. package/dist/modules/gimme/commands/gimme.js.map +1 -0
  68. package/dist/modules/gimme/index.d.ts +4 -0
  69. package/dist/modules/gimme/index.js +43 -0
  70. package/dist/modules/gimme/index.js.map +1 -0
  71. package/dist/modules/highPingKicker/cronJobs/Ping check.d.ts +1 -0
  72. package/dist/modules/highPingKicker/cronJobs/Ping check.js +54 -0
  73. package/dist/modules/highPingKicker/cronJobs/Ping check.js.map +1 -0
  74. package/dist/modules/highPingKicker/index.d.ts +4 -0
  75. package/dist/modules/highPingKicker/index.js +34 -0
  76. package/dist/modules/highPingKicker/index.js.map +1 -0
  77. package/dist/modules/lottery/commands/buyTicket.d.ts +1 -0
  78. package/dist/modules/lottery/commands/buyTicket.js +54 -0
  79. package/dist/modules/lottery/commands/buyTicket.js.map +1 -0
  80. package/dist/modules/lottery/commands/nextDraw.d.ts +1 -0
  81. package/dist/modules/lottery/commands/nextDraw.js +34 -0
  82. package/dist/modules/lottery/commands/nextDraw.js.map +1 -0
  83. package/dist/modules/lottery/commands/viewTickets.d.ts +1 -0
  84. package/dist/modules/lottery/commands/viewTickets.js +23 -0
  85. package/dist/modules/lottery/commands/viewTickets.js.map +1 -0
  86. package/dist/modules/lottery/cronJobs/drawLottery.d.ts +1 -0
  87. package/dist/modules/lottery/cronJobs/drawLottery.js +96 -0
  88. package/dist/modules/lottery/cronJobs/drawLottery.js.map +1 -0
  89. package/dist/modules/lottery/index.d.ts +4 -0
  90. package/dist/modules/lottery/index.js +73 -0
  91. package/dist/modules/lottery/index.js.map +1 -0
  92. package/dist/modules/playerOnboarding/commands/starterkit.d.ts +1 -0
  93. package/dist/modules/playerOnboarding/commands/starterkit.js +34 -0
  94. package/dist/modules/playerOnboarding/commands/starterkit.js.map +1 -0
  95. package/dist/modules/playerOnboarding/hooks/playerConnected.d.ts +1 -0
  96. package/dist/modules/playerOnboarding/hooks/playerConnected.js +11 -0
  97. package/dist/modules/playerOnboarding/hooks/playerConnected.js.map +1 -0
  98. package/dist/modules/playerOnboarding/index.d.ts +4 -0
  99. package/dist/modules/playerOnboarding/index.js +51 -0
  100. package/dist/modules/playerOnboarding/index.js.map +1 -0
  101. package/dist/modules/serverMessages/cronJobs/Automated message.d.ts +1 -0
  102. package/dist/modules/serverMessages/cronJobs/Automated message.js +9 -0
  103. package/dist/modules/serverMessages/cronJobs/Automated message.js.map +1 -0
  104. package/dist/modules/serverMessages/index.d.ts +4 -0
  105. package/dist/modules/serverMessages/index.js +35 -0
  106. package/dist/modules/serverMessages/index.js.map +1 -0
  107. package/dist/modules/teleports/commands/deletetp.d.ts +1 -0
  108. package/dist/modules/teleports/commands/deletetp.js +20 -0
  109. package/dist/modules/teleports/commands/deletetp.js.map +1 -0
  110. package/dist/modules/teleports/commands/deletewaypoint.d.ts +1 -0
  111. package/dist/modules/teleports/commands/deletewaypoint.js +54 -0
  112. package/dist/modules/teleports/commands/deletewaypoint.js.map +1 -0
  113. package/dist/modules/teleports/commands/listwaypoints.d.ts +1 -0
  114. package/dist/modules/teleports/commands/listwaypoints.js +36 -0
  115. package/dist/modules/teleports/commands/listwaypoints.js.map +1 -0
  116. package/dist/modules/teleports/commands/setprivate.d.ts +1 -0
  117. package/dist/modules/teleports/commands/setprivate.js +31 -0
  118. package/dist/modules/teleports/commands/setprivate.js.map +1 -0
  119. package/dist/modules/teleports/commands/setpublic.d.ts +1 -0
  120. package/dist/modules/teleports/commands/setpublic.js +55 -0
  121. package/dist/modules/teleports/commands/setpublic.js.map +1 -0
  122. package/dist/modules/teleports/commands/settp.d.ts +1 -0
  123. package/dist/modules/teleports/commands/settp.js +42 -0
  124. package/dist/modules/teleports/commands/settp.js.map +1 -0
  125. package/dist/modules/teleports/commands/setwaypoint.d.ts +1 -0
  126. package/dist/modules/teleports/commands/setwaypoint.js +88 -0
  127. package/dist/modules/teleports/commands/setwaypoint.js.map +1 -0
  128. package/dist/modules/teleports/commands/teleport.d.ts +1 -0
  129. package/dist/modules/teleports/commands/teleport.js +74 -0
  130. package/dist/modules/teleports/commands/teleport.js.map +1 -0
  131. package/dist/modules/teleports/commands/teleportwaypoint.d.ts +1 -0
  132. package/dist/modules/teleports/commands/teleportwaypoint.js +50 -0
  133. package/dist/modules/teleports/commands/teleportwaypoint.js.map +1 -0
  134. package/dist/modules/teleports/commands/tplist.d.ts +1 -0
  135. package/dist/modules/teleports/commands/tplist.js +45 -0
  136. package/dist/modules/teleports/commands/tplist.js.map +1 -0
  137. package/dist/modules/teleports/functions/utils.d.ts +2 -0
  138. package/dist/modules/teleports/functions/utils.js +18 -0
  139. package/dist/modules/teleports/functions/utils.js.map +1 -0
  140. package/dist/modules/teleports/index.d.ts +4 -0
  141. package/dist/modules/teleports/index.js +184 -0
  142. package/dist/modules/teleports/index.js.map +1 -0
  143. package/dist/modules/utils/commands/help.d.ts +1 -0
  144. package/dist/modules/utils/commands/help.js +29 -0
  145. package/dist/modules/utils/commands/help.js.map +1 -0
  146. package/dist/modules/utils/commands/ping.d.ts +1 -0
  147. package/dist/modules/utils/commands/ping.js +6 -0
  148. package/dist/modules/utils/commands/ping.js.map +1 -0
  149. package/dist/modules/utils/index.d.ts +4 -0
  150. package/dist/modules/utils/index.js +35 -0
  151. package/dist/modules/utils/index.js.map +1 -0
  152. package/dist/modules.json +478 -0
  153. package/package.json +26 -0
  154. package/scripts/buildBuiltinJson.ts +14 -0
  155. package/src/BuiltinModule.ts +125 -0
  156. package/src/__tests__/aliases.integration.test.ts +54 -0
  157. package/src/__tests__/builtinmodule.unit.test.ts +13 -0
  158. package/src/__tests__/commandArgs.integration.test.ts +285 -0
  159. package/src/__tests__/economyUtils.integration.test.ts +488 -0
  160. package/src/__tests__/geoblock.integration.test.ts +380 -0
  161. package/src/__tests__/gimme.integration.test.ts +97 -0
  162. package/src/__tests__/help.integration.test.ts +133 -0
  163. package/src/__tests__/lottery.integration.test.ts +332 -0
  164. package/src/__tests__/modulePermission.integration.test.ts +192 -0
  165. package/src/__tests__/onboarding.integration.test.ts +123 -0
  166. package/src/__tests__/ping.integration.test.ts +36 -0
  167. package/src/__tests__/roleExpiry.integration.test.ts +74 -0
  168. package/src/__tests__/serverMessages.integration.test.ts +104 -0
  169. package/src/__tests__/systemConfigCost.integration.test.ts +196 -0
  170. package/src/__tests__/teleports/listtp.integration.test.ts +115 -0
  171. package/src/__tests__/teleports/publicteleports.integration.test.ts +350 -0
  172. package/src/__tests__/teleports/teleport.integration.test.ts +109 -0
  173. package/src/__tests__/teleports/tpManagement.integration.test.ts +175 -0
  174. package/src/__tests__/teleports/waypoints.integration.test.ts +613 -0
  175. package/src/dto/base.ts +13 -0
  176. package/src/dto/discordEvents.ts +69 -0
  177. package/src/dto/gameEvents.ts +154 -0
  178. package/src/dto/index.ts +25 -0
  179. package/src/dto/takaroEvents.ts +290 -0
  180. package/src/main.ts +36 -0
  181. package/src/modules/.eslintrc +5 -0
  182. package/src/modules/chatBridge/hooks/DiscordToGame.js +18 -0
  183. package/src/modules/chatBridge/hooks/GameToDiscord.js +18 -0
  184. package/src/modules/chatBridge/hooks/PlayerConnected.js +11 -0
  185. package/src/modules/chatBridge/hooks/PlayerDisconnected.js +11 -0
  186. package/src/modules/chatBridge/index.ts +59 -0
  187. package/src/modules/economyUtils/commands/balance.js +8 -0
  188. package/src/modules/economyUtils/commands/confirmTransfer.js +55 -0
  189. package/src/modules/economyUtils/commands/grantCurrency.js +38 -0
  190. package/src/modules/economyUtils/commands/revokeCurrency.js +38 -0
  191. package/src/modules/economyUtils/commands/topCurrency.js +29 -0
  192. package/src/modules/economyUtils/commands/transfer.js +73 -0
  193. package/src/modules/economyUtils/index.ts +125 -0
  194. package/src/modules/geoBlock/hooks/IPDetected.js +52 -0
  195. package/src/modules/geoBlock/index.ts +331 -0
  196. package/src/modules/gimme/commands/gimme.js +28 -0
  197. package/src/modules/gimme/index.ts +49 -0
  198. package/src/modules/highPingKicker/cronJobs/Ping check.js +66 -0
  199. package/src/modules/highPingKicker/index.ts +39 -0
  200. package/src/modules/lottery/commands/buyTicket.js +68 -0
  201. package/src/modules/lottery/commands/nextDraw.js +45 -0
  202. package/src/modules/lottery/commands/viewTickets.js +32 -0
  203. package/src/modules/lottery/cronJobs/drawLottery.js +124 -0
  204. package/src/modules/lottery/index.ts +80 -0
  205. package/src/modules/playerOnboarding/commands/starterkit.js +47 -0
  206. package/src/modules/playerOnboarding/hooks/playerConnected.js +14 -0
  207. package/src/modules/playerOnboarding/index.ts +58 -0
  208. package/src/modules/serverMessages/cronJobs/Automated message.js +12 -0
  209. package/src/modules/serverMessages/index.ts +40 -0
  210. package/src/modules/teleports/commands/deletetp.js +25 -0
  211. package/src/modules/teleports/commands/deletewaypoint.js +77 -0
  212. package/src/modules/teleports/commands/listwaypoints.js +55 -0
  213. package/src/modules/teleports/commands/setprivate.js +39 -0
  214. package/src/modules/teleports/commands/setpublic.js +71 -0
  215. package/src/modules/teleports/commands/settp.js +54 -0
  216. package/src/modules/teleports/commands/setwaypoint.js +112 -0
  217. package/src/modules/teleports/commands/teleport.js +93 -0
  218. package/src/modules/teleports/commands/teleportwaypoint.js +72 -0
  219. package/src/modules/teleports/commands/tplist.js +61 -0
  220. package/src/modules/teleports/functions/utils.js +20 -0
  221. package/src/modules/teleports/index.ts +193 -0
  222. package/src/modules/utils/commands/help.js +38 -0
  223. package/src/modules/utils/commands/ping.js +7 -0
  224. package/src/modules/utils/index.ts +40 -0
  225. package/tsconfig.build.json +10 -0
  226. package/tsconfig.json +9 -0
  227. package/typedoc.json +3 -0
@@ -0,0 +1,74 @@
1
+ import { IntegrationTest, expect } from '@takaro/test';
2
+ import { IModuleTestsSetupData, modulesTestSetup } from '@takaro/test';
3
+ import { GameEvents } from '../dto/index.js';
4
+
5
+ const group = 'Role expiry';
6
+
7
+ const tests = [
8
+ new IntegrationTest<IModuleTestsSetupData>({
9
+ group,
10
+ snapshot: false,
11
+ setup: modulesTestSetup,
12
+ name: 'Assigning an expiring role, removed when executing command',
13
+ test: async function () {
14
+ // First, ensure all players have no roles
15
+ await Promise.all(
16
+ this.setupData.players.map((p) => this.client.player.playerControllerRemoveRole(p.id, this.setupData.role.id))
17
+ );
18
+
19
+ await this.client.gameserver.gameServerControllerInstallModule(
20
+ this.setupData.gameserver.id,
21
+ this.setupData.teleportsModule.id
22
+ );
23
+
24
+ const eventsBeforeRole = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
25
+
26
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
27
+ msg: '/settp test',
28
+ playerId: this.setupData.players[0].id,
29
+ });
30
+
31
+ expect((await eventsBeforeRole).length).to.be.eq(1);
32
+ expect((await eventsBeforeRole)[0].data.msg).to.match(/You do not have permission to use teleports/);
33
+
34
+ // Assign the role with expiry 10 minutes from now
35
+ await this.client.player.playerControllerAssignRole(this.setupData.players[0].id, this.setupData.role.id, {
36
+ expiresAt: new Date(Date.now() + 10 * 60 * 1000).toISOString(),
37
+ });
38
+
39
+ // Execute the command again. Now it should work, since the role is assigned
40
+ const eventsWithRole = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
41
+
42
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
43
+ msg: '/settp test2',
44
+ playerId: this.setupData.players[0].id,
45
+ });
46
+
47
+ expect((await eventsWithRole).length).to.be.eq(1);
48
+ expect((await eventsWithRole)[0].data.msg).to.match(/Teleport test2 set/);
49
+
50
+ // Remove the role and reassign with expiry 1 ms from now
51
+ await this.client.player.playerControllerRemoveRole(this.setupData.players[0].id, this.setupData.role.id);
52
+ await this.client.player.playerControllerAssignRole(this.setupData.players[0].id, this.setupData.role.id, {
53
+ expiresAt: new Date(Date.now() + 1).toISOString(),
54
+ });
55
+
56
+ // Execute the command again. Now it should not work, since the role is expired
57
+ const eventsAfterExpire = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
58
+
59
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
60
+ msg: '/settp test3',
61
+ playerId: this.setupData.players[0].id,
62
+ });
63
+
64
+ expect((await eventsAfterExpire).length).to.be.eq(1);
65
+ expect((await eventsAfterExpire)[0].data.msg).to.match(/You do not have permission to use teleports/);
66
+ },
67
+ }),
68
+ ];
69
+
70
+ describe(group, function () {
71
+ tests.forEach((test) => {
72
+ test.run();
73
+ });
74
+ });
@@ -0,0 +1,104 @@
1
+ import { IntegrationTest, expect } from '@takaro/test';
2
+ import { IModuleTestsSetupData, modulesTestSetup } from '@takaro/test';
3
+ import { GameEvents } from '../dto/index.js';
4
+ import { sleep } from '@takaro/util';
5
+
6
+ const group = 'Server messages';
7
+
8
+ const tests = [
9
+ new IntegrationTest<IModuleTestsSetupData>({
10
+ group,
11
+ snapshot: false,
12
+ setup: modulesTestSetup,
13
+ name: 'Default install sends the default message',
14
+ test: async function () {
15
+ await this.client.gameserver.gameServerControllerInstallModule(
16
+ this.setupData.gameserver.id,
17
+ this.setupData.serverMessagesModule.id
18
+ );
19
+
20
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
21
+
22
+ await this.client.cronjob.cronJobControllerTrigger({
23
+ cronjobId: this.setupData.serverMessagesModule.cronJobs[0].id,
24
+ gameServerId: this.setupData.gameserver.id,
25
+ moduleId: this.setupData.serverMessagesModule.id,
26
+ });
27
+
28
+ expect((await events).length).to.be.eq(1);
29
+ expect((await events)[0].data.msg).to.be.eq(
30
+ // eslint-disable-next-line
31
+ "This is an automated message, don't forget to read the server rules!"
32
+ );
33
+ },
34
+ }),
35
+ new IntegrationTest<IModuleTestsSetupData>({
36
+ group,
37
+ snapshot: false,
38
+ setup: modulesTestSetup,
39
+ name: 'Can override default message via userConfig',
40
+ test: async function () {
41
+ await this.client.gameserver.gameServerControllerInstallModule(
42
+ this.setupData.gameserver.id,
43
+ this.setupData.serverMessagesModule.id,
44
+ {
45
+ userConfig: JSON.stringify({
46
+ messages: ['This is a custom message'],
47
+ }),
48
+ }
49
+ );
50
+
51
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
52
+
53
+ await this.client.cronjob.cronJobControllerTrigger({
54
+ cronjobId: this.setupData.serverMessagesModule.cronJobs[0].id,
55
+ gameServerId: this.setupData.gameserver.id,
56
+ moduleId: this.setupData.serverMessagesModule.id,
57
+ });
58
+
59
+ expect((await events).length).to.be.eq(1);
60
+ expect((await events)[0].data.msg).to.be.eq('This is a custom message');
61
+ },
62
+ }),
63
+ new IntegrationTest<IModuleTestsSetupData>({
64
+ group,
65
+ snapshot: false,
66
+ setup: modulesTestSetup,
67
+ name: 'Can override default message via userConfig with multiple messages',
68
+ test: async function () {
69
+ await this.client.gameserver.gameServerControllerInstallModule(
70
+ this.setupData.gameserver.id,
71
+ this.setupData.serverMessagesModule.id,
72
+ {
73
+ userConfig: JSON.stringify({
74
+ messages: ['Test message 1', 'Test message 2'],
75
+ }),
76
+ }
77
+ );
78
+
79
+ // We should see each of our test messages at least once
80
+
81
+ const numberOfEvents = 10;
82
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, numberOfEvents);
83
+
84
+ for (let i = 0; i < numberOfEvents; i++) {
85
+ await sleep(Math.floor(Math.random() * 10) + 1);
86
+ await this.client.cronjob.cronJobControllerTrigger({
87
+ cronjobId: this.setupData.serverMessagesModule.cronJobs[0].id,
88
+ gameServerId: this.setupData.gameserver.id,
89
+ moduleId: this.setupData.serverMessagesModule.id,
90
+ });
91
+ }
92
+
93
+ const messages = (await events).map((e) => e.data.msg);
94
+ expect(messages).to.include('Test message 1');
95
+ expect(messages).to.include('Test message 2');
96
+ },
97
+ }),
98
+ ];
99
+
100
+ describe(group, function () {
101
+ tests.forEach((test) => {
102
+ test.run();
103
+ });
104
+ });
@@ -0,0 +1,196 @@
1
+ import { IntegrationTest, expect } from '@takaro/test';
2
+ import { IModuleTestsSetupData, modulesTestSetup } from '@takaro/test';
3
+ import { GameEvents } from '../dto/index.js';
4
+ import { sleep } from '@takaro/util';
5
+
6
+ const group = 'System config - cost';
7
+
8
+ const customSetup = async function (this: IntegrationTest<IModuleTestsSetupData>): Promise<IModuleTestsSetupData> {
9
+ const setupData = await modulesTestSetup.bind(this)();
10
+ await this.client.settings.settingsControllerSet('economyEnabled', {
11
+ value: 'true',
12
+ gameServerId: setupData.gameserver.id,
13
+ });
14
+
15
+ await this.client.gameserver.gameServerControllerInstallModule(
16
+ setupData.gameserver.id,
17
+ setupData.teleportsModule.id,
18
+ {
19
+ userConfig: JSON.stringify({
20
+ timeout: 0,
21
+ }),
22
+ systemConfig: JSON.stringify({
23
+ commands: {
24
+ teleport: {
25
+ delay: 0,
26
+ aliases: [],
27
+ cost: 10,
28
+ },
29
+ },
30
+ }),
31
+ }
32
+ );
33
+
34
+ const setEvents = setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
35
+ await this.client.command.commandControllerTrigger(setupData.gameserver.id, {
36
+ msg: '/settp test',
37
+ playerId: setupData.players[0].id,
38
+ });
39
+
40
+ expect((await setEvents).length).to.be.eq(1);
41
+ expect((await setEvents)[0].data.msg).to.be.eq('Teleport test set.');
42
+
43
+ const giveCurrencies = setupData.players.map(async (player) => {
44
+ const playerOnGameServer = (
45
+ await this.client.playerOnGameserver.playerOnGameServerControllerSearch({
46
+ filters: { playerId: [player.id], gameServerId: [setupData.gameserver.id] },
47
+ })
48
+ ).data.data;
49
+ if (playerOnGameServer.length === 0) throw new Error('player not found');
50
+ return this.client.playerOnGameserver.playerOnGameServerControllerSetCurrency(
51
+ playerOnGameServer[0].gameServerId,
52
+ playerOnGameServer[0].playerId,
53
+ {
54
+ currency: 100,
55
+ }
56
+ );
57
+ });
58
+ await Promise.all(giveCurrencies);
59
+
60
+ return setupData;
61
+ };
62
+
63
+ const tests = [
64
+ new IntegrationTest<IModuleTestsSetupData>({
65
+ group,
66
+ snapshot: false,
67
+ setup: customSetup,
68
+ name: 'Deducts money when cost is configured',
69
+ test: async function () {
70
+ const events = this.setupData.eventAwaiter.waitForEvents('command-executed', 1);
71
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
72
+ msg: '/tp test',
73
+ playerId: this.setupData.players[0].id,
74
+ });
75
+
76
+ expect((await events).length).to.be.eq(1);
77
+
78
+ const playerOnGameServerAfter = (
79
+ await this.client.playerOnGameserver.playerOnGameServerControllerSearch({
80
+ filters: { playerId: [this.setupData.players[0].id], gameServerId: [this.setupData.gameserver.id] },
81
+ })
82
+ ).data.data;
83
+
84
+ expect(playerOnGameServerAfter[0].currency).to.be.eq(90);
85
+ },
86
+ }),
87
+ new IntegrationTest<IModuleTestsSetupData>({
88
+ group,
89
+ snapshot: false,
90
+ setup: customSetup,
91
+ name: 'Handles concurrent commands properly',
92
+ test: async function () {
93
+ const amount = 10;
94
+
95
+ const setEvents = this.setupData.eventAwaiter.waitForEvents('command-executed', amount);
96
+
97
+ await Promise.all(
98
+ Array.from({ length: amount }).map(async (_, index) => {
99
+ await sleep(10);
100
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
101
+ msg: `/settp test${index}`,
102
+ playerId: this.setupData.players[0].id,
103
+ });
104
+ })
105
+ );
106
+
107
+ expect((await setEvents).length).to.be.eq(amount);
108
+
109
+ const events = this.setupData.eventAwaiter.waitForEvents('command-executed', amount);
110
+ await Promise.all(
111
+ Array.from({ length: amount }).map(async (_, index) => {
112
+ await sleep(1);
113
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
114
+ msg: `/tp test${index}`,
115
+ playerId: this.setupData.players[0].id,
116
+ });
117
+ })
118
+ );
119
+
120
+ expect((await events).length).to.be.eq(amount);
121
+ for (const event of await events) {
122
+ expect(event.data.meta.result.success).to.be.eq(true);
123
+ }
124
+
125
+ const playerOnGameServerAfter = (
126
+ await this.client.playerOnGameserver.playerOnGameServerControllerSearch({
127
+ filters: { playerId: [this.setupData.players[0].id], gameServerId: [this.setupData.gameserver.id] },
128
+ })
129
+ ).data.data;
130
+
131
+ expect(playerOnGameServerAfter[0].currency).to.be.eq(0);
132
+ },
133
+ }),
134
+ new IntegrationTest<IModuleTestsSetupData>({
135
+ group,
136
+ snapshot: false,
137
+ setup: customSetup,
138
+ name: 'Does not deduct currency when command unsuccessful',
139
+ test: async function () {
140
+ const events = this.setupData.eventAwaiter.waitForEvents('command-executed', 1);
141
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
142
+ msg: '/tp doesntexist',
143
+ playerId: this.setupData.players[0].id,
144
+ });
145
+
146
+ expect((await events).length).to.be.eq(1);
147
+ expect((await events)[0].data.meta.result.success).to.be.eq(false);
148
+
149
+ const playerOnGameServerAfter = (
150
+ await this.client.playerOnGameserver.playerOnGameServerControllerSearch({
151
+ filters: { playerId: [this.setupData.players[0].id], gameServerId: [this.setupData.gameserver.id] },
152
+ })
153
+ ).data.data;
154
+
155
+ expect(playerOnGameServerAfter[0].currency).to.be.eq(100);
156
+ },
157
+ }),
158
+ new IntegrationTest<IModuleTestsSetupData>({
159
+ group,
160
+ snapshot: false,
161
+ setup: customSetup,
162
+ name: 'Rejects command if player does not have enough currency',
163
+ test: async function () {
164
+ // set players' currency to 5
165
+ const playerOnGameServer = (
166
+ await this.client.playerOnGameserver.playerOnGameServerControllerSearch({
167
+ filters: { playerId: [this.setupData.players[1].id], gameServerId: [this.setupData.gameserver.id] },
168
+ })
169
+ ).data.data;
170
+
171
+ if (playerOnGameServer.length === 0) throw new Error('player not found');
172
+ await this.client.playerOnGameserver.playerOnGameServerControllerSetCurrency(
173
+ playerOnGameServer[0].gameServerId,
174
+ playerOnGameServer[0].playerId,
175
+ {
176
+ currency: 5,
177
+ }
178
+ );
179
+
180
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
181
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
182
+ msg: '/tp test',
183
+ playerId: this.setupData.players[1].id,
184
+ });
185
+
186
+ expect((await events).length).to.be.eq(1);
187
+ expect((await events)[0].data.msg).to.be.eq('You do not have enough currency to execute this command.');
188
+ },
189
+ }),
190
+ ];
191
+
192
+ describe(group, function () {
193
+ tests.forEach((test) => {
194
+ test.run();
195
+ });
196
+ });
@@ -0,0 +1,115 @@
1
+ import { IntegrationTest, expect } from '@takaro/test';
2
+ import { IModuleTestsSetupData, modulesTestSetup } from '@takaro/test';
3
+ import { GameEvents } from '../../dto/index.js';
4
+
5
+ const group = 'Teleports suite';
6
+
7
+ const tests = [
8
+ new IntegrationTest<IModuleTestsSetupData>({
9
+ group,
10
+ snapshot: false,
11
+ setup: modulesTestSetup,
12
+ name: 'Can list teleports with /tplist',
13
+ test: async function () {
14
+ await this.client.gameserver.gameServerControllerInstallModule(
15
+ this.setupData.gameserver.id,
16
+ this.setupData.teleportsModule.id
17
+ );
18
+
19
+ const setEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 3);
20
+
21
+ await Promise.all(
22
+ Array.from({ length: 3 }).map(async (_, i) => {
23
+ return this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
24
+ msg: `/settp test${i}`,
25
+ playerId: this.setupData.players[0].id,
26
+ });
27
+ })
28
+ );
29
+
30
+ expect((await setEvents).length).to.be.eq(3);
31
+
32
+ for (const event of await setEvents) {
33
+ expect(event.data.msg).to.match(/Teleport test\d set\./);
34
+ }
35
+
36
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 4);
37
+
38
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
39
+ msg: '/tplist',
40
+ playerId: this.setupData.players[0].id,
41
+ });
42
+
43
+ expect((await events).length).to.be.eq(4);
44
+ expect((await events)[0].data.msg).to.be.eq('You have 3 teleports available');
45
+ // - test0: 61, -262, -52
46
+ expect((await events)[1].data.msg).to.match(/ - test0: [-\d]+, [-\d]+, [-\d]+/);
47
+ expect((await events)[2].data.msg).to.match(/ - test1: [-\d]+, [-\d]+, [-\d]+/);
48
+ expect((await events)[3].data.msg).to.match(/ - test2: [-\d]+, [-\d]+, [-\d]+/);
49
+ },
50
+ }),
51
+ new IntegrationTest<IModuleTestsSetupData>({
52
+ group,
53
+ snapshot: false,
54
+ setup: modulesTestSetup,
55
+ name: 'Public teleports show up in /tplist',
56
+ test: async function () {
57
+ await this.client.gameserver.gameServerControllerInstallModule(
58
+ this.setupData.gameserver.id,
59
+ this.setupData.teleportsModule.id,
60
+ {
61
+ userConfig: JSON.stringify({
62
+ allowPublicTeleports: true,
63
+ }),
64
+ }
65
+ );
66
+
67
+ const setTpEvent = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
68
+
69
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
70
+ msg: '/settp test',
71
+ playerId: this.setupData.players[0].id,
72
+ });
73
+
74
+ expect((await setTpEvent).length).to.be.eq(1);
75
+ expect((await setTpEvent)[0].data.msg).to.be.eq('Teleport test set.');
76
+
77
+ const setPublicEvent = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
78
+
79
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
80
+ msg: '/setpublic test',
81
+ playerId: this.setupData.players[0].id,
82
+ });
83
+
84
+ expect((await setPublicEvent).length).to.be.eq(1);
85
+ expect((await setPublicEvent)[0].data.msg).to.be.eq('Teleport test is now public.');
86
+
87
+ const setTpEvent2 = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
88
+
89
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
90
+ msg: '/settp test2',
91
+ playerId: this.setupData.players[0].id,
92
+ });
93
+
94
+ expect((await setTpEvent2).length).to.be.eq(1);
95
+ expect((await setTpEvent2)[0].data.msg).to.be.eq('Teleport test2 set.');
96
+
97
+ const tpEvent = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 2);
98
+
99
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
100
+ msg: '/tplist',
101
+ playerId: this.setupData.players[1].id,
102
+ });
103
+
104
+ expect((await tpEvent).length).to.be.eq(2);
105
+ expect((await tpEvent)[0].data.msg).to.be.eq('You have 1 teleport available');
106
+ expect((await tpEvent)[1].data.msg).to.match(/ - test: [-\d]+, [-\d]+, [-\d]+ \(public\)/);
107
+ },
108
+ }),
109
+ ];
110
+
111
+ describe(group, function () {
112
+ tests.forEach((test) => {
113
+ test.run();
114
+ });
115
+ });