hundun000 / mirai-fleet-framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

本框架用于尝试一种Plugin内部的分层结构,以获得代码复用等优势。不一定适合刚接触mirai插件开发的人,因为本框架引入了若干新的概念,同时也要求开发者对mirai-console原有的开发所需概念有足够了解。

使用本框架的插件项目:

分层关系

Plugin间复用的对象是Function,即使用对方项目的Share-Function,而不是将对方Plugin作为前置插件。

虽然MusicProject和ImageProject具有打出MusicPlugin和ImagePlugin的能力,但是这些plugin一般只用来验证Share-Function。MusicProject和ImageProject主要目的是提供Share-Function给AmiyaProject和PrinzeugenProject。

flowchart LR
  classDef pluginColor fill:#096,stroke:#333,stroke-width:3px;
  classDef botLogicColor fill:#f96,stroke:#333,stroke-width:4px;
  classDef functionColor fill:#9f6,stroke:#333,stroke-width:2px;

  subgraph MusicProject ["Music插件项目"]
    subgraph MusicPluginPackageA ["Plugin包A: 可打包出一个Plugin"]
      MusicPluginA:::pluginColor
      MusicBotLogicA("MusicBotLogicA: 对应指令语法A"):::botLogicColor

      MusicPluginA --> |持有| MusicBotLogicA
    end
    subgraph MusicPluginPackageB ["Plugin包B: 可打包出一个Plugin"]
      MusicPluginB:::pluginColor
      MusicBotLogicB("MusicBotLogicB: 对应指令语法B"):::botLogicColor

      MusicPluginB --> |持有| MusicBotLogicB
    end
    subgraph MusicFunctionPackage ["Share-Function包: 提供数个音乐Function"]
      MusicFunction("音乐功能"):::functionColor
      Mider("Mider项目: midi生成工具")
      MusicFunction --> |依赖| Mider
    end
  end
  MusicProject --> |依赖| BaseClass
  MusicBotLogicA --> |持有| MusicFunction
  MusicBotLogicB --> |持有| MusicFunction

  subgraph ImageProject ["Image插件项目"]
    subgraph ImagePluginPackage ["Plugin包: 可打包出一个Plugin"]
      ImagePlugin:::pluginColor
      ImageBotLogic:::botLogicColor

      ImagePlugin --> |持有| ImageBotLogic
    end
    subgraph ImageFunctionPackage ["Share-Function包: 提供数个图片合成Function"]
      ImageFunction("图片合成功能"):::functionColor
      Petpet("Petpet项目: 图片生成工具")
      ImageFunction --> |依赖| Petpet
    end
  end
  ImageProject --> |依赖| BaseClass
  ImageBotLogic --> |持有| ImageFunction

  subgraph AmiyaProject ["Amiya插件项目"]
    subgraph AmiyaFunctionPackage ["Function包: 提供数个阿米娅特有Function"]
      AmiyaChatFunction("阿米娅聊天功能"):::functionColor
    end
    subgraph AmiyaPluginPackage ["Plugin包: 可打包出一个Plugin"]
      AmiyaPlugin:::pluginColor
      AmiyaBotLogic:::botLogicColor

      AmiyaPlugin --> |持有| AmiyaBotLogic
    end
  end
  AmiyaProject --> |依赖| BaseClass
  AmiyaBotLogic --> |持有| WeiboFunction
  AmiyaBotLogic --> |持有| AmiyaChatFunction
  AmiyaBotLogic --> |持有| MusicFunction
  AmiyaBotLogic --> |持有| ImageFunction

  subgraph frameworkCore ["framework核心包: 提供基类和工具类"]
    BaseClass("基类")
    FileRepository("config和data工具")
    FileHelper("缓存文件读写工具")
    CosPermission("总权限(cos-perm)检查工具")
  end
  FileRepository --> |使用| ConsolefileApi
  FileHelper --> |使用| ConsolefileApi
  BaseClass --> |依赖| ConsoleBaseClass
  CosPermission --> |使用| ConsolePermManager
  BaseClass("基类") --> |调用| CosPermission

  subgraph starterSubProject ["starterFunction包: 提供数个样例Function"]
    WeiboFunction("微博功能"):::functionColor
    RemindFunction("报时功能"):::functionColor
  end
  starterSubProject --> |依赖| BaseClass
  WeiboFunction --> |读config| FileRepository
  WeiboFunction --> |写图片缓存| FileHelper

  subgraph exampleSubProject ["examplePlugin包: 可打包出一个Plugin"]
    ExamplePlugin:::pluginColor
    ExampleBotLogic:::botLogicColor

    ExamplePlugin --> |持有| ExampleBotLogic
  end
  exampleSubProject --> |依赖| BaseClass
  ExampleBotLogic --> |持有| WeiboFunction
  ExampleBotLogic --> |持有| RemindFunction


  ConsolePluginManager("miraiConsole.PluginManager")
  ConsolePluginManager --> |加载| AmiyaPlugin
  ConsolePluginManager --> |加载| ExamplePlugin
  ConsolePluginManager --> |加载| MusicPluginA
  ConsolePluginManager --> |加载| MusicPluginB
  ConsolePluginManager --> |加载| ImagePlugin

  subgraph miraiGroup1 ["miraiConsoleApi"]
    ConsolefileApi("miraiConsole.fileApi")
    ConsoleBaseClass("miraiConsole.BaseClass: Command,EventHandler,JvmPlugin...")
    ConsolePermManager("miraiConsole.PermissionManager")
  end

BotLogic

Plugin持有一个对应的BotLogic。保持Plugin只处理和mirai对接工作,需满足继承JvmPlugin等约束。本框架的Function层只接触BotLogic。

BotLogic负责的具体的逻辑包括:

  • 定义本Plugin对应的唯一CharacterName和CharacterCosPermission。即使用本框架的Plugin的推荐设计思路是:一个Plugin对应某个Character的角色扮演功能集合。(类似市场上智能助手app的拟人化)
  • 持有若干Function, (onEnable时)将它们初始化(with CharacterName),并注册为Command/ListenHost。

Function

负责一类业务功能,由若干子功能组成。子功能的被调用形式有:

  • 子功能被调用于一个被@SubCommand注解的方法,且包在一个CompositeCommand里(见CompositeCommandFunctionComponent),等待被注册。
  • 子功能被调用于一个被@EventHandler注解的方法,等待被注册。
  • 子功能被调用于一个Timer,等待被启用。

实际使用时,还有如下技巧:

  • 同一个子功能的被调用形式可以不止一种,也就是说可以既写一个被@SubCommand注解的方法调用该子功能,又写一个@EventHandler注解的方法调用该子功能。需求来源
  • 在Function外自定义一个CompositeCommand(见AllCompositeCommandProxy),然后通过点运算调用的方式,调用子功能。需求来源

对于开发者,Function即是实现了跨插件复用业务功能。同时,也允许具体Plugin自定义实际注册Command时的指令语法(见AllCompositeCommandProxy)。

发展历史

来自ZacaFleetBot项目的拆分方案。故框架的大部分来自原项目。

  • 原本数个Character共享ZacaFleetBot的core包,拆分后是数个插件项目依赖本项目的core包。
  • 试着采用社区建议,不再依赖Spring和MongoDB。

About


Languages

Language:Java 100.0%