MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接
    1. 主页
    2. hundun000
    3. 帖子
    H
    • 资料
    • 关注 0
    • 粉丝 3
    • 主题 15
    • 帖子 157
    • 最佳 8
    • 有争议的 0
    • 群组 2

    hundun000 发布的帖子

    • SubCommand未响应群消息,但可响应控制台输入

      以前只开发过ListenerHost,第一次开发Command。

      在mirai-console文档示例有:

      @OptIn(ConsoleExperimentalAPI::class)
      object MyCompositeCommand : CompositeCommand(
          MyPluginMain, "manage", // "manage" 是主指令名
          description = "示例指令", permission = MyCustomPermission,
          // prefixOptional = true // 还有更多参数可填, 此处忽略
      ) {
      
          // [参数智能解析]
          //
          // 在控制台执行 "/manage <群号>.<群员> <持续时间>",
          // 或在聊天群内发送 "/manage <@一个群员> <持续时间>",
          // 或在聊天群内发送 "/manage <目标群员的群名> <持续时间>",
          // 或在聊天群内发送 "/manage <目标群员的账号> <持续时间>"
          // 时调用这个函数
          @SubCommand // 表示这是一个子指令,使用函数名作为子指令名称
          suspend fun CommandSender.mute(target: Member, duration: Int) { // 通过 /manage mute <target> <duration> 调用
          …………
      
      

      我已经写了CommandManager.INSTANCE.registerCommand();,故我已经可以在控制台使用我的SubCommand了。若想实现注释里说的“聊天群内发送 XXX 时调用这个函数”,还需要做什么工作呢?我没有在文档里看到。

      我了解到或许以下方案可以做到:

      • 使用chat-command插件
      • 在消息事件监听中执行命令。

      然而我预期的是,只需要一行代码来声明"这个Command需要响应群消息"。这样的功能存在吗(因为按我的理解这是Command的最常用用法,或是我理解有误)?

      发布在 开发交流
      H
      hundun000
    • RE: 阿里ecs问题导致无法正常访问腾讯的聊天资源服务器,疑似ip被屏蔽

      @orisland
      我觉得是你的代码没有等待网络请求结束就继续向下执行到System.out.println(bytes == null);了。
      https://stackoverflow.com/questions/34597220/how-to-wait-for-the-result-on-a-okhttp-call-to-use-it-on-a-test

      CountDownLatch countDownLatch = new CountDownLatch(1);
      
      client.newCall(request).enqueue(new Callback() {
      
      
      
          @Override
      
          public void onFailure(Request request, IOException e) {
      
              resultWeb = false;
      
              Log.i("Error","Failed to connect: "+e.getMessage());
      
              countDownLatch.countDown();
      
          }
      
      
      
          @Override
      
          public void onResponse(Response response) throws IOException {
      
      
      
              Log.i("Success","Success: "+response.code());
      
              if (response.code() == 200) {
      
                  resulWeb = true;
      
              }
      
              countDownLatch.countDown();
      
          }
      
      });
      
      
      
      countDownLatch.await();
      
      return resultWeb;
      
      发布在 开发交流
      H
      hundun000
    • ExternalResource实例close()以后依然能多次使用?

      主项目的代码里,预期一直使用的ExternalResource实例,每次使用后就执行了close(),但是实际上依然能多次使用这个实例。这个现象正常吗?对于预期一直使用的ExternalResource实例,正确做法是不close()是吧?

      写进了demo项目来复现演示:DemoBotLogic的成员demoExternalResource仅初始化一次。每次onMessage时就执行close()。

      public class DemoBotLogic implements ListenerHost {
      
        JvmPlugin plugin;
        ExternalResource demoExternalResource;
      
         …………
      
        public DemoBotLogic(JvmPlugin plugin) {
      
          this.plugin = plugin;
      
           …………
      
          demoExternalResource = ExternalResource.create(plugin.resolveDataFile("demo.png"));
      
        }
      
        @NotNull
      
        @EventHandler
      
        public ListeningStatus onMessage(@NotNull GroupMessageEvent event) throws Exception { 
      
      
          // test close ExternalResource every time
      
          if (event.getMessage().contentToString().equals("test ExternalResource")) {
      
              Image image = event.getGroup().uploadImage(demoExternalResource);
      
              try {
      
                  demoExternalResource.close();
      
              } catch (IOException e) {
      
                  plugin.getLogger().error("Image externalResource.close error" + e.getMessage());
      
              }
      
              event.getGroup().sendMessage(image);
      
          }
      
          
      
          return ListeningStatus.LISTENING;
      
        }
      
      
      
      
      
      }
      

      07157f3e-8285-4e95-b6e1-e335c2204ea4-image.png

      mcl日志也没有报"Image externalResource.close error",就算是执行close()成功了吧。

      发布在 开发交流
      H
      hundun000
    • RE: ZacaFleetBot 明日方舟游戏助手+舰队收藏游戏助手+More

      新版本已发布。一站到底答题功能已嵌入该项目。

      2.1.4 一站到底答题相关指令

      更多可看一站到底详细说明

      开始比赛

      每次mcl启动后,每个群,需要执行一次开始比赛。

      <子指令>: 开始比赛
      <指令参数列表>[0]: 赛制选择。开发中,目前只开放“无尽模式”。
      <指令参数列表>[1]: 题目包名。详见一站到底详细说明。
      <指令参数列表>[2]: 队伍名。开发中,目前只开放“游客”。

      -> 阿米娅开始比赛 无尽模式 questions_small 游客
      <- 开始比赛成功

      出题

      <子指令>: 出题

      -> 阿米娅出题
      <- 《紫罗兰永恒花园》中薇尔莉特的名字是来自?
      A. 紫罗兰
      B. 勿忘我
      C. 向日葵
      D. 玫瑰
      发送选项字母来回答
      [图片]

      此时,任意一个群员回答“A”、“B”、“C”、“D”均会被视为回答。

      -> A
      <- @回答者 回答错误QAQ
      正确答案是C
      游客 +0分

      可以在这之后任意时刻,再次发出出题指令。

      发布在 插件发布
      H
      hundun000
    • ZacaFleetBot 明日方舟游戏助手+舰队收藏游戏助手+More

      ZacaFleetBot

      Github

      release

      简介

      插件功能:该插件可配置bot在不同Q群扮演不同角色,只提供指定范围的功能(一些通用功能+该角色的特色功能)。目标是同时为多个群提供差异化服务,易配置,易裁剪或拓展。

      有两种使用方式,选这其中一种即可使用:

      • 方式一:作为mirai-console-plugin使用
      • 方式二:作为独立应用使用【暂不开放】

      依赖服务:mirai框架、微博api、企鹅物流api、舰娘百科api

      【最新角色和指令以github文档为准,以下介绍可能落后】

      角色及其功能简介

      阿米娅

      《明日方舟》游戏角色。特色功能为明日方舟游戏助手。

      • 推送微博: 明日方舟、朝陇山
      • 企鹅物流数据查询
      • 事项提醒: 预设的整点报时、用户新增定时提醒
      • 闲聊: 戳一戳、提醒还不能下班……
      • 快速查询: PRTS网页链接、一图流网页链接……
      • 一站到底答题

      欧根

      《舰队收藏》游戏角色。特色功能为舰队收藏游戏助手。

      • 推送微博: 艦colle鎮守府情報
      • 事项提醒: 预设的整点报时、用户新增定时提醒
      • 快速查询: 舰娘信息(舰娘百科网页链接、改造链、初始装备……)

      ZACA娘

      原创角色。实验性的通用功能一般会放在这里。

      • 推送微博: 华工ZACA动漫协会
      • 日文小工具: 日文汉字注音
      • 一站到底答题

      猫猫

      实验性角色。未来可能作为二次开发新角色的模板。

      功能详细介绍

      如前文所述,每个角色有特定的可用指令范围。下面列出的所有指令,并非任意角色都能使用。

      本章的指令示例将以如下格式给出:

      -> 这是一句指令示例
      <- 这是bot对该指令的回复示例

      2.1 第一类指令——调用某个子指令

      语法:
      <角色名><子指令> <指令参数列表>
      或
      <角色名> <子指令> <指令参数列表>

      实验性功能:为了加强角色扮演感,对于同一个子指令功能,不同的角色可能通过不同的“子指令称呼”调用。

      2.1.1 微博相关指令

      查看最近一条微博的发布时间

      <子指令>: 查看最新微博

      -> ZACA娘查看最新微博

      实验性功能:

      对于角色阿米娅,变为 <子指令>: 看看饼

      -> 阿米娅看看饼

      对于角色欧根,变为 <子指令>: 查看镇守府情报

      -> 欧根查看镇守府情报

      2.1.2 企鹅物流数据相关指令

      查询物品掉率

      查看某个物品的在所有地图里掉落率最高的几项。

      <子指令>: 查掉率
      <指令参数列表>: 物品名

      -> 阿米娅查掉率 固源岩

      查询作战

      查看某个作战的理智消耗,掉落等信息。

      <子指令>: 查作战
      <指令参数列表>: 作战id

      -> 阿米娅查作战 1-7

      刷新缓存

      拉取最新的企鹅物流信息数据。

      <子指令>: 更新企鹅物流

      -> 阿米娅更新企鹅物流

      2.1.3 事项提醒相关指令

      创建提醒

      提醒任务指的是在满足时间条件的时候发送指定消息。

      <子指令>: 创建提醒
      <指令参数列表>[0]: 时间条件-月。-1表示不限制。
      <指令参数列表>[1]: 时间条件-日。-1表示不限制。
      <指令参数列表>[2]: 时间条件-星期数。-1表示不限制。
      <指令参数列表>[3]: 时间条件-时。-1表示不限制。
      <指令参数列表>[4]: 时间条件-分。-1表示不限制。
      <指令参数列表>[5]: 执行次数条件。-1表示不限制。
      <指令参数列表>[6]: 消息内容

      -> 阿米娅创建提醒 5 1 -1 9 0 1 限时活动将于10点结束,博士请确认限时活动任务完成状态。 //这条消息将在5月1日(不论是星期几)9点0分时被bot自动发送。执行一次后失效。

      -> 阿米娅创建提醒 -1 -1 7 22 30 -1 博士请确认周常任务完成状态。 //这条消息将在周日(不论是几月几日)22点30分时被bot自动发送。可执行无限次。

      查看提醒

      查看已创建的提醒任务。

      <子指令>: 查看提醒

      -> 阿米娅查看提醒

      移除提醒

      移除指定id的提醒任务。

      <子指令>: 移除提醒
      <指令参数列表>: 提醒id。由查看提醒得到。

      -> 阿米娅移除提醒 29b88b93-89e2-4a3f-8ff2-b35ab13672d3

      2.2 第二类指令——快速查询

      语法:
      <参数>.

      语法尽量简短,用于每个群里最常用到的查询。

      2.2.1 阿米娅的快速查询

      <参数> 回复
      PRTS 或 prts PRTS首页
      一图流 一图流网站
      绿票一图流 绿票一图流网站
      企鹅物流 企鹅物流首页

      -> prts. //得到PRTS首页链接
      <- http://prts.wiki/w/首页

      2.2.2 欧根的快速查询

      <参数> 回复
      任意 舰娘信息(数据来自kcwiki)

      -> 吹雪.
      <- 吹雪 https://zh.kcwiki.cn/wiki/吹雪
      吹雪驱逐舰
      -20级->吹雪改[驱逐舰]
      -70级->吹雪改二[驱逐舰]

      3. 闲聊

      当群员的发言不满足该角色的任意一个指令语法,即为一句闲聊。角色也会在满足条件的情况下做出回复。

      3.1 复读机

      当群里连续3句发言相同时(包括发送相同表情/图片),角色也会回复一次该发言。

      3.2 阿米娅的闲聊

      • 当群员发言里包含“下班”,根据是否是工作时间(周一至周五9点至17点),阿米娅会做不同回复。
      • 当群员发言里包含“damedane”,阿米娅会播放音频。
      • 戳一戳阿米娅或特定群员,阿米娅会发送特定的图片。

      3.3 欧根的闲聊

      • 当群员发言里包含“噗噗”,欧根会发送特定的图片。

      4. 非主动功能

      指的是不由用户发言触发的功能。

      • 微博推送
      • 预设的整点报时
      • 用户创建的事项提醒满足时间条件
      发布在 插件发布
      H
      hundun000
    • RE: mirai-http-api启动时报错

      我猜是mirai-api-http版本和console版本不一致?

      18:44:27 [WARNING] Package "net.mamoe:mirai-api-http" requires "net.mamoe:mirai-console" version 2.5.0. Current version is 2.7-M1
      18:44:27 [WARNING] Package "net.mamoe:chat-command" requires "net.mamoe:mirai-console" version 2.0-RC. Current version is 2.7-M1

           2021-07-01 18:44:30 E/Mirai HTTP API: java.lang.NoSuchMethodError: 'double kotlin.time.DurationKt.toDuration(int, java.util.concurrent.TimeUnit)'java.lang.NoSuchMethodError: 'double kotlin.time.DurationKt.toDuration(int, java.util.concurrent.TimeUnit)'
          …………
          at net.mamoe.mirai.api.http.route.BaseRouteKt.mirai(BaseRoute.kt:45)
      
      发布在 HTTP API和第三方SDK
      H
      hundun000
    • RE: 收不到私聊消息?

      @movingcloud
      应该是还要:
      @nambers 在 mirai更新到2.7M1后mirai-api-http插件无法使用 中说:

      禁止后

      "disabled_scripts": [
          "updater"
        ],
      

      这个是这样子的,不知道你那为什么没有,你可以试一下手动把这一项加上去

      发布在 BUG反馈
      H
      hundun000
    • RE: 插件里Spring的AnnotationConfigApplicationContext扫描不到bean

      @hundun000 在 [插件里Spring的AnnotationConfigApplicationContext扫描不到bean]

      距离我的需求的后两项,试了下,不止@EnableMongoRepositories,@EnableFeignClients这么简单,还需替换其他的Spring默认值,目前还在研究。

      1)@EnableMongoRepositories其实挺简单就能用上,之前是别的地方搞错了。
      2) 我别的项目都是直接上springboot全套,才注意到openfeign自动实现是依赖spring-cloud,打算不引入了。手动构造openfeign本身工作量也不大。

      发布在 开发交流
      H
      hundun000
    • RE: 插件里Spring的AnnotationConfigApplicationContext扫描不到bean

      继续实验了下,有如下发现:

      1. 与其新建线程然后让Spring默认使用当前线程的默认类加载器,其实可以直接context.setClassLoader。
      2. 不一定要插件主体(JvmPlugin) 的类加载器,似乎任意一个插件jar里的类都行,所以这里直接用this.getClass().getClassLoader()。
          context = new AnnotationConfigApplicationContext();
      
          context.setClassLoader(this.getClass().getClassLoader());
      
          context.scan("com.hundun.mirai.bot");
      
          context.refresh();
      

      不过上述操作只能让Ioc容器生效。距离我的需求的后两项,试了下,不止@EnableMongoRepositories,@EnableFeignClients这么简单,还需替换其他的Spring默认值,目前还在研究。

      发布在 开发交流
      H
      hundun000
    • RE: Arknights Helper / 明日方舟 助手,更新订阅的微博号配置项

      @cssxsh
      我自己正准备开发两个插件,我也实现了微博模块。因为两个插件都是同样地使用微博模块,所以简单的复制肯定可行。初步改进的话就是通过共用子项目之类的来复用。如果再进一步改进的目标就是“发布出来给更多插件复用”了,因为放眼到整个社区好像都在各自插件里重复开发微博和B站功能?

      发布在 插件发布
      H
      hundun000
    • RE: Arknights Helper / 明日方舟 助手,更新订阅的微博号配置项

      @cssxsh 我看到你还发布了B站订阅插件和Weibo Helper,然后我稍微看了下Arknights Helper代码,似乎并不是简单地把Weibo Helper包和B站订阅插件包复制进来,而是专门为Arknights Helper重新写的?

      有没有一种组织方式,能使微博、b站功能在这3个项目间方便地复用,甚至发布出来给更多插件复用?

      发布在 插件发布
      H
      hundun000
    • RE: 插件里Spring的AnnotationConfigApplicationContext扫描不到bean

      @lc6a 主项目在转spring的重构中,太乱了。写成了demo项目

      发布在 开发交流
      H
      hundun000
    • RE: 插件里Spring的AnnotationConfigApplicationContext扫描不到bean

      @ryoii 在 插件里Spring的AnnotationConfigApplicationContext扫描不到bean 中说:

      外部加载 Jar 包是插件系统常用的做法,所以和 Srping 默认从 classpath 下读取 bean 是冲突的,所以我一直不推荐使用 spring 容器开发各种插件。

      虽然我没有做过,但是可以提供一个大概率可行的思路。

      • 额外开启 一个线程用于用于初始化 SpringContext
      • 将这个线程的 TCCL (Thread Context Class Loader) 设置为插件主体(JvmPlugin) 的类加载器

      这样 SpringContext 在初始化的时候应该就会取到插件的类加载器。注意,这个 SpringContext 是否能扫描到插件之外的 Bean 取决与 Mirai Console 的实现

      试了,可行

      发布在 开发交流
      H
      hundun000
    • RE: 插件里Spring的AnnotationConfigApplicationContext扫描不到bean

      @cssxsh 目前想要Ioc容器实现、MongoDB数据访问实现,openfeign实现。

      我是在考虑和尝试,使用spring,(1)花费一定的前期工作量在 @ryoii 所说的替换Spring的一些默认实现以适配mirai插件。(2)后期可以获得上述3类Spring的便利。

      如果实际情况是(1)带来的工作量/不稳定性,超过了(2)的好处,那我就不用spring了。目的是插件内省事,不打算取插件以外的bean。

      发布在 开发交流
      H
      hundun000
    • 插件里Spring的AnnotationConfigApplicationContext扫描不到bean

      mirai 2.6.7。
      (一个位于com.hundun.mirai.bot.core包的类)使用以下代码创建ApplicationContext并扫描com.hundun.mirai.bot包,打印beans的名字。

          AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
      
          context.scan("com.hundun.mirai.bot");
      
          context.refresh();
      
          console.getLogger().info("ApplicationContext created, has beans = " + Arrays.toString(context.getBeanDefinitionNames()));
      

      IDE单元测试里加载插件,可以扫到com.hundun.mirai.bot里的beans:
      3ca90bde-9388-4e20-bb82-6f4fb108fe47-image.png

      buildPlugin以后放入mcl,启动后扫不到com.hundun.mirai.bot里的beans:
      47015b15-d522-4661-856d-b32ddc7b5d64-image.png

      确认插件jar里com.hundun.mirai.bot包内容正常:
      287f18cd-f9a1-430e-a9c2-cb80a9a3d986-image.png

      发布在 开发交流
      H
      hundun000
    • RE: 编译好后的插件放到plugins里,运行一大堆红。

      是和这个帖子一样,两个bot用了同一个workDir的原因?

      发布在 使用交流
      H
      hundun000
    • RE: 套用插件的Mirai框架里如何使用Mybatis和Spring呀?

      为什么我的插件放入mcl启动,代码执行new ClassPathXmlApplicationContext("spring.xml"),会报错找不到文件?

      buildPlugin得到的jar的结构如下,"spring.xml"在根目录。

      b32bf6cf-23df-44e5-8c43-184af21014b1-image.png

      发布在 开发交流
      H
      hundun000
    • RE: mirai更新到2.7M1后mirai-api-http插件无法使用

      @nambers
      ……懂了。因为我是在本地改config.json然后覆盖服务器上的,"disabled_scripts": [] 也覆盖上去了。

      发布在 BUG反馈
      H
      hundun000
    • RE: 架构设计:抽离出“纯bot逻辑”?

      @hundun000 在 架构设计:抽离出“纯bot逻辑”? 中说:

      研究了几天,增加了对插件设计粒度的理解。发现我的独立应用不适合转为插件……至少是不适合转为“一个插件”。

      虽然嘴上说着不合适,还是试着把所有功能打成一个插件并成功运行了。姑且先用插件挂着,后续考虑怎么改。

      发布在 开发交流
      H
      hundun000
    • RE: mirai更新到2.7M1后mirai-api-http插件无法使用

      @nambers 在 mirai更新到2.7M1后mirai-api-http插件无法使用 中说:

      @石头狸猫

      • 输入mcl -d updater指令禁掉自动更新脚本, 用mcl -e updater恢复
      • 在config.json里面指定版本

      怎么我试了不行,还是会2.6.4升2.6.7:

      51f52b6f-8fbe-4b61-abef-260a9e385caa-image.png

      {
        "js_optimization_level": -1,
        "mirai_repo": "https://gitee.com/peratx/mirai-repo/raw/master",
        "maven_repo": "https://maven.aliyun.com/repository/public",
        "packages": [
          {
            "id": "net.mamoe:mirai-console",
            "channel": "stable",
            "version": "2.6.4",
            "type": "libs"
          },
          {
            "id": "net.mamoe:mirai-console-terminal",
            "channel": "stable",
            "version": "2.6.4",
            "type": "libs"
          },
          {
            "id": "net.mamoe:mirai-core-all",
            "channel": "stable",
            "version": "2.6.4",
            "type": "libs"
          }
        ],
        "disabled_scripts": [],
        "proxy": "",
        "log_level": 0,
        "script_props": {}
      }
      
      发布在 BUG反馈
      H
      hundun000
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 7 / 8