DevPlugin - OsuSync/Sync GitHub Wiki

简介

插件是主程序调度的单元,插件是直接被程序初始化的类,插件通过放置在程序的 Plugins\ 文件夹下被程序所示别并加载进当前程序实例的Assemblies中。

插件通过继承Plugin类实现,程序会根据类签名对在Plugins文件夹中的所有dll文件进行加载,但是只会对继承了Plugin类的类进行初始化。


成员

Plugin类成员及其成员函数

类别 成员名称 类型 说明
public readonly Name String 插件名称
public readonly Author String 插件作者
public EventBus BaseEventDispatcher<IPluginEvent> 插件的事件绑定、触发器
标识 函数签名 返回类型 说明
public Plugin(string Name, string Author) .ctor() 构造函数
protected getHoster() SyncHost 获得当前程序实例的SyncHost类
public getName() string 获得插件名称(旧代码兼容)
public getAuthor() string 获得插件作者(旧代码兼容)
public virtual OnDisable() void 当插件需要执行禁用操作时,被调用的函数
public virtual OnEnable() void 当插件被程序识别并进行初始化时所调用的函数

EventBus事件

· InitPluginEvent

当插件初始化完成之后,全局已加载插件 将会触发此事件(未加载的插件不会触发和响应这个事件)。

成员 说明
Plugin 正在准备初始化的插件

· InitSourceEvent

当程序准备Source(弹幕源)列表时,将SourceManager暴露给事件接收者,接收者可在此添加Source的实例。

成员 说明
Sources 直播源列表及实例

· InitFilterEvent

当程序准备消息Filter时,将FilterManager暴露给事件接收者,接收者可在此添加Filter的实例。

成员 说明
Filters Filter列表及实例

· InitCommandEvent

当程序准备命令列表时,将CommandManager暴露给事件接收者,接收者可在此为程序添加一系列命令。

成员 说明
Commands 命令实例及列表

· InitClientEvent

当程序准备游戏源实例时,将ClientManager暴露给时间接收者,接收者可在此添加游戏源的实例。

成员 说明
Clients 游戏源实例列表

· InitClientWarpperEvent

当程序决策好当前游戏源实例时(游戏源实例是可以切换的,切换也会触发此事件),触发此事件。

成员 说明
ClientWorkWrapper 游戏源的外覆类

· LoadCompleteEvent

当程序基本的加载完成时,触发此事件

成员 说明
Host 管理程序的初始化类

· ProgramReadyEvent

当程序全部加载完成、并等待用户开始同步命令时触发的函数


杂项

· 插件依赖

当插件出现依赖问题时,就需要使用插件的Attribute进行解决以来,典型问题是插件A 依赖插件B,但是程序的调度是根据文件名的先后顺序来决定加载次序的。如果插件A先于插件B加载,则插件A会丢失或无法访问插件B的实例或者是相关资源。此时需要在插件A的实现上添加一个Attribute,让程序在插件B加载之后再进行插件A的加载操作。

依赖被分为两种情况,硬依赖和软依赖。

硬依赖用于 在加载插件之前,必须将依赖的插件初始化,否则报错 的情况,也就是必须安装了目标插件,才能继续加载。

软依赖用于 声明式的让程序先加载目标插件,如果目标插件不存在,则继续加载。 在安装了目标插件的情况下,程序会先调用目标插件进行加载操作,如果没有安装目标插件,程序则会按正常顺序加载插件。

    [SyncRequirePlugin(typeof(DefaultPlugin.DefaultPlugin))]
    //DefaultPlugin这个插件进行硬依赖,必须有这个插件!
    public class DefaultGUI : Plugin 
    {
        //Implements....
    }

    [SyncSoftRequirePlugin("DefaultPlugin")]
    //对DefaultPlugin这个插件进行软依赖,没有DefaultPlugin这个插件也行!
    public class PPQuery : Plugin
    {
        //Implements...
    }

· 加载顺序

程序的加载次序如下

弹幕源 -> 选择弹幕源 -> 游戏源 -> 选择游戏源 -> 插件命令 -> Filter(消息过滤器)

在如下情况,程序会直接停止工作

  • 无法选择合适的弹幕源
  • 无法选择合适的游戏源
  • 任一插件在处理加载事件时抛出任何错误