discordrb 3.6.0 → 3.7.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +10 -4
  3. data/.rubocop.yml +7 -0
  4. data/CHANGELOG.md +60 -3
  5. data/discordrb.gemspec +1 -1
  6. data/lib/discordrb/api/channel.rb +3 -3
  7. data/lib/discordrb/api/server.rb +2 -2
  8. data/lib/discordrb/api/user.rb +9 -16
  9. data/lib/discordrb/api.rb +5 -0
  10. data/lib/discordrb/bot.rb +24 -4
  11. data/lib/discordrb/container.rb +15 -0
  12. data/lib/discordrb/data/channel.rb +72 -2
  13. data/lib/discordrb/data/collectibles.rb +5 -3
  14. data/lib/discordrb/data/emoji.rb +1 -1
  15. data/lib/discordrb/data/interaction.rb +41 -9
  16. data/lib/discordrb/data/member.rb +39 -5
  17. data/lib/discordrb/data/message.rb +52 -25
  18. data/lib/discordrb/data/overwrite.rb +2 -3
  19. data/lib/discordrb/data/primary_server.rb +1 -1
  20. data/lib/discordrb/data/profile.rb +21 -40
  21. data/lib/discordrb/data/reaction.rb +25 -1
  22. data/lib/discordrb/data/role_subscription.rb +41 -0
  23. data/lib/discordrb/data/server.rb +6 -4
  24. data/lib/discordrb/data.rb +1 -0
  25. data/lib/discordrb/events/interactions.rb +7 -1
  26. data/lib/discordrb/events/message.rb +32 -3
  27. data/lib/discordrb/events/reactions.rb +58 -0
  28. data/lib/discordrb/gateway.rb +2 -5
  29. data/lib/discordrb/id_object.rb +1 -1
  30. data/lib/discordrb/permissions.rb +2 -3
  31. data/lib/discordrb/version.rb +1 -1
  32. data/lib/discordrb/voice/network.rb +64 -52
  33. data/lib/discordrb/voice/opcodes.rb +29 -0
  34. data/lib/discordrb/voice/sodium.rb +137 -78
  35. data/lib/discordrb/voice/timer.rb +19 -0
  36. data/lib/discordrb/voice/voice_bot.rb +20 -42
  37. data/lib/discordrb.rb +3 -1
  38. metadata +10 -10
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'discordrb/voice/encoder'
4
4
  require 'discordrb/voice/network'
5
+ require 'discordrb/voice/timer'
5
6
  require 'discordrb/logger'
7
+ require 'ffi'
6
8
 
7
9
  # Voice support
8
10
  module Discordrb::Voice
@@ -304,20 +306,19 @@ module Discordrb::Voice
304
306
  def play_internal
305
307
  count = 0
306
308
  @playing = true
309
+ self.speaking = true
307
310
 
308
- # Default play length (ms), will be adjusted later
309
- @length = IDEAL_LENGTH
311
+ last_sent = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
310
312
 
311
- self.speaking = true
312
313
  loop do
313
- # Starting from the tenth packet, perform length adjustment every 100 packets (2 seconds)
314
- should_adjust_this_packet = (count % @adjust_interval == @adjust_offset)
315
-
316
- # If we should adjust, start now
317
- @length_adjust = Time.now.nsec if should_adjust_this_packet
314
+ # If paused, wait
315
+ sleep 0.1 while @paused
318
316
 
319
317
  break unless @playing
320
318
 
319
+ # Get timestamp before encoding
320
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
321
+
321
322
  # If we should skip, get some data, discard it and go to the next iteration
322
323
  if @skips.positive?
323
324
  @skips -= 1
@@ -339,45 +340,22 @@ module Discordrb::Voice
339
340
  next unless buf
340
341
 
341
342
  # Track intermediate adjustment so we can measure how much encoding contributes to the total time
342
- @intermediate_adjust = Time.now.nsec if should_adjust_this_packet
343
+ intermediate_adjust = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
343
344
 
344
- # Send the packet
345
- @udp.send_audio(buf, @sequence, @time)
345
+ Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
346
346
 
347
- # Set the stream time (for tracking how long we've been playing)
348
- @stream_time = count * @length / 1000
349
-
350
- if @length_override # Don't do adjustment because the user has manually specified an override value
351
- @length = @length_override
352
- elsif @length_adjust # Perform length adjustment
353
- # Define the time once so it doesn't get inaccurate
354
- now = Time.now.nsec
355
-
356
- # Difference between length_adjust and now in ms
357
- ms_diff = (now - @length_adjust) / 1_000_000.0
358
- if ms_diff >= 0
359
- @length = if @adjust_average
360
- (IDEAL_LENGTH - ms_diff + @length) / 2.0
361
- else
362
- IDEAL_LENGTH - ms_diff
363
- end
364
-
365
- # Track the time it took to encode
366
- encode_ms = (@intermediate_adjust - @length_adjust) / 1_000_000.0
367
- @bot.debug("Length adjustment: new length #{@length} (measured #{ms_diff}, #{(100 * encode_ms) / ms_diff}% encoding)") if @adjust_debug
368
- end
369
- @length_adjust = nil
347
+ if (last_sent + IDEAL_LENGTH) > Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
348
+ sleep_duration = (last_sent + IDEAL_LENGTH - Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)) / 1000.0
349
+ @bot.debug("Waiting for next frame: #{sleep_duration * 1000}ms (encoding #{intermediate_adjust - start_time}ms)") if @adjust_debug
350
+ sleep sleep_duration if sleep_duration.positive?
370
351
  end
371
352
 
372
- # If paused, wait
373
- sleep 0.1 while @paused
353
+ # Send the packet
354
+ @udp.send_audio(buf, @sequence, @time)
374
355
 
375
- if @length.positive?
376
- # Wait `length` ms, then send the next packet
377
- sleep @length / 1000.0
378
- else
379
- Discordrb::LOGGER.warn('Audio encoding and sending together took longer than Discord expects one packet to be (20 ms)! This may be indicative of network problems.')
380
- end
356
+ # Set the stream time (for tracking how long we've been playing)
357
+ @stream_time = count * IDEAL_LENGTH / 1000
358
+ last_sent = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
381
359
  end
382
360
 
383
361
  @bot.debug('Sending five silent frames to clear out buffers')
data/lib/discordrb.rb CHANGED
@@ -65,7 +65,9 @@ module Discordrb
65
65
  long_date: 'D', # 20 April 2021
66
66
  short_datetime: 'f', # 20 April 2021 16:20
67
67
  long_datetime: 'F', # Tuesday, 20 April 2021 16:20
68
- relative: 'R' # 2 months ago
68
+ relative: 'R', # 2 months ago
69
+ simple_datetime: 's', # 20/04/2021, 16:20
70
+ medium_datetime: 'S' # 20/04/2021, 16:20:30
69
71
  }.freeze
70
72
 
71
73
  # Splits a message into chunks of 2000 characters. Attempts to split by lines if possible.
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: discordrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.0
4
+ version: 3.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - meew0
8
8
  - swarley
9
- autorequire:
10
9
  bindir: exe
11
10
  cert_chain: []
12
- date: 2025-10-22 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: base64
@@ -17,14 +16,14 @@ dependencies:
17
16
  requirements:
18
17
  - - "~>"
19
18
  - !ruby/object:Gem::Version
20
- version: 0.2.0
19
+ version: '0.2'
21
20
  type: :runtime
22
21
  prerelease: false
23
22
  version_requirements: !ruby/object:Gem::Requirement
24
23
  requirements:
25
24
  - - "~>"
26
25
  - !ruby/object:Gem::Version
27
- version: 0.2.0
26
+ version: '0.2'
28
27
  - !ruby/object:Gem::Dependency
29
28
  name: ffi
30
29
  requirement: !ruby/object:Gem::Requirement
@@ -87,14 +86,14 @@ dependencies:
87
86
  requirements:
88
87
  - - "~>"
89
88
  - !ruby/object:Gem::Version
90
- version: 3.6.0
89
+ version: 3.7.0
91
90
  type: :runtime
92
91
  prerelease: false
93
92
  version_requirements: !ruby/object:Gem::Requirement
94
93
  requirements:
95
94
  - - "~>"
96
95
  - !ruby/object:Gem::Version
97
- version: 3.6.0
96
+ version: 3.7.0
98
97
  - !ruby/object:Gem::Dependency
99
98
  name: bundler
100
99
  requirement: !ruby/object:Gem::Requirement
@@ -331,6 +330,7 @@ files:
331
330
  - lib/discordrb/data/reaction.rb
332
331
  - lib/discordrb/data/recipient.rb
333
332
  - lib/discordrb/data/role.rb
333
+ - lib/discordrb/data/role_subscription.rb
334
334
  - lib/discordrb/data/server.rb
335
335
  - lib/discordrb/data/server_preview.rb
336
336
  - lib/discordrb/data/snapshot.rb
@@ -370,7 +370,9 @@ files:
370
370
  - lib/discordrb/version.rb
371
371
  - lib/discordrb/voice/encoder.rb
372
372
  - lib/discordrb/voice/network.rb
373
+ - lib/discordrb/voice/opcodes.rb
373
374
  - lib/discordrb/voice/sodium.rb
375
+ - lib/discordrb/voice/timer.rb
374
376
  - lib/discordrb/voice/voice_bot.rb
375
377
  - lib/discordrb/webhooks.rb
376
378
  - lib/discordrb/websocket.rb
@@ -383,7 +385,6 @@ metadata:
383
385
  documentation_uri: https://github.com/shardlab/discordrb/wiki
384
386
  source_code_uri: https://github.com/shardlab/discordrb
385
387
  rubygems_mfa_required: 'true'
386
- post_install_message:
387
388
  rdoc_options: []
388
389
  require_paths:
389
390
  - lib
@@ -398,8 +399,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
398
399
  - !ruby/object:Gem::Version
399
400
  version: '0'
400
401
  requirements: []
401
- rubygems_version: 3.5.3
402
- signing_key:
402
+ rubygems_version: 3.6.9
403
403
  specification_version: 4
404
404
  summary: Discord API for Ruby
405
405
  test_files: []