nonebot-plugin-splatoon3-nso 2.0.0__tar.gz → 2.2.2__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.
Files changed (91) hide show
  1. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/PKG-INFO +25 -26
  2. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/README.md +1 -0
  3. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/__init__.py +122 -0
  4. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/api/main.py +9 -0
  5. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/config.py +7 -0
  6. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/data/data_source.py +168 -17
  7. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/data/db_sqlite.py +111 -28
  8. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/data/transfer.py +3 -3
  9. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/data/utils.py +36 -1
  10. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/__init__.py +1 -0
  11. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/admin.py +34 -11
  12. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/handle/b_or_c_evaluate_text.py +629 -0
  13. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/b_or_c_tools.py +4 -2
  14. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/battle.py +5 -2
  15. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/coop.py +2 -3
  16. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/cron/__init__.py +22 -4
  17. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/handle/cron/else_cron.py +168 -0
  18. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/cron/report.py +179 -43
  19. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/cron/stat_ink.py +16 -4
  20. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/cron/x_player.py +2 -1
  21. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/history.py +8 -3
  22. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/last.py +92 -59
  23. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/login.py +49 -33
  24. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/my.py +137 -22
  25. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/handle/other.py +204 -0
  26. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/push.py +58 -32
  27. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/handle/qq_md.py +373 -0
  28. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/report.py +50 -20
  29. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/screenshot.py +3 -2
  30. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/send_msg.py +192 -86
  31. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/top.py +13 -3
  32. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/utils.py +137 -11
  33. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/resource/excuse_dictionary.csv +142 -0
  34. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/resource/full_message_help.jpg +0 -0
  35. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/resource/full_message_help2.jpg +0 -0
  36. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/s3s/iksm.py +131 -49
  37. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/s3s/splatoon.py +75 -24
  38. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/util.py +1 -11
  39. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/utils/bot.py +5 -2
  40. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/utils/excuse_generator.py +256 -0
  41. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/utils/keyboard.py +201 -0
  42. nonebot_plugin_splatoon3_nso-2.2.2/nonebot_plugin_splatoon3_nso/utils/keyboard_help.md +134 -0
  43. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/utils/utils.py +2 -2
  44. nonebot_plugin_splatoon3_nso-2.2.2/pyproject.toml +59 -0
  45. nonebot_plugin_splatoon3_nso-2.0.0/LICENSE +0 -21
  46. nonebot_plugin_splatoon3_nso-2.0.0/nonebot_plugin_splatoon3_nso/__init__.py +0 -240
  47. nonebot_plugin_splatoon3_nso-2.0.0/nonebot_plugin_splatoon3_nso/handle/cron/else_cron.py +0 -281
  48. nonebot_plugin_splatoon3_nso-2.0.0/nonebot_plugin_splatoon3_nso/handle/qq_md.py +0 -353
  49. nonebot_plugin_splatoon3_nso-2.0.0/pyproject.toml +0 -43
  50. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/api/__init__.py +0 -0
  51. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/api/tools.py +0 -0
  52. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/data/__init__.py +0 -0
  53. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/cron/event_top.py +0 -0
  54. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/cron/user_friends.py +0 -0
  55. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/handle/cron/utils.py +0 -0
  56. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/bot_login.png +0 -0
  57. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/bot_privacy.png +0 -0
  58. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/i18n/en-GB.json +0 -0
  59. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/i18n/ja-JP.json +0 -0
  60. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/i18n/ko-KR.json +0 -0
  61. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/i18n/zh-CN.json +0 -0
  62. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/i18n/zh-TW.json +0 -0
  63. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/AREA.png +0 -0
  64. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/BANKARA(CHALLENGE).png +0 -0
  65. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/BANKARA(OPEN).png +0 -0
  66. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/BANKARA.png +0 -0
  67. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/CLAM.png +0 -0
  68. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/GOAL.png +0 -0
  69. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/LEAGUE.png +0 -0
  70. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/LOFT.png +0 -0
  71. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/Regular.png +0 -0
  72. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/Splatfest.png +0 -0
  73. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/TURF_WAR.png +0 -0
  74. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/X_MATCH.png +0 -0
  75. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/coop_big_run.png +0 -0
  76. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/coop_regular.png +0 -0
  77. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/coop_team.png +0 -0
  78. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/icons/private.png +0 -0
  79. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/md.css +0 -0
  80. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/resource/sp3bot-login.gif +0 -0
  81. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/s3s/__init__.py +0 -0
  82. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/s3s/splatnet_image.py +0 -0
  83. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/s3s/stat.py +0 -0
  84. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/s3s/utils.py +0 -0
  85. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/test_s3s.py +0 -0
  86. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/utils/__init__.py +0 -0
  87. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/utils/cos_upload.py +0 -0
  88. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/utils/http.py +0 -0
  89. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/utils/redis.py +0 -0
  90. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/utils/short_url.py +0 -0
  91. {nonebot_plugin_splatoon3_nso-2.0.0 → nonebot_plugin_splatoon3_nso-2.2.2}/nonebot_plugin_splatoon3_nso/utils/time.py +0 -0
@@ -1,37 +1,36 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.3
2
2
  Name: nonebot-plugin-splatoon3-nso
3
- Version: 2.0.0
3
+ Version: 2.2.2
4
4
  Summary: 一个基于nonebot2框架的splatoon3游戏nso数据查询插件
5
- License-File: LICENSE
6
5
  Author: cypas
7
- Author-email: ayano05@outlook.com
8
- Requires-Python: >=3.10,<4.0
6
+ Author-email: cypas <ayano05@outlook.com>
9
7
  Classifier: Programming Language :: Python :: 3
10
8
  Classifier: Programming Language :: Python :: 3.10
11
9
  Classifier: Programming Language :: Python :: 3.11
12
10
  Classifier: Programming Language :: Python :: 3.12
13
11
  Classifier: Programming Language :: Python :: 3.13
14
12
  Classifier: Programming Language :: Python :: 3.14
15
- Requires-Dist: Pillow (>=11.3.0,<12.0.0)
16
- Requires-Dist: SQLAlchemy (>=2.0.25,<3.0.0)
17
- Requires-Dist: async-lru (>=2.0.0,<3.0.0)
18
- Requires-Dist: beautifulsoup4 (>=4.12.2,<5.0.0)
19
- Requires-Dist: cos_python_sdk_v5 (>=1.9.30,<2.0.0)
20
- Requires-Dist: fastapi (>=0.104.1,<0.105.0)
21
- Requires-Dist: httpx (>=0.28.1,<0.29.0)
22
- Requires-Dist: nonebot-adapter-kaiheila (>=0.3.4,<0.4.0)
23
- Requires-Dist: nonebot-adapter-onebot (>=2.4.6,<3.0.0)
24
- Requires-Dist: nonebot-adapter-qq (>=1.6.6,<2.0.0)
25
- Requires-Dist: nonebot-adapter-telegram (>=0.1.0b20,<0.2.0)
26
- Requires-Dist: nonebot-plugin-apscheduler (>=0.5.0,<0.6.0)
27
- Requires-Dist: nonebot2 (>=2.4.4,<3.0.0)
28
- Requires-Dist: nonebot_plugin_datastore (>=1.3.0,<2.0.0)
29
- Requires-Dist: nonebot_plugin_htmlrender (>=0.6.7,<0.7.0)
30
- Requires-Dist: playwright (>=1.40.0,<2.0.0)
31
- Requires-Dist: pydantic (>=1.0.0,<3.0.0,!=2.5.0,!=2.5.1)
32
- Requires-Dist: pymmh3 (>=0.0.5,<0.0.6)
33
- Requires-Dist: pympler (>=1.1,<2.0)
34
- Requires-Dist: redis (>=5.2.0,<6.0.0)
13
+ Requires-Dist: beautifulsoup4>=4.12.2,<5
14
+ Requires-Dist: httpx>=0.28.1,<0.29
15
+ Requires-Dist: nonebot2>=2.4.4,<3
16
+ Requires-Dist: pydantic>=1.0.0,!=2.5.0,!=2.5.1,<3.0.0
17
+ Requires-Dist: nonebot-adapter-onebot>=2.4.6,<3
18
+ Requires-Dist: nonebot-adapter-telegram>=0.1.0b20,<0.2
19
+ Requires-Dist: nonebot-adapter-kaiheila>=0.3.4,<0.4
20
+ Requires-Dist: nonebot-adapter-qq>=1.7.1,<2
21
+ Requires-Dist: nonebot-plugin-apscheduler>=0.5.0,<0.6
22
+ Requires-Dist: nonebot-plugin-datastore>=1.3.0,<2
23
+ Requires-Dist: nonebot-plugin-htmlrender>=0.6.7,<0.7
24
+ Requires-Dist: sqlalchemy>=2.0.25,<3
25
+ Requires-Dist: playwright>=1.40.0,<2
26
+ Requires-Dist: redis>=5.2.0,<6
27
+ Requires-Dist: pillow>=11.3.0,<12
28
+ Requires-Dist: pympler>=1.1,<2
29
+ Requires-Dist: cos-python-sdk-v5>=1.9.30,<2
30
+ Requires-Dist: pymmh3>=0.0.5,<0.0.6
31
+ Requires-Dist: fastapi>=0.123.9,<0.124
32
+ Requires-Dist: async-lru>=2.0.0,<3
33
+ Requires-Python: >=3.10, <4
35
34
  Description-Content-Type: text/markdown
36
35
 
37
36
  <div align="center">
@@ -224,8 +223,8 @@ nso查询过程中使用到了第三方的自动令牌生成接口
224
223
  - https://github.com/imink-app/f-API 模拟nso授权步骤的公开接口
225
224
  - https://github.com/samuelthomas2774/nxapi-znca-api 模拟nso授权步骤的公开接口
226
225
  - [zurl](https://github.com/helloxz/zurl)一个简单易用的短链接服务
226
+ - [喷喷借口生成器](https://github.com/arainwong/excuse-generator)参考了喷喷借口生成器的代码和借口语料
227
227
 
228
228
  ## ⏳ Star 趋势
229
229
 
230
230
  [![Stargazers over time](https://starchart.cc/Cypas/splatoon3-nso.svg)](https://starchart.cc/Cypas/splatoon3-nso)
231
-
@@ -188,6 +188,7 @@ nso查询过程中使用到了第三方的自动令牌生成接口
188
188
  - https://github.com/imink-app/f-API 模拟nso授权步骤的公开接口
189
189
  - https://github.com/samuelthomas2774/nxapi-znca-api 模拟nso授权步骤的公开接口
190
190
  - [zurl](https://github.com/helloxz/zurl)一个简单易用的短链接服务
191
+ - [喷喷借口生成器](https://github.com/arainwong/excuse-generator)参考了喷喷借口生成器的代码和借口语料
191
192
 
192
193
  ## ⏳ Star 趋势
193
194
 
@@ -0,0 +1,122 @@
1
+ from nonebot.plugin import PluginMetadata
2
+
3
+ from .config import driver, plugin_config, Config
4
+ from .data.db_sqlite import init_db
5
+ from .data.transfer import transfer_user_db
6
+ from .handle import *
7
+ from .handle.cron import remove_all_scheduler, scheduler_controller
8
+ from .handle.qq_md import get_qq_face_md, new_user_added_md
9
+ from .handle.send_msg import bot_send, notify_to_channel, bot_send_new_user_added_md
10
+ from .s3s.splatnet_image import global_browser
11
+ from .utils import MSG_HELP_QQ, MSG_HELP_CN, MSG_HELP, BOT_VERSION, get_time_now_china_str, get_msg_id
12
+ from .utils.bot import *
13
+ from .api.main import app as fastapi_app # 引入fastapi接口
14
+
15
+ __plugin_meta__ = PluginMetadata(
16
+ name="splatoon3游戏nso查询",
17
+ description="一个基于nonebot2框架的splatoon3游戏nso数据查询插件",
18
+ usage="发送 帮助 或 help 可查看详细指令\n",
19
+ type="application",
20
+ # 发布必填,当前有效类型有:`library`(为其他插件编写提供功能),`application`(向机器人用户提供功能)。
21
+ homepage="https://github.com/Cypas/splatoon3-nso",
22
+ # 发布必填。
23
+ config=Config,
24
+ supported_adapters={"~onebot.v11", "~onebot.v12", "~telegram", "~kaiheila", "~qq"},
25
+ )
26
+
27
+
28
+ @driver.on_startup
29
+ async def bot_on_start():
30
+ # 检查旧数据库文件与新数据库文件是否存在
31
+ old_db_path = f"{DIR_RESOURCE}/data.sqlite"
32
+ new_db_path = f"{DIR_RESOURCE}/nso_data.sqlite"
33
+ if os.path.exists(old_db_path) and not os.path.exists(new_db_path):
34
+ # 旧数据库存在,新数据库不存在,启动转移函数
35
+ logger.info("检测到旧版本用户数据库,将开始进行数据转移")
36
+ transfer_user_db()
37
+ logger.info("用户数据库转移完成")
38
+ else:
39
+ init_db()
40
+
41
+ # 创建定时任务
42
+ scheduler_controller()
43
+ version = BOT_VERSION
44
+ logger.info(f" bot start, version: {version} ".center(120, "-"))
45
+ await notify_to_channel(f"bot start, version: {version}")
46
+
47
+
48
+ @driver.on_shutdown
49
+ async def bot_on_shutdown():
50
+ version = BOT_VERSION
51
+ logger.info(f" bot shutdown, version: {version} ".center(120, "x"))
52
+
53
+
54
+ @driver.on_bot_connect
55
+ async def _(bot: Bot):
56
+ bot_name = bot.adapter.get_name()
57
+ logger.info(f" {bot_name} bot connect {bot.self_id} ".center(60, "-").center(90, " "))
58
+ if bot_name == "QQ":
59
+ text = f"bot {bot_name}: {bot.self_id} online ~"
60
+ if plugin_config.splatoon3_bot_disconnect_notify:
61
+ await notify_to_channel(text)
62
+
63
+
64
+ @driver.on_bot_disconnect
65
+ async def _(bot: Bot):
66
+ bot_name = bot.adapter.get_name()
67
+ text = f"bot {bot_name}: {bot.self_id} disconnect !!!!!!!!!!!!!!!!!!!"
68
+ if plugin_config.splatoon3_bot_disconnect_notify:
69
+ try:
70
+ await notify_to_channel(text)
71
+ except Exception as e:
72
+ logger.warning(f"{text}")
73
+ logger.warning(f"日志通知失败: {e}")
74
+
75
+ # @event_preprocessor
76
+ # async def tg_private_msg(bot: Tg_Bot, event: Event):
77
+ # try:
78
+ # user_id = event.get_user_id()
79
+ # message = event.get_plaintext().strip()
80
+ # except:
81
+ # user_id = ''
82
+ # message = ''
83
+ #
84
+ # _event = event.dict() or {}
85
+ # logger.debug(_event)
86
+ # if user_id and message and 'group' not in _event.get('chat', {}).get('type', ''):
87
+ # logger.info(f'tg_private_msg {user_id} {message}')
88
+ #
89
+ # name = _event.get('from_', {}).get('first_name', '')
90
+ # if _event.get('from_', {}).get('last_name', ''):
91
+ # name += ' ' + _event.get('from_', {}).get('last_name', '')
92
+ # if not name:
93
+ # name = _event.get('from_', {}).get('username', '')
94
+ #
95
+ # text = f"#tg{user_id}\n昵称:{name}\n消息:{message}"
96
+ # try:
97
+ # await notify_to_channel(text)
98
+ # except Exception as e:
99
+ # logger.warning("text")
100
+ # logger.warning(f"日志通知失败: {e}")
101
+ #
102
+ #
103
+ # @event_preprocessor
104
+ # async def kk_private_msg(bot: Kook_Bot, event: Event):
105
+ # try:
106
+ # user_id = event.get_user_id()
107
+ # message = event.get_plaintext().strip()
108
+ # except:
109
+ # user_id = ''
110
+ # message = ''
111
+ #
112
+ # if user_id == 'SYSTEM' and message == "[系统消息]":
113
+ # return
114
+ #
115
+ # _event = event.dict() or {}
116
+ # logger.debug(_event)
117
+ # if user_id and message and 'group' not in event.get_event_name():
118
+ # logger.info(f'kk_private_msg {user_id} {message}')
119
+ #
120
+ # name = _event.get('event', {}).get('author', {}).get('username') or ''
121
+ # text = f"#kk{user_id}\n昵称:{name}\n消息:{message}"
122
+ # await notify_to_channel(text)
@@ -9,6 +9,15 @@ from fastapi.middleware.cors import CORSMiddleware
9
9
  from ..utils.utils import DIR_RESOURCE, get_jwt_exp_info
10
10
  from ..utils.redis import api_rget_json_file_name, api_rdel_json_file_name, api_rget_info
11
11
 
12
+ ### bot.py 中启动fastapi
13
+ # nonebot.init()
14
+ # asgi = nonebot.get_asgi()
15
+ # driver = nonebot.get_driver()
16
+ # driver.register_adapter(OneBotV11Adapter)
17
+ # nonebot.load_plugins("plugins")
18
+ # asgi.mount("/api", fastapi_app)
19
+ ###
20
+
12
21
  fast_logger = logger.bind(fastapi=True)
13
22
  app = FastAPI(
14
23
  title="小鱿鱿外部fastapi接口",
@@ -19,6 +19,11 @@ class ZurlConfig(BaseModel, extra=Extra.ignore):
19
19
  host: str = "" # http://demo.a.com
20
20
  token: str = "" # 密钥
21
21
 
22
+ class FullMessageConfig(BaseModel, extra=Extra.ignore):
23
+ """全量消息相关配置 """
24
+ enabled: bool = False
25
+ bot_qq: str = "" # bot qq号
26
+ bot_uid: str = "" # bot_uid需要借助第三方bot才能获取到
22
27
 
23
28
  # 其他地方出现的类似 from .. import config,均是从 __init__.py 导入的 Config 实例
24
29
  class Config(BaseModel):
@@ -75,6 +80,8 @@ class Config(BaseModel):
75
80
  splatoon3_cos_config: CosConfig = Field(default_factory=CosConfig)
76
81
  # zurl短链接配置
77
82
  splatoon3_zurl_config: ZurlConfig = Field(default_factory=ZurlConfig)
83
+ # 全量消息配置
84
+ splatoon3_full_message_config: FullMessageConfig = Field(default_factory=FullMessageConfig)
78
85
 
79
86
 
80
87
  driver = get_driver()
@@ -1,10 +1,10 @@
1
1
  import copy
2
- import datetime
3
2
  import weakref
4
3
  from typing import Type
4
+ from datetime import datetime as dt, timedelta
5
5
 
6
6
  from nonebot import logger
7
- from sqlalchemy import and_, text
7
+ from sqlalchemy import and_, or_, text, func
8
8
  from sqlalchemy.dialects import mysql
9
9
 
10
10
  from .db_sqlite import *
@@ -57,6 +57,10 @@ def dict_get_or_set_user_info(platform, user_id, _type="normal", **kwargs):
57
57
  ns_name=user.ns_name,
58
58
  ns_friend_code=user.ns_friend_code,
59
59
  nsa_id=user.nsa_id,
60
+ first_play_time=user.first_play_time,
61
+ last_play_time=user.last_play_time,
62
+ next_report_run_time=user.next_report_run_time,
63
+ last_cmd_time=user.last_cmd_time,
60
64
  req_client=get_or_init_client(platform, user_id, _type)
61
65
  )
62
66
  user_dict.update({key: user_info})
@@ -209,6 +213,96 @@ def model_get_all_user() -> list[UserTable]:
209
213
  return users
210
214
 
211
215
 
216
+ def model_get_all_report_user() -> list[UserTable]:
217
+ """获取全部session_token不为空用户 且日报更新时间为小于等于今天,或日报更新时间为None(新用户)的日报"""
218
+ session = DBSession()
219
+ today = datetime.datetime.now().date()
220
+
221
+ query = (session.query(UserTable).filter(
222
+ and_(
223
+ UserTable.session_token.isnot(None),
224
+ UserTable.session_token != "",
225
+ UserTable.user_agreement == 1,
226
+ or_(
227
+ UserTable.next_report_run_time.is_(None),
228
+ func.date(UserTable.next_report_run_time) <= today
229
+ )
230
+ )
231
+ ))
232
+
233
+ query = query.order_by(UserTable.platform.asc(), UserTable.id.asc())
234
+
235
+ # # 打印生成的 SQL 语句(包含参数)
236
+ # from sqlalchemy.dialects import sqlite
237
+ # compiled = query.statement.compile(dialect=sqlite.dialect(), compile_kwargs={"literal_binds": True})
238
+ # logger.info(f"Generated SQL: {compiled}")
239
+
240
+ users = query.all()
241
+ session.close()
242
+ return users
243
+
244
+
245
+ def model_get_all_active_report_user() -> list[UserTable]:
246
+ """获取全部昨天或今天使用了nso功能 session_token不为空用户"""
247
+ session = DBSession()
248
+ now = datetime.datetime.utcnow()
249
+ today = now.date()
250
+ yesterday = (now - timedelta(days=1)).date()
251
+ two_before_day = (now - timedelta(days=2)).date()
252
+
253
+ query = (session.query(UserTable).filter(
254
+ and_(
255
+ UserTable.session_token.isnot(None),
256
+ UserTable.session_token != "",
257
+ UserTable.user_agreement == 1,
258
+ or_(
259
+ func.date(UserTable.last_cmd_time) == today,
260
+ func.date(UserTable.last_cmd_time) == yesterday,
261
+ func.date(UserTable.last_cmd_time) == two_before_day,
262
+ )
263
+ )
264
+ ))
265
+
266
+ query = query.order_by(UserTable.platform.asc(), UserTable.id.asc())
267
+
268
+ # # 打印生成的 SQL 语句(包含参数)
269
+ # from sqlalchemy.dialects import sqlite
270
+ # compiled = query.statement.compile(dialect=sqlite.dialect(), compile_kwargs={"literal_binds": True})
271
+ # logger.info(f"Generated SQL: {compiled}")
272
+
273
+ users = query.all()
274
+ session.close()
275
+ return users
276
+
277
+
278
+ def model_get_all_inactive_report_user() -> list[UserTable]:
279
+ """获取全部不活跃日报用户 session_token不为空用户 且日报更新时间大于今天,或日报更新时间为None(新用户)的日报"""
280
+ session = DBSession()
281
+ today = datetime.datetime.now().date()
282
+
283
+ query = (session.query(UserTable).filter(
284
+ and_(
285
+ UserTable.session_token.isnot(None),
286
+ UserTable.session_token != "",
287
+ UserTable.user_agreement == 1,
288
+ or_(
289
+ UserTable.next_report_run_time.isnot(None),
290
+ UserTable.next_report_run_time != "",
291
+ func.date(UserTable.next_report_run_time) > today
292
+ )
293
+ )
294
+ ))
295
+
296
+ query = query.order_by(UserTable.platform.asc(), UserTable.id.asc())
297
+ # # 打印生成的 SQL 语句(包含参数)
298
+ # from sqlalchemy.dialects import sqlite
299
+ # compiled = query.statement.compile(dialect=sqlite.dialect(), compile_kwargs={"literal_binds": True})
300
+ # logger.info(f"Generated SQL: {compiled}")
301
+ users = query.all()
302
+ session.close()
303
+ return users
304
+
305
+
212
306
  def model_get_all_stat_user() -> list[UserTable]:
213
307
  """获取全部session_token不为空,且stat key不为空用户"""
214
308
  session = DBSession()
@@ -243,6 +337,41 @@ def model_get_newest_user() -> UserTable:
243
337
  return user
244
338
 
245
339
 
340
+ def model_add_seed_export(row: SeedExportTable):
341
+ """添加观星导出记录"""
342
+ session = DBSession()
343
+ session.add(row)
344
+ session.commit()
345
+ session.close()
346
+
347
+
348
+ def model_get_seed_export_cnt(platform, user_id):
349
+ """查询单用户观星导出记录
350
+ """
351
+ session = DBSession()
352
+ # 查询某个人按 game_sp_id 分组的记录
353
+ records = session.query(
354
+ SeedExportTable.platform,
355
+ SeedExportTable.user_id,
356
+ SeedExportTable.game_name,
357
+ SeedExportTable.game_sp_id,
358
+ SeedExportTable.ns_name,
359
+ SeedExportTable.ns_friend_code,
360
+ SeedExportTable.nsa_id,
361
+ func.min(SeedExportTable.create_time).label("first_export_time"),
362
+ func.max(SeedExportTable.create_time).label("last_export_time"),
363
+ func.count(SeedExportTable.id).label("count")
364
+ ).filter(
365
+ SeedExportTable.platform == platform,
366
+ SeedExportTable.user_id == user_id
367
+ ).group_by(
368
+ SeedExportTable.game_sp_id
369
+ ).all()
370
+
371
+ session.close()
372
+ return records
373
+
374
+
246
375
  def model_get_login_user_by_sp_code(player_code):
247
376
  """获取登录用户信息"""
248
377
  session = DBSession()
@@ -254,7 +383,7 @@ def model_get_login_user_by_sp_code(player_code):
254
383
 
255
384
  def model_get_top_player(player_code):
256
385
  """获取一名top玩家信息"""
257
- session = DBSession()
386
+ session = DBSession_Top()
258
387
  user = session.query(TopPlayer).filter(
259
388
  TopPlayer.player_code == player_code).order_by(TopPlayer.power.desc()).first()
260
389
  session.close()
@@ -263,7 +392,7 @@ def model_get_top_player(player_code):
263
392
 
264
393
  def model_get_max_power_top_all(player_code) -> TopAll:
265
394
  """获取一条最高分数 top all信息"""
266
- session = DBSession()
395
+ session = DBSession_Top()
267
396
  user = session.query(TopAll).filter(
268
397
  TopAll.player_code == player_code).order_by(TopAll.power.desc()).first()
269
398
  session.close()
@@ -272,7 +401,7 @@ def model_get_max_power_top_all(player_code) -> TopAll:
272
401
 
273
402
  def model_get_all_top_all(player_code):
274
403
  """获取某人全部上榜数据"""
275
- session = DBSession()
404
+ session = DBSession_Top()
276
405
  user = session.query(TopAll).filter(TopAll.player_code == player_code).all()
277
406
  session.close()
278
407
  return user
@@ -317,7 +446,7 @@ def model_add_report(new_report: Report):
317
446
  if not user_id_sp:
318
447
  report_logger.warning(f"no user_id_sp: {new_report}")
319
448
  return
320
- session = DBSession()
449
+ session = DBSession_Report()
321
450
  _res = session.query(Report).filter(Report.user_id_sp == user_id_sp).order_by(Report.create_time.desc()).first()
322
451
  # 避免一天内多次写入
323
452
  if _res and _res.create_time.date() >= datetime.datetime.utcnow().date():
@@ -334,7 +463,7 @@ def model_get_today_report(user_id_sp):
334
463
  """获取今日日报数据 用于判断日报是否需要推送"""
335
464
  if not user_id_sp:
336
465
  return None
337
- session = DBSession()
466
+ session = DBSession_Report()
338
467
  # 1. 获取当前 UTC+0 时间
339
468
  utc_now = datetime.datetime.utcnow()
340
469
  # 2. 确定“今天”的 UTC+0 日期(0点)
@@ -357,7 +486,7 @@ def model_get_report(user_id_sp, create_time=""):
357
486
  """获取日报"""
358
487
  if not user_id_sp:
359
488
  return None
360
- session = DBSession()
489
+ session = DBSession_Report()
361
490
 
362
491
  # query = [Report.user_id_sp == user_id_sp]
363
492
  # report = session.query(Report).filter(*query).order_by(Report.create_time.desc()).all()
@@ -396,7 +525,7 @@ def model_get_report_all(user_id_sp):
396
525
  """获取全部日报"""
397
526
  if not user_id_sp:
398
527
  return None
399
- session = DBSession()
528
+ session = DBSession_Report()
400
529
  data = session.execute(text(f"""
401
530
  SELECT id, DATETIME(last_play_time, '+8 hours') as last_play_time,
402
531
  total_cnt,
@@ -433,7 +562,7 @@ def model_get_user_friend(game_name) -> UserFriendTable:
433
562
 
434
563
 
435
564
  def model_new_get_user_friend(nsa_id) -> UserFriendTable:
436
- """获取好友数据(使用nsa_id精准匹配)"""
565
+ """获取好友数据(使用nsa_id精准匹配) 后来发现好友里面取不到nsa_id 放弃了"""
437
566
  session = DBSession_Friends()
438
567
  user = session.query(UserFriendTable).filter(
439
568
  UserFriendTable.nsa_id == nsa_id
@@ -485,9 +614,31 @@ def model_set_user_friend(data_lst):
485
614
  session.close()
486
615
 
487
616
 
617
+ def model_delete_user_friend():
618
+ """清除90天前创建或90天前才更新的好友数据"""
619
+ # 两种情况删除 1. 90天前创建,从未更新 2.更新时间不为none,在90天前
620
+ session = DBSession_Friends()
621
+ ninety_days_ago = datetime.datetime.now() - datetime.timedelta(days=90)
622
+
623
+ # 情况1: 90天前创建且从未更新(update_time为None)
624
+ session.query(UserFriendTable).filter(
625
+ UserFriendTable.create_time < ninety_days_ago,
626
+ UserFriendTable.update_time == None
627
+ ).delete()
628
+
629
+ # 情况2: 更新时间不为None,且在90天前
630
+ session.query(UserFriendTable).filter(
631
+ UserFriendTable.update_time != None,
632
+ UserFriendTable.update_time < ninety_days_ago
633
+ ).delete()
634
+
635
+ session.commit()
636
+ session.close()
637
+
638
+
488
639
  def model_delete_top_player(top_id):
489
640
  """删除指定赛季 top榜单玩家数据"""
490
- session = DBSession()
641
+ session = DBSession_Top()
491
642
  session.query(TopPlayer).filter(TopPlayer.top_id == top_id).delete()
492
643
  session.commit()
493
644
  session.close()
@@ -495,7 +646,7 @@ def model_delete_top_player(top_id):
495
646
 
496
647
  def model_delete_top_all(top_id):
497
648
  """删除指定赛季 top_all榜单玩家数据"""
498
- session = DBSession()
649
+ session = DBSession_Top()
499
650
  session.query(TopAll).filter(TopAll.top_id == top_id).delete()
500
651
  session.commit()
501
652
  session.close()
@@ -505,7 +656,7 @@ def model_add_top_player(row):
505
656
  """添加top榜单数据"""
506
657
  top_id, _top_type, rank, power, name, name_id, player_code, byname, weapon_id, weapon = row
507
658
 
508
- session = DBSession()
659
+ session = DBSession_Top()
509
660
  _dict = {
510
661
  'top_id': top_id,
511
662
  'top_type': _top_type,
@@ -528,7 +679,7 @@ def model_add_top_all(row):
528
679
  """添加top_all榜单数据"""
529
680
  top_id, _top_type, rank, power, name, name_id, player_code, byname, weapon_id, weapon, play_time = row
530
681
 
531
- session = DBSession()
682
+ session = DBSession_Top()
532
683
  _dict = {
533
684
  'top_id': top_id,
534
685
  'top_type': _top_type,
@@ -550,7 +701,7 @@ def model_add_top_all(row):
550
701
 
551
702
  def model_get_top_all_count_by_top_type(top_type):
552
703
  """通过top_all类型取得top_all记录的count"""
553
- session = DBSession()
704
+ session = DBSession_Top()
554
705
  top_count = session.query(func.count(TopAll.id)).where(TopAll.top_type.contains(top_type)).scalar()
555
706
  session.close()
556
707
  return top_count
@@ -571,7 +722,7 @@ def model_get_top_all_count_by_top_type(top_type):
571
722
  # ORDER BY
572
723
  # top_all.create_time DESC
573
724
  # """
574
- # session = DBSession()
725
+ # session = DBSession_Top()
575
726
  # top = session.query(TopAll).where(TopAll.top_type.like("LeagueMatchRankingTeam%")).group_by(TopAll.top_type) \
576
727
  # .order_by(TopAll.create_time.desc()).first()
577
728
  # session.close()
@@ -579,7 +730,7 @@ def model_get_top_all_count_by_top_type(top_type):
579
730
 
580
731
 
581
732
  def model_get_power_rank():
582
- session = DBSession()
733
+ session = DBSession_Report()
583
734
  data = session.execute(text(f"""
584
735
  select user_id_sp, max(max_power) max_power,
585
736
  row_number() over (order by max_power desc) rank