ruby-cqhttp 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e05ea3a7529706ede1358efa6735e455e8ca125242beab7107145ba78032f9b
4
- data.tar.gz: 9aeeb36d26f766ee178aff75920e60256a8b7d38f9b26731ac89dc9c0f07eefc
3
+ metadata.gz: b423809199376adf6d399e697c3e1e9129453815a92aa5308df2b05e49844c63
4
+ data.tar.gz: 1f979eac7d6f35a094b7ca2e966b30e95583b953c0154d96a93d9f0af5e6721e
5
5
  SHA512:
6
- metadata.gz: 0fbf62999904bee4c4c3811be5ab6ad315e0ef1b10a057ac4d6ea117a982c3a353c9b614283369bb58103c1f80dcedd67c6d126417fe4603c3ed5c41b8958ac6
7
- data.tar.gz: 9d5b13fb23d8f0334cf57aea46ed33e60978c517026755f8bf6880c7ac6c5fd13115ec08f378af20a8505cec64d3444a2e1b81b7f9e21b2cd2d537d480cbf159
6
+ metadata.gz: 7f0ed93f862d094a9dc0240e02ae1409f60c63a00edd1670ae2b89deaae8165b7591b6861f50e370ed6e21d38f734f3e4a86b476ccc6516622aca55e1e8ee81f
7
+ data.tar.gz: 1caf072fa4d44e77c6a41e6b1bf3ed102687074f5a07ad14317986109b0a337fcc89fc0ab5ac0158dcddee67c27e2c8526f709994a1660c1fc86ff86974e7af0
data/.bundle/config ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_PATH: "vendor/bundle"
data/.gitignore CHANGED
@@ -1,2 +1,11 @@
1
- ruby-cqhttp-*.gem
2
- Gemfile.lock
1
+ ruby-cqhttp-*.gem
2
+ Gemfile.lock
3
+
4
+ # debug files
5
+ data/
6
+ logs/
7
+ vendor/
8
+ go-cqhttp*
9
+ session.token
10
+ device.json
11
+ config.yml
data/.rubocop.yml ADDED
@@ -0,0 +1,27 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.2
3
+ NewCops: enable
4
+ Naming/VariableName:
5
+ Enabled: false
6
+ Naming/MethodName:
7
+ Enabled: false
8
+ Naming/FileName:
9
+ Enabled: false
10
+ Style/AsciiComments:
11
+ Enabled: false
12
+ Style/FrozenStringLiteralComment:
13
+ Enabled: false
14
+ Style/Documentation:
15
+ Enabled: false
16
+ Layout/LineLength:
17
+ Enabled: false
18
+ Naming/MethodParameterName:
19
+ Enabled: false
20
+ Metrics/MethodLength:
21
+ Enabled: false
22
+ Metrics/AbcSize:
23
+ Enabled: false
24
+ Metrics/ClassLength:
25
+ Enabled: false
26
+ Metrics/CyclomaticComplexity:
27
+ Enabled: false
data/Gemfile CHANGED
@@ -1,11 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
6
-
7
- gem 'faye-websocket'
8
- gem 'eventmachine'
9
- gem 'json'
10
- gem 'event_emitter'
11
- gem 'uri', '~> 0.10.1'
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
+
7
+ gem 'event_emitter'
8
+ gem 'eventmachine', platform: :ruby
9
+ gem 'faye-websocket'
10
+ gem 'json'
11
+ gem 'puma'
12
+ gem 'rack'
13
+ gem 'solargraph'
data/README.md CHANGED
@@ -1,61 +1,70 @@
1
- # RUBY-CQHTTP
2
-
3
- [![Gem Version](https://badge.fury.io/rb/ruby-cqhttp.svg)](https://badge.fury.io/rb/ruby-cqhttp)
4
- [![yard docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://rubydoc.info/github/fantasyzhjk/ruby-cqhttp)
5
-
6
- 一个基于 OneBot 标准的 QQ 机器人框架
7
-
8
- Ruby QQ 机器人!
9
-
10
- 本库还在快速迭代更新中。。
11
-
12
- ## 使用
13
-
14
- 安装
15
-
16
- $ gem install ruby-cqhttp
17
-
18
- 或者
19
-
20
- 在 `Gemfile` 中添加
21
-
22
- ```ruby
23
- gem 'ruby-cqhttp'
24
- ```
25
-
26
- 然后运行
27
-
28
- $ bundle
29
-
30
- ## 示例
31
-
32
- ```ruby
33
- require 'ruby-cqhttp'
34
-
35
- CQHttp::Bot.connect host: '127.0.0.1', port: 6700 do |bot|
36
- bot.on :logged do |botQQ|
37
- CQHttp::Utils.log('我开了欸')
38
- end
39
-
40
- bot.on :message do |msg, sdr, tar|
41
- CQHttp::Utils.log('我收到消息了欸')
42
- end
43
-
44
- # 获取并发出好友撤回的消息
45
- bot.on :notice do |notice_type, data|
46
- if notice_type == 'friend_recall'
47
- req = CQHttp::Api.get_msg data['message_id']
48
- bot.sendPrivateMessage req['message'], req['sender']['user_id']
49
- end
50
- end
51
-
52
- # 自动同意群邀请和好友请求
53
- bot.on :request do |request_type, data|
54
- if request_type == 'group'
55
- CQHttp::Api.acceptGroupRequest(data['flag'], data['sub_type']) if data['sub_type'] == 'invite'
56
- elsif request_type == 'friend'
57
- CQHttp::Api.acceptFriendRequest(data['flag'])
58
- end
59
- end
60
- end
61
- ```
1
+ # ruby-cqhttp
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/ruby-cqhttp.svg)](https://badge.fury.io/rb/ruby-cqhttp)
4
+ [![yard docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://www.rubydoc.info/gems/ruby-cqhttp/)
5
+
6
+ ![图标](https://raw.githubusercontent.com/fantasyzhjk/ruby-cqhttp/main/icon.png)
7
+
8
+ 一个基于 OneBot 标准的 QQ 机器人框架
9
+
10
+ 用 Ruby 写 QQ 机器人!
11
+
12
+ 本库还在快速迭代更新中。。(咕了
13
+
14
+ ## 使用
15
+
16
+ 安装
17
+
18
+ $ gem install ruby-cqhttp
19
+
20
+ 或者
21
+
22
+ 在 `Gemfile` 中添加
23
+
24
+ ```ruby
25
+ gem 'ruby-cqhttp'
26
+ ```
27
+
28
+ 然后运行
29
+
30
+ $ bundle
31
+
32
+ ## 示例
33
+
34
+ ```ruby
35
+ require 'onebot-ruby'
36
+
37
+ logger = Onebot::Logging::Logger.new().setLoggerLevel(Logger::INFO) # 如果需要 logger 可以直接建立
38
+ api = Onebot::Http::API.new().setLogger(logger)
39
+
40
+ Onebot::Core.connect url: "ws://127.0.0.1:6700", logger: logger do |bot|
41
+ bot.on :logged do |botQQ|
42
+ logger.log('我开了欸')
43
+ end
44
+
45
+ bot.on :message do |session|
46
+ logger.log('我收到消息了欸')
47
+ # 复读
48
+ bot.sendMessage(session.message, session)
49
+ end
50
+
51
+ # 获取并发出好友撤回的消息
52
+ bot.on :notice do |notice_type, data|
53
+ if notice_type == 'friend_recall'
54
+ req = bot.get_msg(data.message_id)
55
+ bot.sendPrivateMessage req.message, req.sender.user_id
56
+ end
57
+ end
58
+
59
+ # 自动同意群邀请和好友请求
60
+ bot.on :request do |request_type, data|
61
+ if request_type == 'group'
62
+ api.acceptGroupRequest(data.flag, data.sub_type) if data.sub_type == 'invite'
63
+ elsif request_type == 'friend'
64
+ api.acceptFriendRequest(data.flag)
65
+ end
66
+ end
67
+ end
68
+ ```
69
+
70
+ **具体使用方法请查看 tests*
data/icon.png ADDED
Binary file
data/lib/Core/Core.rb ADDED
@@ -0,0 +1,19 @@
1
+ module Onebot
2
+ # 消息处理,ws连接
3
+ #
4
+ # Example:
5
+ # Onebot::Core.connect host: host, port: port {|bot| ... }
6
+ class Core
7
+ # 新建连接
8
+ #
9
+ # @param host [String]
10
+ # @param port [Number]
11
+ # @return [WebSocket]
12
+ def self.connect(url:, logger: nil, protocols: nil, options: {})
13
+ client = ::Onebot::WebSocket::Client.new(url:, logger:)
14
+ yield client if block_given?
15
+ client.connect(protocols, options)
16
+ client
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,183 @@
1
+ module Onebot
2
+ # OneBot标准API
3
+ # [OneBot文档] (https://github.com/howmanybots/onebot)
4
+ #
5
+ # Example:
6
+ # Onebot::Api.getImage file
7
+ module Http
8
+ class API
9
+ # @return [URI] HTTP API链接
10
+ attr_accessor :url
11
+
12
+ # (初始化) 设置API地址
13
+ #
14
+ # @param apiIp [String]
15
+ # @param apiPort [Number]
16
+ # @return [URI]
17
+ def initialize(apiIp: '127.0.0.1', apiPort: 5700)
18
+ @url = URI::HTTP.build(host: apiIp, port: apiPort)
19
+ @logger = Logging::EventLogger.new
20
+ end
21
+
22
+ def setLogger(logger)
23
+ @logger = Logging::EventLogger.new(logger)
24
+ self
25
+ end
26
+
27
+ # 设置群名
28
+ #
29
+ # @param group_id [Number]
30
+ # @param group_name [String]
31
+ # @param url [URI]
32
+ # @return [Hash]
33
+ def setGroupName(group_id, group_name)
34
+ data = send('set_group_name', { group_id: group_id.to_i, group_name: })
35
+ if data['status'] == 'ok'
36
+ @logger.log '设置群头像成功'
37
+ else
38
+ @logger.log '设置群头像失败', Logger::WARN
39
+ end
40
+ data['data']
41
+ end
42
+
43
+ # 获取图片信息
44
+ #
45
+ # @param file [String]
46
+ # @param url [URI]
47
+ # @return [Hash]
48
+ def getImage(file)
49
+ data = send('get_image', { file: })
50
+ if data['status'] == 'ok'
51
+ @logger.log '下载图片成功'
52
+ else
53
+ @logger.log '下载图片失败', Logger::WARN
54
+ end
55
+ data['data']
56
+ end
57
+
58
+ # 获取消息
59
+ #
60
+ # @param message_id [Number]
61
+ # @param url [URI]
62
+ # @return [Hash]
63
+ def get_msg(message_id)
64
+ data = send('get_msg', { message_id: })
65
+ if data['status'] == 'ok'
66
+ @logger.log '消息获取成功'
67
+ else
68
+ @logger.log '消息获取失败', Logger::WARN
69
+ end
70
+ data['data']
71
+ end
72
+
73
+ # 发送私聊消息
74
+ #
75
+ # @param msg [String]
76
+ # @param user_id [Number]
77
+ # @param url [URI]
78
+ # @return [Hash]
79
+ def sendPrivateMessage(msg, user_id)
80
+ data = send('send_private_msg', { user_id:, message: msg })
81
+ if data['status'] == 'ok'
82
+ message_id = data['data']['message_id']
83
+ @logger.log "发送至私聊 #{user_id} 的消息: #{msg} (#{message_id})"
84
+ else
85
+ @logger.log '发送消息失败', Logger::WARN
86
+ end
87
+ data['data']
88
+ end
89
+
90
+ # 发送群聊消息
91
+ #
92
+ # @param msg [String]
93
+ # @param group_id [Number]
94
+ # @param url [URI]
95
+ # @return [Hash]
96
+ def sendGroupMessage(msg, group_id)
97
+ data = send('send_group_msg', { group_id:, message: msg })
98
+ if data['status'] == 'ok'
99
+ message_id = data['data']['message_id']
100
+ @logger.log "发送至群 #{group_id} 的消息: #{msg} (#{message_id})"
101
+ else
102
+ @logger.log '发送消息失败', Logger::WARN
103
+ end
104
+ data['data']
105
+ end
106
+
107
+ # 接受好友邀请
108
+ #
109
+ # @param flag [String]
110
+ # @param reason [String]
111
+ # @param url [URI]
112
+ # @return [Boolean]
113
+ def acceptFriendRequest(flag, reason = nil)
114
+ data = send('set_friend_add_request', { flag:, approve: true, remark: reason })
115
+ if data['status'] == 'ok'
116
+ @logger.log '已通过好友请求'
117
+ true
118
+ else
119
+ @logger.log '请求通过失败', Logger::WARN
120
+ false
121
+ end
122
+ end
123
+
124
+ # 拒绝好友邀请
125
+ #
126
+ # @param flag [String]
127
+ # @param url [URI]
128
+ # @return [Boolean]
129
+ def refuseFriendRequest(flag)
130
+ data = send('set_friend_add_request', { flag:, approve: false })
131
+ if data['status'] == 'ok'
132
+ @logger.log '已拒绝好友请求'
133
+ true
134
+ else
135
+ @logger.log '请求拒绝失败', Logger::WARN
136
+ false
137
+ end
138
+ end
139
+
140
+ # 接受加群请求
141
+ #
142
+ # @param flag [String]
143
+ # @param sub_type [String]
144
+ # @param url [URI]
145
+ # @return [Boolean]
146
+ def acceptGroupRequest(flag, sub_type)
147
+ data = send('set_group_add_request', { flag:, sub_type:, approve: true })
148
+ if data['status'] == 'ok'
149
+ @logger.log '已通过加群请求'
150
+ true
151
+ else
152
+ @logger.log '请求通过失败', Logger::WARN
153
+ false
154
+ end
155
+ end
156
+
157
+ # 拒绝加群请求
158
+ #
159
+ # @param flag [String]
160
+ # @param sub_type [String]
161
+ # @param reason [String]
162
+ # @param url [URI]
163
+ # @return [Boolean]
164
+ def refuseGroupRequest(flag, sub_type, reason = nil)
165
+ data = send('set_group_add_request', { flag:, sub_type:, approve: false, reason: })
166
+ if data['status'] == 'ok'
167
+ @logger.log '已拒绝加群请求'
168
+ true
169
+ else
170
+ @logger.log '请求拒绝失败', Logger::WARN
171
+ false
172
+ end
173
+ end
174
+
175
+ private
176
+
177
+ def send(action, params, url = @url)
178
+ url.path = action
179
+ JSON.parse(Utils.httpPost(url, params.to_json))
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,101 @@
1
+ module Onebot
2
+ module Logging
3
+ class EventLogger
4
+ def initialize(logger = nil)
5
+ @logger = logger
6
+ end
7
+
8
+ def log(str, severity = ::Logger::INFO, app = 'Onebot')
9
+ return if @logger.nil?
10
+
11
+ @logger.log(str, severity, app)
12
+ end
13
+
14
+ #
15
+ # 消息解析部分
16
+ #
17
+ def dataParse(msg)
18
+ return if @logger.nil?
19
+
20
+ # 连接成功
21
+ @selfID = msg.self_id if msg.meta_event_type == 'lifecycle' && msg.sub_type == 'connect'
22
+ @logger.log(msg.to_json, ::Logger::DEBUG) if msg.meta_event_type != 'heartbeat' # 过滤心跳
23
+ case msg.post_type
24
+ #
25
+ # 请求事件
26
+ #
27
+ when 'request'
28
+ onReq(msg)
29
+ #
30
+ # 提醒事件
31
+ #
32
+ when 'notice'
33
+ onNotice(msg)
34
+ #
35
+ # 消息事件
36
+ #
37
+ when 'message'
38
+ onMsg(msg)
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def onMsg(msg)
45
+ if msg.message_type == 'group' # 判断是否为群聊
46
+ @logger.log "收到群 #{msg.group_id} 内 #{msg.sender.nickname}(#{msg.user_id}) 的消息: #{msg.raw_message} (#{msg.message_id})"
47
+ else
48
+ @logger.log "收到好友 #{msg.sender.nickname}(#{msg.user_id}) 的消息: #{msg.raw_message} (#{msg.message_id})"
49
+ end
50
+ end
51
+
52
+ def onReq(msg)
53
+ case msg.request_type
54
+ when 'group'
55
+ if msg.sub_type == 'add'
56
+ @logger.log "收到用户 #{msg.user_id} 加群 #{msg.group_id} 的请求 (#{msg.flag})" # 加群请求
57
+ end
58
+ if msg.sub_type == 'invite'
59
+ @logger.log "收到用户 #{msg.user_id} 的加群 #{msg.group_id} 请求 (#{msg.flag})" # 加群邀请
60
+ end
61
+ when 'friend' # 加好友邀请
62
+ @logger.log "收到用户 #{msg.user_id} 的好友请求 (#{msg.flag})"
63
+ end
64
+ end
65
+
66
+ def onNotice(msg)
67
+ case msg.notice_type
68
+ when 'group_admin' # 群管理员变动
69
+ @logger.log "群 #{msg.group_id} 内 #{msg.user_id} 成了管理员" if msg.sub_type == 'set' # 设置管理员
70
+ @logger.log "群 #{msg.group_id} 内 #{msg.user_id} 没了管理员" if msg.sub_type == 'unset' # 取消管理员
71
+ when 'group_increase' # 群成员增加
72
+ if msg.sub_type == 'approve'
73
+ @logger.log "#{msg.operator_id} 已同意 #{msg.user_id} 进入了群 #{msg.group_id}" # 管理员已同意入群
74
+ end
75
+ if msg.sub_type == 'invite'
76
+ @logger.log "#{msg.operator_id} 邀请 #{msg.user_id} 进入了群 #{msg.group_id}" # 管理员邀请入群
77
+ end
78
+ when 'group_decrease' # 群成员减少
79
+ @logger.log "被 #{msg.operator_id} 踢出了群 #{msg.group_id}" if msg.sub_type == 'kick_me' # 登录号被踢
80
+ if msg.sub_type == 'kick'
81
+ @logger.log "#{msg.user_id} 被 #{msg.operator_id} 踢出了群 #{msg.group_id}" # 成员被踢
82
+ end
83
+ @logger.log "#{msg.operator_id} 退出了群 #{msg.group_id}" if msg.sub_type == 'leave' # 主动退群
84
+ when 'group_ban' # 群禁言
85
+ if msg.sub_type == 'ban'
86
+ @logger.log "群 #{msg.group_id} 内 #{msg.user_id} 被 #{msg.operator_id} 禁言了 #{msg.duration} 秒" # 禁言
87
+ end
88
+ if msg.sub_type == 'lift_ban'
89
+ @logger.log "群 #{msg.group_id} 内 #{msg.user_id} 被 #{msg.operator_id} 解除禁言" # 解除禁言
90
+ end
91
+ when 'friend_add' # 好友添加
92
+ @logger.log "#{msg.user_id} 成了你的好友"
93
+ when 'group_recall' # 群消息撤回
94
+ @logger.log "群 #{msg.group_id} 内 #{msg.user_id} 撤回了一条消息 (#{msg.message_id})"
95
+ when 'friend_recall' # 好友消息撤回
96
+ @logger.log "好友 #{msg.user_id} 撤回了一条消息 (#{msg.message_id})"
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,58 @@
1
+ module Onebot
2
+ module Logging
3
+ class Logger
4
+ # @!method stdLogger
5
+ # @return [Logger] 终端Logger
6
+ # @!method fileLogger
7
+ # @return [Logger] 文件Logger
8
+ # @!method loggerFile
9
+ # @return [String] Logger文件地址
10
+ attr_accessor :stdLogger, :fileLogger, :loggerFile
11
+
12
+ # 初始化日志
13
+ #
14
+ # @param loggerFile [String]
15
+ def initialize(loggerFile = nil)
16
+ @loggerFile = loggerFile
17
+ @stdLogger = setLogger(::Logger.new($stdout))
18
+ @fileLogger = setLogger(::Logger.new(@loggerFile, 'daily')) if @loggerFile
19
+ end
20
+
21
+ # 设置日志等级
22
+ #
23
+ # @param loggerLevel [String]
24
+ def setLoggerLevel(loggerLevel)
25
+ @stdLogger.level = loggerLevel
26
+ @fileLogger.level = loggerLevel if @loggerFile
27
+ self
28
+ end
29
+
30
+ # 输出日志
31
+ #
32
+ # @param str [String]
33
+ # @param severity [Logger::INFO, Logger::DEBUG, Logger::WARN, Logger::ERROR]
34
+ # @param app [String]
35
+ def log(str, severity = ::Logger::INFO, app = 'Onebot')
36
+ @stdLogger.log(severity, str, app)
37
+ @fileLogger.log(severity, str, app) if @loggerFile
38
+ end
39
+
40
+ private
41
+
42
+ # 设置logger
43
+ def setLogger(logger)
44
+ logger.level = 'INFO'
45
+ logger.formatter = proc do |severity, datetime, progname, msg|
46
+ if progname.nil?
47
+ "[#{datetime.strftime('%Y-%m-%d %H:%M:%S')}][#{severity}]: #{msg.to_s.gsub(/\n/, '\n').gsub(/\r/, '\r')}\n"
48
+ else
49
+ "[#{datetime.strftime('%Y-%m-%d %H:%M:%S')}][#{progname}][#{severity}]: #{msg.to_s.gsub(/\n/, '\n').gsub(
50
+ /\r/, '\r'
51
+ )}\n"
52
+ end
53
+ end
54
+ logger
55
+ end
56
+ end
57
+ end
58
+ end
data/lib/Core/Utils.rb ADDED
@@ -0,0 +1,85 @@
1
+ module Onebot
2
+ # 各种工具包
3
+ #
4
+ # Example:
5
+ # Onebot::Utils.log str, Logger::INFO
6
+ module Utils
7
+ extend self
8
+ # post发包
9
+ #
10
+ # @param url [URI]
11
+ # @param ret [String]
12
+ # @return [String]
13
+ def httpPost(url, ret)
14
+ req = Net::HTTP::Post.new(url.path, { 'Content-Type' => 'application/json' })
15
+ req.body = ret
16
+ res = Net::HTTP.start(url.hostname, url.port) do |http|
17
+ http.request(req)
18
+ end
19
+ res.body
20
+ end
21
+
22
+ alias post httpPost
23
+ # 消息转义
24
+ # & -> &
25
+ # [ -> [
26
+ # ] -> ]
27
+ #
28
+ # @param msg [String]
29
+ # @return [String]
30
+ def cqEscape(msg)
31
+ msg.gsub!('&', '&')
32
+ msg.gsub!('[', '[')
33
+ msg.gsub!(']', ']')
34
+ msg
35
+ end
36
+
37
+ # 消息反转义
38
+ # & -> &
39
+ # [ -> [
40
+ # ] -> ]
41
+ #
42
+ # @param msg [String]
43
+ # @return [String]
44
+ def cqUnescape(msg)
45
+ msg.gsub!('&', '&')
46
+ msg.gsub!('[', '[')
47
+ msg.gsub!(']', ']')
48
+ msg
49
+ end
50
+
51
+ # CQ码解析, 将字符串格式转换成 Onebot v11 的消息段数组格式
52
+ #
53
+ # @param cqmsg [String]
54
+ # @return [Array]
55
+ def cqParse(cqmsg)
56
+ msgary = []
57
+ cqary = cqmsg.scan(/\[CQ:(.*?),(.*?)\]/m)
58
+ isCode = false
59
+ i = 0
60
+ temp = ''
61
+ cqmsg.each_char do |c|
62
+ if isCode
63
+ if c == ']'
64
+ isCode = false
65
+ matches = cqary[i]
66
+ cqcode = { type: matches[0], data: {} }
67
+ matches[1].split(',').each do |arg|
68
+ args = arg.split('=')
69
+ cqcode[:data][args[0].to_sym] = args[1]
70
+ end
71
+ msgary << cqcode
72
+ end
73
+ elsif c == '['
74
+ msgary << { type: 'text', data: { text: cqEscape(temp) } }
75
+ temp = ''
76
+ isCode = true
77
+ else
78
+ temp << c
79
+ end
80
+ end
81
+ msgary << { type: 'text', data: { text: cqEscape(temp) } } unless temp.empty?
82
+ msgary
83
+ end
84
+ end
85
+ end