MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接
    1. 主页
    2. MrXiaoM
    3. 帖子
    • 资料
    • 关注 9
    • 粉丝 39
    • 主题 37
    • 帖子 876
    • 最佳 212
    • 有争议的 0
    • 群组 5

    MrXiaoM 发布的帖子

    • mirai 消息变量替换工具类

      使用 kotlin 编写,但有 java 兼容。

      import kotlinx.coroutines.Dispatchers
      import kotlinx.coroutines.runBlocking
      import kotlinx.coroutines.withContext
      import net.mamoe.mirai.contact.Contact
      import net.mamoe.mirai.message.data.*
      import net.mamoe.mirai.utils.ExternalResource
      import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
      import java.net.URL
      
      /**
      * 消息助手
      * @author MrXiaoM
      */
      object MessageHelper {
         /**
          * 参见 [String.replace]
          * @author MrXiaoM
          */
         @JvmStatic
         fun replace(s: String, replacements: Map<String, SingleMessage>): MessageChain =
             runBlocking { s.replace(replacements) }
      }
      
      /**
      * 消息助手预处理消息接口
      * @author MrXiaoM
      */
      interface PrepareMessage : SingleMessage {
         /**
          * 该方法将会在该消息需要被处理时调用以生成消息。
          * 有时,用户可能会在单条消息多次使用同一变量,建议储存生成结果以便复用。
          * @author MrXiaoM
          */
         suspend fun generateMessage(): SingleMessage
         override fun contentToString(): String = ""
      }
      
      /**
      * 适用于 MessageHelper.replace 的预上传图片
      * @author MrXiaoM
      * @param contact 要上传到的联系人
      * @param handler 需要上传时用于生成 ExternalResource 的处理器,自行编写处理器时应自觉 toAutoCloseable()
      * @param failedText 上传失败时的代替文本
      */
      class PrepareUploadImage(
         private val contact: Contact,
         private val handler: suspend () -> ExternalResource?,
         private val failedText: String = ""
      ) : PrepareMessage {
         private var generated: SingleMessage? = null
         override suspend fun generateMessage(): SingleMessage {
             generated?.also { return it }
             return try {
                 contact.uploadImage(handler()!!).also { generated = it }
             } catch (_: Throwable) {
                 PlainText(failedText)
             }
         }
         override fun contentToString(): String = failedText
         override fun toString(): String = "PrepareUploadImage(contact=$contact)"
         companion object {
             /**
              * 生成预下载图片消息。
              * 图片将会在 replace 时发现需要用到该变量时下载。
              * @author MrXiaoM
              * @param contact 要上传到的联系人
              * @param link 图片下载链接
              * @param failedText 上传失败时的返回消息
              */
             @JvmStatic
             fun fromURL(contact: Contact, link: String, failedText: String = ""): PrepareUploadImage =
                 PrepareUploadImage(contact, {
                     try {
                         withContext(Dispatchers.IO) {
                             URL(link).openConnection().also { it.connect() }.getInputStream()
                         }.toExternalResource().toAutoCloseable()
                     } catch (t: Throwable) {
                         t.printStackTrace()
                         null
                     }
                 }, failedText)
      
             /**
              * 生成预下载图片消息。
              *
              * 参见 [fromURL]
              * @param link 要下载图片的链接
              * @param failedText 上传失败时的返回消息
              */
             @JvmStatic
             fun Contact.prepareUploadImage(link: String, failedText: String = ""): PrepareUploadImage =
                 fromURL(this, link, failedText)
      
             /**
              * 生成预下载头像图片消息。
              *
              * 参见 [prepareUploadImage]
              * @param failedText 上传失败时的返回消息
              */
             @JvmStatic
             fun Contact.prepareUploadAvatarImage(failedText: String = ""): PrepareUploadImage =
                 prepareUploadImage(avatarUrl, failedText)
         }
      }
      
      /**
      * 将字符串作为字符串模板,替换其中的变量为 SingleMessage 来生成 MessageChain
      *
      * 使用示例: @用户并发送他的头像
      * ```kotlin
      * val member = event.sender
      * "\$at 你好,你的头像是\n \$pic".replace(mapOf("at" to At(member), "pic" to member.prepareUploadAvatarImage()))
      * ```
      *
      * 在配置文件或者在 java 中不需要用 \ 将 $ 转义,这会对用户自定义机器人发送的消息的体验更加友好
      * @author MrXiaoM
      * @param replacements 变量对照表
      */
      suspend fun String.replace(replacements: Map<String, SingleMessage>): MessageChain {
         if (!this.contains("\$") || replacements.isEmpty()) return PlainText(this).toMessageChain()
         val message = MessageChainBuilder()
         val s = this.split("\$").toMutableList()
         message.add(s.removeAt(0))
         s.forEach { text ->
             var isOriginal = true
             for ((k, m) in replacements) {
                 if (!text.startsWith(k)) continue
                 if (m is PrepareMessage) message.add(m.generateMessage())
                 else message.add(m)
      
                 message.add(text.substring(k.length))
                 isOriginal = false
                 break
             }
             if (isOriginal) message.add("\$$text")
         }
         return message.build()
      }
      

      刚学 kt 不久,代码有点烂,但是能用就行。以下是使用例子,均会生成 @人间工作p 你好,2431208142

      // kotlin
      val msg = "\$at 你好,\$qq".replace(mapOf("qq" to PlainText(sender.id), "at" to At(sender)))
      
      // java
      Map<String, SingleMessage> replacements = new HashMap<>();
      replacements.put("qq", new PlainText(String.valueOf(sender.getId())));
      replacements.put("at", new At(sender.getId()));
      MessageChain msg = MessageHelper.replace("$at 你好,$qq", replacements);
      

      若要使用这份代码,你只需要在源代码中保留作者信息(即保留 @author MrXiaoM)即可。

      发布在 技术交流板块
      MrXiaoM
      MrXiaoM
    • RE: 【每日沙雕图】沙雕小别墅



      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • RE: 【每日沙雕图】沙雕小别墅

      QQ图片20220720105301.jpg

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • RE: 来博客互换友情链接

      @MrXiaoM 氦嗨亥,移动端适配做好了

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • RE: 来博客互换友情链接

      @RainChan 确实,之前把密码忘了,自己写的主题还没来得及做适配(

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • RE: 来博客互换友情链接

      来晚了

      网站名称:MrXiaoM的博客
      地址:https://blog.mrxiaom.top
      头像地址:https://blog.mrxiaom.top/logo-64.png
      logo-64.png

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • WifeYouWant —— 每天随机把群友当老婆

      WifeYouWant

      项目地址:https://github.com/MrXiaoM/WifeYouWant

      「你想要的插件」系列作品

      本插件移植自 椛椛 ᴮᴼᵀ

      名场面
      WifeYouWant.png

      特性

      • 每天可以从群友里随机抽一次老婆 (渣男!)
      • 不想要的可以换 (渣男!!)
      • 可设置只能抽和自己性别相反的人,也可以无视性别
      • 可以设置能抽到自己
      • 可以设置能 NTR (重复抽到群友)

      安装

      到 Releases 下载插件并放入 plugins 文件夹进行安装

      2.11 或以上下载 WifeYouWant-*.mirai2.jar

      2.11 以下下载 WifeYouWant-legacy-*.mirai.jar
      安装完毕后,编辑配置文件作出你想要的修改。在控制台执行 /wuw reload 重载配置即可~

      配置文件内有详细的注释,详见 源码

      用法

      随机挑选一位群友,在明天之前,无论怎么抽都是那位群友

      抽老婆
      

      抛弃老婆,重新抽一位群友

      换老婆
      

      关键词可在配置文件中修改

      捐助

      前往 爱发电 捐助我。

      来自群组: SkyNet1748

      发布在 插件发布
      MrXiaoM
      MrXiaoM
    • RE: 简单的Rss订阅插件 已添加RssHub支持 番剧订阅Bt种子自动上传

      @Moon1995 噢我的上帝啊,为什么不使用开源免费还不用登录查看的 pastebin.pl 呢
      好吧我找的这个过不去验证码()
      啊,找到了,moz://a 在线剪贴板:https://pastebin.mozilla.org/

      发布在 插件发布
      MrXiaoM
      MrXiaoM
    • 和 mirai 娘贴贴!

      同人图这不就来了吗?(我真的不会画画,硬画的)

      pid 99557438

      图片

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • RE: 高数考试的逆天活

      放心,你和机器至少能跑一个🤔

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • RE: 【每日沙雕图】沙雕小别墅

      -59f045164f29a1c9.gif
      -1ba2044f5ac1ea5a.jpg
      6d469ff21e2464cb.jpg
      7c32339999306634.jpg
      4f40bc62b3196e8a.jpg
      690804e1dc416d1c.jpg
      59a673f9acc5c589.png

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • RE: 检查更新超时

      那就不让它检查

      ./mcl --boot-only
      
      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • Mirai 摸鱼&开发交流群 非官方

      如果你在玩 mirai 途中遇到问题可以尝试加群 1047497524 询问以快速得到答案。
      不要问有没有人,不要不贴截图,不要笼统提问,不要高血压提问,我谢谢你。

      本群有以下要素

      • 转载高血压图片
      • 超超猫猫
      • 版本过低滚去论坛看223
      • 除了mirai以外什么都聊
      • 更新进度放送
      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • 在 mirai-console 插件配置文件中添加注释

      有时候我们可能不可避免地要给配置文件添加注释以便提升配置文件可读性,这个时候就要添加注释了。

      怎么用

      要添加注释,首先导入包 yamlkt

      compileOnly("net.mamoe.yamlkt:yamlkt-jvm:0.10.2")
      

      然后在你的配置上头打上 @Comment 注解就行,比如

      public object MyConfig : AutoSavePluginConfig("config") {
          @Comment("这是一条注释")
          public var message: String by value("awa")
      
          @Comment(
          """
          可以多行
          就像这样
          或者你用换行符也行
          """
          )
          public var enable : Boolean by value(true)
      }
      

      这其实 又是一个坑

      我想加注释无奈 mirai-console 文档里没教程。

      某天我忽然想到自带的自动登录配置文件不是有注释吗,于是我在源码找到了 AutoLoginConfig,才看到了 @Comment 注解。

      其实这个东西就在 Him188/yamlkt 的最下面

      发布在 技术交流板块
      MrXiaoM
      MrXiaoM
    • RE: IDEA的mirai console插件有操作说明吗?

      说实话mirai的文档藏得挺深的
      详见 README 和 MiraiConsoleExtension 的注释
      啊上面那个是 Gradle 的,IDEA 的在这里
      其实说宽了就只有新建项目目模板和代码检查两个功能

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • RE: 关于基于 Mirai Console 的【经济管理】前置插件的构思

      @hundun000

      https://github.com/SkyNet1748/mirai-economy-core/pull/1

      没看帖子,拿着教室的教学机搓了一晚上写的,感觉和你描述的差不多,只是接口管理器感觉仍不完善

      坐等css大佬把我的代码全部覆盖(

      MrXiaoM created this issue in SkyNet1748/mirai-economy-core

      closed 初步完成接口 #1

      发布在 开发交流
      MrXiaoM
      MrXiaoM
    • RE: 【每日沙雕图】沙雕小别墅

      edited_20220603_155438.jpg

      发布在 摸鱼区
      MrXiaoM
      MrXiaoM
    • SpecialTitleYouWant —— 喜闻见乐的头衔插件来了

      SpecialTitleYouWant

      项目地址: https://github.com/MrXiaoM/SpecialTitleYouWant

      「你想要的插件」系列作品

      设置任何你想要的群头衔!

      特性

      • 可以自定义设置头衔的命令
      • 可以自定义大部分提示信息
      • 可以设置违禁词
      • 违禁词可用正则表达式

      安装

      到 Releases 下载插件并放入 plugins 文件夹进行安装

      2.11 或以上下载 SpecialTitleYouWant-*.mirai2.jar

      2.11 以下下载 SpecialTitleYouWant-legacy-*.mirai.jar

      安装完毕后,编辑配置文件 (路径: config/top.mrxiaom.SpecialTitleYouWant/config.yml,在旧版mirai的路径是config/自定义头衔/config.yml)

      配置文件注释请见源码
      或者展开下面的折叠

      # 启用该插件的群
      enableGroups: []
      
      # 头衔违禁词(不分大小写)
      illegalWords:
        - 变态
        - bt
        - 病娇
      
      # 头衔违禁词正则表达式
      illegalPatterns:
        - '^(可爱)?[男女]?(小学|[初高]中|大[学专])生$'
      
      # 最小长度,-1为不限制
      minLength: -1
      
      # 最大长度,-1为不限制,但即使不限制,依然会截断头衔长度
      maxLength: -1
      
      # 修改头衔命令
      cmd:
        - 我要头衔
        - 设置头衔
      
      # 消息,若包括%quote%将会回复用户
      # %at%将会替换为@用户
      # %old%将会替换成旧头衔
      # %title%将会替换成新头衔
      msgTooLong: "%quote%你输入的头衔过长"
      msgTooShort: "%quote%你输入的头衔过短"
      msgSet: "%quote%已设置头衔!"
      msgIllegal: "%quote%你的头衔包含违禁词,不许设置!"
      msgNotOwner: "%quote%机器人不是群主,无法设置头衔!"
      msgNotNormalMember: "%quote%你不是普通群员(比如开启了匿名),无法设置头衔!"
      
      msgReload: "配置文件已重载"
      msgHelp:
        - "自定义头衔 帮助"
        - "/stuw reload - 重载配置文件"
      

      在 enableGroups 中加入要使用该插件的群号,如

      enableGroups:
        - 114514
        - 1919810
      

      在控制台执行 /stuw reload 重载配置文件即可

      如果你觉得这个插件有用,不妨动动手指点击帖子右下角的大拇指对我表示支持

      为什么不用 console 的內建权限系统?
      高情商: 据我了解大多数小白都不了解什么是“被许可人”之类对他们来说有点复杂的东西,那我不如返璞归真,使用配置文件储存需要启用的群。
      低情商: 反正需求不高,懒得学权限系统怎么用。

      用法

      机器人必须是群主!!!

      @机器人 我要头衔 头衔名称
      

      命令可以在配置文件的cmd那里设置,在输入命令时可以不打空格

      捐助

      前往 爱发电 捐助我。

      来自群组: SkyNet1748

      发布在 插件发布
      MrXiaoM
      MrXiaoM
    • 1
    • 2
    • 36
    • 37
    • 38
    • 39
    • 40
    • 43
    • 44
    • 38 / 44