rubirai 0.0.3.pre.a1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9af7ce359d2d64f6e7f1228870a74558fc3004b6b5f23257b951c13893ca4599
4
- data.tar.gz: 421a1ecaa61dd1049501873197b01b22fe78bbdc7ef8c38766f20582ee598125
3
+ metadata.gz: 174008ec842a298001749f9dc9650708cf789be436d9bdcde347270edc14b435
4
+ data.tar.gz: 31d528b994fe981b958e02a3847657d4c6b60848ce9778ee6126c1068d90a410
5
5
  SHA512:
6
- metadata.gz: ae1ada8f42c7d9c8df3422262782b2c2a5ee16a8611d104ccd53d78c156430d8e88e9d8bff1283b05bca3c7faf530ab8af71e3ea1cdf81dbfab9b296838bbbc5
7
- data.tar.gz: 9621c881cd3812da59a2c1371c5ed56d87bd8971c6c472c056ce05b1159a37333f1d3701a0b3fe287278fe9e33b5de357baa7f8df4c7bbea554ab93a4c035224
6
+ metadata.gz: a512e0d593a4d59d6988deeab66f671529bd2651e4fecc984c92f6b7da26317b7a87f1259a348fc38dad13bee02600457e5e832f2b947fded5f2439417c3d1d8
7
+ data.tar.gz: '0976747106fbe368257515a5f3164fc190b3f751631fdef68f059655ac624ee7b3d55898b543adaf404e1fa30ae7f4c20a7bfe6283ef00cc8bdf80fe2592c09c'
@@ -7,7 +7,6 @@ on:
7
7
 
8
8
  jobs:
9
9
  publish:
10
- if: github.event.base_ref == 'refs/heads/master'
11
10
  runs-on: ubuntu-latest
12
11
  steps:
13
12
  - uses: actions/checkout@v2
data/README.md CHANGED
@@ -55,8 +55,12 @@ gem install rubirai
55
55
 
56
56
 
57
57
  ## License
58
+
59
+ [AGPL-3.0 License][license]
60
+
58
61
  [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FShimogawa%2Frubirai.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FShimogawa%2Frubirai?ref=badge_large)
59
62
 
60
63
 
61
64
  [wiki]: https://github.com/Shimogawa/rubirai/wiki
62
65
  [rubydocs]: https://www.rebuild.moe/rubirai/
66
+ [license]: LICENSE
data/lib/rubirai.rb CHANGED
@@ -1,3 +1,11 @@
1
+ # Copyright 2021 Rebuild.
2
+ #
3
+ # 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
4
+ # Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
5
+ #
6
+ # https://github.com/Shimogawa/rubirai/blob/master/LICENSE
7
+ #
8
+
1
9
  # frozen_string_literal: true
2
10
 
3
11
  require 'rubirai/errors'
@@ -8,13 +16,14 @@ module Rubirai
8
16
  require 'http'
9
17
 
10
18
  # Bot represents a QQ bot at mirai side. All functions are API calls to the http plugin.
19
+ #
20
+ # @!attribute [r] base_uri
21
+ # @return [String] the base uri of mirai-api-http which the bot will send messages to
22
+ # @!attribute [r] session
23
+ # @return [String] the session key
24
+ # @!attribute [r] qq
25
+ # @return [String, Integer] the qq of the bot
11
26
  class Bot
12
- # @!attribute [r] base_uri
13
- # @return [String] the base uri of mirai-api-http which the bot will send messages to
14
- # @!attribute [r] session
15
- # @return [String] the session key
16
- # @!attribute [r] qq
17
- # @return [String, Integer] the qq of the bot
18
27
  attr_reader :base_uri, :session, :qq
19
28
 
20
29
  alias id qq
@@ -28,10 +37,12 @@ module Rubirai
28
37
  @listener_funcs = []
29
38
  end
30
39
 
40
+ # @private
31
41
  def gen_uri(path)
32
42
  URI.join(base_uri, path)
33
43
  end
34
44
 
45
+ # @private
35
46
  def self.ensure_type_in(type, *types)
36
47
  types = types.map { |x| x.to_s.downcase }
37
48
  type.to_s.downcase.must_be_one_of! types, RubiraiError, "not valid type: should be one of #{types}"
@@ -58,22 +58,7 @@ module Rubirai
58
58
  attr_keys.each do |k|
59
59
  k2 = k.to_s.snake_to_camel(lower: true)
60
60
  val = hash[k2]
61
- val = case k2
62
- when 'group'
63
- Group.new val, bot
64
- when 'operator', 'member'
65
- GroupUser.new val, bot
66
- when 'sender'
67
- if val.key? 'group'
68
- GroupUser.new val, bot
69
- else
70
- User.new val, bot
71
- end
72
- when 'messageChain'
73
- MessageChain.new bot, val
74
- else
75
- val
76
- end
61
+ val = parse_val_from_key k2, val, bot
77
62
  instance_variable_set("@#{k}", val)
78
63
  end
79
64
  end
@@ -107,6 +92,27 @@ module Rubirai
107
92
  @raw = hash
108
93
  @bot = bot
109
94
  end
95
+
96
+ protected
97
+
98
+ def parse_val_from_key(key, val, bot)
99
+ case key
100
+ when 'group'
101
+ Group.new val, bot
102
+ when 'operator', 'member'
103
+ GroupUser.new val, bot
104
+ when 'sender'
105
+ if val.key? 'group'
106
+ GroupUser.new val, bot
107
+ else
108
+ User.new val, bot
109
+ end
110
+ when 'messageChain'
111
+ MessageChain.new bot, val
112
+ else
113
+ val
114
+ end
115
+ end
110
116
  end
111
117
  end
112
118
 
@@ -114,7 +114,7 @@ module Rubirai
114
114
  #
115
115
  # @param msgs [Array<Rubirai::Message, Hash, String, Object>] messages to form a chain
116
116
  # @param quote [Boolean] if to quote the original message
117
- # @return [void]
117
+ # @return [Integer] message id
118
118
  def respond(*msgs, quote: false)
119
119
  check_bot
120
120
  msgs.prepend(gen_quote) if quote
@@ -128,7 +128,6 @@ module Rubirai
128
128
  else
129
129
  raise 'undefined error'
130
130
  end
131
- nil
132
131
  end
133
132
 
134
133
  # Generates a quote message from this event
@@ -140,7 +139,8 @@ module Rubirai
140
139
  group_id: @sender.is_a?(GroupUser) ? @sender.group.id : 0,
141
140
  sender_id: @sender.id,
142
141
  target_id: @sender.is_a?(GroupUser) ? @sender.group.id : @bot.qq,
143
- origin: @message_chain
142
+ origin: @message_chain.raw,
143
+ bot: @bot
144
144
  )
145
145
  end
146
146
 
@@ -2,25 +2,75 @@
2
2
 
3
3
  require 'rubirai/utils'
4
4
 
5
+ # @!method self.AtMessage(**kwargs)
6
+ # Form an {Rubirai::AtMessage}. The `display` option has no effect when
7
+ # sending at messages.
8
+ # @option kwargs [Integer] :target the target id
9
+ # @return [Rubirai::AtMessage] the message object
10
+ # @see Rubirai::AtMessage.from
11
+ # @!method self.QuoteMessage(**kwargs)
12
+ # Form a {Rubirai::QuoteMessage}.
13
+ # @return [Rubirai::QuoteMessage] the message object
14
+ # @see Rubirai::QuoteMessage.from
15
+ # @!method self.AtAllMessage()
16
+ # Form an {Rubirai::AtAllMessage}.
17
+ # @return [Rubirai::AtAllMessage] the message object
18
+ # @see Rubirai::AtAllMessage.from
19
+ # @!method self.FaceMessage(**kwargs)
20
+ # Form a {Rubirai::FaceMessage}. Only needs to give one of the two arguments.
21
+ # @option kwargs [Integer] :face_id the face id (high priority)
22
+ # @option kwargs [String] :name the face's name (low priority)
23
+ # @return [Rubirai::FaceMessage] the message object
24
+ # @see Rubirai::FaceMessage.from
25
+ # @!method self.PlainMessage(**kwargs)
26
+ # @option kwargs [String] :text the plain text
27
+ # @return [Rubirai::PlainMessage] the message object
28
+ # @see Rubirai::PlainMessage.from
29
+ # @!method self.ImageMessage(**kwargs)
30
+ # Form an {Rubirai::ImageMessage}. Only needs to give one of the three arguments.
31
+ # @option kwargs [String] :image_id the image id
32
+ # @option kwargs [String] :url the url of the image
33
+ # @option kwargs [String] :path the local path of the image
34
+ # @return [Rubirai::ImageMessage] the message object
35
+ # @see Rubirai::ImageMessage.from
36
+ # @!method self.FlashImageMessage(**kwargs)
37
+ # Form a {Rubirai::FlashImageMessage}. Only needs to give one of the three arguments.
38
+ # @option kwargs [String] :image_id the image id
39
+ # @option kwargs [String] :url the url of the image
40
+ # @option kwargs [String] :path the local path of the image
41
+ # @return [Rubirai::FlashImageMessage] the message object
42
+ # @see Rubirai::FlashImageMessage.from
43
+ # @!method self.VoiceMessage(**kwargs)
44
+ # Form a {Rubirai::VoiceMessage}. Only needs to give one of the three arguments.
45
+ # @option kwargs [String] :voice_id the voice id
46
+ # @option kwargs [String] :url the url of the voice
47
+ # @option kwargs [String] :path the local path of the voice
48
+ # @return [Rubirai::VoiceMessage] the message object
49
+ # @see Rubirai::VoiceMessage.from
50
+ # @!method self.XmlMessage(**kwargs)
51
+ # Form a {Rubirai::XmlMessage}.
52
+ # @option kwargs [String] :xml the xml body
53
+ # @return [Rubirai::XmlMessage] the message object
54
+ # @see Rubirai::XmlMessage.from
55
+ # @!method self.JsonMessage(**kwargs)
56
+ # Form a {Rubirai::JsonMessage}.
57
+ # @option kwargs [String] :json the json body
58
+ # @return [Rubirai::JsonMessage] the message object
59
+ # @see Rubirai::JsonMessage.from
60
+ # @!method self.AppMessage(**kwargs)
61
+ # Form an {Rubirai::AppMessage}.
62
+ # @option kwargs [String] :content the app body
63
+ # @return [Rubirai::AppMessage] the message object
64
+ # @see Rubirai::AppMessage.from
65
+ # @!method self.PokeMessage(**kwargs)
66
+ # Form a {Rubirai::PokeMessage}.
67
+ # @option kwargs [String] :name the poke name
68
+ # @return [Rubirai::PokeMessage] the message object
69
+ # @see Rubirai::PokeMessage.from
5
70
  module Rubirai
6
71
  # The message abstract class.
7
72
  #
8
73
  # @abstract
9
- # @!method self.AtMessage(**kwargs)
10
- # @param kwargs [Hash{Symbol => Object}] arguments
11
- # @return [Rubirai::AtMessage]
12
- # @!method self.QuoteMessage(**kwargs)
13
- # @param kwargs [Hash{Symbol => Object}] arguments
14
- # @return [Rubirai::QuoteMessage]
15
- # @!method self.AtAllMessage(**kwargs)
16
- # @param kwargs [Hash{Symbol => Object}] arguments
17
- # @return [Rubirai::AtAllMessage]
18
- # @!method self.FaceMessage(**kwargs)
19
- # @param kwargs [Hash{Symbol => Object}] arguments
20
- # @return [Rubirai::FaceMessage]
21
- # @!method self.PlainMessage(**kwargs)
22
- # @option text [String] the plain text
23
- # @return [Rubirai::PlainMessage]
24
74
  class Message
25
75
  # @!attribute [r] bot
26
76
  # @return [Bot] the bot
@@ -30,7 +80,7 @@ module Rubirai
30
80
 
31
81
  # Objects to {Rubirai::Message}
32
82
  #
33
- # @param msg [Rubirai::Message, Hash, Object] the object to transform to a message
83
+ # @param msg [Rubirai::Message, Hash{String => Object}, Object] the object to transform to a message
34
84
  # @return [Rubirai::Message] the message
35
85
  def self.to_message(msg, bot = nil)
36
86
  # noinspection RubyYardReturnMatch
@@ -150,6 +200,10 @@ module Rubirai
150
200
  end
151
201
  end
152
202
 
203
+ # {include:Rubirai::Message.to_message}
204
+ # @param obj [Message, Hash{String => Object}, Object] the object
205
+ # @return [Message] the message
206
+ # @see Rubirai::Message.to_message
153
207
  def self.Message(obj, bot = nil)
154
208
  Message.to_message obj, bot
155
209
  end
@@ -185,7 +239,9 @@ module Rubirai
185
239
  # @return [Integer] the original receiver's (group or user) id
186
240
  # @!attribute [r] origin
187
241
  # @return [MessageChain] the original message chain
188
- set_message :Quote, :id, :group_id, :sender_id, :target_id, :origin
242
+ # @!method from(**kwargs)
243
+ # Form a {QuoteMessage}.
244
+ set_message :Quote, :id, :group_id, :sender_id, :target_id, :origin, :origin_raw
189
245
 
190
246
  # @private
191
247
  def initialize(hash, bot = nil)
@@ -195,6 +251,18 @@ module Rubirai
195
251
  @sender_id = hash['senderId']
196
252
  @target_id = hash['targetId']
197
253
  @origin = MessageChain.make(*hash['origin'], bot: bot)
254
+ @origin_raw = hash['origin']
255
+ end
256
+
257
+ def to_h
258
+ {
259
+ 'type' => 'Quote',
260
+ 'id' => @id,
261
+ 'groupId' => @group_id,
262
+ 'senderId' => @sender_id,
263
+ 'targetId' => @target_id,
264
+ 'origin' => @origin_raw || @origin.to_a
265
+ }.compact
198
266
  end
199
267
  end
200
268
 
@@ -205,15 +273,16 @@ module Rubirai
205
273
  # @!attribute [r] display
206
274
  # @return [String] the displayed name (not used when sending)
207
275
  # @!method from(**kwargs)
208
- # @param kwargs [Hash{Symbol => Object}] not used
276
+ # Form an {AtMessage}. The `display` option has no effect when
277
+ # sending at messages.
278
+ # @option kwargs [Integer] :target the target id
209
279
  # @return [AtMessage] the message object
210
280
  set_message :At, :target, :display
211
281
  end
212
282
 
213
283
  # The At All message type
214
284
  class AtAllMessage < Message
215
- # @!method from(**kwargs)
216
- # @param kwargs [Hash{Symbol => Object}] the fields to set
285
+ # @!method from()
217
286
  # @return [AtAllMessage] the message object
218
287
  set_message :AtAll
219
288
  end
@@ -224,6 +293,12 @@ module Rubirai
224
293
  # @return [Integer] the face's id
225
294
  # @!attribute [r] name
226
295
  # @return [String, nil] the face's name
296
+ # @!method from(**kwargs)
297
+ # Form a {Rubirai::FaceMessage}. Only needs to give one of the two arguments.
298
+ # @option kwargs [Integer] :face_id the face id (high priority)
299
+ # @option kwargs [String] :name the face's name (low priority)
300
+ # @return [Rubirai::FaceMessage] the message object
301
+ # @!scope class
227
302
  set_message :Face, :face_id, :name
228
303
  end
229
304
 
@@ -231,6 +306,10 @@ module Rubirai
231
306
  class PlainMessage < Message
232
307
  # @!attribute [r] text
233
308
  # @return [String] the text
309
+ # @!method from(**kwargs)
310
+ # @option kwargs [String] :text the plain text
311
+ # @return [PlainMessage] the message object
312
+ # @!scope class
234
313
  set_message :Plain, :text
235
314
  end
236
315
 
@@ -238,21 +317,54 @@ module Rubirai
238
317
  # Only one out of the three fields is needed to form the message.
239
318
  class ImageMessage < Message
240
319
  # @!attribute [r] image_id
241
- # @return [Integer, nil] the image id from mirai
320
+ # @return [String, nil] the image id from mirai
242
321
  # @!attribute [r] url
243
322
  # @return [String, nil] the url of the image
244
323
  # @!attribute [r] path
245
324
  # @return [String, nil] the local path of the image
325
+ # @!method from(**kwargs)
326
+ # Form an {Rubirai::ImageMessage}. Only needs to give one of the three arguments.
327
+ # @option kwargs [String] :image_id the image id
328
+ # @option kwargs [String] :url the url of the image
329
+ # @option kwargs [String] :path the local path of the image
330
+ # @return [Rubirai::ImageMessage] the message object
331
+ # @!scope class
246
332
  set_message :Image, :image_id, :url, :path
247
333
  end
248
334
 
249
335
  # The flash image message type
250
336
  class FlashImageMessage < Message
337
+ # @!attribute [r] image_id
338
+ # @return [String, nil] the image id from mirai
339
+ # @!attribute [r] url
340
+ # @return [String, nil] the url of the image
341
+ # @!attribute [r] path
342
+ # @return [String, nil] the local path of the image
343
+ # @!method from(**kwargs)
344
+ # Form a {Rubirai::FlashImageMessage}. Only needs to give one of the three arguments.
345
+ # @option kwargs [String] :image_id the image id
346
+ # @option kwargs [String] :url the url of the image
347
+ # @option kwargs [String] :path the local path of the image
348
+ # @return [Rubirai::FlashImageMessage] the message object
349
+ # @!scope class
251
350
  set_message :FlashImage, :image_id, :url, :path
252
351
  end
253
352
 
254
353
  # The voice message type
255
354
  class VoiceMessage < Message
355
+ # @!attribute [r] voice_id
356
+ # @return [String, nil] the voice id from mirai
357
+ # @!attribute [r] url
358
+ # @return [String, nil] the url of the voice
359
+ # @!attribute [r] path
360
+ # @return [String, nil] the local path of the voice
361
+ # @!method from(**kwargs)
362
+ # Form a {Rubirai::VoiceMessage}. Only needs to give one of the three arguments.
363
+ # @option kwargs [String] :voice_id the voice id
364
+ # @option kwargs [String] :url the url of the voice
365
+ # @option kwargs [String] :path the local path of the voice
366
+ # @return [Rubirai::VoiceMessage] the message object
367
+ # @!scope class
256
368
  set_message :Voice, :voice_id, :url, :path
257
369
  end
258
370
 
@@ -260,6 +372,11 @@ module Rubirai
260
372
  class XmlMessage < Message
261
373
  # @!attribute [r] xml
262
374
  # @return [String] the xml content
375
+ # @!method from(**kwargs)
376
+ # Form a {Rubirai::XmlMessage}.
377
+ # @option kwargs [String] :xml the xml body
378
+ # @return [Rubirai::XmlMessage] the message object
379
+ # @!scope class
263
380
  set_message :Xml, :xml
264
381
  end
265
382
 
@@ -267,6 +384,11 @@ module Rubirai
267
384
  class JsonMessage < Message
268
385
  # @!attribute [r] json
269
386
  # @return [String] the json content
387
+ # @!method from(**kwargs)
388
+ # Form a {Rubirai::JsonMessage}.
389
+ # @option kwargs [String] :json the json body
390
+ # @return [Rubirai::JsonMessage] the message object
391
+ # @!scope class
270
392
  set_message :Json, :json
271
393
  end
272
394
 
@@ -274,27 +396,72 @@ module Rubirai
274
396
  class AppMessage < Message
275
397
  # @!attribute [r] content
276
398
  # @return [String] the app content
399
+ # @!method from(**kwargs)
400
+ # Form an {Rubirai::AppMessage}.
401
+ # @option kwargs [String] :content the app body
402
+ # @return [Rubirai::AppMessage] the message object
403
+ # @!scope class
277
404
  set_message :App, :content
278
405
  end
279
406
 
407
+ # The poke message type
280
408
  class PokeMessage < Message
409
+ # @!attribute [r] name
410
+ # @return [String] type (name) of the poke
411
+ # @!method from(**kwargs)
412
+ # Form an {Rubirai::PokeMessage}.
413
+ # @option kwargs [String] :name the name (type) of poke
414
+ # @return [Rubirai::PokeMessage] the message object
415
+ # @!scope class
281
416
  set_message :Poke, :name
282
417
  end
283
418
 
419
+ # The forward message type
284
420
  class ForwardMessage < Message
421
+ # A message node in the forward message list
422
+ #
423
+ # @!attribute [r] sender_id
424
+ # @return [Integer] sender id
425
+ # @!attribute [r] time
426
+ # @return [Integer] send timestamp (second)
427
+ # @!attribute [r] sender_name
428
+ # @return [String] the sender name
429
+ # @!attribute [r] message_chain
430
+ # @return [MessageChain] the message chain
285
431
  class Node
286
432
  attr_reader :sender_id, :time, :sender_name, :message_chain
287
433
 
434
+ # @private
288
435
  def initialize(hash, bot = nil)
436
+ return unless hash
289
437
  @sender_id = hash['senderId']
290
438
  @time = hash['time']
291
439
  @sender_name = hash['senderName']
292
440
  @message_chain = MessageChain.make(*hash['messageChain'], bot: bot)
293
441
  end
442
+
443
+ def self.from(**kwargs)
444
+ n = new({})
445
+ %i[sender_id time sender_name message_chain].each do |attr|
446
+ n.instance_variable_set("@#{attr}", kwargs[attr])
447
+ end
448
+ end
294
449
  end
295
450
 
451
+ # @!attribute [r] title
452
+ # @return [String] the title
453
+ # @!attribute [r] brief
454
+ # @return [String] the brief text
455
+ # @!attribute [r] source
456
+ # @return [String] the source text
457
+ # @!attribute [r] summary
458
+ # @return [String] the summary text
459
+ # @!attribute [r] node_list
460
+ # @return [Array<Node>] the node list
461
+ # @see Node
296
462
  set_message :Forward, :title, :brief, :source, :summary, :node_list
297
463
 
464
+ # @private
298
465
  def initialize(hash, bot = nil)
299
466
  super :Forward, bot
300
467
  @title = hash['title']
@@ -307,15 +474,42 @@ module Rubirai
307
474
  end
308
475
  end
309
476
 
477
+ # The file message type
310
478
  class FileMessage < Message
479
+ # @!attribute [r] id
480
+ # @return [String] the file id
481
+ # @!attribute [r] internal_id
482
+ # @return [Integer] the internal id needed by server
483
+ # @!attribute [r] name
484
+ # @return [String] the filename
485
+ # @!attribute [r] size
486
+ # @return [Integer] the file size
311
487
  set_message :File, :id, :internal_id, :name, :size
312
488
  end
313
489
 
490
+ # The music share card message
314
491
  class MusicShareMessage < Message
492
+ # List all kinds of music providers
493
+ #
494
+ # @return [Array<String>] kinds
315
495
  def self.all_kinds
316
496
  %w[NeteaseCloudMusic QQMusic MiguMusic]
317
497
  end
318
498
 
499
+ # @!attribute [r] kind
500
+ # @return [String] the kind of music provider
501
+ # @!attribute [r] title
502
+ # @return [String] the music card title
503
+ # @!attribute [r] summary
504
+ # @return [String] the music card summary
505
+ # @!attribute [r] jump_url
506
+ # @return [String] the jump url
507
+ # @!attribute [r] picture_url
508
+ # @return [String] the picture's url
509
+ # @!attribute [r] music_url
510
+ # @return [String] the music's url
511
+ # @!attribute [r] brief
512
+ # @return [String, nil] the brief message (optional)
319
513
  set_message :MusicShare, :kind, :title, :summary, :jump_url, :picture_url, :music_url, :brief do |hash|
320
514
  raise(RubiraiError, 'non valid music type') unless all_kinds.include? hash['kind']
321
515
  end
@@ -12,11 +12,13 @@ module Rubirai
12
12
  # @return [Bot] the bot object
13
13
  # @!attribute [r] id
14
14
  # @return [Integer, nil] the message id, may be `nil`
15
+ # @!attribute [r] raw
16
+ # @return [Hash{String => Object}, nil] the raw message chain, may be `nil`
15
17
  # @!attribute [r] send_time
16
18
  # @return [Integer, nil] the send time of the message chain, may be `nil`
17
19
  # @!attribute [r] messages
18
20
  # @return [Array<Message>] the raw message array
19
- attr_reader :bot, :id, :send_time, :messages
21
+ attr_reader :bot, :id, :raw, :send_time, :messages
20
22
 
21
23
  # Makes a message chain from a list of messages
22
24
  #
@@ -87,10 +89,10 @@ module Rubirai
87
89
  # @private
88
90
  # @param bot [Rubirai::Bot, nil]
89
91
  # @param source [Array, nil]
90
- # @param id [Integer, nil]
91
92
  def initialize(bot = nil, source = nil)
92
93
  @bot = bot
93
94
  @messages = []
95
+ @raw = source
94
96
  return unless source
95
97
  raise(MiraiError, 'source is not array') unless source.is_a? Array
96
98
  raise(MiraiError, 'length is zero') if source.empty?
@@ -130,6 +132,9 @@ module Rubirai
130
132
  end
131
133
 
132
134
  # Makes a message chain. See {MessageChain#make}.
135
+ #
136
+ # @return [MessageChain] the message chain made.
137
+ # @see MessageChain#make
133
138
  def self.MessageChain(*messages, bot: nil)
134
139
  MessageChain.make(*messages, bot: bot)
135
140
  end
@@ -5,6 +5,11 @@ require 'rubirai/utils'
5
5
  module Rubirai
6
6
  # The abstract class for group information
7
7
  # @abstract
8
+ #
9
+ # @!attribute [r] raw
10
+ # @return [Hash{String => Object}] the raw hash
11
+ # @!attribute [r] bot
12
+ # @return [Bot] the bot
8
13
  class GroupInfo
9
14
  # @private
10
15
  def self.set_fields(*fields, **default_values)
@@ -34,10 +39,6 @@ module Rubirai
34
39
  attr_writer(*fields)
35
40
  end
36
41
 
37
- # @!attribute [r] raw
38
- # @return [Hash{String => Object}] the raw hash
39
- # @!attribute [r] bot
40
- # @return [Bot] the bot
41
42
  attr_reader :raw, :bot
42
43
 
43
44
  # @private
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Rubirai
4
4
  # Rubirai version
5
- VERSION = '0.0.3-a1'
5
+ VERSION = '0.1.0'
6
6
 
7
7
  # mirai-api-http version
8
8
  MIRAI_API_VERSION = '1.10.0'
@@ -76,6 +76,7 @@ describe Rubirai::Event do
76
76
  expect(e.class.type).to eq(:BotGroupPermissionChangeEvent)
77
77
  expect(e.origin).to eq(Rubirai::Group::Permission::MEMBER)
78
78
  expect(e.new).to eq(Rubirai::Group::Permission::ADMINISTRATOR)
79
+ expect(e.group).to be_a(Rubirai::Group)
79
80
  expect(e.group.id).to eq(123456789)
80
81
  end
81
82
  end
data/spec/message_spec.rb CHANGED
@@ -84,4 +84,62 @@ describe 'message api' do
84
84
  expect(@mirai_bot.recall(123)).to be_nil
85
85
  end.not_to raise_error
86
86
  end
87
+
88
+ it 'should be able to respond to a message event' do
89
+ e = Rubirai::Event.parse({
90
+ "type": 'GroupMessage',
91
+ "messageChain": [
92
+ {
93
+ "type": 'Source',
94
+ "id": 123456,
95
+ "time": 123456789
96
+ }.stringify_keys,
97
+ {
98
+ "type": 'Plain',
99
+ "text": 'Miral牛逼'
100
+ }.stringify_keys
101
+ ],
102
+ "sender": {
103
+ "id": 123456789,
104
+ "memberName": '化腾',
105
+ "permission": 'MEMBER',
106
+ "group": {
107
+ "id": 1234567890,
108
+ "name": 'Miral Technology',
109
+ "permission": 'MEMBER'
110
+ }.stringify_keys
111
+ }.stringify_keys
112
+ }.stringify_keys, @mirai_bot)
113
+ stub_request(:post, @mirai_bot.gen_uri('/sendGroupMessage'))
114
+ .with(body: {
115
+ "sessionKey": 'test_session_key',
116
+ "target": 1234567890,
117
+ "messageChain": [
118
+ {
119
+ "id": 123456,
120
+ "groupId": 1234567890,
121
+ "senderId": 123456789,
122
+ "targetId": 1234567890,
123
+ "origin": [
124
+ {
125
+ "type": 'Source',
126
+ "id": 123456,
127
+ "time": 123456789
128
+ },
129
+ { "text": 'Miral牛逼', "type": 'Plain' }
130
+ ],
131
+ "type": 'Quote'
132
+ },
133
+ { "text": 'hi', "type": 'Plain' }
134
+ ]
135
+ })
136
+ .to_return(status: 200, body: %({
137
+ "code": 0,
138
+ "msg": "success",
139
+ "messageId": 1234567890
140
+ }))
141
+ expect(e).to be_a(Rubirai::GroupMessageEvent)
142
+ msg_id = e.respond 'hi', quote: true
143
+ expect(msg_id).to eq(1234567890)
144
+ end
87
145
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubirai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3.pre.a1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rebuild
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-30 00:00:00.000000000 Z
11
+ date: 2021-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -111,9 +111,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
111
  version: '2.6'
112
112
  required_rubygems_version: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - ">"
114
+ - - ">="
115
115
  - !ruby/object:Gem::Version
116
- version: 1.3.1
116
+ version: '0'
117
117
  requirements: []
118
118
  rubygems_version: 3.0.3.1
119
119
  signing_key: