MiraiForum

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

    kagg886 创建的主题

    • K

      使用 Spring Websocket 托管 Overflow 默认的WebSocket实现
      摸鱼区 • • kagg886

      2
      0
      赞同
      2
      帖子
      516
      浏览

      K

      适用于只使用overflow-core开发bot,并且使用spring自带的IoC能力的一套ws解决方案。可以避免早期overflow版本中反向websocket存在的各种问题。

      定义handler class WSHandler : WebSocketHandler, IAdapter { override val scope = CoroutineScope(Dispatchers.IO) + SupervisorJob() override val logger: Logger = LoggerFactory.getLogger(ActionHandler::class.java) override val actionHandler: ActionHandler = ActionHandler(scope.coroutineContext[Job], logger) init { top.mrxiaom.overflow.internal.Overflow.setup() log.info("Youmu WebSocket 已接管默认Overflow Bot Handler,WSBufferSize: ${System.getProperty("org.apache.tomcat.websocket.DEFAULT_BUFFER_SIZE")}") } override fun afterConnectionEstablished(session: WebSocketSession) { //在这里进行鉴权 scope.launch { val botImpl = Bot( SpringDelegatedWebSocket(session), BotConfig(), actionHandler ) val versionInfo = botImpl.getVersionInfo() if (botImpl.onebotVersion == 12) { session.close(CloseStatus.PROTOCOL_ERROR.withReason("不支持的onebot版本:12")) return@launch } net.mamoe.mirai.Bot.getInstanceOrNull(botImpl.id)?.getOriginChannel() ?.close(CloseStatus.NORMAL.withReason("当前连接下线")) val bot = with(BotWrapper) { val result = runCatching { botImpl.wrap( configuration = BotConfiguration { botLoggerSupplier = { LoggerFactory.getLogger("Bot#${botImpl.id}").asMiraiLogger() } networkLoggerSupplier = { LoggerFactory.getLogger("Net#${botImpl.id}").asMiraiLogger() } } ) } if (result.isFailure) { session.close(CloseStatus.PROTOCOL_ERROR.withReason("无法实例化bot")) return@launch } result.getOrThrow() } log.info("Bot ${bot.id} 已连接,协议版本信息:$versionInfo") net.mamoe.mirai.Bot._instances[botImpl.id] = bot } } override fun handleMessage(session: WebSocketSession, message: WebSocketMessage<*>) { if (message is TextMessage) { val text = message.payload onReceiveMessage(text) } } override fun handleTransportError(session: WebSocketSession, exception: Throwable) { } @OptIn(MiraiInternalApi::class) override fun afterConnectionClosed(session: WebSocketSession, closeStatus: CloseStatus) { val bot = net.mamoe.mirai.Bot.instances.find { it.getOriginChannel() == session } if (bot !== null) { bot as BotWrapper bot.eventDispatcher.broadcastAsync(BotOfflineEvent.Dropped(bot, cause = RuntimeException("连接断开"))) net.mamoe.mirai.Bot._instances.remove(bot.id) log.info("${bot.id}断开连接") } } override fun supportsPartialMessages(): Boolean = false } 定义ws session的wrapper。overflow中未使用的方法均可以使用TODO替代。 class SpringDelegatedWebSocket(val delegated: WebSocketSession) : WebSocket { override fun close(p0: Int, p1: String?) { delegated.close(CloseStatus(p0, p1)) } override fun close(p0: Int) { delegated.close(CloseStatus(p0)) } override fun close() { delegated.close() } override fun closeConnection(p0: Int, p1: String?) { delegated.close(CloseStatus(p0, p1)) } override fun send(p0: String?) { delegated.sendMessage(TextMessage(p0!!)) } override fun send(p0: ByteBuffer?) { delegated.sendMessage(BinaryMessage(p0!!)) } override fun send(p0: ByteArray?) { delegated.sendMessage(BinaryMessage(p0!!)) } override fun sendFrame(p0: Framedata?) { TODO("Not yet implemented") } override fun sendFrame(p0: MutableCollection<Framedata>?) { TODO("Not yet implemented") } override fun sendPing() { delegated.sendMessage(PingMessage()) } override fun sendFragmentedFrame(p0: Opcode?, p1: ByteBuffer?, p2: Boolean) { TODO("Not yet implemented") } override fun hasBufferedData(): Boolean { TODO("Not yet implemented") } override fun getRemoteSocketAddress(): InetSocketAddress = delegated.remoteAddress!! override fun getLocalSocketAddress(): InetSocketAddress = delegated.localAddress!! override fun isOpen(): Boolean = delegated.isOpen override fun isClosing(): Boolean = !isOpen override fun isFlushAndClose(): Boolean { TODO("Not yet implemented") } override fun isClosed(): Boolean = !isOpen override fun getDraft(): Draft { TODO("Not yet implemented") } override fun getReadyState(): ReadyState { TODO("Not yet implemented") } override fun getResourceDescriptor(): String { TODO("Not yet implemented") } override fun <T : Any?> setAttachment(p0: T) { TODO("Not yet implemented") } override fun <T : Any?> getAttachment(): T { TODO("Not yet implemented") } override fun hasSSLSupport(): Boolean { TODO("Not yet implemented") } override fun getSSLSession(): SSLSession { TODO("Not yet implemented") } override fun getProtocol(): IProtocol { TODO("Not yet implemented") } } 最后自行注册即可 @Configuration @EnableWebSocket class WSConfig:WebSocketConfigurer { override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) { registry.addHandler( WSHandler(), "bot" ) } } 补一个上文中出现的工具类 @file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") package top.kagg886.youmu.backend.socket import net.mamoe.mirai.Bot import org.springframework.web.socket.WebSocketSession import top.kagg886.youmu.bot.internal.spring.SpringDelegatedWebSocket import top.mrxiaom.overflow.internal.contact.BotWrapper import kotlin.reflect.KProperty1 import kotlin.reflect.full.memberProperties import kotlin.reflect.jvm.isAccessible fun Bot.getOriginChannel(): WebSocketSession { val prop = BotWrapper::class.memberProperties.first { it.name == "implBot" } as KProperty1<BotWrapper, cn.evolvefield.onebot.client.core.Bot> prop.isAccessible = true val wrapper = prop.get(this as BotWrapper).channel return (wrapper as SpringDelegatedWebSocket).delegated }

      最后附赠一套使用此方案部署在公网上的反向websocket bot:

      wss://youmu.kagg886.top/bot

      接入教程见此:部署bot

    • K

      舞萌DX开字母游戏插件
      插件发布 • • kagg886

      1
      0
      赞同
      1
      帖子
      676
      浏览

      K

      注:虽然名字叫舞萌开字母,但是曲库是可以自定义的。即自定义的曲库也可以是别的引诱甚至是混合的

      一.下载地址

      https://github.com/kagg886/maimai-opening-song-game/releases

      二. 食用说明

      在群内发送:舞萌开字母以开启一个新游戏。

      <注>:一个群仅允许运行一个猜曲名实例。

      在群内发送:开字母 一个字 以获得部分提示

      <注>:这个字可以是数字可以是英文可以是标点符号甚至可以是日文

      如果你知道了这是哪个曲子,那么请发送回答 id/别名/名字以进行回答,回答成功后该曲目将会被完全解禁。

      重复2,3步骤,直到所有曲目完全解禁。此时会提示游戏结束,并放出猜正确曲目的排行榜

      实在猜不出来了怎么办呢?发送公布答案以关闭这个游戏!

      三.配置文件,指令

      翻阅插件项目即可查看:项目地址

      四. 扣扣交流群

      973510746

    • K

      舞萌DX整合包
      其他项目发布 • • kagg886

      1
      0
      赞同
      1
      帖子
      555
      浏览

      K

      有个朋友找我做一个,然后我就顺手做了一个(

      使用教程在压缩包里,
      压缩包加群下载:572360632
      QQ截图20230408205337.png

    • K

      移动端扫码登录
      项目发布 • • kagg886

      2
      0
      赞同
      2
      帖子
      1378
      浏览

      K

      我等不及了我现在就想体验扫码登录

      一.演示:

      source.gif

      二.链接地址:

      安装包(国内):https://gitee.com/kagg886/Seiko/releases
      源代码(国外):https://github.com/kagg886/Seiko

      三.已知bug:

      登录确认页面取消后,不能重新登录。

      四.关于Seiko:

      https://mirai.mamoe.net/topic/1899/

    • K

      SeikoDIC | 基于自制伪代码引擎的指令编写插件
      插件发布 • jvm java mirai-console 词库 plugin • • kagg886

      4
      0
      赞同
      4
      帖子
      1169
      浏览

      K

      Seiko Dictionary Plugin

      一个基于mirai和mirai-console的插件。用于0基础人士编写指令

      开源地址:https://github.com/kagg886/Seiko/tree/master/ConsolePlugin

      特性 仅需两行文本即可构建一个自动回复的单元。若想制作一个自动回复的bot,该插件会让你特别舒服的编写自定义回复脚本 支持在发送的消息内添加变量 支持简单的控制流语句 支持使用函数 语法简洁,学习成本低。对语法不敏感 部署

      https://github.com/kagg886/Seiko/blob/master/ConsolePlugin/README.md

      教程

      https://github.com/kagg886/Seiko/blob/master/DictionaryCore/README.md

      贡献

      欢迎任何对此项目感兴趣的人们贡献这个项目。

      贡献的方式包括但不限于:

      反馈 BUG。可以在Github提出issue,也可以在本主题下回复~~(不推荐使用此方式,因为论坛我不常上)~~,向我邮件也是一件选择(邮件地址:iveour@163.com) 在Github提出PR申请。我会认真的审计每一行代码。 修改文档,使文档变得更加的严谨。 编写SeikoDIC可以运行的伪代码。因为更多的使用意味着更多的潜在bug会被发现,这样会有利于SeikoDIC的发展
    • K

      Seiko——将使用Mirai-CoreAPI的应用直接迁移到Android上
      项目发布 • • kagg886

      2
      2
      赞同
      2
      帖子
      825
      浏览

      K

      一.标题没看懂是怎么回事

      如果你的项目仅使用了Mirai-CoreAPI,但最近希望将其迁移进Android中,那么Seiko可以解决滑动验证,Bot保活等问题。

      二.了解更多

      前往Seiko的Github仓库预览源代码
      前往Seiko的Realease下载Seiko

    • K

      Seiko开发日记
      摸鱼区 • • kagg886

      4
      0
      赞同
      4
      帖子
      300
      浏览

      K

      Seiko是什么?

      Seiko可以在Android上使用Mirai登录BOT的APP

      在哪里下载?

      前往Seiko的repo以下载:
      源代码
      打包APK

      接下来的几L里,会不定时发帖umm...

    • K

      mirai打包报错
      开发交流 • • kagg886

      1
      0
      赞同
      1
      帖子
      178
      浏览

      K

      QQ截图20220204130110.jpg
      如题,编辑器是不报红的
      非水 在线等

    • K

      关于音乐卡片中预览图被替换的问题
      开发交流 • • kagg886

      2
      0
      赞同
      2
      帖子
      288
      浏览

      K

      {\"app\":\"com.tencent.structmsg\",\"desc\":\"QQ新版红包\",\"view\":\"news\",\"ver\":\"0.0.0.1\",\"prompt\":\"wwww\",\"appID\":\"\",\"sourceName\":\"\",\"actionData\":\"\",\"actionData_A\":\"\",\"sourceUrl\":\"\",\"meta\":{\"news\":{\"action\":\"\",\"desc\":\"asd\",\"android_pkg_name\":\"\",\"jumpUrl\":\"baidu.com\",\"preview\":\"" + m + "\",\"title\":\"www\",\"app_type\":1,\"source_icon\":\"\",\"tag\":\"agsgsgsdg\",\"source_url\":\"\",\"appid\":100446242}},\"text\":\"\",\"extraApps\":[],\"sourceAd\":\"\",\"extra\":\"\"}");

      m代表着一个图片url,这个url是我的服务器上的一个图片地址
      但是在发送后发现这个preview里的图片外链被替换了。
      如何避免这种问题的产生?

    • 1 / 1