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"; }