@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,332 @@
1
+ import { IntegrationTest, expect } from '@takaro/test';
2
+ import { IModuleTestsSetupData, modulesTestSetup } from '@takaro/test';
3
+ import { GameEvents } from '../dto/index.js';
4
+ import { Client } from '@takaro/apiclient';
5
+
6
+ const group = 'lottery suite';
7
+ const ticketCost = 50;
8
+ const playerStartBalance = 1000;
9
+
10
+ async function expectTicketAmountLengthToBe(
11
+ client: Client,
12
+ gameServerId: string,
13
+ moduleId: string,
14
+ expectedAmount = 0
15
+ ) {
16
+ const ticketVars = await client.variable.variableControllerSearch({
17
+ filters: {
18
+ gameServerId: [gameServerId],
19
+ moduleId: [moduleId],
20
+ key: ['lottery_tickets_bought'],
21
+ },
22
+ });
23
+
24
+ const amount = ticketVars.data.data.reduce((acc, variable) => {
25
+ return acc + parseInt(JSON.parse(variable.value).amount, 10);
26
+ }, 0);
27
+
28
+ expect(expectedAmount).to.be.eq(amount);
29
+ }
30
+
31
+ const setup = async function (this: IntegrationTest<IModuleTestsSetupData>): Promise<IModuleTestsSetupData> {
32
+ const data = await modulesTestSetup.call(this);
33
+
34
+ await this.client.settings.settingsControllerSet('economyEnabled', {
35
+ value: 'true',
36
+ gameServerId: data.gameserver.id,
37
+ });
38
+
39
+ await this.client.gameserver.gameServerControllerInstallModule(data.gameserver.id, data.economyUtilsModule.id);
40
+
41
+ const pogs = await this.client.playerOnGameserver.playerOnGameServerControllerSearch({
42
+ filters: {
43
+ gameServerId: [data.gameserver.id],
44
+ },
45
+ });
46
+
47
+ const tasks = pogs.data.data.map((pog) => {
48
+ return this.client.playerOnGameserver.playerOnGameServerControllerAddCurrency(pog.gameServerId, pog.playerId, {
49
+ currency: playerStartBalance,
50
+ });
51
+ });
52
+
53
+ await Promise.allSettled(tasks);
54
+
55
+ await this.client.gameserver.gameServerControllerInstallModule(data.gameserver.id, data.lotteryModule.id, {
56
+ systemConfig: JSON.stringify({
57
+ commands: {
58
+ buyTicket: {
59
+ cost: ticketCost,
60
+ },
61
+ },
62
+ }),
63
+ });
64
+
65
+ const useLotteryRole = await this.client.permissionCodesToInputs(['LOTTERY_BUY']);
66
+ const viewLotteryRole = await this.client.permissionCodesToInputs(['LOTTERY_VIEW_TICKETS']);
67
+
68
+ await this.client.role.roleControllerUpdate(data.role.id, {
69
+ permissions: [
70
+ {
71
+ permissionId: useLotteryRole[0].permissionId,
72
+ },
73
+ {
74
+ permissionId: viewLotteryRole[0].permissionId,
75
+ },
76
+ ],
77
+ });
78
+
79
+ return data;
80
+ };
81
+
82
+ const tests = [
83
+ new IntegrationTest<IModuleTestsSetupData>({
84
+ group,
85
+ snapshot: false,
86
+ setup,
87
+ name: 'Cannot buy 0 lottery tickets',
88
+ test: async function () {
89
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
90
+ const player = this.setupData.players[0];
91
+
92
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
93
+ msg: '/buyTicket 0',
94
+ playerId: player.id,
95
+ });
96
+
97
+ expect((await events).length).to.be.eq(1);
98
+ expect((await events)[0].data.msg).to.be.eq('You must buy at least 1 ticket.');
99
+ },
100
+ }),
101
+ new IntegrationTest<IModuleTestsSetupData>({
102
+ group,
103
+ snapshot: false,
104
+ setup,
105
+ name: 'Can buy lottery ticket',
106
+ test: async function () {
107
+ let events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
108
+
109
+ const ticketAmount = 1;
110
+ const ticketPrice = ticketAmount * ticketCost;
111
+
112
+ const player = this.setupData.players[0];
113
+
114
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
115
+ msg: `/buyTicket ${ticketAmount}`,
116
+ playerId: player.id,
117
+ });
118
+
119
+ const currencyName = (
120
+ await this.client.settings.settingsControllerGetOne('currencyName', this.setupData.gameserver.id)
121
+ ).data.data.value;
122
+
123
+ expect((await events).length).to.be.eq(1);
124
+ expect((await events)[0].data.msg).to.be.eq(
125
+ `You have successfully bought ${ticketAmount} tickets for ${ticketPrice} ${currencyName}. Good luck!`
126
+ );
127
+
128
+ let pog = (
129
+ await this.client.playerOnGameserver.playerOnGameServerControllerGetOne(this.setupData.gameserver.id, player.id)
130
+ ).data.data;
131
+
132
+ expect(pog.currency).to.be.eq(playerStartBalance - ticketPrice);
133
+ await expectTicketAmountLengthToBe(this.client, this.setupData.gameserver.id, this.setupData.lotteryModule.id, 1);
134
+
135
+ events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
136
+
137
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
138
+ msg: `/buyTicket ${ticketAmount}`,
139
+ playerId: player.id,
140
+ });
141
+
142
+ expect((await events).length).to.be.eq(1);
143
+ expect((await events)[0].data.msg).to.be.eq(
144
+ `You have successfully bought ${ticketAmount} tickets for ${ticketPrice} ${currencyName}. Good luck!`
145
+ );
146
+
147
+ pog = (
148
+ await this.client.playerOnGameserver.playerOnGameServerControllerGetOne(this.setupData.gameserver.id, player.id)
149
+ ).data.data;
150
+ expect(pog.currency).to.be.eq(playerStartBalance - 2 * ticketPrice);
151
+ await expectTicketAmountLengthToBe(this.client, this.setupData.gameserver.id, this.setupData.lotteryModule.id, 2);
152
+ },
153
+ }),
154
+ new IntegrationTest<IModuleTestsSetupData>({
155
+ group,
156
+ snapshot: false,
157
+ setup,
158
+ name: 'Can view lottery tickets',
159
+ test: async function () {
160
+ const wantAmount = 10;
161
+
162
+ const waitForBuyEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
163
+
164
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
165
+ msg: `/buyTicket ${wantAmount}}`,
166
+ playerId: this.setupData.players[0].id,
167
+ });
168
+
169
+ await waitForBuyEvents;
170
+
171
+ const waitForViewEvent = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
172
+
173
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
174
+ msg: '/viewTickets',
175
+ playerId: this.setupData.players[0].id,
176
+ });
177
+
178
+ const events = await waitForViewEvent;
179
+
180
+ expect(events.length).to.be.eq(1);
181
+ expect(events[0].data.msg).to.be.eq(`You have bought ${wantAmount} tickets.`);
182
+ },
183
+ }),
184
+ new IntegrationTest<IModuleTestsSetupData>({
185
+ group,
186
+ snapshot: false,
187
+ setup,
188
+ name: 'Can give the lottery winner the prize money',
189
+ test: async function () {
190
+ const currencyName = (
191
+ await this.client.settings.settingsControllerGetOne('currencyName', this.setupData.gameserver.id)
192
+ ).data.data.value;
193
+
194
+ const playerAmount = this.setupData.players.length;
195
+ const ticketEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, playerAmount);
196
+
197
+ // let some players buy tickets
198
+ const asyncTasks = this.setupData.players.map(async (player) => {
199
+ return await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
200
+ msg: '/buyTicket 1',
201
+ playerId: player.id,
202
+ });
203
+ });
204
+
205
+ await Promise.allSettled(asyncTasks);
206
+ await ticketEvents;
207
+
208
+ const lotteryEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 4);
209
+
210
+ await this.client.cronjob.cronJobControllerTrigger({
211
+ moduleId: this.setupData.lotteryModule.id,
212
+ cronjobId: this.setupData.lotteryModule.cronJobs[0].id,
213
+ gameServerId: this.setupData.gameserver.id,
214
+ });
215
+
216
+ const mod = (
217
+ await this.client.gameserver.gameServerControllerGetModuleInstallation(
218
+ this.setupData.gameserver.id,
219
+ this.setupData.lotteryModule.id
220
+ )
221
+ ).data.data;
222
+
223
+ const userConfig: Record<string, any> = mod.userConfig;
224
+ const prize = ticketCost * playerAmount * (1 - userConfig.profitMargin);
225
+
226
+ const events = await lotteryEvents;
227
+
228
+ expect(events.length).to.be.eq(4);
229
+ expect(events[3].data.msg).to.contain(`${prize} ${currencyName}`);
230
+
231
+ const winnerName = events[3].data.msg.split('!')[0];
232
+ const winner = this.setupData.players.find((player) => player.name === winnerName);
233
+ if (!winner) {
234
+ throw new Error('winner name not found in the list of setup players');
235
+ }
236
+
237
+ const winnerPog = (
238
+ await this.client.playerOnGameserver.playerOnGameServerControllerGetOne(this.setupData.gameserver.id, winner.id)
239
+ ).data.data;
240
+ expect(winnerPog.currency).to.be.eq(playerStartBalance + (prize - ticketCost));
241
+ },
242
+ }),
243
+ new IntegrationTest<IModuleTestsSetupData>({
244
+ group,
245
+ snapshot: false,
246
+ setup,
247
+ name: 'If no players joined, the lottery is cancelled',
248
+ test: async function () {
249
+ const waitForEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
250
+
251
+ await this.client.cronjob.cronJobControllerTrigger({
252
+ moduleId: this.setupData.lotteryModule.id,
253
+ cronjobId: this.setupData.lotteryModule.cronJobs[0].id,
254
+ gameServerId: this.setupData.gameserver.id,
255
+ });
256
+
257
+ const events = await waitForEvents;
258
+
259
+ expect(events.length).to.be.eq(1);
260
+ expect(events[0].data.msg).to.eq('No one has bought any tickets. The lottery has been cancelled.');
261
+ },
262
+ }),
263
+ new IntegrationTest<IModuleTestsSetupData>({
264
+ group,
265
+ snapshot: false,
266
+ setup,
267
+ name: 'If one player joined, the lottery is cancelled and the player gets his money back',
268
+ test: async function () {
269
+ const waitForTicketEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
270
+
271
+ const player = this.setupData.players[0];
272
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
273
+ msg: '/buyTicket 1',
274
+ playerId: player.id,
275
+ });
276
+
277
+ await waitForTicketEvents;
278
+
279
+ const currencyName = (
280
+ await this.client.settings.settingsControllerGetOne('currencyName', this.setupData.gameserver.id)
281
+ ).data.data.value;
282
+
283
+ const waitForEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 2);
284
+
285
+ await this.client.cronjob.cronJobControllerTrigger({
286
+ moduleId: this.setupData.lotteryModule.id,
287
+ cronjobId: this.setupData.lotteryModule.cronJobs[0].id,
288
+ gameServerId: this.setupData.gameserver.id,
289
+ });
290
+
291
+ const events = await waitForEvents;
292
+
293
+ expect(events.length).to.be.eq(2);
294
+ expect(events[0].data.msg).to.eq('Only one person has bought a ticket. The lottery has been cancelled.');
295
+ expect(events[1].data.msg).to.eq(
296
+ `You have been refunded ${ticketCost} ${currencyName} because the lottery has been cancelled.`
297
+ );
298
+
299
+ const pog = (
300
+ await this.client.playerOnGameserver.playerOnGameServerControllerGetOne(this.setupData.gameserver.id, player.id)
301
+ ).data.data;
302
+ expect(pog.currency).to.be.eq(playerStartBalance);
303
+
304
+ await expectTicketAmountLengthToBe(this.client, this.setupData.gameserver.id, this.setupData.lotteryModule.id);
305
+ },
306
+ }),
307
+ new IntegrationTest<IModuleTestsSetupData>({
308
+ group,
309
+ snapshot: false,
310
+ setup,
311
+ name: 'Can view next lottery draw',
312
+ test: async function () {
313
+ const waitForEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
314
+
315
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
316
+ msg: '/nextDraw',
317
+ playerId: this.setupData.players[0].id,
318
+ });
319
+
320
+ const events = await waitForEvents;
321
+
322
+ expect(events.length).to.be.eq(1);
323
+ expect(events[0].data.msg).to.contain('The next lottery draw is in');
324
+ },
325
+ }),
326
+ ];
327
+
328
+ describe(group, function () {
329
+ tests.forEach((test) => {
330
+ test.run();
331
+ });
332
+ });
@@ -0,0 +1,192 @@
1
+ import { IntegrationTest, expect, integrationConfig } from '@takaro/test';
2
+ import { IModuleTestsSetupData, modulesTestSetup } from '@takaro/test';
3
+ import { GameEvents } from '../dto/index.js';
4
+
5
+ const group = 'Module permissions role assignments';
6
+
7
+ async function cleanRoleSetup(this: IntegrationTest<IModuleTestsSetupData>) {
8
+ const defaultSetup = await modulesTestSetup.bind(this)();
9
+
10
+ const playersRes = await this.client.player.playerControllerSearch();
11
+
12
+ const permissions = await this.client.permissionCodesToInputs(['TELEPORTS_USE']);
13
+
14
+ await this.client.role.roleControllerUpdate(defaultSetup.role.id, {
15
+ name: defaultSetup.role.name,
16
+ permissions,
17
+ });
18
+
19
+ await this.client.gameserver.gameServerControllerInstallModule(
20
+ defaultSetup.gameserver.id,
21
+ defaultSetup.teleportsModule.id
22
+ );
23
+
24
+ await Promise.all(
25
+ playersRes.data.data.map(async (player) => {
26
+ await this.client.player.playerControllerRemoveRole(player.id, defaultSetup.role.id);
27
+ })
28
+ );
29
+
30
+ return defaultSetup;
31
+ }
32
+
33
+ const tests = [
34
+ new IntegrationTest<IModuleTestsSetupData>({
35
+ group,
36
+ snapshot: false,
37
+ setup: cleanRoleSetup,
38
+ name: 'Player has global role -> works',
39
+ test: async function () {
40
+ const useTeleportsRole = await this.client.permissionCodesToInputs(['TELEPORTS_USE']);
41
+ await this.client.role.roleControllerUpdate(this.setupData.role.id, {
42
+ permissions: [
43
+ {
44
+ permissionId: useTeleportsRole[0].permissionId,
45
+ count: 3,
46
+ },
47
+ ],
48
+ });
49
+ await this.client.player.playerControllerAssignRole(this.setupData.players[0].id, this.setupData.role.id);
50
+
51
+ const setEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
52
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
53
+ msg: '/settp test',
54
+ playerId: this.setupData.players[0].id,
55
+ });
56
+
57
+ expect((await setEvents).length).to.be.eq(1);
58
+ expect((await setEvents)[0].data.msg).to.be.eq('Teleport test set.');
59
+ },
60
+ }),
61
+ new IntegrationTest<IModuleTestsSetupData>({
62
+ group,
63
+ snapshot: false,
64
+ setup: cleanRoleSetup,
65
+ name: 'Player has role on other gameserver -> command denied',
66
+ test: async function () {
67
+ const newGameServer = await this.client.gameserver.gameServerControllerCreate({
68
+ name: 'newServer',
69
+ connectionInfo: JSON.stringify({
70
+ host: integrationConfig.get('mockGameserver.host'),
71
+ }),
72
+ type: 'MOCK',
73
+ });
74
+
75
+ await this.client.player.playerControllerAssignRole(this.setupData.players[0].id, this.setupData.role.id, {
76
+ gameServerId: newGameServer.data.data.id,
77
+ });
78
+
79
+ const setEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
80
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
81
+ msg: '/settp test',
82
+ playerId: this.setupData.players[0].id,
83
+ });
84
+
85
+ expect((await setEvents).length).to.be.eq(1);
86
+ expect((await setEvents)[0].data.msg).to.be.eq('You do not have permission to use teleports.');
87
+ },
88
+ }),
89
+ new IntegrationTest<IModuleTestsSetupData>({
90
+ group,
91
+ snapshot: false,
92
+ setup: cleanRoleSetup,
93
+ name: 'Player has role on correct gameserver -> works',
94
+ test: async function () {
95
+ const useTeleportsRole = await this.client.permissionCodesToInputs(['TELEPORTS_USE']);
96
+ await this.client.role.roleControllerUpdate(this.setupData.role.id, {
97
+ permissions: [
98
+ {
99
+ permissionId: useTeleportsRole[0].permissionId,
100
+ count: 3,
101
+ },
102
+ ],
103
+ });
104
+
105
+ await this.client.player.playerControllerAssignRole(this.setupData.players[0].id, this.setupData.role.id, {
106
+ gameServerId: this.setupData.gameserver.id,
107
+ });
108
+
109
+ const setEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
110
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
111
+ msg: '/settp test',
112
+ playerId: this.setupData.players[0].id,
113
+ });
114
+
115
+ expect((await setEvents).length).to.be.eq(1);
116
+ expect((await setEvents)[0].data.msg).to.be.eq('Teleport test set.');
117
+ },
118
+ }),
119
+ new IntegrationTest<IModuleTestsSetupData>({
120
+ group,
121
+ snapshot: false,
122
+ setup: modulesTestSetup,
123
+ name: 'Uses system roles',
124
+ test: async function () {
125
+ await this.client.gameserver.gameServerControllerInstallModule(
126
+ this.setupData.gameserver.id,
127
+ this.setupData.teleportsModule.id,
128
+ {
129
+ userConfig: JSON.stringify({
130
+ timeout: 0,
131
+ }),
132
+ }
133
+ );
134
+
135
+ await Promise.all(
136
+ this.setupData.players.map(async (player) => {
137
+ await this.client.player.playerControllerRemoveRole(player.id, this.setupData.role.id);
138
+ })
139
+ );
140
+
141
+ const playerRoleRes = await this.client.role.roleControllerSearch({ filters: { name: ['Player'] } });
142
+ const useTeleportsRole = await this.client.permissionCodesToInputs(['TELEPORTS_USE']);
143
+ await this.client.role.roleControllerUpdate(playerRoleRes.data.data[0].id, {
144
+ permissions: [
145
+ {
146
+ permissionId: useTeleportsRole[0].permissionId,
147
+ count: 3,
148
+ },
149
+ ],
150
+ });
151
+
152
+ const setTpEvent = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
153
+
154
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
155
+ msg: '/settp test',
156
+ playerId: this.setupData.players[0].id,
157
+ });
158
+
159
+ expect((await setTpEvent).length).to.be.eq(1);
160
+ expect((await setTpEvent)[0].data.msg).to.be.eq('Teleport test set.');
161
+
162
+ const tpEvent = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
163
+
164
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
165
+ msg: '/tp test',
166
+ playerId: this.setupData.players[0].id,
167
+ });
168
+
169
+ expect((await tpEvent)[0].data.msg).to.be.eq('Teleported to test.');
170
+
171
+ await this.client.role.roleControllerUpdate(playerRoleRes.data.data[0].id, {
172
+ name: 'Player',
173
+ permissions: [],
174
+ });
175
+
176
+ const tpEventNoPerm = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
177
+
178
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
179
+ msg: '/tp test',
180
+ playerId: this.setupData.players[0].id,
181
+ });
182
+
183
+ expect((await tpEventNoPerm)[0].data.msg).to.be.eq('You do not have permission to use teleports.');
184
+ },
185
+ }),
186
+ ];
187
+
188
+ describe(group, function () {
189
+ tests.forEach((test) => {
190
+ test.run();
191
+ });
192
+ });
@@ -0,0 +1,123 @@
1
+ import { IntegrationTest, expect } from '@takaro/test';
2
+ import { IModuleTestsSetupData, modulesTestSetup } from '@takaro/test';
3
+ import { EventPlayerConnected, GameEvents } from '../dto/gameEvents.js';
4
+ import { HookEvents } from '../main.js';
5
+
6
+ const group = 'Onboarding';
7
+ const groupStarterkit = 'Onboarding - Starterkit';
8
+
9
+ const _tests = [
10
+ new IntegrationTest<IModuleTestsSetupData>({
11
+ group,
12
+ snapshot: false,
13
+ setup: modulesTestSetup,
14
+ name: 'PlayerConnected hook sends a message when a player connects to the server',
15
+ test: async function () {
16
+ await this.client.gameserver.gameServerControllerInstallModule(
17
+ this.setupData.gameserver.id,
18
+ this.setupData.onboardingModule.id
19
+ );
20
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
21
+ await this.client.hook.hookControllerTrigger({
22
+ gameServerId: this.setupData.gameserver.id,
23
+ playerId: this.setupData.players[0].id,
24
+ eventType: GameEvents.PLAYER_CONNECTED,
25
+ eventMeta: new EventPlayerConnected({
26
+ player: {
27
+ gameId: '1',
28
+ },
29
+ msg: 'Player connected',
30
+ }),
31
+ });
32
+
33
+ expect((await events).length).to.be.eq(1);
34
+ expect((await events)[0].data.msg).to.match(/Welcome .+ to the server!/);
35
+ },
36
+ }),
37
+ new IntegrationTest<IModuleTestsSetupData>({
38
+ group: groupStarterkit,
39
+ snapshot: false,
40
+ setup: modulesTestSetup,
41
+ name: 'Starterkit command gives the player items',
42
+ test: async function () {
43
+ await this.client.gameserver.gameServerControllerInstallModule(
44
+ this.setupData.gameserver.id,
45
+ this.setupData.onboardingModule.id,
46
+ {
47
+ userConfig: JSON.stringify({
48
+ starterKitItems: ['cigar'],
49
+ }),
50
+ }
51
+ );
52
+ const events = this.setupData.eventAwaiter.waitForEvents(HookEvents.COMMAND_EXECUTED);
53
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
54
+ msg: '/starterkit',
55
+ playerId: this.setupData.players[0].id,
56
+ });
57
+
58
+ const resultLogs = (await events)[0].data.meta.result.logs;
59
+ expect(resultLogs.some((log: any) => log.msg.match(/giveItem 200 OK/))).to.be.true;
60
+ },
61
+ }),
62
+ new IntegrationTest<IModuleTestsSetupData>({
63
+ group: groupStarterkit,
64
+ snapshot: false,
65
+ setup: modulesTestSetup,
66
+ name: 'Starterkit command can only be used once',
67
+ test: async function () {
68
+ await this.client.gameserver.gameServerControllerInstallModule(
69
+ this.setupData.gameserver.id,
70
+ this.setupData.onboardingModule.id,
71
+ {
72
+ userConfig: JSON.stringify({
73
+ starterKitItems: ['cigar'],
74
+ }),
75
+ }
76
+ );
77
+ const firstEvents = this.setupData.eventAwaiter.waitForEvents(HookEvents.COMMAND_EXECUTED);
78
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
79
+ msg: '/starterkit',
80
+ playerId: this.setupData.players[0].id,
81
+ });
82
+
83
+ const resultLogs = (await firstEvents)[0].data.meta.result.logs;
84
+ expect(resultLogs.some((log: any) => log.msg.match(/giveItem 200 OK/))).to.be.true;
85
+
86
+ const secondEvents = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
87
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
88
+ msg: '/starterkit',
89
+ playerId: this.setupData.players[0].id,
90
+ });
91
+
92
+ expect((await secondEvents).length).to.be.eq(1);
93
+ expect((await secondEvents)[0].data.msg).to.match(/ou already used starterkit on this server/);
94
+ },
95
+ }),
96
+ new IntegrationTest<IModuleTestsSetupData>({
97
+ group: groupStarterkit,
98
+ snapshot: false,
99
+ setup: modulesTestSetup,
100
+ name: 'Starterkit with nothing configured, shows an error message',
101
+ test: async function () {
102
+ await this.client.gameserver.gameServerControllerInstallModule(
103
+ this.setupData.gameserver.id,
104
+ this.setupData.onboardingModule.id
105
+ );
106
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE, 1);
107
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
108
+ msg: '/starterkit',
109
+ playerId: this.setupData.players[0].id,
110
+ });
111
+
112
+ expect((await events).length).to.be.eq(1);
113
+ expect((await events)[0].data.msg).to.match(/No starter kit items configured/);
114
+ },
115
+ }),
116
+ ];
117
+
118
+ // Temp disabled...
119
+ /* describe(group, function () {
120
+ tests.forEach((test) => {
121
+ test.run();
122
+ });
123
+ }); */
@@ -0,0 +1,36 @@
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 = 'Ping command';
6
+
7
+ const tests = [
8
+ new IntegrationTest<IModuleTestsSetupData>({
9
+ group,
10
+ snapshot: false,
11
+ setup: modulesTestSetup,
12
+ name: 'Ping command replies with pong',
13
+ test: async function () {
14
+ await this.client.gameserver.gameServerControllerInstallModule(
15
+ this.setupData.gameserver.id,
16
+ this.setupData.utilsModule.id
17
+ );
18
+
19
+ const events = this.setupData.eventAwaiter.waitForEvents(GameEvents.CHAT_MESSAGE);
20
+
21
+ await this.client.command.commandControllerTrigger(this.setupData.gameserver.id, {
22
+ msg: '/ping',
23
+ playerId: this.setupData.players[0].id,
24
+ });
25
+
26
+ expect((await events).length).to.be.eq(1);
27
+ expect((await events)[0].data.msg).to.be.eq('Pong!');
28
+ },
29
+ }),
30
+ ];
31
+
32
+ describe(group, function () {
33
+ tests.forEach((test) => {
34
+ test.run();
35
+ });
36
+ });