ErisPulse 2.6.3.dev0__tar.gz → 2.7.0__tar.gz
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.
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/PKG-INFO +1 -1
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/pyproject.toml +1 -1
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/cli.py +17 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/create.py +194 -142
- erispulse-2.7.0/src/ErisPulse/CLI/commands/doctor.py +127 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/init.py +1 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/list.py +29 -9
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/run.py +2 -1
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/types.py +3 -2
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/console.py +2 -2
- erispulse-2.7.0/src/ErisPulse/CLI/constants.py +46 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/i18n/__init__.py +82 -2
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/i18n/locales/en.py +33 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/i18n/locales/ja.py +33 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/i18n/locales/ru.py +33 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/i18n/locales/zh_cn.py +33 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/i18n/locales/zh_tw.py +33 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/utils/display.py +4 -2
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/utils/package_manager.py +229 -38
- erispulse-2.7.0/src/ErisPulse/CLI/utils/scaffold_text.py +338 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/__init__.py +24 -1
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/adapter.py +440 -20
- {erispulse-2.6.3.dev0/src/ErisPulse/runtime → erispulse-2.7.0/src/ErisPulse/Core/Bases}/config_schema.py +155 -34
- erispulse-2.7.0/src/ErisPulse/Core/Bases/converter.py +80 -0
- erispulse-2.7.0/src/ErisPulse/Core/Bases/i18n_schema.py +239 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/module.py +37 -3
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/send_rules.py +3 -3
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/command.py +60 -25
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/session_type.py +28 -6
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/wrapper.py +111 -4
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/__init__.py +2 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/adapter.py +47 -3
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/client.py +4 -3
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/config.py +164 -26
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/constants.py +80 -1
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/i18n/locales/en.py +43 -7
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/i18n/locales/ja.py +43 -7
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/i18n/locales/ru.py +43 -7
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/i18n/locales/zh_cn.py +43 -7
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/i18n/locales/zh_tw.py +43 -7
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/lifecycle.py +61 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/logger.py +31 -7
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/master.py +1 -1
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/module.py +11 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/router.py +183 -20
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/storage.py +30 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/finders/adapter.py +3 -2
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/finders/module.py +3 -2
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/loaders/adapter.py +9 -2
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/loaders/module.py +22 -7
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/runtime/__init__.py +46 -13
- erispulse-2.7.0/src/ErisPulse/runtime/config_schema.py +39 -0
- erispulse-2.7.0/src/ErisPulse/runtime/diagnostics.py +317 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/runtime/frame_config.py +51 -1
- erispulse-2.7.0/src/ErisPulse/runtime/memory.py +121 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/sdk.py +221 -31
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/__init__.pyi +0 -16
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/base.pyi +0 -52
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/cli.pyi +0 -89
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/__init__.pyi +0 -9
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/create.pyi +0 -95
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/init.pyi +0 -94
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/install.pyi +0 -78
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/language.pyi +0 -51
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/list.pyi +0 -58
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/list_remote.pyi +0 -44
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/run.pyi +0 -108
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/self_update.pyi +0 -68
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/types.pyi +0 -148
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/uninstall.pyi +0 -37
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/commands/upgrade.pyi +0 -31
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/console.pyi +0 -51
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/hints.pyi +0 -71
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/i18n/__init__.pyi +0 -115
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/i18n/locales/__init__.pyi +0 -12
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/i18n/locales/en.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/i18n/locales/ja.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/i18n/locales/ru.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/i18n/locales/zh_cn.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/i18n/locales/zh_tw.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/registry.pyi +0 -92
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/utils/__init__.pyi +0 -11
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/utils/display.pyi +0 -114
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/utils/file_watcher.pyi +0 -123
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/utils/package_manager.pyi +0 -391
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/__init__.pyi +0 -19
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/adapter.pyi +0 -786
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/client.pyi +0 -277
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/errors.pyi +0 -115
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/kv_builder.pyi +0 -125
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/manager.pyi +0 -138
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/module.pyi +0 -137
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/router.pyi +0 -451
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/send_builder.pyi +0 -231
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/send_rules.pyi +0 -167
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/storage.pyi +0 -397
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Bases/websocket.pyi +0 -194
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/__init__.pyi +0 -28
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/base.pyi +0 -71
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/command.pyi +0 -121
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/message.pyi +0 -102
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/message_builder.pyi +0 -147
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/meta.pyi +0 -101
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/notice.pyi +0 -117
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/request.pyi +0 -86
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/session_type.pyi +0 -216
- erispulse-2.6.3.dev0/src/ErisPulse/Core/Event/wrapper.pyi +0 -1170
- erispulse-2.6.3.dev0/src/ErisPulse/Core/__init__.pyi +0 -36
- erispulse-2.6.3.dev0/src/ErisPulse/Core/adapter.pyi +0 -494
- erispulse-2.6.3.dev0/src/ErisPulse/Core/assets/__init__.pyi +0 -65
- erispulse-2.6.3.dev0/src/ErisPulse/Core/client.pyi +0 -407
- erispulse-2.6.3.dev0/src/ErisPulse/Core/config.pyi +0 -129
- erispulse-2.6.3.dev0/src/ErisPulse/Core/constants.pyi +0 -217
- erispulse-2.6.3.dev0/src/ErisPulse/Core/i18n/__init__.pyi +0 -153
- erispulse-2.6.3.dev0/src/ErisPulse/Core/i18n/constants.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/Core/i18n/locales/__init__.pyi +0 -12
- erispulse-2.6.3.dev0/src/ErisPulse/Core/i18n/locales/en.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/Core/i18n/locales/ja.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/Core/i18n/locales/ru.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/Core/i18n/locales/zh_cn.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/Core/i18n/locales/zh_tw.pyi +0 -8
- erispulse-2.6.3.dev0/src/ErisPulse/Core/lifecycle.pyi +0 -240
- erispulse-2.6.3.dev0/src/ErisPulse/Core/logger.pyi +0 -378
- erispulse-2.6.3.dev0/src/ErisPulse/Core/master.pyi +0 -119
- erispulse-2.6.3.dev0/src/ErisPulse/Core/module.pyi +0 -300
- erispulse-2.6.3.dev0/src/ErisPulse/Core/router.pyi +0 -651
- erispulse-2.6.3.dev0/src/ErisPulse/Core/storage.pyi +0 -455
- erispulse-2.6.3.dev0/src/ErisPulse/__init__.pyi +0 -20
- erispulse-2.6.3.dev0/src/ErisPulse/__main__.pyi +0 -21
- erispulse-2.6.3.dev0/src/ErisPulse/finders/__init__.pyi +0 -19
- erispulse-2.6.3.dev0/src/ErisPulse/finders/adapter.pyi +0 -91
- erispulse-2.6.3.dev0/src/ErisPulse/finders/bases/__init__.pyi +0 -4
- erispulse-2.6.3.dev0/src/ErisPulse/finders/bases/finder.pyi +0 -66
- erispulse-2.6.3.dev0/src/ErisPulse/finders/module.pyi +0 -91
- erispulse-2.6.3.dev0/src/ErisPulse/loaders/__init__.pyi +0 -18
- erispulse-2.6.3.dev0/src/ErisPulse/loaders/adapter.pyi +0 -96
- erispulse-2.6.3.dev0/src/ErisPulse/loaders/bases/__init__.pyi +0 -4
- erispulse-2.6.3.dev0/src/ErisPulse/loaders/bases/loader.pyi +0 -20
- erispulse-2.6.3.dev0/src/ErisPulse/loaders/module.pyi +0 -185
- erispulse-2.6.3.dev0/src/ErisPulse/loaders/strategy.pyi +0 -90
- erispulse-2.6.3.dev0/src/ErisPulse/loaders/strict.pyi +0 -118
- erispulse-2.6.3.dev0/src/ErisPulse/runtime/__init__.pyi +0 -18
- erispulse-2.6.3.dev0/src/ErisPulse/runtime/config_schema.pyi +0 -285
- erispulse-2.6.3.dev0/src/ErisPulse/runtime/context.pyi +0 -34
- erispulse-2.6.3.dev0/src/ErisPulse/runtime/exceptions.pyi +0 -95
- erispulse-2.6.3.dev0/src/ErisPulse/runtime/frame_config.pyi +0 -116
- erispulse-2.6.3.dev0/src/ErisPulse/runtime/hints.pyi +0 -266
- erispulse-2.6.3.dev0/src/ErisPulse/runtime/tasks.pyi +0 -41
- erispulse-2.6.3.dev0/src/ErisPulse/sdk.pyi +0 -259
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/.gitignore +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/LICENSE +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/README.pypi.md +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/base.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/install.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/language.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/list_remote.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/self_update.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/uninstall.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/commands/upgrade.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/hints.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/i18n/locales/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/registry.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/utils/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/CLI/utils/file_watcher.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/client.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/errors.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/kv_builder.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/manager.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/router.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/send_builder.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/storage.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Bases/websocket.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/base.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/message.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/message_builder.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/meta.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/notice.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/Event/request.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/assets/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/assets/error.css +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/assets/error.html +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/assets/root.css +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/assets/root.html +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/i18n/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/i18n/constants.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/Core/i18n/locales/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/__main__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/finders/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/finders/bases/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/finders/bases/finder.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/loaders/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/loaders/bases/__init__.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/loaders/bases/loader.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/loaders/strategy.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/loaders/strict.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/py.typed +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/runtime/context.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/runtime/exceptions.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/runtime/hints.py +0 -0
- {erispulse-2.6.3.dev0 → erispulse-2.7.0}/src/ErisPulse/runtime/tasks.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ErisPulse
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.0
|
|
4
4
|
Summary: Event-driven modular async bot framework — write once, deploy to any platform | 事件驱动的模块化异步机器人框架,一次编写,多平台部署
|
|
5
5
|
Project-URL: Homepage, https://github.com/ErisPulse/ErisPulse
|
|
6
6
|
Project-URL: Documentation, https://www.erisdev.com#docs
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ErisPulse"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.7.0"
|
|
8
8
|
description = "Event-driven modular async bot framework — write once, deploy to any platform | 事件驱动的模块化异步机器人框架,一次编写,多平台部署"
|
|
9
9
|
readme = "README.pypi.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -60,6 +60,19 @@ class CLI:
|
|
|
60
60
|
default=0,
|
|
61
61
|
help=i18n.t("cli.parser.verbose_help"),
|
|
62
62
|
)
|
|
63
|
+
parser.add_argument(
|
|
64
|
+
"--no-color",
|
|
65
|
+
action="store_true",
|
|
66
|
+
default=False,
|
|
67
|
+
help=i18n.t("cli.parser.no_color_help"),
|
|
68
|
+
)
|
|
69
|
+
parser.add_argument(
|
|
70
|
+
"--yes",
|
|
71
|
+
"-y",
|
|
72
|
+
action="store_true",
|
|
73
|
+
default=False,
|
|
74
|
+
help=i18n.t("cli.parser.yes_help"),
|
|
75
|
+
)
|
|
63
76
|
|
|
64
77
|
# 子命令
|
|
65
78
|
subparsers = parser.add_subparsers(
|
|
@@ -286,6 +299,10 @@ class CLI:
|
|
|
286
299
|
args, unknown = self.parser.parse_known_args()
|
|
287
300
|
args._unknown_args = unknown
|
|
288
301
|
|
|
302
|
+
# --no-color:禁用 Rich 控制台着色(CI / 日志采集场景)
|
|
303
|
+
if getattr(args, "no_color", False):
|
|
304
|
+
console.no_color = True
|
|
305
|
+
|
|
289
306
|
print_banner()
|
|
290
307
|
|
|
291
308
|
# 前几次启动时提醒用户确认语言(检测错误时用户仍可看懂多语言提示)
|
|
@@ -16,6 +16,7 @@ from ..base import Command
|
|
|
16
16
|
from ..console import console
|
|
17
17
|
from ..i18n import i18n
|
|
18
18
|
from ..utils.display import prompt_validated, section_header
|
|
19
|
+
from ..utils.scaffold_text import ScaffoldText
|
|
19
20
|
|
|
20
21
|
_LICENSE_TEMPLATE = """MIT License
|
|
21
22
|
|
|
@@ -63,30 +64,59 @@ _MODULE_INIT = """from .Core import Main
|
|
|
63
64
|
"""
|
|
64
65
|
|
|
65
66
|
_MODULE_CORE = """from dataclasses import dataclass, field
|
|
66
|
-
from ErisPulse.Core.Bases import BaseModule
|
|
67
|
+
from ErisPulse.Core.Bases import BaseConfig, BaseI18n, BaseModule, I18nKey
|
|
67
68
|
from ErisPulse.Core.Event import command, message, notice
|
|
68
|
-
from ErisPulse.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
@dataclass
|
|
72
|
-
class {name}Config(BaseConfig):
|
|
73
|
-
\"\"\"{name} 模块配置\"\"\"
|
|
74
|
-
enabled: bool = field(
|
|
75
|
-
default=True,
|
|
76
|
-
metadata={{
|
|
77
|
-
\"description\": \"是否启用模块\",
|
|
78
|
-
}},
|
|
79
|
-
)
|
|
69
|
+
from ErisPulse.Core.i18n import i18n
|
|
80
70
|
|
|
81
71
|
|
|
82
72
|
class Main(BaseModule):
|
|
83
73
|
\"\"\"
|
|
84
|
-
{
|
|
85
|
-
|
|
86
|
-
继承自BaseModule基类,实现了标准化的模块生命周期管理和事件处理
|
|
74
|
+
{text[module.doc]}
|
|
87
75
|
\"\"\"
|
|
88
76
|
|
|
89
|
-
|
|
77
|
+
# {text[module.config_hint]}
|
|
78
|
+
@dataclass
|
|
79
|
+
class ConfigClass(BaseConfig):
|
|
80
|
+
\"\"\"{text[module.config_doc]}\"\"\"
|
|
81
|
+
|
|
82
|
+
enabled: bool = field(
|
|
83
|
+
default=True,
|
|
84
|
+
metadata={{
|
|
85
|
+
\"description\": {{\"i18n\": \"module.{name}.enabled\", \"default\": \"Enable module\"}},
|
|
86
|
+
}},
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# {text[module.i18n_hint]}
|
|
90
|
+
class I18nClass(BaseI18n):
|
|
91
|
+
\"\"\"{name} translation keys\"\"\"
|
|
92
|
+
|
|
93
|
+
enabled: I18nKey = I18nKey(
|
|
94
|
+
key=\"module.{name}.enabled\",
|
|
95
|
+
default=\"Enable module\",
|
|
96
|
+
zh_CN=\"是否启用模块\",
|
|
97
|
+
en=\"Enable module\",
|
|
98
|
+
ja=\"モジュールを有効にする\",
|
|
99
|
+
ru=\"Включить модуль\",
|
|
100
|
+
zh_TW=\"啟用模組\",
|
|
101
|
+
)
|
|
102
|
+
hello_help: I18nKey = I18nKey(
|
|
103
|
+
key=\"module.{name}.command.hello.help\",
|
|
104
|
+
default=\"Send a greeting message\",
|
|
105
|
+
zh_CN=\"发送问候消息\",
|
|
106
|
+
en=\"Send a greeting message\",
|
|
107
|
+
ja=\"挨拶メッセージを送信\",
|
|
108
|
+
ru=\"Отправить приветствие\",
|
|
109
|
+
zh_TW=\"發送問候訊息\",
|
|
110
|
+
)
|
|
111
|
+
hello_reply: I18nKey = I18nKey(
|
|
112
|
+
key=\"module.{name}.command.hello.reply\",
|
|
113
|
+
default=\"Hello from {name}!\",
|
|
114
|
+
zh_CN=\"来自 {name} 的问候!\",
|
|
115
|
+
en=\"Hello from {name}!\",
|
|
116
|
+
ja=\"{name} からの挨拶です!\",
|
|
117
|
+
ru=\"Привет от {name}!\",
|
|
118
|
+
zh_TW=\"來自 {name} 的問候!\",
|
|
119
|
+
)
|
|
90
120
|
|
|
91
121
|
def __init__(self, sdk=None):
|
|
92
122
|
from ErisPulse import sdk as _sdk
|
|
@@ -96,7 +126,7 @@ class Main(BaseModule):
|
|
|
96
126
|
self.adapter = self.sdk.adapter
|
|
97
127
|
self.client = self.sdk.client
|
|
98
128
|
|
|
99
|
-
self.logger.info(\"{name}
|
|
129
|
+
self.logger.info((\"{text[module.log.init_done]}\").format(name=\"{name}\"))
|
|
100
130
|
|
|
101
131
|
@staticmethod
|
|
102
132
|
def get_load_strategy():
|
|
@@ -108,35 +138,39 @@ class Main(BaseModule):
|
|
|
108
138
|
|
|
109
139
|
async def on_load(self, event: dict) -> bool:
|
|
110
140
|
\"\"\"
|
|
111
|
-
|
|
141
|
+
{text[module.on_load_doc]}
|
|
112
142
|
|
|
113
|
-
:param event:
|
|
114
|
-
:return:
|
|
143
|
+
:param event: event data
|
|
144
|
+
:return: processing result
|
|
115
145
|
\"\"\"
|
|
116
146
|
await self._register_commands()
|
|
117
147
|
await self._register_message_handlers()
|
|
118
|
-
self.logger.info(
|
|
148
|
+
self.logger.info((\"{text[module.log.loaded]}\").format(event=event))
|
|
119
149
|
return True
|
|
120
150
|
|
|
121
151
|
async def on_unload(self, event: dict) -> bool:
|
|
122
152
|
\"\"\"
|
|
123
|
-
|
|
153
|
+
{text[module.on_unload_doc]}
|
|
124
154
|
|
|
125
|
-
:param event:
|
|
126
|
-
:return:
|
|
155
|
+
:param event: event data
|
|
156
|
+
:return: processing result
|
|
127
157
|
\"\"\"
|
|
128
|
-
self.logger.info(
|
|
158
|
+
self.logger.info((\"{text[module.log.unloaded]}\").format(event=event))
|
|
129
159
|
return True
|
|
130
160
|
|
|
161
|
+
def on_config_update(self, old_config, new_config):
|
|
162
|
+
\"\"\"{text[module.config_updated_doc]}\"\"\"
|
|
163
|
+
self.logger.info(\"{text[module.log.config_updated]}\")
|
|
164
|
+
|
|
131
165
|
async def _register_commands(self):
|
|
132
|
-
@command(\"hello\", help
|
|
166
|
+
@command(\"hello\", help=i18n.t(\"module.{name}.command.hello.help\"))
|
|
133
167
|
async def hello_command(event):
|
|
134
|
-
await event.reply(\"
|
|
168
|
+
await event.reply(i18n.t(\"module.{name}.command.hello.reply\"))
|
|
135
169
|
|
|
136
170
|
async def _register_message_handlers(self):
|
|
137
171
|
@message.on_private_message()
|
|
138
172
|
async def private_message_handler(event):
|
|
139
|
-
self.logger.info(
|
|
173
|
+
self.logger.info((\"{text[module.log.private_message]}\").format(content=event.get_text()))
|
|
140
174
|
|
|
141
175
|
@message.on_group_message()
|
|
142
176
|
async def group_message_handler(event):
|
|
@@ -144,7 +178,7 @@ class Main(BaseModule):
|
|
|
144
178
|
|
|
145
179
|
@notice.on_friend_add()
|
|
146
180
|
async def friend_add_handler(event):
|
|
147
|
-
self.logger.info(
|
|
181
|
+
self.logger.info((\"{text[module.log.friend_add]}\").format(nickname=event.get_user_nickname()))
|
|
148
182
|
"""
|
|
149
183
|
|
|
150
184
|
_ADAPTER_PYPROJECT = """[project]
|
|
@@ -179,63 +213,79 @@ _ADAPTER_CORE = """import asyncio
|
|
|
179
213
|
import json
|
|
180
214
|
from dataclasses import dataclass, field
|
|
181
215
|
from ErisPulse.Core import BaseAdapter
|
|
182
|
-
from ErisPulse.
|
|
216
|
+
from ErisPulse.Core.Bases import BaseConfig, BaseI18n, I18nKey
|
|
183
217
|
from ErisPulse.Core import router
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
@dataclass
|
|
187
|
-
class {name}Config(BaseConfig):
|
|
188
|
-
\"\"\"{name} 适配器配置\"\"\"
|
|
189
|
-
endpoint: str = field(
|
|
190
|
-
default="https://api.example.com",
|
|
191
|
-
metadata={{
|
|
192
|
-
"description": {{"i18n": "adapter.{name}.endpoint", "default": "平台 API 地址"}},
|
|
193
|
-
"required": False,
|
|
194
|
-
"ui": {{"widget": "text", "group": "connection", "order": 1}},
|
|
195
|
-
}},
|
|
196
|
-
)
|
|
197
|
-
token: str = field(
|
|
198
|
-
default="",
|
|
199
|
-
metadata={{
|
|
200
|
-
"description": {{"i18n": "adapter.{name}.token", "default": "平台 Token"}},
|
|
201
|
-
"required": True,
|
|
202
|
-
"secret": True,
|
|
203
|
-
"ui": {{"widget": "password", "group": "basic", "order": 2}},
|
|
204
|
-
}},
|
|
205
|
-
)
|
|
218
|
+
from ErisPulse.Core.i18n import i18n
|
|
206
219
|
|
|
207
220
|
|
|
208
221
|
class {name}(BaseAdapter):
|
|
209
222
|
\"\"\"
|
|
210
|
-
{
|
|
211
|
-
|
|
212
|
-
继承自 BaseAdapter 基类,使用声明式配置管理(ConfigClass),
|
|
213
|
-
实现了 SendDSL 风格的链式调用接口和 Bot 状态追踪。
|
|
223
|
+
{text[adapter.doc]}
|
|
214
224
|
\"\"\"
|
|
215
225
|
|
|
216
|
-
|
|
226
|
+
# {text[adapter.config_hint]}
|
|
227
|
+
@dataclass
|
|
228
|
+
class ConfigClass(BaseConfig):
|
|
229
|
+
\"\"\"{text[adapter.config_doc]}\"\"\"
|
|
230
|
+
|
|
231
|
+
endpoint: str = field(
|
|
232
|
+
default="https://api.example.com",
|
|
233
|
+
metadata={{
|
|
234
|
+
"description": {{"i18n": "adapter.{name}.endpoint", "default": "Platform API Endpoint"}},
|
|
235
|
+
"required": False,
|
|
236
|
+
"ui": {{"widget": "text", "group": "connection", "order": 1}},
|
|
237
|
+
}},
|
|
238
|
+
)
|
|
239
|
+
token: str = field(
|
|
240
|
+
default="",
|
|
241
|
+
metadata={{
|
|
242
|
+
"description": {{"i18n": "adapter.{name}.token", "default": "Platform Token"}},
|
|
243
|
+
"required": True,
|
|
244
|
+
"secret": True,
|
|
245
|
+
"ui": {{"widget": "password", "group": "basic", "order": 2}},
|
|
246
|
+
}},
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
# {text[adapter.i18n_hint]}
|
|
250
|
+
class I18nClass(BaseI18n):
|
|
251
|
+
\"\"\"{name} translation keys\"\"\"
|
|
252
|
+
|
|
253
|
+
endpoint: I18nKey = I18nKey(
|
|
254
|
+
key="adapter.{name}.endpoint",
|
|
255
|
+
default="Platform API Endpoint",
|
|
256
|
+
zh_CN="平台 API 地址",
|
|
257
|
+
en="Platform API Endpoint",
|
|
258
|
+
ja="APIアドレス",
|
|
259
|
+
ru="API адрес",
|
|
260
|
+
zh_TW="API 位址",
|
|
261
|
+
)
|
|
262
|
+
token: I18nKey = I18nKey(
|
|
263
|
+
key="adapter.{name}.token",
|
|
264
|
+
default="Platform Token",
|
|
265
|
+
zh_CN="平台 Token",
|
|
266
|
+
en="Platform Token",
|
|
267
|
+
ja="トークン",
|
|
268
|
+
ru="Токен",
|
|
269
|
+
zh_TW="權杖",
|
|
270
|
+
)
|
|
217
271
|
|
|
218
272
|
def __init__(self, sdk=None):
|
|
219
|
-
super().__init__()
|
|
273
|
+
super().__init__(sdk=sdk)
|
|
274
|
+
self.logger = self._get_logger()
|
|
220
275
|
self.converter = self._setup_converter()
|
|
221
276
|
self.convert = self.converter.convert
|
|
222
277
|
|
|
278
|
+
def on_config_update(self, old_config, new_config):
|
|
279
|
+
\"\"\"Called when adapter config hot-reloads\"\"\"
|
|
280
|
+
self.logger.info("{text[adapter.log.config_updated]}")
|
|
281
|
+
|
|
223
282
|
def _setup_converter(self):
|
|
224
283
|
from .Converter import {converter_name}
|
|
225
284
|
return {converter_name}()
|
|
226
285
|
|
|
227
286
|
class Send(BaseAdapter.Send):
|
|
228
287
|
\"\"\"
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
At / AtAll / Reply / Using / To 由框架基类内置处理。
|
|
232
|
-
标准发送方法(Text/Image/Voice/Video/File)已从 SendDSL 基类继承,
|
|
233
|
-
默认委托给 Raw_ob12,无需重复实现。
|
|
234
|
-
使用 self._apply_modifiers(message) 合并修饰器到消息段。
|
|
235
|
-
使用 self.send_context 获取发送上下文 (target_type, target_id, account_id)。
|
|
236
|
-
|
|
237
|
-
支持链式调用:
|
|
238
|
-
Send.To("group", "123").At("456").Reply("789").Text("hi")
|
|
288
|
+
{text[adapter.dsl.send_doc]}
|
|
239
289
|
\"\"\"
|
|
240
290
|
|
|
241
291
|
def Raw_ob12(self, message, **kwargs):
|
|
@@ -249,22 +299,18 @@ class {name}(BaseAdapter):
|
|
|
249
299
|
)
|
|
250
300
|
return asyncio.create_task(_do_send())
|
|
251
301
|
|
|
252
|
-
#
|
|
253
|
-
#
|
|
302
|
+
# {text[adapter.dsl.send_std_methods_hint]}
|
|
303
|
+
# {text[adapter.dsl.send_override_hint]}
|
|
254
304
|
# def Text(self, text: str):
|
|
255
305
|
# return self.Raw_ob12([{{"type": "text", "data": {{"text": text}}}}])
|
|
256
306
|
|
|
257
|
-
#
|
|
307
|
+
# {text[adapter.dsl.send_extra_methods_hint]}
|
|
258
308
|
# def Sticker(self, sticker_id: str):
|
|
259
309
|
# return self.Raw_ob12([{{"type": "sticker", "data": {{"id": sticker_id}}}}])
|
|
260
310
|
|
|
261
311
|
class Request(BaseAdapter.Request):
|
|
262
312
|
\"\"\"
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
适配器应重写 accept / reject 实现平台特定的请求处理逻辑。
|
|
266
|
-
如果平台不支持请求操作,可不实现此内部类。
|
|
267
|
-
基类默认返回 retcode=10002(不支持的操作)。
|
|
313
|
+
{text[adapter.dsl.request_doc]}
|
|
268
314
|
\"\"\"
|
|
269
315
|
|
|
270
316
|
async def _do_accept(self, **kwargs):
|
|
@@ -299,23 +345,34 @@ class {name}(BaseAdapter):
|
|
|
299
345
|
"message": result.get("message", ""),
|
|
300
346
|
}}
|
|
301
347
|
|
|
348
|
+
class Api(BaseAdapter.Api):
|
|
349
|
+
\"\"\"
|
|
350
|
+
{text[adapter.dsl.api_doc]}
|
|
351
|
+
\"\"\"
|
|
352
|
+
|
|
353
|
+
# {text[adapter.dsl.api_std_methods_hint]}
|
|
354
|
+
# {text[adapter.dsl.api_override_hint]}
|
|
355
|
+
# async def get_user_info(self, user_id: str) -> dict:
|
|
356
|
+
# raw = await self._adapter._request("GET", f"/users/{{user_id}}")
|
|
357
|
+
# return self._adapter.make_response(data={{...}}, raw=raw)
|
|
358
|
+
|
|
302
359
|
async def start(self):
|
|
303
|
-
\"\"\"
|
|
360
|
+
\"\"\"Start the adapter\"\"\"
|
|
304
361
|
cfg = self.cfg
|
|
305
|
-
self.logger.info(
|
|
362
|
+
self.logger.info("{text[adapter.log.starting]}")
|
|
306
363
|
|
|
307
364
|
router.register_websocket(
|
|
308
365
|
module_name="{entry_key}",
|
|
309
366
|
path="/ws",
|
|
310
367
|
handler=self._ws_handler,
|
|
311
368
|
)
|
|
312
|
-
self.logger.info("
|
|
369
|
+
self.logger.info("{text[adapter.log.ws_registered]}")
|
|
313
370
|
|
|
314
371
|
async def _ws_handler(self, websocket):
|
|
315
372
|
bot_id = self._get_bot_id()
|
|
316
373
|
|
|
317
374
|
await self.emit_meta("connect", bot_id, user_name="{name}")
|
|
318
|
-
self.logger.info(
|
|
375
|
+
self.logger.info("{text[adapter.log.bot_connected]}")
|
|
319
376
|
|
|
320
377
|
try:
|
|
321
378
|
while True:
|
|
@@ -325,18 +382,18 @@ class {name}(BaseAdapter):
|
|
|
325
382
|
if event:
|
|
326
383
|
await self.adapter.emit(event)
|
|
327
384
|
except Exception as e:
|
|
328
|
-
self.logger.warning(
|
|
385
|
+
self.logger.warning("{text[adapter.log.connection_lost]}")
|
|
329
386
|
finally:
|
|
330
387
|
await self.emit_meta("disconnect", bot_id)
|
|
331
|
-
self.logger.info(
|
|
388
|
+
self.logger.info("{text[adapter.log.bot_disconnected]}")
|
|
332
389
|
|
|
333
390
|
async def shutdown(self):
|
|
334
|
-
\"\"\"
|
|
391
|
+
\"\"\"Shut down the adapter\"\"\"
|
|
335
392
|
router.unregister_websocket("{entry_key}", "/ws")
|
|
336
|
-
self.logger.info("
|
|
393
|
+
self.logger.info("{text[adapter.log.shutdown]}")
|
|
337
394
|
|
|
338
395
|
async def call_api(self, endpoint: str, **params):
|
|
339
|
-
\"\"\"
|
|
396
|
+
\"\"\"Call platform API\"\"\"
|
|
340
397
|
from ErisPulse.Core import client
|
|
341
398
|
|
|
342
399
|
cfg = self.cfg
|
|
@@ -358,77 +415,51 @@ class {name}(BaseAdapter):
|
|
|
358
415
|
raw=result,
|
|
359
416
|
)
|
|
360
417
|
except Exception as e:
|
|
361
|
-
self.logger.error(
|
|
418
|
+
self.logger.error(("{text[adapter.log.api_call_failed]}").format(error=e))
|
|
362
419
|
return self.make_error(message=str(e))
|
|
363
420
|
"""
|
|
364
421
|
|
|
365
422
|
_ADAPTER_CONVERTER = """\"\"\"
|
|
366
|
-
{
|
|
367
|
-
|
|
368
|
-
将平台原生事件转换为 OneBot12 标准格式(正向转换)。
|
|
369
|
-
反向转换(发送方向)由适配器的 Send.Raw_ob12() 处理。
|
|
423
|
+
{text[adapter.converter_doc]}
|
|
370
424
|
\"\"\"
|
|
371
425
|
|
|
372
|
-
import
|
|
373
|
-
import uuid
|
|
426
|
+
from ErisPulse.Core.Bases import BaseConverter
|
|
374
427
|
|
|
375
428
|
|
|
376
|
-
class {converter_name}:
|
|
429
|
+
class {converter_name}(BaseConverter):
|
|
377
430
|
\"\"\"
|
|
378
|
-
{
|
|
431
|
+
{converter_name} converter class
|
|
379
432
|
|
|
380
|
-
|
|
381
|
-
|
|
433
|
+
Converts platform-specific event formats to the ErisPulse standard OneBot12 format.
|
|
434
|
+
Inherits BaseConverter to reuse common field construction (build_base_event)
|
|
435
|
+
and message-segment helpers (text/at/image).
|
|
382
436
|
\"\"\"
|
|
383
437
|
|
|
384
|
-
def
|
|
438
|
+
def __init__(self):
|
|
439
|
+
super().__init__(platform="{entry_key}")
|
|
440
|
+
|
|
441
|
+
def convert(self, raw_event: dict) -> dict | None:
|
|
385
442
|
\"\"\"
|
|
386
|
-
|
|
443
|
+
Convert a platform-native event to the OneBot12 standard format
|
|
387
444
|
|
|
388
|
-
:param raw_event:
|
|
389
|
-
:return: OneBot12
|
|
445
|
+
:param raw_event: raw platform event data
|
|
446
|
+
:return: OneBot12 event dict, or None if unrecognized
|
|
390
447
|
\"\"\"
|
|
391
448
|
if not isinstance(raw_event, dict):
|
|
392
449
|
return None
|
|
393
450
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
event = {{
|
|
398
|
-
"id": str(event_id),
|
|
399
|
-
"time": int(timestamp),
|
|
400
|
-
"type": self._convert_type(raw_event),
|
|
401
|
-
"detail_type": self._convert_detail_type(raw_event),
|
|
402
|
-
"platform": "{entry_key}",
|
|
403
|
-
"self": {{
|
|
404
|
-
"platform": "{entry_key}",
|
|
405
|
-
"user_id": str(raw_event.get("self_id", "")),
|
|
406
|
-
}},
|
|
407
|
-
"{entry_key}_raw": raw_event,
|
|
408
|
-
"{entry_key}_raw_type": raw_event.get("type", ""),
|
|
409
|
-
}}
|
|
410
|
-
|
|
411
|
-
if event["type"] == "message":
|
|
412
|
-
event["user_id"] = str(raw_event.get("sender_id", ""))
|
|
413
|
-
event["message"] = self._convert_message_segments(raw_event.get("content", ""))
|
|
414
|
-
event["alt_message"] = raw_event.get("content", "")
|
|
451
|
+
event_type = raw_event.get("type", "")
|
|
452
|
+
base = self.build_base_event(raw_event, event_type)
|
|
415
453
|
|
|
416
|
-
|
|
454
|
+
if event_type == "message":
|
|
455
|
+
base["type"] = "message"
|
|
456
|
+
base["detail_type"] = "private" if raw_event.get("is_private") else "group"
|
|
457
|
+
base["user_id"] = str(raw_event.get("sender_id", ""))
|
|
458
|
+
base["message"] = [self.text(raw_event.get("content", ""))]
|
|
459
|
+
base["alt_message"] = raw_event.get("content", "")
|
|
460
|
+
return base
|
|
417
461
|
|
|
418
|
-
|
|
419
|
-
event_type = raw_event.get("type", "")
|
|
420
|
-
type_map = {{
|
|
421
|
-
"chat": "message",
|
|
422
|
-
}}
|
|
423
|
-
return type_map.get(event_type, "unknown")
|
|
424
|
-
|
|
425
|
-
def _convert_detail_type(self, raw_event: dict) -> str:
|
|
426
|
-
return "private" if raw_event.get("is_private") else "group"
|
|
427
|
-
|
|
428
|
-
def _convert_message_segments(self, content) -> list:
|
|
429
|
-
if isinstance(content, str) and content:
|
|
430
|
-
return [{{"type": "text", "data": {{"text": content}}}}]
|
|
431
|
-
return []
|
|
462
|
+
return None
|
|
432
463
|
"""
|
|
433
464
|
|
|
434
465
|
_README_MODULE = """# {name}
|
|
@@ -438,7 +469,7 @@ _README_MODULE = """# {name}
|
|
|
438
469
|
## 安装
|
|
439
470
|
|
|
440
471
|
```bash
|
|
441
|
-
epsdk install {name}
|
|
472
|
+
epsdk install ErisPulse-{name}
|
|
442
473
|
```
|
|
443
474
|
|
|
444
475
|
## 使用
|
|
@@ -462,7 +493,7 @@ _README_ADAPTER = """# {name}
|
|
|
462
493
|
## 安装
|
|
463
494
|
|
|
464
495
|
```bash
|
|
465
|
-
epsdk install {name}
|
|
496
|
+
epsdk install ErisPulse-{name}
|
|
466
497
|
```
|
|
467
498
|
|
|
468
499
|
## 使用
|
|
@@ -530,6 +561,20 @@ def _validate_name(name: str) -> bool:
|
|
|
530
561
|
return all(c.isalnum() or c == "_" for c in name)
|
|
531
562
|
|
|
532
563
|
|
|
564
|
+
def _scaffold_text(name: str) -> dict:
|
|
565
|
+
"""
|
|
566
|
+
构建当前语言的脚手架文案映射,并预填充 {name} 占位符
|
|
567
|
+
|
|
568
|
+
:param name: [str] 模块/适配器名称
|
|
569
|
+
:return: [dict] ScaffoldText.all() 的文案字典(含占位符替换)
|
|
570
|
+
"""
|
|
571
|
+
st = ScaffoldText()
|
|
572
|
+
return {
|
|
573
|
+
key: (value.replace("{name}", name) if value else value)
|
|
574
|
+
for key, value in st.all().items()
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
|
|
533
578
|
class CreateCommand(Command):
|
|
534
579
|
"""
|
|
535
580
|
create 命令
|
|
@@ -669,7 +714,8 @@ class CreateCommand(Command):
|
|
|
669
714
|
|
|
670
715
|
(pkg_dir / "__init__.py").write_text(_MODULE_INIT, encoding="utf-8")
|
|
671
716
|
(pkg_dir / "Core.py").write_text(
|
|
672
|
-
_MODULE_CORE.format(name=name
|
|
717
|
+
_MODULE_CORE.format(name=name, text=_scaffold_text(name)),
|
|
718
|
+
encoding="utf-8",
|
|
673
719
|
)
|
|
674
720
|
(project_dir / "pyproject.toml").write_text(
|
|
675
721
|
_MODULE_PYPROJECT.format(
|
|
@@ -767,13 +813,19 @@ class CreateCommand(Command):
|
|
|
767
813
|
)
|
|
768
814
|
(pkg_dir / "Core.py").write_text(
|
|
769
815
|
_ADAPTER_CORE.format(
|
|
770
|
-
name=name,
|
|
816
|
+
name=name,
|
|
817
|
+
converter_name=converter_name,
|
|
818
|
+
entry_key=entry_key,
|
|
819
|
+
text=_scaffold_text(name),
|
|
771
820
|
),
|
|
772
821
|
encoding="utf-8",
|
|
773
822
|
)
|
|
774
823
|
(pkg_dir / "Converter.py").write_text(
|
|
775
824
|
_ADAPTER_CONVERTER.format(
|
|
776
|
-
name=name,
|
|
825
|
+
name=name,
|
|
826
|
+
converter_name=converter_name,
|
|
827
|
+
entry_key=entry_key,
|
|
828
|
+
text=_scaffold_text(name),
|
|
777
829
|
),
|
|
778
830
|
encoding="utf-8",
|
|
779
831
|
)
|