ruby-cqhttp 0.0.7 → 0.1.3

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: f4ded7c0bb8d8255401a9d13b5c98eafdba3324f7221bf6ef4e1c0bf7646ba8e
4
+ data.tar.gz: 2cc88a1e903da48f2b74859f3f7bc8a7c5cc2292d70061f219d528c1b90ead2e
5
5
  SHA512:
6
- metadata.gz: 0fbf62999904bee4c4c3811be5ab6ad315e0ef1b10a057ac4d6ea117a982c3a353c9b614283369bb58103c1f80dcedd67c6d126417fe4603c3ed5c41b8958ac6
7
- data.tar.gz: 9d5b13fb23d8f0334cf57aea46ed33e60978c517026755f8bf6880c7ac6c5fd13115ec08f378af20a8505cec64d3444a2e1b81b7f9e21b2cd2d537d480cbf159
6
+ metadata.gz: 8e2d94cbf60ef8697ac9a8fef81a46051939f2daac915ddb4b8b6d31193ef4cd87acfb27686c4762680e0ffbfe53653d4e9ccec2a304fbac9f8b5c604073a795
7
+ data.tar.gz: 5925ec6144d391cded1963e7790907dece0a8c945e269ce0c19c2a8f5e930395e98443c607a871690db8fef6306d4e6ad4722566fb70e79b13631597cb70f5e2
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Zh_Jk
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,61 +1,71 @@
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
+ [![Badge](https://img.shields.io/badge/OneBot-11-black?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAMAAADxPgR5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF////29vbr6+vAAAAk1hCcwAAAAR0Uk5T////AEAqqfQAAAKcSURBVHja7NrbctswDATQXfD//zlpO7FlmwAWIOnOtNaTM5JwDMa8E+PNFz7g3waJ24fviyDPgfhz8fHP39cBcBL9KoJbQUxjA2iYqHL3FAnvzhL4GtVNUcoSZe6eSHizBcK5LL7dBr2AUZlev1ARRHCljzRALIEog6H3U6bCIyqIZdAT0eBuJYaGiJaHSjmkYIZd+qSGWAQnIaz2OArVnX6vrItQvbhZJtVGB5qX9wKqCMkb9W7aexfCO/rwQRBzsDIsYx4AOz0nhAtWu7bqkEQBO0Pr+Ftjt5fFCUEbm0Sbgdu8WSgJ5NgH2iu46R/o1UcBXJsFusWF/QUaz3RwJMEgngfaGGdSxJkE/Yg4lOBryBiMwvAhZrVMUUvwqU7F05b5WLaUIN4M4hRocQQRnEedgsn7TZB3UCpRrIJwQfqvGwsg18EnI2uSVNC8t+0QmMXogvbPg/xk+Mnw/6kW/rraUlvqgmFreAA09xW5t0AFlHrQZ3CsgvZm0FbHNKyBmheBKIF2cCA8A600aHPmFtRB1XvMsJAiza7LpPog0UJwccKdzw8rdf8MyN2ePYF896LC5hTzdZqxb6VNXInaupARLDNBWgI8spq4T0Qb5H4vWfPmHo8OyB1ito+AysNNz0oglj1U955sjUN9d41LnrX2D/u7eRwxyOaOpfyevCWbTgDEoilsOnu7zsKhjRCsnD/QzhdkYLBLXjiK4f3UWmcx2M7PO21CKVTH84638NTplt6JIQH0ZwCNuiWAfvuLhdrcOYPVO9eW3A67l7hZtgaY9GZo9AFc6cryjoeFBIWeU+npnk/nLE0OxCHL1eQsc1IciehjpJv5mqCsjeopaH6r15/MrxNnVhu7tmcslay2gO2Z1QfcfX0JMACG41/u0RrI9QAAAABJRU5ErkJggg==)](https://github.com/botuniverse/onebot-11)
4
+ [![Gem Version](https://badge.fury.io/rb/ruby-cqhttp.svg)](https://badge.fury.io/rb/ruby-cqhttp)
5
+ [![yard docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://www.rubydoc.info/github/fantasyzhjk/ruby-cqhttp)
6
+
7
+ ![图标](https://raw.githubusercontent.com/fantasyzhjk/ruby-cqhttp/main/icon.png)
8
+
9
+ 一个基于 OneBot 标准的 QQ 机器人框架
10
+
11
+ 用 Ruby 写 QQ 机器人!
12
+
13
+ 本库还在快速迭代更新中。。(咕了
14
+
15
+ ## 使用
16
+
17
+ 安装
18
+
19
+ $ gem install ruby-cqhttp
20
+
21
+ 或者
22
+
23
+ `Gemfile` 中添加
24
+
25
+ ```ruby
26
+ gem 'ruby-cqhttp'
27
+ ```
28
+
29
+ 然后运行
30
+
31
+ $ bundle
32
+
33
+ ## 示例
34
+
35
+ ```ruby
36
+ require 'onebot-ruby'
37
+
38
+ logger = Onebot::Logging::Logger.new().setLoggerLevel(Logger::INFO) # 如果需要 logger 可以直接建立
39
+ api = Onebot::Http::API.new().setLogger(logger)
40
+
41
+ Onebot::Core.connect url: "ws://127.0.0.1:6700", logger: logger do |bot|
42
+ bot.on :logged do |botQQ|
43
+ logger.log('我开了欸')
44
+ end
45
+
46
+ bot.on :message do |data|
47
+ logger.log('我收到消息了欸')
48
+ # 复读
49
+ bot.sendMessage(data.message, data)
50
+ end
51
+
52
+ # 获取并发出好友撤回的消息
53
+ bot.on :notice do |notice_type, data|
54
+ if notice_type == 'friend_recall'
55
+ req = bot.get_msg(data.message_id)
56
+ bot.sendPrivateMessage req.message, req.sender.user_id
57
+ end
58
+ end
59
+
60
+ # 自动同意群邀请和好友请求
61
+ bot.on :request do |request_type, data|
62
+ if request_type == 'group'
63
+ api.acceptGroupRequest(data.flag, data.sub_type) if data.sub_type == 'invite'
64
+ elsif request_type == 'friend'
65
+ api.acceptFriendRequest(data.flag)
66
+ end
67
+ end
68
+ end
69
+ ```
70
+
71
+ **具体使用方法请查看 examples*
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,174 @@
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 host [String]
15
+ # @param port [Number]
16
+ # @return [URI]
17
+ def initialize(host: '127.0.0.1', port: 5700)
18
+ @url = URI::HTTP.build(host: host, port: port)
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
+ # @return [Hash]
32
+ def setGroupName(group_id, group_name)
33
+ data = sendReq('set_group_name', { group_id: group_id.to_i, group_name: })
34
+ if data['status'] == 'ok'
35
+ @logger.log '设置群头像成功'
36
+ else
37
+ @logger.log '设置群头像失败', Logger::WARN
38
+ end
39
+ data['data']
40
+ end
41
+
42
+ # 获取图片信息
43
+ #
44
+ # @param file [String]
45
+ # @return [Hash]
46
+ def getImage(file)
47
+ data = sendReq('get_image', { file: })
48
+ if data['status'] == 'ok'
49
+ @logger.log '下载图片成功'
50
+ else
51
+ @logger.log '下载图片失败', Logger::WARN
52
+ end
53
+ data['data']
54
+ end
55
+
56
+ # 获取消息
57
+ #
58
+ # @param message_id [Number]
59
+ # @return [Hash]
60
+ def get_msg(message_id)
61
+ data = sendReq('get_msg', { message_id: })
62
+ if data['status'] == 'ok'
63
+ @logger.log '消息获取成功'
64
+ else
65
+ @logger.log '消息获取失败', Logger::WARN
66
+ end
67
+ data['data']
68
+ end
69
+
70
+ # 发送私聊消息
71
+ #
72
+ # @param msg [String]
73
+ # @param user_id [Number]
74
+ # @return [Hash]
75
+ def sendPrivateMessage(msg, user_id)
76
+ data = sendReq('send_private_msg', { user_id:, message: msg })
77
+ if data['status'] == 'ok'
78
+ message_id = data['data']['message_id']
79
+ @logger.log "发送至私聊 #{user_id} 的消息: #{msg} (#{message_id})"
80
+ else
81
+ @logger.log '发送消息失败', Logger::WARN
82
+ end
83
+ data['data']
84
+ end
85
+
86
+ # 发送群聊消息
87
+ #
88
+ # @param msg [String]
89
+ # @param group_id [Number]
90
+ # @return [Hash]
91
+ def sendGroupMessage(msg, group_id)
92
+ data = sendReq('send_group_msg', { group_id:, message: msg })
93
+ if data['status'] == 'ok'
94
+ message_id = data['data']['message_id']
95
+ @logger.log "发送至群 #{group_id} 的消息: #{msg} (#{message_id})"
96
+ else
97
+ @logger.log '发送消息失败', Logger::WARN
98
+ end
99
+ data['data']
100
+ end
101
+
102
+ # 接受好友邀请
103
+ #
104
+ # @param flag [String]
105
+ # @param reason [String]
106
+ # @return [Boolean]
107
+ def acceptFriendRequest(flag, reason = nil)
108
+ data = sendReq('set_friend_add_request', { flag:, approve: true, remark: reason })
109
+ if data['status'] == 'ok'
110
+ @logger.log '已通过好友请求'
111
+ true
112
+ else
113
+ @logger.log '请求通过失败', Logger::WARN
114
+ false
115
+ end
116
+ end
117
+
118
+ # 拒绝好友邀请
119
+ #
120
+ # @param flag [String]
121
+ # @return [Boolean]
122
+ def refuseFriendRequest(flag)
123
+ data = sendReq('set_friend_add_request', { flag:, approve: false })
124
+ if data['status'] == 'ok'
125
+ @logger.log '已拒绝好友请求'
126
+ true
127
+ else
128
+ @logger.log '请求拒绝失败', Logger::WARN
129
+ false
130
+ end
131
+ end
132
+
133
+ # 接受加群请求
134
+ #
135
+ # @param flag [String]
136
+ # @param sub_type [String]
137
+ # @return [Boolean]
138
+ def acceptGroupRequest(flag, sub_type)
139
+ data = sendReq('set_group_add_request', { flag:, sub_type:, approve: true })
140
+ if data['status'] == 'ok'
141
+ @logger.log '已通过加群请求'
142
+ true
143
+ else
144
+ @logger.log '请求通过失败', Logger::WARN
145
+ false
146
+ end
147
+ end
148
+
149
+ # 拒绝加群请求
150
+ #
151
+ # @param flag [String]
152
+ # @param sub_type [String]
153
+ # @param reason [String]
154
+ # @return [Boolean]
155
+ def refuseGroupRequest(flag, sub_type, reason = nil)
156
+ data = sendReq('set_group_add_request', { flag:, sub_type:, approve: false, reason: })
157
+ if data['status'] == 'ok'
158
+ @logger.log '已拒绝加群请求'
159
+ true
160
+ else
161
+ @logger.log '请求拒绝失败', Logger::WARN
162
+ false
163
+ end
164
+ end
165
+
166
+ private
167
+
168
+ def sendReq(action, params, url = @url)
169
+ url.path = '/' << action
170
+ JSON.parse(Utils.httpPost(url, params.to_json))
171
+ end
172
+ end
173
+ end
174
+ 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
+ # &amp; -> &
25
+ # &#91; -> [
26
+ # &#93; -> ]
27
+ #
28
+ # @param msg [String]
29
+ # @return [String]
30
+ def cqEscape(msg)
31
+ msg.gsub!('&amp;', '&')
32
+ msg.gsub!('&#91;', '[')
33
+ msg.gsub!('&#93;', ']')
34
+ msg
35
+ end
36
+
37
+ # 消息反转义
38
+ # & -> &amp;
39
+ # [ -> &#91;
40
+ # ] -> &#93;
41
+ #
42
+ # @param msg [String]
43
+ # @return [String]
44
+ def cqUnescape(msg)
45
+ msg.gsub!('&', '&amp;')
46
+ msg.gsub!('[', '&#91;')
47
+ msg.gsub!(']', '&#93;')
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