diff --git a/dll/FunGame.Core.dll b/dll/FunGame.Core.dll
new file mode 100644
index 0000000..d656324
Binary files /dev/null and b/dll/FunGame.Core.dll differ
diff --git a/dll/FunGame.Core.xml b/dll/FunGame.Core.xml
new file mode 100644
index 0000000..e1d0e17
--- /dev/null
+++ b/dll/FunGame.Core.xml
@@ -0,0 +1,2846 @@
+
+
+
+ FunGame.Core
+
+
+
+
+ 需要配合Milimoe.FunGame.Core.Library.Constant.DataRequestType使用
+ 确保已添加对应的枚举
+
+
+
+
+ 数据请求结果
+
+
+
+
+ 详细错误信息
+
+
+
+
+ 私有的实现类
+
+
+
+
+ 基于本地已连接的Socket创建新的数据请求
+ 使用RunTimeModel中的NewDataRequest创建一个新的请求
+
+
+
+
+
+
+
+ 添加数据
+
+
+
+
+
+
+ 长时间运行的数据请求需要在使用完毕后自行关闭
+
+
+
+
+ 向服务器发送数据请求
+
+
+
+
+
+ 异步向服务器发送数据请求
+
+
+
+
+
+ 获取指定key对应的反序列化对象
+
+
+
+
+
+
+
+ 反序列化Hashtable中的Json对象
+
+
+
+
+
+
+
+
+ 邮件服务内部ID
+
+
+
+
+ Smtp客户端信息
+
+
+
+
+ 上一个邮件发送的结果
+
+
+
+
+ 上一个邮件的发送错误信息(如果发送失败)
+
+
+
+ 内部变量
+
+
+
+ 创建邮件服务
+
+
+
+
+
+
+
+
+
+
+ 创建完整邮件对象
+
+
+
+
+
+
+
+
+
+
+
+
+ 发送邮件
+
+
+
+
+
+
+ 关闭邮件服务
+
+
+
+
+ 关闭邮件服务
+
+
+
+
+
+ 需要在Server中继承此类实现
+
+
+
+
+ 执行一个命令
+
+ 影响的行数
+
+
+
+ 执行一个指定的命令
+
+ 命令
+ 影响的行数
+
+
+
+ 查询DataSet
+
+ 结果集
+
+
+
+ 执行指定的命令查询DataSet
+
+ 命令
+ 结果集
+
+
+
+ 执行指定的命令查询DataRow(可选实现)
+
+ 结果行
+
+
+
+ 执行指定的命令查询DataRow(可选实现)
+
+ 命令
+ 结果行
+
+
+
+ 关闭连接
+
+
+
+
+ 创建一个SQL事务
+
+
+
+
+ 提交事务
+
+
+
+
+ 回滚事务
+
+
+
+
+ 获取角色实例
+
+
+
+
+
+ 获取库存实例
+
+
+
+
+
+ 获取物品实例,默认返回Passiveitem 被动物品 需要强制转换
+
+ Item类型 主动 或 被动
+
+
+
+
+ 获取主动物品实例
+
+
+
+
+
+ 获取被动物品实例
+
+
+
+
+
+ 获取房间实例
+
+ 房间内部序列号
+ 房间号
+ 创建时间
+ 房主
+ 房间类型
+ 游戏模组
+
+ 房间状态
+
+ 房间密码
+
+
+
+
+ 通过DataSet获取房间实例
+
+
+
+
+
+
+
+ 通过DataSet获取房间列表
+
+
+
+
+
+
+
+ 获取大厅(-1号房)
+
+
+
+
+
+ 获取技能实例,默认返回PassiveSkill 被动技能 需要强制转换
+
+ Skill类型 主动 或 被动
+
+
+
+
+ 获取主动技能实例
+
+
+
+
+
+ 获取被动技能实例
+
+
+
+
+
+ 获取用户实例
+
+
+
+
+
+ 获取用户实例
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获取用户实例
+
+
+
+
+
+
+ 获取用户实例
+
+
+
+
+
+
+ 适用于客户端的模组集
+
+
+
+
+ 适用于服务器的模组集
+
+
+
+
+ 游戏地图集
+
+
+
+
+ 角色表
+
+
+
+
+ 技能表
+
+
+
+
+ 物品表
+
+
+
+
+ 传入 类型来创建指定端的模组读取器
+ runtime = 时,仅读取
+ runtime = 时,仅读取
+ 都会读取
+
+ 传入 类型来创建指定端的模组读取器
+ 用于构建
+ 其他需要传入给插件初始化的对象
+
+
+
+
+ 获取对应名称的模组实例
+ 如果需要取得服务器模组的实例,请调用
+
+
+
+
+
+
+ 获取对应名称的服务器模组实例
+
+
+
+
+
+
+ 获取对应名称的游戏地图
+
+
+
+
+
+
+ 网络服务工具箱
+
+
+
+
+ 判断字符串是否是IP地址
+
+
+
+
+
+
+ 判断字符串是否为邮箱地址
+
+
+
+
+
+
+ 判断字符串是否是正常的用户名(只有中英文和数字)
+
+
+
+
+
+
+ 获取用户名长度
+
+
+
+
+
+
+ 判断字符串是否是一个FunGame可接受的服务器地址
+ 此方法可以解析域名
+
+
+
+
+ 返回地址验证结果,同时输出服务器地址和端口号
+
+
+
+ 判断参数是否是一个FunGame可接受的服务器地址
+
+
+
+
+
+
+
+ 获取服务器的延迟
+
+ 服务器IP地址
+
+
+
+
+ 解析域名为IP地址
+
+
+
+
+
+
+
+ 返回目标对象的Json字符串
+
+
+
+
+
+
+
+ 返回目标对象的Json字符串 可指定反序列化选项
+
+
+
+
+
+
+
+
+ 反序列化Json对象
+
+
+
+
+
+
+
+ 反序列化Json对象 可指定反序列化选项
+
+
+
+
+
+
+
+
+ 反序列化Hashtable中的Json对象
+
+
+
+
+
+
+
+
+ 反序列化IEnumerable中的Json对象
+
+
+
+
+
+
+
+
+ 反序列化IEnumerable中的Json对象 可指定反序列化选项
+
+
+
+
+
+
+
+
+
+ 反序列化Hashtable中的Json对象 可指定反序列化选项
+
+
+
+
+
+
+
+
+
+ 时间服务工具箱
+
+
+
+
+ 获取系统时间
+
+ 格式化类型
+
+
+
+
+ 通过字符串转换为DateTime对象
+
+ 时间字符串
+ 转换失败返回当前时间
+
+
+
+ 获取系统时间并转为字符串
+
+ 格式化类型
+
+
+
+
+ 获取系统时间并转为字符串
+
+ 格式化字符串
+
+
+
+
+ 获取系统短时间
+
+ 时:分:秒
+
+
+
+ 获取系统日期
+
+
+
+
+
+ 使用HMACSHA512算法加密
+
+
+
+
+ 使用HMACSHA512算法加密
+
+ 需要加密的值
+ 秘钥
+
+
+
+
+ 使用RSA算法加密
+
+ 明文
+ 公钥
+
+
+
+
+ 使用RSA算法解密
+
+ 密文
+ 私钥
+
+
+
+
+ 使用HMACSHA512算法加密
+
+ 需要加密的值
+ 秘钥
+
+
+
+
+ 生成验证码
+
+ 类型
+ 长度
+
+
+
+
+ 数字验证码
+
+
+
+
+
+
+ 字母验证码
+
+
+
+
+
+
+ 混合验证码
+
+
+
+
+
+
+ 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
+
+
+
+
+
+ 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
+
+
+
+
+
+ 开启一个计时器任务
+
+
+
+
+
+
+ See: , ,
+
+
+
+
+ 获取FunGame.Implement.dll中接口的实现方法
+
+ 程序集
+ 接口代号
+
+
+
+
+ 获取接口实现类类名
+
+ 接口类型
+
+
+
+
+ 获取接口方法名(支持属性)
+
+ 方法
+
+
+
+
+ 公开方法:获取FunGame.Implement.DLL中指定方法(属性)的返回值
+
+ 接口代号
+ 方法代号(支持属性)
+ 是否是方法(如是属性请传入false)
+
+
+
+
+ 创建一个Json工具类
+ 此工具类拥有单独的序列化选项,支持添加自定义转换器
+ 继承自
+
+
+
+
+ 序列化选项
+ 已经默认添加了下列转换器:
+ , ,
+
+
+
+
+ 注册一个自定义转换器,支持
+
+
+
+
+
+ 注册多个自定义转换器,支持
+
+
+
+
+
+ 获取Json字符串
+
+
+
+
+
+
+
+ 反序列化Json对象
+
+
+
+
+
+
+
+ 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别
+
+
+
+
+
+
+ 反序列化Hashtable中Key对应的Json对象
+
+
+
+
+
+
+
+
+ 反序列化IEnumerable中的Json对象 可指定反序列化选项
+
+
+
+
+
+
+
+
+ 反序列化多个Json对象
+ 注意必须是相同的Json对象才可以使用此方法解析
+
+
+
+
+
+
+
+ Private JsonSerializerOptions
+
+
+
+
+ 简易的插件配置文件生成器
+ 仅支持部分基本类型(, , , )及其数组(List<long>, List<decimal>, List<string>, List<bool>和long[], decimal[], string[], bool[])
+ 文件会保存为:程序目录/configs//.json
+
+
+ 新建一个配置文件,文件会保存为:程序目录/configs//.json
+
+
+
+
+
+
+ 简易的插件配置文件生成器
+ 仅支持部分基本类型(, , , )及其数组(List<long>, List<decimal>, List<string>, List<bool>和long[], decimal[], string[], bool[])
+ 文件会保存为:程序目录/configs//.json
+
+
+ 新建一个配置文件,文件会保存为:程序目录/configs//.json
+
+
+
+
+
+
+ 插件的名称
+
+
+
+
+ 配置文件的名称(后缀将是.json)
+
+
+
+
+ 使用索引器给指定key赋值,不存在key会新增
+
+
+
+
+
+
+ 如果保存了对象,请使用此方法转换
+
+
+
+
+
+
+ 获取指定key的value
+
+
+
+
+
+
+ 使用泛型获取指定key的value
+
+
+
+
+
+
+
+ 添加一个配置,如果已存在key会覆盖
+
+
+
+
+
+
+ 从配置文件中读取配置。
+ 注意:所有保存时为数组的对象都会变成对象,并且不支持类型
+
+
+
+
+ 将配置保存到配置文件。调用此方法会覆盖原有的.json,请注意备份
+
+
+
+
+ Json反序列化的方法
+
+
+
+
+
+
+ Json数组反序列化的方法。不支持数组。
+
+
+
+
+
+
+ 已读取的插件列表
+ key 是
+
+
+
+
+ 构建一个插件读取器并读取插件
+
+ 用于构建
+ 其他需要传入给插件初始化的对象
+
+
+
+
+ 单例表:表中的对象以类名作为Key保存,并以Key获取该对象,Key具有唯一约束
+ 用于储存单例对象使用
+
+
+
+
+ 查询目标的类是否已经有实例
+
+ 单例对象
+
+
+
+
+ 将目标和目标的类添加至单例表
+
+ 单例对象
+
+ 添加单例到单例表时遇到错误
+
+
+
+ 将目标和目标的类从单例表中移除
+
+ 单例对象
+
+
+
+
+ 获取单例对象
+
+ 目标类
+
+ 不能从单例表中获取到指定的单例
+
+
+
+ 获取单例对象
+
+ 目标类
+
+ 不能从单例表中获取到指定的单例
+
+
+
+ 默认的配置文件名称
+
+
+
+
+ 写入ini文件
+
+ Section
+ 键
+ 值
+ 文件名,缺省为FunGame.ini
+
+
+
+ 读取ini文件
+
+ Section
+ 键
+ 文件名,缺省为FunGame.ini
+ 读取到的值
+
+
+
+ 查询ini文件是否存在
+
+ 文件名,缺省为FunGame.ini
+ 是否存在
+
+
+
+ 初始化ini模板文件
+
+
+
+
+ 读取TXT文件内容
+
+ 文件名
+ 相对路径
+ 内容
+
+
+
+ 写入TXT文件内容(如不存在文件会创建,反之新起一行追加)
+
+
+ 文件名
+ 相对路径
+ 内容
+
+
+
+ 追加错误日志 默认写入logs文件夹下的当日日期.log文件
+
+
+
+
+
+ Aka. 2FA 双重认证 双因素身份验证
+
+
+
+
+ SQLHelper 允许为空
+
+
+
+
+ 不使用SQL模式
+
+
+
+
+ 使用SQL模式 记录对应账号的密文到数据库中
+
+
+
+
+
+ 检查账号是否需要2FA
+
+
+
+
+
+
+ 2FA验证
+
+
+
+
+
+
+
+ 每30秒刷新
+
+
+
+
+ 6位数字2FA验证码
+
+
+
+
+ ----- PUBLIC KEY -----
+
+
+
+
+ ----- SECRET SIGN -----
+
+
+
+
+ 创键私钥,用于绑定账号,并生成两个文件,需要用户保存
+
+
+
+
+ 生成随机秘钥字符串
+
+
+
+
+
+
+ 生成基于当前时间戳的6位数字2FA验证码
+
+
+
+
+
+
+ 获取当前时间节点
+
+
+
+
+
+ 生成验证码
+
+
+
+
+
+
+
+ 拆分字符串中的密文和私钥
+
+
+
+
+
+
+
+ 输出系统消息
+
+
+
+
+ 输出错误消息
+
+
+
+
+ 基于本地已连接的Socket创建新的数据请求
+
+
+
+
+ 基于本地已连接的Socket创建长时间运行的数据请求
+
+
+
+
+ 输出系统消息
+
+
+
+
+
+
+ 输出错误消息
+
+
+
+
+
+
+ 基于本地已连接的Socket创建新的数据请求
+ 请勿在 中调用此方法
+
+
+
+
+
+
+ 基于本地已连接的Socket创建长时间运行的数据请求
+ 请勿在 中调用此方法
+
+
+
+
+
+
+ 新建一个AddonController
+
+
+
+
+
+
+ 此类实现服务器连接、断开连接、心跳检测、创建数据请求等功能
+ -- 需要继承并实现部分方法 --
+
+
+
+
+ 与服务器的连接套接字实例
+
+
+
+
+ 套接字是否已经连接
+
+
+
+
+ 接收服务器信息的线程
+
+
+
+
+ 用于类内赋值
+
+
+
+
+ 是否正在接收服务器信息
+
+
+
+
+ 断开服务器连接
+
+
+
+
+
+ 发送结束游戏反馈
+
+
+
+
+
+ 连接服务器
+
+
+
+
+
+
+
+ 获取服务器地址
+
+ string:IP地址;int:端口号
+
+
+
+
+ 此方法将在连接服务器前触发
+ 客户端可以重写此方法
+
+ 服务器IP
+ 服务器端口
+ 重写时可以提供额外的连接参数
+ false:中止连接
+
+
+
+ 此方法将在连接服务器后触发(Connect结果返回前)
+ 客户端可以重写此方法
+
+ 连接服务器后返回的一些数据,可以使用也可以修改它们
+
+
+
+
+ 客户端需要自行实现自动登录的事务
+
+
+
+
+ 关闭所有连接
+
+
+
+
+
+ 输出消息
+
+
+
+
+
+ 自定处理异常的方法
+ -- 一般放在catch中 --
+
+
+
+
+
+ 基于本地已连接的Socket创建新的数据请求
+
+
+
+
+
+
+
+ 基于本地已连接的Socket创建长时间运行的数据请求
+
+
+
+
+
+
+
+ 开始接收服务器信息
+
+
+
+
+ 获取服务器已发送的信息为SocketObject数组
+
+
+
+
+
+ 具体接收服务器信息以及处理信息的方法
+
+
+
+
+
+ 客户端接收服务器断开连接的通知
+
+
+
+
+
+ 客户端接收并处理服务器系统消息
+
+
+
+
+
+ 客户端接收并处理服务器心跳
+
+
+
+
+
+ 客户端接收强制退出登录的通知
+
+
+
+
+
+ 客户端接收并处理聊天信息
+
+
+
+
+
+ 客户端接收并处理更换房主信息
+
+
+
+
+
+ 客户端接收并处理匹配房间成功信息
+
+
+
+
+
+ 客户端接收并处理开始游戏信息
+
+
+
+
+
+ 客户端接收并处理游戏结束信息
+
+
+
+
+
+ 客户端接收并处理局内消息
+
+
+
+
+
+ 继承 AsyncAwaiter 用法:
+ 1、调用Socket.Send()前,请设置为等待状态:SetWorking();
+ 2、调用Socket.Send() == Success后,请等待任务完成:WaitForWorkDone();
+ 3、在其他任何地方修改Working状态,均会使任务终止。
+
+
+
+
+ 接收到的SocketObject实例
+
+
+
+
+ Socket
+
+
+
+
+ 继承请调用base构造
+
+ Socket
+
+
+
+ 继承请重写此方法
+
+ SocketObject
+
+
+
+ 判断是否已经Disposed
+
+
+
+
+ 公开的Dispose方法
+
+
+
+
+ 关闭时
+
+
+
+
+
+ 关闭事件
+
+
+
+
+ Controller关闭时事件
+ 不建议new Dispose()方法,建议使用事件
+ 事件会在base.Dispose()执行前触发
+
+
+
+
+ 触发关闭事件
+
+
+
+
+ 记录 的生涯、赛季统计数据
+ Key为赛季(long),每个key代表第key赛季,key = 0时为生涯数据。
+
+
+
+
+ 服务器实例是否在运行
+
+
+
+
+ 客户端的套接字实例
+
+
+
+
+ 客户端的用户实例,在用户登录后有效
+
+
+
+
+ 客户端的名称,默认是客户端的IP地址
+
+
+
+
+ 客户端是否启动了开发者模式
+
+
+
+
+ 向客户端发送消息
+
+
+
+
+
+
+
+
+ 向客户端发送系统消息
+
+
+
+
+
+
+
+
+
+ 获取客户端的名称,通常未登录时显示为客户端的IP地址,登录后显示为账号名
+
+
+
+
+
+ 开始接收客户端消息
+ 请勿在 中调用此方法
+
+
+
+
+
+
+ 启动对客户端的监听
+ 请勿在 中调用此方法
+
+
+
+
+ 窗体继承这些接口便能实现事件,或为插件预留。
+
+
+
+
+ 局内事件的接口,与 配套使用
+
+
+
+
+ 这是最基本的接口,要求客户端实现
+
+
+
+
+ 服务器需要实现此接口
+
+
+
+
+ 模组名称
+
+
+
+
+ 模组描述
+
+
+
+
+ 模组版本
+
+
+
+
+ 模组作者
+
+
+
+
+ 此模组中包含的角色
+
+
+
+
+ 加载标记
+
+
+
+
+ 加载模组
+
+
+
+
+ 模组加载后需要做的事
+
+
+
+
+ 允许返回false来阻止加载此模组
+
+
+
+
+
+ 必须继承基类:
+ 继承事件接口并实现其方法来使插件生效。例如继承:
+
+
+
+
+ 地图名称
+
+
+
+
+ 地图描述
+
+
+
+
+ 地图版本
+
+
+
+
+ 地图作者
+
+
+
+
+ 宽度
+
+
+
+
+ 高度
+
+
+
+
+ 格子大小
+
+
+
+
+ 加载标记
+
+
+
+
+ 加载地图
+
+
+
+
+
+
+ 加载后需要做的事
+
+
+
+
+ 允许返回false来阻止加载此地图
+
+
+
+
+
+ 模组名称
+
+
+
+
+ 模组描述
+
+
+
+
+ 模组版本
+
+
+
+
+ 模组作者
+
+
+
+
+ 默认地图
+
+
+
+
+ 模组所使用的地图
+
+
+
+
+ 适用的房间模式
+
+
+
+
+ 包含了一些常用方法的控制器
+
+
+
+
+ 控制器内部变量
+
+
+
+
+ 如模组有界面,请重写此方法
+ 此方法会在StartGame时调用
+
+
+
+
+
+
+ 加载标记
+
+
+
+
+ 加载模组
+
+
+
+
+ 模组加载后需要做的事
+
+
+
+
+ 允许返回false来阻止加载此模组
+
+
+
+
+
+ 传递委托以便让模组调用
+
+
+
+
+ Session对象
+
+
+
+
+ Config对象
+
+
+
+
+ 绑定事件。在后触发
+
+
+
+
+ 模组名称
+
+
+
+
+ 模组描述
+
+
+
+
+ 模组版本
+
+
+
+
+ 模组作者
+
+
+
+
+ 默认地图
+
+
+
+
+ 模组所使用的地图
+
+
+
+
+ 包含了一些常用方法的控制器
+
+
+
+
+ 控制器内部变量
+
+
+
+
+ 启动服务器监听 请在此处实现服务器逻辑
+
+
+
+
+
+
+
+
+
+
+
+ 接收并处理GamingMessage
+
+ 发送此消息的账号
+ 消息类型
+ 消息参数
+ 底层会将哈希表中的数据发送给客户端
+
+
+
+ 加载标记
+
+
+
+
+ 加载模组
+
+
+
+
+ 模组加载后需要做的事
+
+
+
+
+ 允许返回false来阻止加载此模组
+
+
+
+
+
+ 模组名称
+
+
+
+
+ 模组描述
+
+
+
+
+ 模组版本
+
+
+
+
+ 模组作者
+
+
+
+
+ 此模组中包含的物品
+
+
+
+
+ 加载标记
+
+
+
+
+ 加载模组
+
+
+
+
+ 模组加载后需要做的事
+
+
+
+
+ 允许返回false来阻止加载此模组
+
+
+
+
+
+ 插件名称
+
+
+
+
+ 插件描述
+
+
+
+
+ 插件版本
+
+
+
+
+ 插件作者
+
+
+
+
+ 包含了一些常用方法的控制器
+
+
+
+
+ 控制器内部变量
+
+
+
+
+ 加载标记
+
+
+
+
+ 加载插件
+
+
+
+
+ 插件加载后需要做的事
+
+
+
+
+ 允许返回false来阻止加载此插件
+
+
+
+
+
+ 传递委托以便让插件调用
+
+
+
+
+ Session对象
+
+
+
+
+ Config对象
+
+
+
+
+ 绑定事件。在后触发
+
+
+
+
+ 模组名称
+
+
+
+
+ 模组描述
+
+
+
+
+ 模组版本
+
+
+
+
+ 模组作者
+
+
+
+
+ 此模组中包含的技能
+
+
+
+
+ 加载标记
+
+
+
+
+ 加载模组
+
+
+
+
+ 模组加载后需要做的事
+
+
+
+
+ 允许返回false来阻止加载此模组
+
+
+
+
+
+ 继承这个类可以获得异步等待的功能
+ 参考实现
+
+
+
+
+ 接收到的实例
+
+
+
+
+ 是否处于等待的状态
+
+
+
+
+ 异步操作前,请设置为等待状态
+
+
+
+
+ 等待任务完成(需要自己异步)
+
+
+
+
+ 异步等待任务完成
+
+
+
+
+ 任务的等待器,可以设置在任务完成后需要的操作
+
+
+
+
+ 任务是否完成
+
+
+
+
+ 捕获到的异常
+
+
+
+
+ 内部实现类
+ 实现参见
+
+
+
+
+ 构造一个等待器
+
+
+
+
+
+ 返回TaskAwaiter可以连续的调用方法
+ 但是意义不大,前一个OnCompleted方法并不会等待下一个方法
+ 可以理解为并行广播
+
+
+
+
+
+
+ 在捕获到异常时,将触发Error事件
+
+
+
+
+
+
+ 发件人邮箱
+
+
+
+
+ 发件人名称
+
+
+
+
+ 邮件主题
+
+
+
+
+ 邮件内容
+
+
+
+
+ 邮件优先级
+
+
+
+
+ 内容是否支持HTML
+
+
+
+
+ 收件人列表
+
+
+
+
+ 抄送列表
+
+
+
+
+ 密送列表
+
+
+
+
+ 使用MailSender工具类创建邮件对象
+
+
+
+
+
+ 使用地址和名称创建邮件对象
+
+
+
+
+
+
+ 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人
+
+
+
+
+
+
+
+
+ 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人、单个抄送
+
+
+
+
+
+
+
+
+
+ 完整的创建邮件对象
+
+
+
+
+
+
+
+
+
+
+
+
+ 发送邮件
+ -- 适合创建一次性邮件并发送 --
+
+
+
+
+
+
+ 添加收件人
+
+
+
+
+
+ 添加多个收件人
+
+
+
+
+
+ 添加抄送
+
+
+
+
+
+ 添加多个抄送
+
+
+
+
+
+ 添加密送
+
+
+
+
+
+ 添加多个密送
+
+
+
+
+
+ 从参数列表中获取指定类型和索引的参数
+
+ 类型
+ 索引
+ 类型的参数
+ 索引超过数组上限
+
+
+
+ 配合 使用,也别忘了修改
+
+
+
+
+ 需要同步更新
+
+
+
+
+ 将通信类型的枚举转换为字符串
+
+ 通信类型
+ 等效字符串
+
+
+
+ 需要同步更新
+
+
+
+ RunTime
+
+
+ Main
+
+
+ Register
+
+
+ Login
+
+
+ Room
+
+
+ Gaming
+
+
+
+ 获取Type的等效字符串
+
+
+
+
+
+
+ 获取Type的等效字符串
+
+
+
+
+
+
+ 获取Type的等效字符串
+
+
+
+
+
+
+ 获取字符串对应的枚举
+
+
+
+
+
+
+ 添加-debug启动项将开启DebugMode(仅适用于Desktop或Console)
+ 目前支持禁用心跳检测功能
+
+
+
+
+ 此类保存常用的对象常量
+
+
+
+
+ 空的实体类 用于object返回
+
+
+
+
+ 默认的未知用户
+
+
+
+
+ 游客用户
+
+
+
+
+ 本地用户
+
+
+
+
+ 大厅(空房间)实例
+
+
+
+
+ 默认的字符编码
+
+
+
+
+ 默认的时间格式
+
+
+
+
+ 默认的时间值(1970年8月1日8点0分0秒)
+
+
+
+
+ 最多自动重试连接次数
+
+
+
+
+ 1C2G推荐的任务数量
+
+
+
+
+ 2C2G推荐的任务数量
+
+
+
+
+ 4C4G推荐的任务数量
+
+
+
+
+ 默认Socket数据包大小
+
+
+
+
+ 默认Stream传输大小
+
+
+
+
+ 配合 使用,也别忘了修改
+
+
+
+
+ 配合 使用,也别忘了修改
+
+
+
+
+ 配合 使用
+
+
+
+
+ 需要同步更新
+
+
+
+
+ 需要同步更新
+
+
+
+
+ 需要同步更新
+
+
+
+ Commands
+
+
+
+ 是否自动连接服务器
+
+
+
+
+ 是否自动登录
+
+
+
+
+ 是否在匹配中
+
+
+
+
+ 是否连接上服务器
+
+
+
+
+ 是否正在重连
+
+
+
+
+ 是否自动重连
+
+
+
+
+ 是否在房间中
+
+
+
+
+ 当前所处的房间类型
+
+
+
+
+ 服务器名称
+
+
+
+
+ 公告
+
+
+
+
+ 自动登录的账号
+
+
+
+
+ 自动登录的密码
+
+
+
+
+ 自动登录的秘钥
+
+
+
+
+ 游戏局内类
+ 客户端需要使用创建此类单例
+
+
+
+
+ 传入游戏所需的参数,构造一个Gaming实例
+
+
+
+
+
+
+
+
+ 需在RunTimeController的SocketHandler_Gaming方法中调用此方法
+ 客户端也可以参照此方法自行实现
+ 此方法目的是为了触发 的局内事件实现
+
+
+
+
+
+
+ 服务器地址
+
+
+
+
+ 服务器端口号
+
+
+
+
+ SocketToken
+
+
+
+
+ LoginKey
+
+
+
+
+ 已登录的用户
+
+
+
+
+ 已登录用户名
+
+
+
+
+ 所处的房间
+
+
+
+
+ 从plugins目录加载所有插件
+
+
+
+
+
+
+
+
+ 从gamemodes目录加载所有模组
+
+
+
+
+
+
+
+
+
+
+
+ 从gamemodes目录加载所有适用于服务器的模组
+
+
+
+
+
+
+
+
+
+
+
+ 从gamemaps目录加载所有地图
+
+
+
+
+
+
+
+ 默认的序列化选项
+
+
+
+
+ 获取Json字符串
+
+
+
+
+
+
+
+ 获取Json字符串
+
+
+
+
+
+
+
+
+ 反序列化Json对象
+
+
+
+
+
+
+
+ 反序列化Json对象
+
+
+
+
+
+
+
+
+ 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别
+
+
+
+
+
+
+ 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别
+
+
+
+
+
+
+
+ 反序列化SocketObject中索引为index的Json对象
+
+
+
+
+
+
+
+
+
+ 反序列化Hashtable中Key对应的Json对象
+
+
+
+
+
+
+
+
+ 反序列化IEnumerable中的Json对象
+
+
+
+
+
+
+
+
+ 反序列化IEnumerable中的Json对象
+
+
+
+
+
+
+
+
+
+ 反序列化Hashtable中Key对应的Json对象
+
+
+
+
+
+
+
+
+
+ 反序列化多个Json对象
+ 注意必须是相同的Json对象才可以使用此方法解析
+
+
+
+
+
+
+
+ 反序列化多个Json对象
+ 注意必须是相同的Json对象才可以使用此方法解析
+
+
+
+
+
+
+
+
+ 检查字符串是否为完整的JSON对象
+
+
+
+
+
+
+ 用于保存Smtp客户端
+ 一个邮件服务对应一个Smtp客户端
+
+
+
+
+ 用于保存邮件服务
+ 允许服务器同时存在多个服务
+
+
+
+
+ 获取某个已经保存过的邮件服务
+
+
+
+
+
+
+ 统一调用此方法发送邮件
+
+
+
+
+
+
+
+
+ 关闭邮件服务
+
+
+
+
+
+
+ 目前的Model数量
+
+
+
+
+ 最大接受的Model数量
+
+
+
+
+ 可参与高并发的字典,但添加效率较低
+
+
+
+
+ Init ModelManager
+
+ MaxModel
+
+
+
+ 获取Model对象
+
+ Model的Key
+ Model对象
+
+
+
+ 向Model管理器中添加Model
+
+ Model的Key
+ Model对象
+ True:操作成功
+
+
+
+ 从Model管理器中移除Model
+
+ Model的Key
+ True:操作成功
+
+
+
+ 将Model移除,并取得这个Model
+
+ Model的Key
+ Model对象
+ 被移除的Model
+
+
+
+ 将Model移除,并取得这个Model
+
+ Model的Key
+ 被移除的Model
+
+
+
+ 清空Model管理器
+
+
+
+
+ 获取Model对象的列表
+
+
+
+
+ 客户端专用Socket
+
+
+
+
+ 服务器端专用Socket
+
+
+
+
+ 创建服务器监听Socket
+
+ 监听端口号
+ 最大连接数量
+ 服务器端专用Socket
+
+
+
+ 创建一个监听到客户端Socket
+
+ 客户端IP地址[0]和客户端Socket[1]
+
+
+
+ 创建客户端Socket
+
+ 服务器IP地址
+ 服务器监听端口
+ 客户端专用Socket
+
+
+
+ 用于服务器端向客户端Socket发送信息
+
+ 客户端Socket
+ Socket信息容器
+ 通信结果
+
+
+
+ 用于客户端向服务器Socket发送信息
+
+ Socket信息容器
+ 通信结果
+
+
+
+ 接收数据流中的信息
+ 如果是服务器接收信息需要传入客户端Socket
+
+ 如果是服务器接收信息需要传入客户端Socket
+ SocketObjects
+
+
+
+ 监听事件的委托
+
+ SocketObject
+
+
+
+ 监听事件
+
+
+
+
+ 触发异步监听事件
+
+ SocketObject
+
+
+
+ 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
+
+
+
+
+
+
+ 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
+
+
+
+
+
+
+ 内部实现类
+
+
+
+
+ 返回ITaskAwaiter可以进一步调用方法
+ 但是意义不大,前一个OnCompleted方法并不会等待下一个方法
+ 可以理解为并行广播
+
+
+
+
+
+
+ 在捕获到异常时,将触发Error事件
+
+
+
+
+
+
diff --git a/dll/OneBot-HTTPClient.dll b/dll/OneBot-HTTPClient.dll
new file mode 100644
index 0000000..bf4cfa6
Binary files /dev/null and b/dll/OneBot-HTTPClient.dll differ
diff --git a/src/Command/MasterCommand.cs b/src/Command/MasterCommand.cs
index 85790bd..aba8afd 100644
--- a/src/Command/MasterCommand.cs
+++ b/src/Command/MasterCommand.cs
@@ -119,6 +119,7 @@ namespace Milimoe.RainBOT.Command
if (user_id == GeneralSettings.Master)
{
GeneralSettings.LoadSetting();
+ Music.InitMusicList();
SendMessage(send_group, target_id, "参数设定以及权限组重新加载完成。");
}
else Access_Denied(send_group, target_id);
diff --git a/src/RainBOT.csproj b/src/RainBOT.csproj
index d0d88ae..e3c36d4 100644
--- a/src/RainBOT.csproj
+++ b/src/RainBOT.csproj
@@ -22,7 +22,7 @@
- ..\..\OneBot-HTTPClient\bin\Debug\net8.0\OneBot-HTTPClient.dll
+ ..\..\OneBot-HTTPClient\bin\Release\net8.0\win-x64\OneBot-HTTPClient.dll
diff --git a/src/Settings/Bot.cs b/src/Settings/Bot.cs
index 7c3e31d..aa5fc70 100644
--- a/src/Settings/Bot.cs
+++ b/src/Settings/Bot.cs
@@ -103,16 +103,32 @@ namespace Milimoe.RainBOT.Settings
else if (++bltimes == 5)
{
BlackList.Times[user_id] = 6;
- FriendMessageContent content = new(user_id);
- content.message.Add(new AtMessage(user_id));
- content.message.Add(new TextMessage("警告:你已因短时间内频繁操作被禁止使用BOT指令" + (GeneralSettings.BlackFrozenTime / 60) + "分钟" + (GeneralSettings.BlackFrozenTime % 60) + "秒。"));
- _ = Task.Run(async () =>
+ if (send_group)
{
- await Task.Delay(1000 * GeneralSettings.BlackFrozenTime);
- BlackList.Times.Remove(user_id);
- });
- await (send_group ? SendGroupMessage(target_id, "黑名单", content) : SendFriendMessage(target_id, "黑名单", content));
- return false;
+ GroupMessageContent content = new(user_id);
+ content.message.Add(new AtMessage(user_id));
+ content.message.Add(new TextMessage("警告:你已因短时间内频繁操作被禁止使用BOT指令" + (GeneralSettings.BlackFrozenTime / 60) + "分钟" + (GeneralSettings.BlackFrozenTime % 60) + "秒。"));
+ _ = Task.Run(async () =>
+ {
+ await Task.Delay(1000 * GeneralSettings.BlackFrozenTime);
+ BlackList.Times.Remove(user_id);
+ });
+ await SendGroupMessage(target_id, "黑名单", content);
+ return false;
+ }
+ else
+ {
+ FriendMessageContent content = new(user_id);
+ content.message.Add(new AtMessage(user_id));
+ content.message.Add(new TextMessage("警告:你已因短时间内频繁操作被禁止使用BOT指令" + (GeneralSettings.BlackFrozenTime / 60) + "分钟" + (GeneralSettings.BlackFrozenTime % 60) + "秒。"));
+ _ = Task.Run(async () =>
+ {
+ await Task.Delay(1000 * GeneralSettings.BlackFrozenTime);
+ BlackList.Times.Remove(user_id);
+ });
+ await SendFriendMessage(target_id, "黑名单", content);
+ return false;
+ }
}
else
{
diff --git a/src/Settings/Music.cs b/src/Settings/Music.cs
index c52ca73..71706ea 100644
--- a/src/Settings/Music.cs
+++ b/src/Settings/Music.cs
@@ -1,4 +1,6 @@
-namespace Milimoe.RainBOT.Settings
+using Milimoe.OneBot.Framework.Utility;
+
+namespace Milimoe.RainBOT.Settings
{
public class Music
{
@@ -6,54 +8,16 @@
public static void InitMusicList()
{
- MusicList.Add("kun", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\ikun.mp3");
- MusicList.Add("csgo", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\懂CSGO.mp3");
- MusicList.Add("架不住", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\令人沮丧的游戏.mp3");
- MusicList.Add("不玩了", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\令人沮丧的游戏.mp3");
- MusicList.Add("令人沮丧的游戏", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\令人沮丧的游戏.mp3");
- MusicList.Add("man", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\man.mp3");
- MusicList.Add("马云", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\马云.mp3");
- MusicList.Add("疤王", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\疤王.mp3");
- MusicList.Add("电锯", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\电锯.mp3");
- MusicList.Add("终极", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\终极.mp3");
- MusicList.Add("高考", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\高考.mp3");
- MusicList.Add("8位", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\8位.mp3");
- MusicList.Add("8bit", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\8位.mp3");
- MusicList.Add("躺平青年", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\躺平青年.mp3");
- MusicList.Add("有为青年", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\有为青年.mp3");
- MusicList.Add("年少有为", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\有为青年.mp3");
- MusicList.Add("花脸", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\花脸.mp3");
- MusicList.Add("爱莉克斯", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\爱莉克斯.mp3");
- MusicList.Add("alyx", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\爱莉克斯.mp3");
- MusicList.Add("巴克拉姆", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\巴克拉姆.mp3");
- MusicList.Add("尘归尘", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\尘归尘.mp3");
- MusicList.Add("好好干", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\好好干.mp3");
- MusicList.Add("好好活", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\好好干.mp3");
- MusicList.Add("冲击星", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\冲击星.mp3");
- MusicList.Add("触摸能量", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\触摸能量.mp3");
- MusicList.Add("非人类", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\非人类.mp3");
- MusicList.Add("黄色魔法", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\黄色魔法.mp3");
- MusicList.Add("精彩时刻", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\精彩时刻.mp3");
- MusicList.Add("巨龙之眼", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\巨龙之眼.mp3");
- MusicList.Add("绝对统御", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\绝对统御.mp3");
- MusicList.Add("困兽", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\困兽.mp3");
- MusicList.Add("理由", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\理由.mp3");
- MusicList.Add("令人发指", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\令人发指.mp3");
- MusicList.Add("你急了", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\你急了.mp3");
- MusicList.Add("枪炮", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\枪炮卷饼卡车.mp3");
- MusicList.Add("卡车", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\枪炮卷饼卡车.mp3");
- MusicList.Add("求佛", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\求佛.mp3");
- MusicList.Add("青山", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\人生何处不青山.mp3");
- MusicList.Add("如日中天", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\如日中天.mp3");
- MusicList.Add("通宵达旦", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\通宵达旦.mp3");
- MusicList.Add("万众瞩目", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\万众瞩目.mp3");
- MusicList.Add("燥起来", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\燥起来.mp3");
- MusicList.Add("追溯起源", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\追溯起源.mp3");
- MusicList.Add("zood", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\zood.mp3");
- MusicList.Add("igs", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\igotsmoke.mp3");
- MusicList.Add("劝导", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\丁真劝导.mp3");
- MusicList.Add("丁真", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\丁真劝导.mp3");
- MusicList.Add("change", "file:///" + AppDomain.CurrentDomain.BaseDirectory.ToString() + @"music\change.mp3");
+ PluginConfig Configs = new("rainbot", "musiclist");
+ Configs.Load();
+ foreach (string key in Configs.Keys)
+ {
+ if (Configs.TryGetValue(key, out object? value) && value != null && value.GetType() == typeof(string))
+ {
+ if (MusicList.ContainsKey(key)) MusicList[key] = (string)value;
+ else MusicList.Add(key, (string)value);
+ }
+ }
}
}
}
diff --git a/src/Settings/OSMCore.cs b/src/Settings/OSMCore.cs
index b3467a7..7c5b75f 100644
--- a/src/Settings/OSMCore.cs
+++ b/src/Settings/OSMCore.cs
@@ -3,8 +3,8 @@
public class OSMCore
{
public const string version = "v1.0";
- public const string version2 = "Patch2";
- public const string time = "Apr. 11st, 2024";
+ public const string version2 = "Patch3 Test";
+ public const string time = "Apr. 12nd, 2024";
public static string Info => $"OSM Core {version} {version2}\r\nAuthor: Milimoe\r\nBuilt on {time}\r\nSee: https://github.com/milimoe";
}