Lanly109 / headimg_generator

基于HoshinoBot的制作头像相关的表情包插件,移植自nonebot-plugin-petpet
MIT License
50 stars 11 forks source link

重构 #34

Closed kcn3388 closed 1 year ago

kcn3388 commented 1 year ago

33

kcn3388 commented 1 year ago

meme_optional里面存放自定义表情,实际制作参考源仓库

cca2878 commented 1 year ago

大佬牛逼 另外能否为此插件的单独设置命令前缀? 此插件的命令格式极易与其他插件冲突。

kcn3388 commented 1 year ago

大佬牛逼 另外能否为此插件的单独设置命令前缀? 此插件的命令格式极易与其他插件冲突。

@CCA2878 config.py

meme_command_start: str = "" # 命令前缀

Lanly109 commented 1 year ago

感谢您的pr!目前在会战不好测试,会战结束后我看看

kcn3388 commented 1 year ago

还有一个比较头疼的点,通过pip安装源仓库的话有个更新慢和不方便的问题,考虑直接将整个仓库移植过来ing 回头开个new branch吧

kcn3388 commented 1 year ago

想了一下,作以下注释:

kcn3388 commented 1 year ago

新增更新头像表情包,拉取表情包资源更新

Lanly109 commented 1 year ago

最后一个,我之前就想解决那个前缀匹配删除会影响ev里的内容(可能会影响到其他插件的触发),但改成deepcopy貌似还会有这个问题。

e2c4670这里把List删了会报错诶,第26行用到了List

kcn3388 commented 1 year ago

@Lanly109 按道理是不会的,我之前也是察觉到python这边变量直接赋值给另一个变量的话,两个变量是在同一个内存地址上的(也就是两个变量本质上是同一个),调用deepcopy的话理论上就是两个不相关的变量了。这边测试过修改以后就不会对原来的event进行操作了。或者我直接干脆点,对整个event做copy操作试试

kcn3388 commented 1 year ago

最后一个,我之前就想解决那个前缀匹配删除会影响ev里的内容(可能会影响到其他插件的触发),但改成deepcopy貌似还会有这个问题。

e2c4670这里把List删了会报错诶,第26行用到了List

这里可能需要你debug一下,看看是在哪里开始event被修改了。我这边姑且直接deepcopy整个event,你也可以看看新的commit有没有问题。 顺带我把原仓库提供的一些optional meme也加进来 hoshino的触发机制挺奇怪的,子目录下必须得有init.py才能被识别到,所以也没办法把optional meme作为一个submodule加入到仓库里,回头我试试能不能也更聪明的办法

kcn3388 commented 1 year ago

如果在git clone时没有抓取子模块:

如果想在git clone时抓取子模块: git clone --recursive

kcn3388 commented 1 year ago

直接copy event有点问题,还是需要你debug一下定位在哪里开始ev内容被修改了

Lanly109 commented 1 year ago

插件加载机制用的是nonebot的,加载会判断目录是不是一个python3package(有__init__.py就是),不是的话就不加载了。

关于meme_3rd_optional,我这里貌似出现了点问题

image image
kcn3388 commented 1 year ago
折叠图片 ![_X%~ TE9JDI_N@SQ95 (WKN_tmb](https://github.com/Lanly109/headimg_generator/assets/25716090/7a254129-75fc-4084-8cbe-7a09efb61bc0)

我这边没问题,你截图一下完整的log? 或者你执行一下 git submodule init git submodule update

Lanly109 commented 1 year ago
2023-05-15 15:47:24.145 | ERROR    | meme_generator.manager:load_memes:54 - Failed to import ~/HoshinoBot/hoshino/modules/headimg_generator/meme_optional/meme_3rd_optional/__init__.py!
Traceback (most recent call last):

  File "~/HoshinoBot/run.py", line 4, in <module>
    bot = hoshino.init()
          │       └ <function init at 0x7ff29a4f8c10>
          └ <module 'hoshino' from '~/HoshinoBot/hoshino/__init__.py'>

  File "~/HoshinoBot/hoshino/__init__.py", line 67, in init
    nonebot.load_plugins(
    │       └ <function load_plugins at 0x7ff292658a60>
    └ <module 'nonebot' from '/usr/local/lib/python3.8/site-packages/nonebot/__init__.py'>

  File "/usr/local/lib/python3.8/site-packages/nonebot/plugin.py", line 323, in load_plugins
    result = load_plugin(f'{module_prefix}.{m.group(1)}')
             └ <function load_plugin at 0x7ff292642dc0>
  File "/usr/local/lib/python3.8/site-packages/nonebot/plugin.py", line 249, in load_plugin
    module = importlib.import_module(module_path)
             │         │             └ 'hoshino.modules.headimg_generator.manager'
             │         └ <function import_module at 0x7ff2a1e1d820>
             └ <module 'importlib' from '/usr/local/lib/python3.8/importlib/__init__.py'>
  File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           │          │           │    │        │        └ 0
           │          │           │    │        └ None
           │          │           │    └ 0
           │          │           └ 'hoshino.modules.headimg_generator.manager'
           │          └ <function _gcd_import at 0x7ff2a1f4d430>
           └ <module 'importlib._bootstrap' (frozen)>
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed

  File "~/HoshinoBot/hoshino/modules/headimg_generator/__init__.py", line 17, in <module>
    from meme_generator.download import check_resources

  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "~/.local/lib/python3.8/site-packages/meme_generator/__init__.py", line 21, in <module>
    load_memes(meme_dir)
    │          └ PosixPath('~/HoshinoBot/hoshino/modules/headimg_generator/meme_optional')
    └ <function load_memes at 0x7ff2763f58b0>
> File "~/.local/lib/python3.8/site-packages/meme_generator/manager.py", line 52, in load_memes
    module_loader.exec_module(module)
    │             │           └ <module 'meme_3rd_optional' from '~/HoshinoBot/hoshino/modules/headimg_generator/meme_optional/meme_3rd_optio...
    │             └ <function _LoaderBasics.exec_module at 0x7ff2a1eee5e0>
    └ <_frozen_importlib_external.SourceFileLoader object at 0x7ff2772e9eb0>
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed

  File "~/HoshinoBot/hoshino/modules/headimg_generator/meme_optional/meme_3rd_optional/__init__.py", line 1, in <module>
    from .memes import *

ModuleNotFoundError: No module named 'meme_3rd_optional'
2023-05-15 15:47:24.610 | WARNING  | meme_generator.manager:add_meme:73 - Meme with key "cuidao" already exists!
2023-05-15 15:47:24.613 | WARNING  | meme_generator.manager:add_meme:73 - Meme with key "operations" already exists!

meme_optional下的目录

.
├── __init__.py
├── cuidao
│   └── __init__.py
├── meme_3rd_optional
│   ├── LICENSE
│   ├── README.md
│   ├── __init__.py
│   ├── docs
│   │   ├── images
│   │   ├── memes.md
│   │   └── update_doc.py
│   ├── memes
│   │   ├── __init__.py
│   │   ├── can_can_need
│   │   ├── do
│   │   ├── empathy
│   │   ├── fleshlight
│   │   ├── forbid
│   │   ├── grab
│   │   ├── operator_generator
│   │   └── stretch
│   └── pyproject.toml
└── operations
    └── __init__.py
kcn3388 commented 1 year ago

@Lanly109 你fetch一下新的commit,我对这个是做了保护的,避免没有更新子模块的时候发生ModuleNotFoundError meme_optional/__init.py, line 5-6

if os.path.exists(os.path.join(os.path.dirname(__file__), "meme_3rd_optional")):
    from .meme_3rd_optional import *

理论上没有检测到这个git的子模块的话是不会import的 你试试在git clone以后执行下面两个:

git submodule init
git submodule update

如果还是报错的话,上面的__init__.py的那两行代码改成这样:

try:
    from .meme_3rd_optional import *
except ModuleNotFoundError:
    pass

或者直接改成这样:

if os.path.exists(os.path.join(os.path.dirname(__file__), "meme_3rd_optional")):
    try:
        from .meme_3rd_optional import *
    except ModuleNotFoundError:
        pass

请反馈一下两份代码哪份可行,谢谢~

Lanly109 commented 1 year ago

你fetch一下新的commit,我对这个是做了保护的,避免没有更新子模块的时候发生ModuleNotFoundError meme_optional/__init.py, line 5-6

但问题是你看我上面的meme_optional的目录下,meme_3rd_optional里是有内容的,我是在本地执行过

git submodule init
git submodule update

然后把所有文件拷贝到服务器上。

上述的两份代码我都试了下,报错信息都是一样的。

看报错信息感觉是meme的逻辑与所想的有些出入。

以下是我的插件的版本。

meme-generator                    0.0.11
nonebot-plugin-memes              0.4.6
kcn3388 commented 1 year ago

你fetch一下新的commit,我对这个是做了保护的,避免没有更新子模块的时候发生ModuleNotFoundError meme_optional/__init.py, line 5-6

但问题是你看我上面的meme_optional的目录下,meme_3rd_optional里是有内容的,我是在本地执行过

git submodule init
git submodule update

然后把所有文件拷贝到服务器上。

上述的两份代码我都试了下,报错信息都是一样的。

看报错信息感觉是meme的逻辑与所想的有些出入。

以下是我的插件的版本。

meme-generator                    0.0.11
nonebot-plugin-memes              0.4.6

很神必,我这边双平台都没有报错 直接删除子模块吧,有需要再自行添加 而且看了一下这个库,有些表情挺吓人的()

还有一种可能是Python版本的问题,新版本的Python弃用了很多旧版本的兼容性特性,我机器人这边用的venv是跟随hoshino要求用的3.8

Lanly109 commented 1 year ago

我的Python是3.8.6的,感觉是meme版本的问题。 不过目前也没什么问题,感谢您的pr!