@futdevpro/nts-dynamo 1.15.13 → 1.15.15
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/.c8rc.json +26 -26
- package/.copilot/patterns.json +7 -7
- package/.cursor/rules/__assistant_guide.mdc +30 -30
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
- package/.cursor/rules/_ag_frontend.mdc +39 -39
- package/.cursor/rules/_ag_import-rules.mdc +44 -44
- package/.cursor/rules/_ag_naming.mdc +115 -115
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/cursor-rules.md +160 -160
- package/.cursor/rules/default-command.mdc +464 -464
- package/.cursor/rules/error_code_pattern.md +39 -39
- package/.cursor/rules/saved rule mcp server use.md +15 -15
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/_specifications/BACKLOG.md +50 -22
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/build/_collections/global-settings.const.d.ts.map +1 -1
- package/build/_collections/global-settings.const.js +4 -0
- package/build/_collections/global-settings.const.js.map +1 -1
- package/build/_models/interfaces/global-log-settings.interface.d.ts +11 -0
- package/build/_models/interfaces/global-log-settings.interface.d.ts.map +1 -1
- package/build/_modules/logs/get-logs-routing-module.util.d.ts +19 -0
- package/build/_modules/logs/get-logs-routing-module.util.d.ts.map +1 -0
- package/build/_modules/logs/get-logs-routing-module.util.js +32 -0
- package/build/_modules/logs/get-logs-routing-module.util.js.map +1 -0
- package/build/_modules/logs/index.d.ts +4 -0
- package/build/_modules/logs/index.d.ts.map +1 -0
- package/build/_modules/logs/index.js +10 -0
- package/build/_modules/logs/index.js.map +1 -0
- package/build/_modules/logs/log-buffer.service.d.ts +38 -0
- package/build/_modules/logs/log-buffer.service.d.ts.map +1 -0
- package/build/_modules/logs/log-buffer.service.js +97 -0
- package/build/_modules/logs/log-buffer.service.js.map +1 -0
- package/build/_modules/logs/logs.controller.d.ts +27 -0
- package/build/_modules/logs/logs.controller.d.ts.map +1 -0
- package/build/_modules/logs/logs.controller.js +90 -0
- package/build/_modules/logs/logs.controller.js.map +1 -0
- package/build/_modules/logs/logs.service.d.ts +40 -0
- package/build/_modules/logs/logs.service.d.ts.map +1 -0
- package/build/_modules/logs/logs.service.js +97 -0
- package/build/_modules/logs/logs.service.js.map +1 -0
- package/build/_modules/server/errors/errors.data-service.d.ts.map +1 -1
- package/build/_modules/server/errors/errors.data-service.js +2 -1
- package/build/_modules/server/errors/errors.data-service.js.map +1 -1
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +362 -353
- package/scripts/run-coverage-tests.js +28 -28
- package/spec/support/helpers/spec-reporter-loader.js +359 -359
- package/spec/support/helpers/ts-node-helper.js +93 -93
- package/spec/support/jasmine.coverage.json +24 -24
- package/spec/support/jasmine.json +24 -24
- package/src/_collections/archive.util.spec.ts +57 -57
- package/src/_collections/archive.util.ts +18 -18
- package/src/_collections/atlas-default-db-options.const.ts +9 -9
- package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
- package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
- package/src/_collections/default-not-found-page.const.spec.ts +19 -19
- package/src/_collections/default-not-found-page.const.ts +22 -22
- package/src/_collections/default-socket-path.const.spec.ts +12 -12
- package/src/_collections/default-socket-path.const.ts +2 -2
- package/src/_collections/get-environment-settings.util.spec.ts +210 -210
- package/src/_collections/get-environment-settings.util.ts +48 -48
- package/src/_collections/global-settings.const.ts +5 -0
- package/src/_collections/sample.env +21 -21
- package/src/_collections/star.controller.spec.ts +224 -224
- package/src/_collections/star.controller.ts +129 -129
- package/src/_enums/data-model-type.enum.ts +14 -14
- package/src/_enums/data-service-function.enum.ts +24 -24
- package/src/_enums/predefined-data-types.enum.ts +16 -16
- package/src/_enums/route-security.enum.ts +12 -12
- package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
- package/src/_models/control-models/api-call-params.control-model.ts +142 -142
- package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
- package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
- package/src/_models/control-models/app-params.control-model.ts +136 -136
- package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
- package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/endpoint-params.control-model.spec.ts +578 -578
- package/src/_models/control-models/endpoint-params.control-model.ts +526 -526
- package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
- package/src/_models/control-models/http-settings.control-model.ts +37 -37
- package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
- package/src/_models/control-models/system-control.control-model.ts +12 -12
- package/src/_models/interfaces/certification-settings.interface.ts +7 -7
- package/src/_models/interfaces/environment-settings.interface.ts +59 -59
- package/src/_models/interfaces/global-log-settings.interface.ts +108 -96
- package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
- package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
- package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
- package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
- package/src/_models/types/db-update.type.ts +100 -100
- package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
- package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
- package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
- package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
- package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
- package/src/_modules/ai/_modules/document-ai/index.ts +28 -28
- package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
- package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
- package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
- package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +240 -240
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.ts +98 -98
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +615 -615
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +437 -437
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +833 -833
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
- package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
- package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
- package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
- package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
- package/src/_modules/ai/_services/ai-llm.service-base.ts +332 -332
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +79 -79
- package/src/_modules/ai/_services/ai-provider.service-base.ts +29 -29
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/index.ts +13 -13
- package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
- package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
- package/src/_modules/assistant/_collections/ass.util.ts +50 -50
- package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
- package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
- package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
- package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
- package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
- package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
- package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
- package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
- package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
- package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
- package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
- package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
- package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
- package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
- package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
- package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
- package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
- package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
- package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
- package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
- package/src/_modules/custom-data/custom-data.controller.ts +67 -67
- package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
- package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
- package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
- package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
- package/src/_modules/custom-data/index.ts +9 -9
- package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
- package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
- package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
- package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
- package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
- package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
- package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
- package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
- package/src/_modules/defaults/index.ts +17 -17
- package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
- package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
- package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
- package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
- package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
- package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
- package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
- package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
- package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
- package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
- package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
- package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
- package/src/_modules/discord-assistant/index.ts +38 -38
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
- package/src/_modules/discord-assistant-voiced/index.ts +36 -36
- package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
- package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
- package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
- package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
- package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
- package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
- package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
- package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
- package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
- package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
- package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
- package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
- package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
- package/src/_modules/discord-bot/index.ts +36 -36
- package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +19 -19
- package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +345 -345
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +330 -330
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +393 -393
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +220 -220
- package/src/_modules/local-vector-search/index.ts +11 -11
- package/src/_modules/logs/get-logs-routing-module.util.ts +36 -0
- package/src/_modules/logs/index.ts +3 -0
- package/src/_modules/logs/log-buffer.service.ts +101 -0
- package/src/_modules/logs/logs.controller.ts +109 -0
- package/src/_modules/logs/logs.service.ts +100 -0
- package/src/_modules/messaging/README.md +354 -354
- package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
- package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
- package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
- package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
- package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
- package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
- package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
- package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
- package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
- package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
- package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
- package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
- package/src/_modules/messaging/index.ts +30 -30
- package/src/_modules/mock/app-extended-server.mock.ts +201 -201
- package/src/_modules/mock/app-integration-test.mock.ts +51 -51
- package/src/_modules/mock/app-params.mock.spec.ts +21 -21
- package/src/_modules/mock/app-params.mock.ts +9 -9
- package/src/_modules/mock/app-server.mock.ts +188 -188
- package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
- package/src/_modules/mock/auth-service.mock.ts +28 -28
- package/src/_modules/mock/controller.mock.spec.ts +26 -26
- package/src/_modules/mock/controller.mock.ts +16 -16
- package/src/_modules/mock/data-model.mock.spec.ts +111 -111
- package/src/_modules/mock/data-model.mock.ts +82 -82
- package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
- package/src/_modules/mock/email-service-collection.mock.ts +15 -15
- package/src/_modules/mock/email-service.mock.spec.ts +17 -17
- package/src/_modules/mock/email-service.mock.ts +20 -20
- package/src/_modules/mock/email-template.mock.html +14 -14
- package/src/_modules/mock/endpoint.mock.ts +91 -91
- package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
- package/src/_modules/mock/socket-client.mock.ts +45 -45
- package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
- package/src/_modules/mock/socket-server.mock.ts +46 -46
- package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
- package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
- package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
- package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
- package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
- package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
- package/src/_modules/oauth2/index.ts +17 -17
- package/src/_modules/server/errors/errors.control-service.spec.ts +230 -230
- package/src/_modules/server/errors/errors.control-service.ts +69 -69
- package/src/_modules/server/errors/errors.controller.spec.ts +165 -165
- package/src/_modules/server/errors/errors.controller.ts +270 -270
- package/src/_modules/server/errors/errors.data-service.spec.ts +355 -355
- package/src/_modules/server/errors/errors.data-service.ts +2 -1
- package/src/_modules/server/index.ts +30 -30
- package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
- package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
- package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
- package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +516 -516
- package/src/_modules/server/server-status/server-status.control-service.ts +336 -336
- package/src/_modules/server/server-status/server-status.controller.spec.ts +156 -156
- package/src/_modules/server/server-status/server-status.controller.ts +131 -131
- package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
- package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
- package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
- package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
- package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
- package/src/_modules/socket/_services/socket-client.service.ts +260 -260
- package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
- package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
- package/src/_modules/socket/app-extended.server.ts +630 -630
- package/src/_modules/socket/index.ts +42 -42
- package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
- package/src/_modules/test/get-test-routing-module.util.ts +23 -23
- package/src/_modules/test/index.ts +11 -11
- package/src/_modules/test/test.controller.spec.ts +72 -72
- package/src/_modules/test/test.controller.ts +115 -115
- package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
- package/src/_modules/usage/index.ts +15 -15
- package/src/_modules/usage/usage.controller.spec.ts +81 -81
- package/src/_modules/usage/usage.controller.ts +126 -126
- package/src/_modules/usage/usage.data-service.spec.ts +332 -332
- package/src/_modules/usage/usage.data-service.ts +185 -185
- package/src/_services/base/api.service-base.spec.ts +125 -125
- package/src/_services/base/api.service-base.ts +74 -74
- package/src/_services/base/archive-data.service.spec.ts +196 -196
- package/src/_services/base/archive-data.service.ts +216 -216
- package/src/_services/base/data.service.spec.ts +493 -493
- package/src/_services/base/data.service.ts +2525 -2525
- package/src/_services/base/db.service.spec.ts +73 -73
- package/src/_services/base/db.service.ts +1575 -1575
- package/src/_services/base/singleton.service-base.spec.ts +28 -28
- package/src/_services/base/singleton.service-base.ts +24 -24
- package/src/_services/base/singleton.service.spec.ts +114 -114
- package/src/_services/base/singleton.service.ts +38 -38
- package/src/_services/core/api.service.spec.ts +140 -140
- package/src/_services/core/auth.service.spec.ts +159 -159
- package/src/_services/core/auth.service.ts +174 -174
- package/src/_services/core/email.service.spec.ts +85 -85
- package/src/_services/core/email.service.ts +742 -742
- package/src/_services/core/global.service.spec.ts +275 -275
- package/src/_services/core/global.service.ts +461 -461
- package/src/_services/core/service-collection.service.spec.ts +46 -46
- package/src/_services/core/service-collection.service.ts +6 -6
- package/src/_services/route/controller.service.spec.ts +53 -53
- package/src/_services/route/controller.service.ts +148 -148
- package/src/_services/route/routing-module.service.spec.ts +98 -98
- package/src/_services/route/routing-module.service.ts +330 -330
- package/src/_services/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +94 -94
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
|
@@ -1,488 +1,488 @@
|
|
|
1
|
-
import { Client, GatewayIntentBits, Guild, Collection, GuildMember, Message, Partials, Role, TextChannel } from 'discord.js'
|
|
2
|
-
import * as dotenv from 'dotenv'
|
|
3
|
-
import { DyNTS_SingletonService } from '../../../_services/base/singleton.service';
|
|
4
|
-
import { DyFM_Async, DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
5
|
-
import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
|
|
6
|
-
import { DyNTS_DiBo_Routines_ControlService } from './dibo-routines.control-service';
|
|
7
|
-
import { DyNTS_DiBo_IO_ControlService } from './dibo-io.control-service';
|
|
8
|
-
import { DyNTS_DiBo_global_settings } from '../_collections/dibo-global-settings.conts';
|
|
9
|
-
import { DyNTS_GlobalService } from '../../../_services/core/global.service';
|
|
10
|
-
import { DyNTS_DiBo_Operations_Util } from '../_collections/dibo-operations.util';
|
|
11
|
-
import { DyNTS_DiBo_Commands_ControlService } from './dibo-commands.control-service';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* This is the main control service for the Discord Bot.
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* Setup:
|
|
19
|
-
* 1. creating the Bot
|
|
20
|
-
* - go to: https://discord.com/developers/applications
|
|
21
|
-
* - click: "New Application"
|
|
22
|
-
* - give a name → Create
|
|
23
|
-
*
|
|
24
|
-
* 2. adding the Bot to the app
|
|
25
|
-
* - on the left: "Bot" → "Add Bot" → Yes, do it
|
|
26
|
-
*
|
|
27
|
-
* 3. getting the token
|
|
28
|
-
* - on the same page: "Reset Token" → Copy
|
|
29
|
-
* - put the token in the .env file: DISCORD_BOT_TOKEN=...
|
|
30
|
-
*
|
|
31
|
-
* 4. Bot ID (Client ID) and Invite link
|
|
32
|
-
* - on the left: "OAuth2" > "URL Generator"
|
|
33
|
-
* - Scopes: tick the bot
|
|
34
|
-
* - Bot Permissions: pl. Send Messages, Read Message History
|
|
35
|
-
* - at the bottom: generate Invite URL → open it → add it to a server
|
|
36
|
-
* - the Client ID is on the same page, the "Application ID" on the "OAuth2 > General" or "Application" tab.
|
|
37
|
-
* - it only works if you are admin on that server or have "Manage Server" permissions.
|
|
38
|
-
*
|
|
39
|
-
* 5. Permissions
|
|
40
|
-
* - on the left: "Bot" tab
|
|
41
|
-
* - enable these:
|
|
42
|
-
* - MESSAGE CONTENT INTENT
|
|
43
|
-
* - PRESENCE INTENT (if you use it)
|
|
44
|
-
* - SERVER MEMBERS INTENT (if you need guild user info)
|
|
45
|
-
* - Save
|
|
46
|
-
*
|
|
47
|
-
*/
|
|
48
|
-
export abstract class DyNTS_DiBo_Main_ControlService extends DyNTS_SingletonService {
|
|
49
|
-
|
|
50
|
-
/* static getInstance(): DyNTS_DiBo_Main_ControlService {
|
|
51
|
-
return DyNTS_DiBo_Main_ControlService.getSingletonInstance();
|
|
52
|
-
} */
|
|
53
|
-
|
|
54
|
-
readonly client: Client;
|
|
55
|
-
|
|
56
|
-
private _discordServer: Guild;
|
|
57
|
-
get discordServer(): Guild {
|
|
58
|
-
return this._discordServer;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
get botClientId(): string {
|
|
62
|
-
return this.client?.user?.id ?? DyNTS_global_settings?.env_settings?.discord?.clientId;
|
|
63
|
-
}
|
|
64
|
-
get botDisplayName(): string {
|
|
65
|
-
return this.client?.user?.displayName;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
protected botIO_CS: DyNTS_DiBo_IO_ControlService;
|
|
69
|
-
protected abstract getBotIOControlService(): DyNTS_DiBo_IO_ControlService;
|
|
70
|
-
|
|
71
|
-
protected routines_CS: DyNTS_DiBo_Routines_ControlService;
|
|
72
|
-
protected abstract getRoutinesControlService(): DyNTS_DiBo_Routines_ControlService;
|
|
73
|
-
|
|
74
|
-
protected commands_CS: DyNTS_DiBo_Commands_ControlService;
|
|
75
|
-
protected abstract getCommandsControlService(): DyNTS_DiBo_Commands_ControlService;
|
|
76
|
-
|
|
77
|
-
private _channelsByNames: {
|
|
78
|
-
[key: string]: TextChannel;
|
|
79
|
-
} = {};
|
|
80
|
-
|
|
81
|
-
private _rolesByNames: {
|
|
82
|
-
[key: string]: Role;
|
|
83
|
-
} = {};
|
|
84
|
-
|
|
85
|
-
protected debugLog = false;
|
|
86
|
-
|
|
87
|
-
protected constructor(
|
|
88
|
-
setupAutomatically?: boolean,
|
|
89
|
-
) {
|
|
90
|
-
super();
|
|
91
|
-
|
|
92
|
-
DyNTS_global_settings.bot_settings ??= DyNTS_DiBo_global_settings;
|
|
93
|
-
|
|
94
|
-
if (this.client) {
|
|
95
|
-
throw new DyFM_Error({
|
|
96
|
-
...this.getDefaultErrorSettings(
|
|
97
|
-
'start',
|
|
98
|
-
new Error('Discord client already initialized'),
|
|
99
|
-
'system-init'
|
|
100
|
-
),
|
|
101
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-C000`,
|
|
102
|
-
})
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
this.client = new Client({
|
|
106
|
-
intents: DyNTS_global_settings.bot_settings.intents,
|
|
107
|
-
partials: DyNTS_global_settings.bot_settings.partials,
|
|
108
|
-
})
|
|
109
|
-
DyFM_Log.success('Discord client initialized');
|
|
110
|
-
|
|
111
|
-
if (setupAutomatically) {
|
|
112
|
-
this.setup('system-init');
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
async setup(issuer: string): Promise<void> {
|
|
117
|
-
try {
|
|
118
|
-
await DyFM_Async.delay(100);
|
|
119
|
-
|
|
120
|
-
if (!DyNTS_global_settings.env_settings.discord.guildId) {
|
|
121
|
-
throw new Error(
|
|
122
|
-
`No discord server id found!` +
|
|
123
|
-
`\nPlease set the DISCORD_GUILD_ID in the .env file, ` +
|
|
124
|
-
`or directly in the DyNTS_global_settings.env_settings.discord.guildId` +
|
|
125
|
-
`\nYou also will need to set the DISCORD_BOT_TOKEN, DISCORD_BOT_CLIENT_ID and DISCORD_BOT_OAUTH2_URL.`
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if (!DyNTS_global_settings.env_settings.discord.token) {
|
|
130
|
-
throw new Error(
|
|
131
|
-
`No discord token found!` +
|
|
132
|
-
`\nPlease set the DISCORD_BOT_TOKEN in the .env file, ` +
|
|
133
|
-
`or directly in the DyNTS_global_settings.env_settings.discord.token` +
|
|
134
|
-
`\nYou also will need to set the DISCORD_GUILD_ID, DISCORD_BOT_CLIENT_ID and DISCORD_BOT_OAUTH2_URL.`
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if (!DyNTS_global_settings.env_settings.discord.clientId) {
|
|
139
|
-
throw new Error(
|
|
140
|
-
`No discord client id found!` +
|
|
141
|
-
`\nPlease set the DISCORD_BOT_CLIENT_ID in the .env file, ` +
|
|
142
|
-
`or directly in the DyNTS_global_settings.env_settings.discord.clientId` +
|
|
143
|
-
`\nYou also will need to set the DISCORD_GUILD_ID, DISCORD_BOT_TOKEN and DISCORD_BOT_OAUTH2_URL.`
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (!DyNTS_global_settings.env_settings.discord.oauth2Url) {
|
|
148
|
-
throw new Error(
|
|
149
|
-
`No discord oauth2 url found!` +
|
|
150
|
-
`\nPlease set the DISCORD_BOT_OAUTH2_URL in the .env file, ` +
|
|
151
|
-
`or directly in the DyNTS_global_settings.env_settings.discord.oauth2Url` +
|
|
152
|
-
`\nYou also will need to set the DISCORD_GUILD_ID, DISCORD_BOT_TOKEN and DISCORD_BOT_CLIENT_ID.`
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
DyNTS_DiBo_global_settings.channelSettings.defaultChannels.forEach(
|
|
157
|
-
channelName => {
|
|
158
|
-
if (!DyNTS_DiBo_global_settings.channelSettings.allowedChannels.includes(channelName)) {
|
|
159
|
-
DyNTS_DiBo_global_settings.channelSettings.allowedChannels.push(channelName);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
);
|
|
163
|
-
if (!DyNTS_DiBo_global_settings.channelSettings.allowedChannels.includes(
|
|
164
|
-
DyNTS_DiBo_global_settings.channelSettings.reportChannelName
|
|
165
|
-
)) {
|
|
166
|
-
DyNTS_DiBo_global_settings.channelSettings.allowedChannels.push(
|
|
167
|
-
DyNTS_DiBo_global_settings.channelSettings.reportChannelName
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
this.botIO_CS = this.getBotIOControlService();
|
|
172
|
-
this.routines_CS = this.getRoutinesControlService();
|
|
173
|
-
this.commands_CS = this.getCommandsControlService();
|
|
174
|
-
|
|
175
|
-
if (!this.botIO_CS) {
|
|
176
|
-
throw new DyFM_Error({
|
|
177
|
-
...this.getDefaultErrorSettings('setup', new Error('Bot IO Control Service not found'), issuer),
|
|
178
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-S01`,
|
|
179
|
-
})
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (!this.routines_CS) {
|
|
183
|
-
throw new DyFM_Error({
|
|
184
|
-
...this.getDefaultErrorSettings('setup', new Error('Routines Control Service not found'), issuer),
|
|
185
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-S02`,
|
|
186
|
-
})
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if (!this.commands_CS) {
|
|
190
|
-
throw new DyFM_Error({
|
|
191
|
-
...this.getDefaultErrorSettings('setup', new Error('Commands Control Service not found'), issuer),
|
|
192
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-S03`,
|
|
193
|
-
})
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
await this.botIO_CS.setup(issuer);
|
|
197
|
-
await this.routines_CS.setup(issuer);
|
|
198
|
-
await this.commands_CS.setup(issuer);
|
|
199
|
-
|
|
200
|
-
return new Promise((resolve, reject) => {
|
|
201
|
-
this.client.on('error', (error) => {
|
|
202
|
-
if (DyNTS_DiBo_global_settings.debugLevel >= 1) {
|
|
203
|
-
/* DyFM_Log.error('Discord client error:', error); */
|
|
204
|
-
DyFM_Error.logSimple('Discord client error:', error);
|
|
205
|
-
}
|
|
206
|
-
DyNTS_GlobalService.globalErrorHandler(error);
|
|
207
|
-
reject(error);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
if (this.debugLog) {
|
|
211
|
-
DyFM_Log.success('Error event registered\n\n', new Error().stack);
|
|
212
|
-
} else {
|
|
213
|
-
DyFM_Log.success('Error event registered');
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
this.client.on('ready', async () => {
|
|
217
|
-
if (DyNTS_DiBo_global_settings.debugLevel >= 1) {
|
|
218
|
-
DyFM_Log.success(`Logged in as ${this.client.user?.tag}`)
|
|
219
|
-
}
|
|
220
|
-
// szerver azonosító
|
|
221
|
-
this._discordServer = this.client.guilds.cache.get(
|
|
222
|
-
DyNTS_global_settings.env_settings.discord.guildId
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
if (!this._discordServer) {
|
|
226
|
-
throw new Error(`No discord server found`);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
await this.start(issuer);
|
|
230
|
-
|
|
231
|
-
//await Operations.reportIn(this._discordServer, this.client)
|
|
232
|
-
|
|
233
|
-
DyFM_Log.success('Discord Bot setup complete')
|
|
234
|
-
resolve();
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
if (this.debugLog) {
|
|
238
|
-
DyFM_Log.success('Ready event registered\n\n', new Error().stack);
|
|
239
|
-
} else {
|
|
240
|
-
DyFM_Log.success('Ready event registered');
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
this.client.on('messageCreate', (message: Message) => {
|
|
244
|
-
try {
|
|
245
|
-
// Discord-specific implementation doesn't use generic wrapper pattern
|
|
246
|
-
// It has its own handleNewMessage signature
|
|
247
|
-
this.botIO_CS.handleNewMessage(message, message?.author?.id ?? 'unknown')
|
|
248
|
-
} catch (error) {
|
|
249
|
-
DyFM_Error.logSimple('Error handling new message:', error);
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
if (this.debugLog) {
|
|
255
|
-
DyFM_Log.success('Message create event registered\n\n', new Error().stack);
|
|
256
|
-
} else {
|
|
257
|
-
DyFM_Log.success('Message create event registered');
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
process.on('exit', () => {
|
|
261
|
-
try {
|
|
262
|
-
DyFM_Log.warn('Bot is shutting down...')
|
|
263
|
-
DyNTS_DiBo_Operations_Util.sendMessageToChannelByName(
|
|
264
|
-
this._discordServer,
|
|
265
|
-
DyNTS_DiBo_global_settings.channelSettings.reportChannelName,
|
|
266
|
-
`Bot is shutting down...`
|
|
267
|
-
)
|
|
268
|
-
} catch (error) {
|
|
269
|
-
DyFM_Error.logSimple('Error sending message to report channel:', error);
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
if (this.debugLog) {
|
|
274
|
-
DyFM_Log.success('Exit event registered\n\n', new Error().stack);
|
|
275
|
-
} else {
|
|
276
|
-
DyFM_Log.success('Exit event registered');
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
this.client.login(DyNTS_global_settings.env_settings.discord.token).catch((error) => {
|
|
280
|
-
reject(error);
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
} catch (error) {
|
|
284
|
-
if (this.discordServer) {
|
|
285
|
-
try {
|
|
286
|
-
DyNTS_DiBo_Operations_Util.sendMessageToChannelByName(
|
|
287
|
-
this.discordServer,
|
|
288
|
-
DyNTS_DiBo_global_settings.channelSettings.reportChannelName,
|
|
289
|
-
`#Error during bot startup:\n` +
|
|
290
|
-
((error as DyFM_Error)._message ?? error.message ?? error)
|
|
291
|
-
)
|
|
292
|
-
} catch {}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
DyFM_Error.logSimple('Error during bot startup:', error);
|
|
296
|
-
|
|
297
|
-
throw new DyFM_Error({
|
|
298
|
-
...this.getDefaultErrorSettings('start', error, issuer),
|
|
299
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-SE0`,
|
|
300
|
-
})
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
async start(issuer: string): Promise<void> {
|
|
305
|
-
try {
|
|
306
|
-
if (!this.discordServer) {
|
|
307
|
-
throw new DyFM_Error({
|
|
308
|
-
...this.getDefaultErrorSettings(
|
|
309
|
-
'start',
|
|
310
|
-
new Error(
|
|
311
|
-
'Discord server not yet initialized, ' +
|
|
312
|
-
'should only be called after DiscordBot_ControlService.start'
|
|
313
|
-
),
|
|
314
|
-
issuer,
|
|
315
|
-
),
|
|
316
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-ST01`,
|
|
317
|
-
})
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
await this.routines_CS.start(issuer);
|
|
321
|
-
await this.botIO_CS.start(issuer);
|
|
322
|
-
await this.commands_CS.start(issuer);
|
|
323
|
-
|
|
324
|
-
DyFM_Log.success('Discord Bot started')
|
|
325
|
-
} catch (error) {
|
|
326
|
-
DyFM_Error.logSimple('Error during bot start:', error);
|
|
327
|
-
|
|
328
|
-
throw new DyFM_Error({
|
|
329
|
-
...this.getDefaultErrorSettings('start', error, issuer),
|
|
330
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-ST0`,
|
|
331
|
-
})
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
async getRolePingByName(roleName: string): Promise<string> {
|
|
336
|
-
const role: Role = this.getRoleByName(roleName);
|
|
337
|
-
|
|
338
|
-
return role ? `<@&${role.id}>` : '';
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
async getRolePingsByName(roleNames: string[]): Promise<string> {
|
|
342
|
-
const pings: string[] = await Promise.all(
|
|
343
|
-
roleNames.map(roleName => this.getRolePingByName(roleName))
|
|
344
|
-
);
|
|
345
|
-
|
|
346
|
-
return pings.join(' ');
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
getRoleByName(roleName: string): Role {
|
|
350
|
-
this._rolesByNames[roleName] ??= this.discordServer.roles.cache.find(r => r.name === roleName);
|
|
351
|
-
|
|
352
|
-
return this._rolesByNames[roleName];
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
getChannelByName(channelName: string): TextChannel {
|
|
356
|
-
this._channelsByNames[channelName] ??= DyNTS_DiBo_Operations_Util.findTextChannelByName(
|
|
357
|
-
this.discordServer.channels,
|
|
358
|
-
channelName
|
|
359
|
-
);
|
|
360
|
-
|
|
361
|
-
return this._channelsByNames[channelName];
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
async sendMessageToChannelByName(
|
|
365
|
-
channelName: string,
|
|
366
|
-
message: string,
|
|
367
|
-
issuer: string,
|
|
368
|
-
): Promise<Message> {
|
|
369
|
-
try {
|
|
370
|
-
const channel = await this.getChannelByName(channelName);
|
|
371
|
-
|
|
372
|
-
if (!channel) {
|
|
373
|
-
throw new DyFM_Error({
|
|
374
|
-
...this.getDefaultErrorSettings(
|
|
375
|
-
'sendMessageToChannelByName',
|
|
376
|
-
new Error('Channel not found'),
|
|
377
|
-
issuer
|
|
378
|
-
),
|
|
379
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-SMCN1`,
|
|
380
|
-
})
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
if (!channel.isTextBased()) {
|
|
384
|
-
throw new DyFM_Error({
|
|
385
|
-
...this.getDefaultErrorSettings(
|
|
386
|
-
'sendMessageToChannelByName',
|
|
387
|
-
new Error('Channel is not a text channel'),
|
|
388
|
-
issuer
|
|
389
|
-
),
|
|
390
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-SMCN2`,
|
|
391
|
-
})
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
if (message.length > 2_000) { // 2000 characters per message
|
|
395
|
-
let firstMessage: Message;
|
|
396
|
-
|
|
397
|
-
while (message.length) {
|
|
398
|
-
if (!firstMessage) {
|
|
399
|
-
firstMessage = await channel.send(message.substring(0, 2_000));
|
|
400
|
-
} else {
|
|
401
|
-
await channel.send(message.substring(0, 2_000));
|
|
402
|
-
}
|
|
403
|
-
message = message.substring(2_000);
|
|
404
|
-
}
|
|
405
|
-
} else {
|
|
406
|
-
return await channel.send(message);
|
|
407
|
-
}
|
|
408
|
-
} catch (error) {
|
|
409
|
-
DyFM_Error.logSimple('Error sending message to channel by name:', error);
|
|
410
|
-
|
|
411
|
-
throw new DyFM_Error({
|
|
412
|
-
...this.getDefaultErrorSettings('sendMessageToChannelByName', error, issuer),
|
|
413
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-SMCN0`,
|
|
414
|
-
})
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
async clearChannel(
|
|
419
|
-
channel: TextChannel,
|
|
420
|
-
issuer: string,
|
|
421
|
-
): Promise<void> {
|
|
422
|
-
try {
|
|
423
|
-
DyFM_Log.testInfo('Clearing channel... ', channel.name);
|
|
424
|
-
|
|
425
|
-
let messages: Message[] = (await DyNTS_DiBo_Operations_Util.fetchAllMessagesWithPaging(channel)).map(
|
|
426
|
-
(message) => message,
|
|
427
|
-
);
|
|
428
|
-
|
|
429
|
-
while (messages.length) {
|
|
430
|
-
DyFM_Log.testInfo('Deleting next 1000 messages... ', messages.length);
|
|
431
|
-
|
|
432
|
-
await Promise.all(messages.map(message => {
|
|
433
|
-
return new Promise(async (resolve, reject) => {
|
|
434
|
-
await DyNTS_DiBo_Operations_Util.deleteMessage(message).catch((error) => {
|
|
435
|
-
DyFM_Error.logSimple('Failed to delete message', error);
|
|
436
|
-
});
|
|
437
|
-
messages = messages.filter(m => m.id !== message.id);
|
|
438
|
-
DyFM_Log.success('Deleted message', message.content);
|
|
439
|
-
resolve(true);
|
|
440
|
-
});
|
|
441
|
-
}));
|
|
442
|
-
|
|
443
|
-
if (messages.length === 0) {
|
|
444
|
-
messages = (await DyNTS_DiBo_Operations_Util.fetchAllMessagesWithPaging(channel)).map(
|
|
445
|
-
(message) => message,
|
|
446
|
-
);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
DyFM_Log.success('Deleted messages', messages.length);
|
|
451
|
-
|
|
452
|
-
channel.send('[SYSTEM|OPERATION|RESULT] Csatorna üzeneteinek törlése sikeresen befejeződött.');
|
|
453
|
-
} catch (error) {
|
|
454
|
-
DyFM_Error.logSimple('Error clearing channel:', error);
|
|
455
|
-
|
|
456
|
-
throw new DyFM_Error({
|
|
457
|
-
...this.getDefaultErrorSettings('clearChannel', error, issuer),
|
|
458
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-CC0`,
|
|
459
|
-
})
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
/**
|
|
465
|
-
* A leggyakoribb client.on(...) események a következők (TypeScript + discord.js 14+):
|
|
466
|
-
*
|
|
467
|
-
* 🔁 Alap események
|
|
468
|
-
* client.on('ready', () => {}) // Bot elindult
|
|
469
|
-
* client.on('messageCreate', (msg) => {}) // Üzenet érkezett
|
|
470
|
-
* client.on('interactionCreate', (i) => {}) // Slash command vagy gomb stb.
|
|
471
|
-
* client.on('guildCreate', (guild) => {}) // Új szerverre került
|
|
472
|
-
* client.on('guildDelete', (guild) => {}) // Szerverről eltávolították
|
|
473
|
-
* client.on('error', (err) => {}) // Hiba történt
|
|
474
|
-
*
|
|
475
|
-
* 👥 Felhasználókkal kapcsolatos események
|
|
476
|
-
* client.on('guildMemberAdd', (member) => {}) // Új user csatlakozott
|
|
477
|
-
* client.on('guildMemberRemove', (member) => {}) // User kilépett
|
|
478
|
-
* client.on('presenceUpdate', (oldP, newP) => {})// Status változott (pl. online → idle)
|
|
479
|
-
* ✏️ Üzenet események
|
|
480
|
-
* client.on('messageUpdate', (oldMsg, newMsg) => {}) // Üzenet módosult
|
|
481
|
-
* client.on('messageDelete', (msg) => {}) // Üzenetet töröltek
|
|
482
|
-
*
|
|
483
|
-
* 🔧 Moderáció/jogosultság/stb.
|
|
484
|
-
* client.on('roleCreate', (role) => {})
|
|
485
|
-
* client.on('roleDelete', (role) => {})
|
|
486
|
-
* client.on('channelCreate', (ch) => {})
|
|
487
|
-
* client.on('channelDelete', (ch) => {})
|
|
1
|
+
import { Client, GatewayIntentBits, Guild, Collection, GuildMember, Message, Partials, Role, TextChannel } from 'discord.js'
|
|
2
|
+
import * as dotenv from 'dotenv'
|
|
3
|
+
import { DyNTS_SingletonService } from '../../../_services/base/singleton.service';
|
|
4
|
+
import { DyFM_Async, DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
5
|
+
import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
|
|
6
|
+
import { DyNTS_DiBo_Routines_ControlService } from './dibo-routines.control-service';
|
|
7
|
+
import { DyNTS_DiBo_IO_ControlService } from './dibo-io.control-service';
|
|
8
|
+
import { DyNTS_DiBo_global_settings } from '../_collections/dibo-global-settings.conts';
|
|
9
|
+
import { DyNTS_GlobalService } from '../../../_services/core/global.service';
|
|
10
|
+
import { DyNTS_DiBo_Operations_Util } from '../_collections/dibo-operations.util';
|
|
11
|
+
import { DyNTS_DiBo_Commands_ControlService } from './dibo-commands.control-service';
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* This is the main control service for the Discord Bot.
|
|
16
|
+
*
|
|
17
|
+
*
|
|
18
|
+
* Setup:
|
|
19
|
+
* 1. creating the Bot
|
|
20
|
+
* - go to: https://discord.com/developers/applications
|
|
21
|
+
* - click: "New Application"
|
|
22
|
+
* - give a name → Create
|
|
23
|
+
*
|
|
24
|
+
* 2. adding the Bot to the app
|
|
25
|
+
* - on the left: "Bot" → "Add Bot" → Yes, do it
|
|
26
|
+
*
|
|
27
|
+
* 3. getting the token
|
|
28
|
+
* - on the same page: "Reset Token" → Copy
|
|
29
|
+
* - put the token in the .env file: DISCORD_BOT_TOKEN=...
|
|
30
|
+
*
|
|
31
|
+
* 4. Bot ID (Client ID) and Invite link
|
|
32
|
+
* - on the left: "OAuth2" > "URL Generator"
|
|
33
|
+
* - Scopes: tick the bot
|
|
34
|
+
* - Bot Permissions: pl. Send Messages, Read Message History
|
|
35
|
+
* - at the bottom: generate Invite URL → open it → add it to a server
|
|
36
|
+
* - the Client ID is on the same page, the "Application ID" on the "OAuth2 > General" or "Application" tab.
|
|
37
|
+
* - it only works if you are admin on that server or have "Manage Server" permissions.
|
|
38
|
+
*
|
|
39
|
+
* 5. Permissions
|
|
40
|
+
* - on the left: "Bot" tab
|
|
41
|
+
* - enable these:
|
|
42
|
+
* - MESSAGE CONTENT INTENT
|
|
43
|
+
* - PRESENCE INTENT (if you use it)
|
|
44
|
+
* - SERVER MEMBERS INTENT (if you need guild user info)
|
|
45
|
+
* - Save
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
export abstract class DyNTS_DiBo_Main_ControlService extends DyNTS_SingletonService {
|
|
49
|
+
|
|
50
|
+
/* static getInstance(): DyNTS_DiBo_Main_ControlService {
|
|
51
|
+
return DyNTS_DiBo_Main_ControlService.getSingletonInstance();
|
|
52
|
+
} */
|
|
53
|
+
|
|
54
|
+
readonly client: Client;
|
|
55
|
+
|
|
56
|
+
private _discordServer: Guild;
|
|
57
|
+
get discordServer(): Guild {
|
|
58
|
+
return this._discordServer;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get botClientId(): string {
|
|
62
|
+
return this.client?.user?.id ?? DyNTS_global_settings?.env_settings?.discord?.clientId;
|
|
63
|
+
}
|
|
64
|
+
get botDisplayName(): string {
|
|
65
|
+
return this.client?.user?.displayName;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected botIO_CS: DyNTS_DiBo_IO_ControlService;
|
|
69
|
+
protected abstract getBotIOControlService(): DyNTS_DiBo_IO_ControlService;
|
|
70
|
+
|
|
71
|
+
protected routines_CS: DyNTS_DiBo_Routines_ControlService;
|
|
72
|
+
protected abstract getRoutinesControlService(): DyNTS_DiBo_Routines_ControlService;
|
|
73
|
+
|
|
74
|
+
protected commands_CS: DyNTS_DiBo_Commands_ControlService;
|
|
75
|
+
protected abstract getCommandsControlService(): DyNTS_DiBo_Commands_ControlService;
|
|
76
|
+
|
|
77
|
+
private _channelsByNames: {
|
|
78
|
+
[key: string]: TextChannel;
|
|
79
|
+
} = {};
|
|
80
|
+
|
|
81
|
+
private _rolesByNames: {
|
|
82
|
+
[key: string]: Role;
|
|
83
|
+
} = {};
|
|
84
|
+
|
|
85
|
+
protected debugLog = false;
|
|
86
|
+
|
|
87
|
+
protected constructor(
|
|
88
|
+
setupAutomatically?: boolean,
|
|
89
|
+
) {
|
|
90
|
+
super();
|
|
91
|
+
|
|
92
|
+
DyNTS_global_settings.bot_settings ??= DyNTS_DiBo_global_settings;
|
|
93
|
+
|
|
94
|
+
if (this.client) {
|
|
95
|
+
throw new DyFM_Error({
|
|
96
|
+
...this.getDefaultErrorSettings(
|
|
97
|
+
'start',
|
|
98
|
+
new Error('Discord client already initialized'),
|
|
99
|
+
'system-init'
|
|
100
|
+
),
|
|
101
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-C000`,
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this.client = new Client({
|
|
106
|
+
intents: DyNTS_global_settings.bot_settings.intents,
|
|
107
|
+
partials: DyNTS_global_settings.bot_settings.partials,
|
|
108
|
+
})
|
|
109
|
+
DyFM_Log.success('Discord client initialized');
|
|
110
|
+
|
|
111
|
+
if (setupAutomatically) {
|
|
112
|
+
this.setup('system-init');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async setup(issuer: string): Promise<void> {
|
|
117
|
+
try {
|
|
118
|
+
await DyFM_Async.delay(100);
|
|
119
|
+
|
|
120
|
+
if (!DyNTS_global_settings.env_settings.discord.guildId) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
`No discord server id found!` +
|
|
123
|
+
`\nPlease set the DISCORD_GUILD_ID in the .env file, ` +
|
|
124
|
+
`or directly in the DyNTS_global_settings.env_settings.discord.guildId` +
|
|
125
|
+
`\nYou also will need to set the DISCORD_BOT_TOKEN, DISCORD_BOT_CLIENT_ID and DISCORD_BOT_OAUTH2_URL.`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (!DyNTS_global_settings.env_settings.discord.token) {
|
|
130
|
+
throw new Error(
|
|
131
|
+
`No discord token found!` +
|
|
132
|
+
`\nPlease set the DISCORD_BOT_TOKEN in the .env file, ` +
|
|
133
|
+
`or directly in the DyNTS_global_settings.env_settings.discord.token` +
|
|
134
|
+
`\nYou also will need to set the DISCORD_GUILD_ID, DISCORD_BOT_CLIENT_ID and DISCORD_BOT_OAUTH2_URL.`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (!DyNTS_global_settings.env_settings.discord.clientId) {
|
|
139
|
+
throw new Error(
|
|
140
|
+
`No discord client id found!` +
|
|
141
|
+
`\nPlease set the DISCORD_BOT_CLIENT_ID in the .env file, ` +
|
|
142
|
+
`or directly in the DyNTS_global_settings.env_settings.discord.clientId` +
|
|
143
|
+
`\nYou also will need to set the DISCORD_GUILD_ID, DISCORD_BOT_TOKEN and DISCORD_BOT_OAUTH2_URL.`
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (!DyNTS_global_settings.env_settings.discord.oauth2Url) {
|
|
148
|
+
throw new Error(
|
|
149
|
+
`No discord oauth2 url found!` +
|
|
150
|
+
`\nPlease set the DISCORD_BOT_OAUTH2_URL in the .env file, ` +
|
|
151
|
+
`or directly in the DyNTS_global_settings.env_settings.discord.oauth2Url` +
|
|
152
|
+
`\nYou also will need to set the DISCORD_GUILD_ID, DISCORD_BOT_TOKEN and DISCORD_BOT_CLIENT_ID.`
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
DyNTS_DiBo_global_settings.channelSettings.defaultChannels.forEach(
|
|
157
|
+
channelName => {
|
|
158
|
+
if (!DyNTS_DiBo_global_settings.channelSettings.allowedChannels.includes(channelName)) {
|
|
159
|
+
DyNTS_DiBo_global_settings.channelSettings.allowedChannels.push(channelName);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
if (!DyNTS_DiBo_global_settings.channelSettings.allowedChannels.includes(
|
|
164
|
+
DyNTS_DiBo_global_settings.channelSettings.reportChannelName
|
|
165
|
+
)) {
|
|
166
|
+
DyNTS_DiBo_global_settings.channelSettings.allowedChannels.push(
|
|
167
|
+
DyNTS_DiBo_global_settings.channelSettings.reportChannelName
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
this.botIO_CS = this.getBotIOControlService();
|
|
172
|
+
this.routines_CS = this.getRoutinesControlService();
|
|
173
|
+
this.commands_CS = this.getCommandsControlService();
|
|
174
|
+
|
|
175
|
+
if (!this.botIO_CS) {
|
|
176
|
+
throw new DyFM_Error({
|
|
177
|
+
...this.getDefaultErrorSettings('setup', new Error('Bot IO Control Service not found'), issuer),
|
|
178
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-S01`,
|
|
179
|
+
})
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (!this.routines_CS) {
|
|
183
|
+
throw new DyFM_Error({
|
|
184
|
+
...this.getDefaultErrorSettings('setup', new Error('Routines Control Service not found'), issuer),
|
|
185
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-S02`,
|
|
186
|
+
})
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (!this.commands_CS) {
|
|
190
|
+
throw new DyFM_Error({
|
|
191
|
+
...this.getDefaultErrorSettings('setup', new Error('Commands Control Service not found'), issuer),
|
|
192
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-S03`,
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
await this.botIO_CS.setup(issuer);
|
|
197
|
+
await this.routines_CS.setup(issuer);
|
|
198
|
+
await this.commands_CS.setup(issuer);
|
|
199
|
+
|
|
200
|
+
return new Promise((resolve, reject) => {
|
|
201
|
+
this.client.on('error', (error) => {
|
|
202
|
+
if (DyNTS_DiBo_global_settings.debugLevel >= 1) {
|
|
203
|
+
/* DyFM_Log.error('Discord client error:', error); */
|
|
204
|
+
DyFM_Error.logSimple('Discord client error:', error);
|
|
205
|
+
}
|
|
206
|
+
DyNTS_GlobalService.globalErrorHandler(error);
|
|
207
|
+
reject(error);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
if (this.debugLog) {
|
|
211
|
+
DyFM_Log.success('Error event registered\n\n', new Error().stack);
|
|
212
|
+
} else {
|
|
213
|
+
DyFM_Log.success('Error event registered');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
this.client.on('ready', async () => {
|
|
217
|
+
if (DyNTS_DiBo_global_settings.debugLevel >= 1) {
|
|
218
|
+
DyFM_Log.success(`Logged in as ${this.client.user?.tag}`)
|
|
219
|
+
}
|
|
220
|
+
// szerver azonosító
|
|
221
|
+
this._discordServer = this.client.guilds.cache.get(
|
|
222
|
+
DyNTS_global_settings.env_settings.discord.guildId
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
if (!this._discordServer) {
|
|
226
|
+
throw new Error(`No discord server found`);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
await this.start(issuer);
|
|
230
|
+
|
|
231
|
+
//await Operations.reportIn(this._discordServer, this.client)
|
|
232
|
+
|
|
233
|
+
DyFM_Log.success('Discord Bot setup complete')
|
|
234
|
+
resolve();
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
if (this.debugLog) {
|
|
238
|
+
DyFM_Log.success('Ready event registered\n\n', new Error().stack);
|
|
239
|
+
} else {
|
|
240
|
+
DyFM_Log.success('Ready event registered');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
this.client.on('messageCreate', (message: Message) => {
|
|
244
|
+
try {
|
|
245
|
+
// Discord-specific implementation doesn't use generic wrapper pattern
|
|
246
|
+
// It has its own handleNewMessage signature
|
|
247
|
+
this.botIO_CS.handleNewMessage(message, message?.author?.id ?? 'unknown')
|
|
248
|
+
} catch (error) {
|
|
249
|
+
DyFM_Error.logSimple('Error handling new message:', error);
|
|
250
|
+
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
if (this.debugLog) {
|
|
255
|
+
DyFM_Log.success('Message create event registered\n\n', new Error().stack);
|
|
256
|
+
} else {
|
|
257
|
+
DyFM_Log.success('Message create event registered');
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
process.on('exit', () => {
|
|
261
|
+
try {
|
|
262
|
+
DyFM_Log.warn('Bot is shutting down...')
|
|
263
|
+
DyNTS_DiBo_Operations_Util.sendMessageToChannelByName(
|
|
264
|
+
this._discordServer,
|
|
265
|
+
DyNTS_DiBo_global_settings.channelSettings.reportChannelName,
|
|
266
|
+
`Bot is shutting down...`
|
|
267
|
+
)
|
|
268
|
+
} catch (error) {
|
|
269
|
+
DyFM_Error.logSimple('Error sending message to report channel:', error);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
if (this.debugLog) {
|
|
274
|
+
DyFM_Log.success('Exit event registered\n\n', new Error().stack);
|
|
275
|
+
} else {
|
|
276
|
+
DyFM_Log.success('Exit event registered');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
this.client.login(DyNTS_global_settings.env_settings.discord.token).catch((error) => {
|
|
280
|
+
reject(error);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
} catch (error) {
|
|
284
|
+
if (this.discordServer) {
|
|
285
|
+
try {
|
|
286
|
+
DyNTS_DiBo_Operations_Util.sendMessageToChannelByName(
|
|
287
|
+
this.discordServer,
|
|
288
|
+
DyNTS_DiBo_global_settings.channelSettings.reportChannelName,
|
|
289
|
+
`#Error during bot startup:\n` +
|
|
290
|
+
((error as DyFM_Error)._message ?? error.message ?? error)
|
|
291
|
+
)
|
|
292
|
+
} catch {}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
DyFM_Error.logSimple('Error during bot startup:', error);
|
|
296
|
+
|
|
297
|
+
throw new DyFM_Error({
|
|
298
|
+
...this.getDefaultErrorSettings('start', error, issuer),
|
|
299
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-SE0`,
|
|
300
|
+
})
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
async start(issuer: string): Promise<void> {
|
|
305
|
+
try {
|
|
306
|
+
if (!this.discordServer) {
|
|
307
|
+
throw new DyFM_Error({
|
|
308
|
+
...this.getDefaultErrorSettings(
|
|
309
|
+
'start',
|
|
310
|
+
new Error(
|
|
311
|
+
'Discord server not yet initialized, ' +
|
|
312
|
+
'should only be called after DiscordBot_ControlService.start'
|
|
313
|
+
),
|
|
314
|
+
issuer,
|
|
315
|
+
),
|
|
316
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-ST01`,
|
|
317
|
+
})
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
await this.routines_CS.start(issuer);
|
|
321
|
+
await this.botIO_CS.start(issuer);
|
|
322
|
+
await this.commands_CS.start(issuer);
|
|
323
|
+
|
|
324
|
+
DyFM_Log.success('Discord Bot started')
|
|
325
|
+
} catch (error) {
|
|
326
|
+
DyFM_Error.logSimple('Error during bot start:', error);
|
|
327
|
+
|
|
328
|
+
throw new DyFM_Error({
|
|
329
|
+
...this.getDefaultErrorSettings('start', error, issuer),
|
|
330
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-ST0`,
|
|
331
|
+
})
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
async getRolePingByName(roleName: string): Promise<string> {
|
|
336
|
+
const role: Role = this.getRoleByName(roleName);
|
|
337
|
+
|
|
338
|
+
return role ? `<@&${role.id}>` : '';
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
async getRolePingsByName(roleNames: string[]): Promise<string> {
|
|
342
|
+
const pings: string[] = await Promise.all(
|
|
343
|
+
roleNames.map(roleName => this.getRolePingByName(roleName))
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
return pings.join(' ');
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
getRoleByName(roleName: string): Role {
|
|
350
|
+
this._rolesByNames[roleName] ??= this.discordServer.roles.cache.find(r => r.name === roleName);
|
|
351
|
+
|
|
352
|
+
return this._rolesByNames[roleName];
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
getChannelByName(channelName: string): TextChannel {
|
|
356
|
+
this._channelsByNames[channelName] ??= DyNTS_DiBo_Operations_Util.findTextChannelByName(
|
|
357
|
+
this.discordServer.channels,
|
|
358
|
+
channelName
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
return this._channelsByNames[channelName];
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
async sendMessageToChannelByName(
|
|
365
|
+
channelName: string,
|
|
366
|
+
message: string,
|
|
367
|
+
issuer: string,
|
|
368
|
+
): Promise<Message> {
|
|
369
|
+
try {
|
|
370
|
+
const channel = await this.getChannelByName(channelName);
|
|
371
|
+
|
|
372
|
+
if (!channel) {
|
|
373
|
+
throw new DyFM_Error({
|
|
374
|
+
...this.getDefaultErrorSettings(
|
|
375
|
+
'sendMessageToChannelByName',
|
|
376
|
+
new Error('Channel not found'),
|
|
377
|
+
issuer
|
|
378
|
+
),
|
|
379
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-SMCN1`,
|
|
380
|
+
})
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
if (!channel.isTextBased()) {
|
|
384
|
+
throw new DyFM_Error({
|
|
385
|
+
...this.getDefaultErrorSettings(
|
|
386
|
+
'sendMessageToChannelByName',
|
|
387
|
+
new Error('Channel is not a text channel'),
|
|
388
|
+
issuer
|
|
389
|
+
),
|
|
390
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-SMCN2`,
|
|
391
|
+
})
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (message.length > 2_000) { // 2000 characters per message
|
|
395
|
+
let firstMessage: Message;
|
|
396
|
+
|
|
397
|
+
while (message.length) {
|
|
398
|
+
if (!firstMessage) {
|
|
399
|
+
firstMessage = await channel.send(message.substring(0, 2_000));
|
|
400
|
+
} else {
|
|
401
|
+
await channel.send(message.substring(0, 2_000));
|
|
402
|
+
}
|
|
403
|
+
message = message.substring(2_000);
|
|
404
|
+
}
|
|
405
|
+
} else {
|
|
406
|
+
return await channel.send(message);
|
|
407
|
+
}
|
|
408
|
+
} catch (error) {
|
|
409
|
+
DyFM_Error.logSimple('Error sending message to channel by name:', error);
|
|
410
|
+
|
|
411
|
+
throw new DyFM_Error({
|
|
412
|
+
...this.getDefaultErrorSettings('sendMessageToChannelByName', error, issuer),
|
|
413
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-SMCN0`,
|
|
414
|
+
})
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
async clearChannel(
|
|
419
|
+
channel: TextChannel,
|
|
420
|
+
issuer: string,
|
|
421
|
+
): Promise<void> {
|
|
422
|
+
try {
|
|
423
|
+
DyFM_Log.testInfo('Clearing channel... ', channel.name);
|
|
424
|
+
|
|
425
|
+
let messages: Message[] = (await DyNTS_DiBo_Operations_Util.fetchAllMessagesWithPaging(channel)).map(
|
|
426
|
+
(message) => message,
|
|
427
|
+
);
|
|
428
|
+
|
|
429
|
+
while (messages.length) {
|
|
430
|
+
DyFM_Log.testInfo('Deleting next 1000 messages... ', messages.length);
|
|
431
|
+
|
|
432
|
+
await Promise.all(messages.map(message => {
|
|
433
|
+
return new Promise(async (resolve, reject) => {
|
|
434
|
+
await DyNTS_DiBo_Operations_Util.deleteMessage(message).catch((error) => {
|
|
435
|
+
DyFM_Error.logSimple('Failed to delete message', error);
|
|
436
|
+
});
|
|
437
|
+
messages = messages.filter(m => m.id !== message.id);
|
|
438
|
+
DyFM_Log.success('Deleted message', message.content);
|
|
439
|
+
resolve(true);
|
|
440
|
+
});
|
|
441
|
+
}));
|
|
442
|
+
|
|
443
|
+
if (messages.length === 0) {
|
|
444
|
+
messages = (await DyNTS_DiBo_Operations_Util.fetchAllMessagesWithPaging(channel)).map(
|
|
445
|
+
(message) => message,
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
DyFM_Log.success('Deleted messages', messages.length);
|
|
451
|
+
|
|
452
|
+
channel.send('[SYSTEM|OPERATION|RESULT] Csatorna üzeneteinek törlése sikeresen befejeződött.');
|
|
453
|
+
} catch (error) {
|
|
454
|
+
DyFM_Error.logSimple('Error clearing channel:', error);
|
|
455
|
+
|
|
456
|
+
throw new DyFM_Error({
|
|
457
|
+
...this.getDefaultErrorSettings('clearChannel', error, issuer),
|
|
458
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-DiBo-MCS-CC0`,
|
|
459
|
+
})
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* A leggyakoribb client.on(...) események a következők (TypeScript + discord.js 14+):
|
|
466
|
+
*
|
|
467
|
+
* 🔁 Alap események
|
|
468
|
+
* client.on('ready', () => {}) // Bot elindult
|
|
469
|
+
* client.on('messageCreate', (msg) => {}) // Üzenet érkezett
|
|
470
|
+
* client.on('interactionCreate', (i) => {}) // Slash command vagy gomb stb.
|
|
471
|
+
* client.on('guildCreate', (guild) => {}) // Új szerverre került
|
|
472
|
+
* client.on('guildDelete', (guild) => {}) // Szerverről eltávolították
|
|
473
|
+
* client.on('error', (err) => {}) // Hiba történt
|
|
474
|
+
*
|
|
475
|
+
* 👥 Felhasználókkal kapcsolatos események
|
|
476
|
+
* client.on('guildMemberAdd', (member) => {}) // Új user csatlakozott
|
|
477
|
+
* client.on('guildMemberRemove', (member) => {}) // User kilépett
|
|
478
|
+
* client.on('presenceUpdate', (oldP, newP) => {})// Status változott (pl. online → idle)
|
|
479
|
+
* ✏️ Üzenet események
|
|
480
|
+
* client.on('messageUpdate', (oldMsg, newMsg) => {}) // Üzenet módosult
|
|
481
|
+
* client.on('messageDelete', (msg) => {}) // Üzenetet töröltek
|
|
482
|
+
*
|
|
483
|
+
* 🔧 Moderáció/jogosultság/stb.
|
|
484
|
+
* client.on('roleCreate', (role) => {})
|
|
485
|
+
* client.on('roleDelete', (role) => {})
|
|
486
|
+
* client.on('channelCreate', (ch) => {})
|
|
487
|
+
* client.on('channelDelete', (ch) => {})
|
|
488
488
|
*/
|