Class: Discordrb::Bot

Inherits:
Object
  • Object
show all
Includes:
Cache, EventContainer
Defined in:
lib/discordrb/bot.rb

Overview

Represents a Discord bot, including servers, users, etc.

Direct Known Subclasses

Commands::CommandBot

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Cache

#channel, #ensure_channel, #ensure_server, #ensure_user, #find_channel, #find_user, #init_cache, #invite, #member, #pm_channel, #request_chunks, #resolve_invite_code, #server, #user, #voice_regions

Methods included from EventContainer

#add_handler, #await, #channel_create, #channel_delete, #channel_recipient_add, #channel_recipient_remove, #channel_update, class_from_string, #clear!, #disconnected, event_class, handler_class, #heartbeat, #include_events, #member_join, #member_leave, #member_update, #mention, #message, #message_delete, #message_edit, #playing, #pm, #presence, #raw, #reaction_add, #reaction_remove, #reaction_remove_all, #ready, #remove_handler, #server_create, #server_delete, #server_emoji, #server_emoji_create, #server_emoji_delete, #server_emoji_update, #server_update, #typing, #unknown, #user_ban, #user_unban, #voice_state_update, #webhook_update

Methods included from Events

matches_all

Constructor Details

#initialize(log_mode: :normal, token: nil, client_id: nil, type: nil, name: '', fancy_log: false, suppress_ready: false, parse_self: false, shard_id: nil, num_shards: nil, redact_token: true, ignore_bots: false) ⇒ Bot

Makes a new bot with the given authentication data. It will be ready to be added event handlers to and can eventually be run with #run.

As support for logging in using username and password has been removed in version 3.0.0, only a token login is possible. Be sure to specify the type parameter as :user if you're logging in as a user.

Simply creating a bot won't be enough to start sending messages etc. with, only a limited set of methods can be used after logging in. If you want to do something when the bot has connected successfully, either do it in the EventContainer#ready event, or use the #run method with the :async parameter and do the processing after that.

Parameters:

  • log_mode (Symbol) (defaults to: :normal)

    The mode this bot should use for logging. See Logger#mode= for a list of modes.

  • token (String) (defaults to: nil)

    The token that should be used to log in. If your bot is a bot account, you have to specify this. If you're logging in as a user, make sure to also set the account type to :user so discordrb doesn't think you're trying to log in as a bot.

  • client_id (Integer) (defaults to: nil)

    If you're logging in as a bot, the bot's client ID. This is optional, and may be fetched from the API by calling #bot_application (see Application).

  • type (Symbol) (defaults to: nil)

    This parameter lets you manually overwrite the account type. This needs to be set when logging in as a user, otherwise discordrb will treat you as a bot account. Valid values are :user and :bot.

  • name (String) (defaults to: '')

    Your bot's name. This will be sent to Discord with any API requests, who will use this to trace the source of excessive API requests; it's recommended to set this to something if you make bots that many people will host on their servers separately.

  • fancy_log (true, false) (defaults to: false)

    Whether the output log should be made extra fancy using ANSI escape codes. (Your terminal may not support this.)

  • suppress_ready (true, false) (defaults to: false)

    Whether the READY packet should be exempt from being printed to console. Useful for very large bots running in debug or verbose log_mode.

  • parse_self (true, false) (defaults to: false)

    Whether the bot should react on its own messages. It's best to turn this off unless you really need this so you don't inadvertently create infinite loops.

  • shard_id (Integer) (defaults to: nil)

    The number of the shard this bot should handle. See https://github.com/hammerandchisel/discord-api-docs/issues/17 for how to do sharding.

  • num_shards (Integer) (defaults to: nil)

    The total number of shards that should be running. See https://github.com/hammerandchisel/discord-api-docs/issues/17 for how to do sharding.

  • redact_token (true, false) (defaults to: true)

    Whether the bot should redact the token in logs. Default is true.

  • ignore_bots (true, false) (defaults to: false)

    Whether the bot should ignore bot accounts or not. Default is false.


100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/discordrb/bot.rb', line 100

def initialize(
    log_mode: :normal,
    token: nil, client_id: nil,
    type: nil, name: '', fancy_log: false, suppress_ready: false, parse_self: false,
    shard_id: nil, num_shards: nil, redact_token: true, ignore_bots: false
)

  LOGGER.mode = if log_mode.is_a? TrueClass # Specifically check for `true` because people might not have updated yet
                  :debug
                else
                  log_mode
                end

  LOGGER.token = token if redact_token

  @should_parse_self = parse_self

  @client_id = client_id

  @type = type || :bot
  @name = name

  @shard_key = num_shards ? [shard_id, num_shards] : nil

  LOGGER.fancy = fancy_log
  @prevent_ready = suppress_ready

  @token = process_token(@type, token)
  @gateway = Gateway.new(self, @token, @shard_key)

  init_cache

  @voices = {}
  @should_connect_to_voice = {}

  @ignored_ids = Set.new
  @ignore_bots = ignore_bots

  @event_threads = []
  @current_thread = 0

  @status = :online
end

Instance Attribute Details

#awaitsHash<Symbol => Await> (readonly)

Returns the list of registered Awaits.

Returns:

  • (Hash<Symbol => Await>)

    the list of registered Awaits.


58
59
60
# File 'lib/discordrb/bot.rb', line 58

def awaits
  @awaits
end

#event_threadsArray<Thread> (readonly)

The list of currently running threads used to parse and call events. The threads will have a local variable :discordrb_name in the format of et-1234, where "et" stands for "event thread" and the number is a continually incrementing number representing how many events were executed before.

Returns:

  • (Array<Thread>)

    The threads.


44
45
46
# File 'lib/discordrb/bot.rb', line 44

def event_threads
  @event_threads
end

#gatewayGateway (readonly)

The gateway connection is an internal detail that is useless to most people. It is however essential while debugging or developing discordrb itself, or while writing very custom bots.

Returns:


63
64
65
# File 'lib/discordrb/bot.rb', line 63

def gateway
  @gateway
end

#nameString

The bot's name which discordrb sends to Discord when making any request, so Discord can identify bots with the same codebase. Not required but I recommend setting it anyway.

Returns:

  • (String)

    The bot's name.


52
53
54
# File 'lib/discordrb/bot.rb', line 52

def name
  @name
end

#shard_keyArray(Integer, Integer) (readonly)

Returns the current shard key.

Returns:


55
56
57
# File 'lib/discordrb/bot.rb', line 55

def shard_key
  @shard_key
end

#should_parse_selftrue, false

Returns whether or not the bot should parse its own messages. Off by default.

Returns:

  • (true, false)

    whether or not the bot should parse its own messages. Off by default.


47
48
49
# File 'lib/discordrb/bot.rb', line 47

def should_parse_self
  @should_parse_self
end

#voicesHash<Integer => VoiceBot> (readonly)

Returns the voice connections this bot currently has, by the server ID to which they are connected.

Returns:

  • (Hash<Integer => VoiceBot>)

    the voice connections this bot currently has, by the server ID to which they are connected.


274
275
276
# File 'lib/discordrb/bot.rb', line 274

def voices
  @voices
end

Instance Method Details

#add_await(key, type, attributes = {}) {|event| ... } ⇒ Await

Add an await the bot should listen to. For information on awaits, see Await.

Parameters:

  • key (Symbol)

    The key that uniquely identifies the await for Events::AwaitEvents to listen to (see EventContainer#await).

  • type (Class)

    The event class that should be listened for.

  • attributes (Hash) (defaults to: {})

    The attributes the event should check for. The block will only be executed if all attributes match.

Yields:

  • Is executed when the await is triggered.

Yield Parameters:

  • event (Event)

    The event object that was triggered.

Returns:

  • (Await)

    The await that was created.


538
539
540
541
542
543
# File 'lib/discordrb/bot.rb', line 538

def add_await(key, type, attributes = {}, &block)
  raise "You can't await an AwaitEvent!" if type == Discordrb::Events::AwaitEvent
  await = Await.new(self, key, type, attributes, block)
  @awaits ||= {}
  @awaits[key] = await
end

#bot_applicationApplication? Also known as: bot_app

The bot's OAuth application.

Returns:

  • (Application, nil)

    The bot's application info. Returns nil if bot is not a bot account.


200
201
202
203
204
# File 'lib/discordrb/bot.rb', line 200

def bot_application
  return unless @type == :bot
  response = API.oauth_application(token)
  Application.new(JSON.parse(response), self)
end

#connected?true, false

Returns whether or not the bot is currently connected to Discord.

Returns:

  • (true, false)

    whether or not the bot is currently connected to Discord.


250
251
252
# File 'lib/discordrb/bot.rb', line 250

def connected?
  @gateway.open?
end

#create_oauth_application(name, redirect_uris) ⇒ Array(String, String)

Creates a new application to do OAuth authorization with. This allows you to use OAuth to authorize users using Discord. For information how to use this, see the docs: https://discordapp.com/developers/docs/topics/oauth2

Parameters:

  • name (String)

    What your application should be called.

  • redirect_uris (Array<String>)

    URIs that Discord should redirect your users to after authorizing.

Returns:

  • (Array(String, String))

    your applications' client ID and client secret to be used in OAuth authorization.


409
410
411
412
# File 'lib/discordrb/bot.rb', line 409

def create_oauth_application(name, redirect_uris)
  response = JSON.parse(API.create_oauth_application(@token, name, redirect_uris))
  [response['id'], response['secret']]
end

#create_server(name, region = eu-central) ⇒ Server

Note:

Discord's API doesn't directly return the server when creating it, so this method waits until the data has been received via the websocket. This may make the execution take a while.

Creates a server on Discord with a specified name and a region.

Parameters:

  • name (String)

    The name the new server should have. Doesn't have to be alphanumeric.

  • region (Symbol) (defaults to: eu-central)

    The region where the server should be created, for example 'eu-central' or 'hongkong'.

Returns:

  • (Server)

    The server that was created.


395
396
397
398
399
400
401
402
# File 'lib/discordrb/bot.rb', line 395

def create_server(name, region = :'eu-central')
  response = API::Server.create(token, name, region)
  id = JSON.parse(response)['id'].to_i
  sleep 0.1 until @servers[id]
  server = @servers[id]
  debug "Successfully created server #{server.id} with name #{server.name}"
  server
end

#debug(message) ⇒ Object

See Also:

  • Logger#debug

567
568
569
# File 'lib/discordrb/bot.rb', line 567

def debug(message)
  LOGGER.debug(message)
end

#debug=(new_debug) ⇒ Object

Sets debug mode. If debug mode is on, many things will be outputted to STDOUT.


516
517
518
# File 'lib/discordrb/bot.rb', line 516

def debug=(new_debug)
  LOGGER.debug = new_debug
end

#delete_invite(code) ⇒ Object

Revokes an invite to a server. Will fail unless you have the Manage Server permission. It is recommended that you use Invite#delete instead.

Parameters:


339
340
341
342
# File 'lib/discordrb/bot.rb', line 339

def delete_invite(code)
  invite = resolve_invite_code(code)
  API::Invite.delete(token, invite)
end

#dispatch(type, data) ⇒ Object

Dispatches an event to this bot. Called by the gateway connection handler used internally.


577
578
579
# File 'lib/discordrb/bot.rb', line 577

def dispatch(type, data)
  handle_dispatch(type, data)
end

#dndObject

Sets the bot's status to DnD (red icon).


504
505
506
507
# File 'lib/discordrb/bot.rb', line 504

def dnd
  gateway_check
  update_status(:dnd, @game, nil)
end

#emoji(id) ⇒ Object #emojiArray<Emoji> Also known as: emojis, all_emoji

Overloads:

  • #emoji(id) ⇒ Object

    Return an emoji by its ID

    Parameters:

    • id (Integer, #resolve_id)

      The emoji's ID.

  • #emojiArray<Emoji>

    The list of emoji the bot can use.

    Returns:

    • (Array<Emoji>)

      the emoji available.


165
166
167
168
169
170
171
172
173
174
175
# File 'lib/discordrb/bot.rb', line 165

def emoji(id = nil)
  gateway_check

  emoji_hash = @servers.values.map(&:emoji).reduce(&:merge)
  if id
    id = id.resolve_id
    emoji_hash[id]
  else
    emoji_hash.values
  end
end

#find_emoji(name) ⇒ GlobalEmoji?

Finds an emoji by its name.

Parameters:

  • name (String)

    The emoji name that should be resolved.

Returns:

  • (GlobalEmoji, nil)

    the emoji identified by the name, or nil if it couldn't be found.


183
184
185
186
# File 'lib/discordrb/bot.rb', line 183

def find_emoji(name)
  LOGGER.out("Resolving emoji #{name}")
  emoji.find { |element| element.name == name }
end

#game=(name) ⇒ String

Sets the currently playing game to the specified game.

Parameters:

  • name (String)

    The name of the game to be played.

Returns:

  • (String)

    The game that is being played now.


471
472
473
474
475
# File 'lib/discordrb/bot.rb', line 471

def game=(name)
  gateway_check
  update_status(@status, name, nil)
  name
end

#idleObject Also known as: away

Sets status to idle.


496
497
498
499
# File 'lib/discordrb/bot.rb', line 496

def idle
  gateway_check
  update_status(:idle, @game, nil)
end

#ignore_user(user) ⇒ Object

Note:

Ignoring a user only prevents any message events (including mentions, commands etc.) from them! Typing and presence and any other events will still be received.

Add a user to the list of ignored users. Those users will be ignored in message events at event processing level.

Parameters:

  • user (User, Integer, #resolve_id)

    The user, or its ID, to be ignored.


549
550
551
# File 'lib/discordrb/bot.rb', line 549

def ignore_user(user)
  @ignored_ids << user.resolve_id
end

#ignored?(user) ⇒ true, false

Checks whether a user is being ignored.

Parameters:

  • user (User, Integer, #resolve_id)

    The user, or its ID, to check.

Returns:

  • (true, false)

    whether or not the user is ignored.


562
563
564
# File 'lib/discordrb/bot.rb', line 562

def ignored?(user)
  @ignored_ids.include?(user.resolve_id)
end

#invisibleObject

Sets the bot's status to invisible (appears offline).


510
511
512
513
# File 'lib/discordrb/bot.rb', line 510

def invisible
  gateway_check
  update_status(:invisible, @game, nil)
end

#invite_url(server: nil, permission_bits: nil) ⇒ String

Creates an OAuth invite URL that can be used to invite this bot to a particular server.

Parameters:

  • server (Server, nil) (defaults to: nil)

    The server the bot should be invited to, or nil if a general invite should be created.

  • permission_bits (Integer, String) (defaults to: nil)

    Permission bits that should be appended to invite url.

Returns:

  • (String)

    the OAuth invite URL.


265
266
267
268
269
270
271
# File 'lib/discordrb/bot.rb', line 265

def invite_url(server: nil, permission_bits: nil)
  @client_id ||= bot_application.id

  server_id_str = server ? "&guild_id=#{server.id}" : ''
  permission_bits_str = permission_bits ? "&permissions=#{permission_bits}" : ''
  "https://discordapp.com/oauth2/authorize?&client_id=#{@client_id}#{server_id_str}#{permission_bits_str}&scope=bot"
end

#join(invite) ⇒ Object

Makes the bot join an invite to a server.

Parameters:


256
257
258
259
# File 'lib/discordrb/bot.rb', line 256

def join(invite)
  resolved = invite(invite).code
  API::Invite.accept(token, resolved)
end

#log_exception(e) ⇒ Object


572
573
574
# File 'lib/discordrb/bot.rb', line 572

def log_exception(e)
  LOGGER.log_exception(e)
end

#mode=(new_mode) ⇒ Object

Sets the logging mode

See Also:


522
523
524
# File 'lib/discordrb/bot.rb', line 522

def mode=(new_mode)
  LOGGER.mode = new_mode
end

#onlineObject Also known as: on

Sets status to online.


488
489
490
491
# File 'lib/discordrb/bot.rb', line 488

def online
  gateway_check
  update_status(:online, @game, @streamurl)
end

#parse_mention(mention, server = nil) ⇒ User, ...

Gets the user, role or emoji from a mention of the user, role or emoji.

Parameters:

  • mention (String)

    The mention, which should look like <@12314873129>, <@&123456789> or <:Name:126328:>.

  • server (Server, nil) (defaults to: nil)

    The server of the associated mention. (recommended for role parsing, to speed things up)

Returns:

  • (User, Role, Emoji)

    The user, role or emoji identified by the mention, or nil if none exists.


428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
# File 'lib/discordrb/bot.rb', line 428

def parse_mention(mention, server = nil)
  # Mention format: <@id>
  if /<@!?(?<id>\d+)>/ =~ mention
    user(id)
  elsif /<@&(?<id>\d+)>/ =~ mention
    return server.role(id) if server
    @servers.values.each do |element|
      role = element.role(id)
      return role unless role.nil?
    end

    # Return nil if no role is found
    nil
  elsif /<:(\w+):(?<id>\d+)>/ =~ mention
    emoji(id)
  end
end

#profileProfile Also known as: bot_user

The bot's user profile. This special user object can be used to edit user data like the current username (see Profile#username=).

Returns:

  • (Profile)

    The bot's profile that can be used to edit data.


191
192
193
194
# File 'lib/discordrb/bot.rb', line 191

def profile
  gateway_check
  @profile
end

#prune_empty_groupsObject


586
587
588
589
590
# File 'lib/discordrb/bot.rb', line 586

def prune_empty_groups
  @channels.each_value do |channel|
    channel.leave_group if channel.group? && channel.recipients.empty?
  end
end

#raise_heartbeat_eventObject

Raises a heartbeat event. Called by the gateway connection handler used internally.


582
583
584
# File 'lib/discordrb/bot.rb', line 582

def raise_heartbeat_event
  raise_event(HeartbeatEvent.new(self))
end

#raw_tokenString

Returns the raw token, without any prefix.

Returns:

  • (String)

    the raw token, without any prefix

See Also:


218
219
220
# File 'lib/discordrb/bot.rb', line 218

def raw_token
  @token.split(' ').last
end

#run(async = false) ⇒ Object

Runs the bot, which logs into Discord and connects the WebSocket. This prevents all further execution unless it is executed with async = :async.

Parameters:

  • async (Symbol) (defaults to: false)

    If it is :async, then the bot will allow further execution. It doesn't necessarily have to be that, anything truthy will work, however it is recommended to use :async for code readability reasons. If the bot is run in async mode, make sure to eventually run #sync so the script doesn't stop prematurely.


228
229
230
231
232
233
234
# File 'lib/discordrb/bot.rb', line 228

def run(async = false)
  @gateway.run_async
  return if async

  debug('Oh wait! Not exiting yet as run was run synchronously.')
  @gateway.sync
end

#send_file(channel, file, caption: nil, tts: false) ⇒ Object

Note:

This executes in a blocking way, so if you're sending long files, be wary of delays.

Sends a file to a channel. If it is an image, it will automatically be embedded.

Parameters:

  • channel (Channel, Integer, #resolve_id)

    The channel to send something to.

  • file (File)

    The file that should be sent.

  • caption (string) (defaults to: nil)

    The caption for the file.

  • tts (true, false) (defaults to: false)

    Whether or not this file's caption should be sent using Discord text-to-speech.


383
384
385
386
387
# File 'lib/discordrb/bot.rb', line 383

def send_file(channel, file, caption: nil, tts: false)
  channel = channel.resolve_id
  response = API::Channel.upload_file(token, channel, file, caption: caption, tts: tts)
  Message.new(JSON.parse(response), self)
end

#send_message(channel, content, tts = false, embed = nil) ⇒ Message

Sends a text message to a channel given its ID and the message's content.

Parameters:

  • channel (Channel, Integer, #resolve_id)

    The channel to send something to.

  • content (String)

    The text that should be sent as a message. It is limited to 2000 characters (Discord imposed).

  • tts (true, false) (defaults to: false)

    Whether or not this message should be sent using Discord text-to-speech.

  • embed (Hash, Discordrb::Webhooks::Embed, nil) (defaults to: nil)

    The rich embed to append to this message.

Returns:

  • (Message)

    The message that was sent.


350
351
352
353
354
355
356
# File 'lib/discordrb/bot.rb', line 350

def send_message(channel, content, tts = false, embed = nil)
  channel = channel.resolve_id
  debug("Sending message to #{channel} with content '#{content}'")

  response = API::Channel.create_message(token, channel, content, [], tts, embed ? embed.to_hash : nil)
  Message.new(JSON.parse(response), self)
end

#send_temporary_message(channel, content, timeout, tts = false, embed = nil) ⇒ Object

Sends a text message to a channel given its ID and the message's content, then deletes it after the specified timeout in seconds.

Parameters:

  • channel (Channel, Integer, #resolve_id)

    The channel to send something to.

  • content (String)

    The text that should be sent as a message. It is limited to 2000 characters (Discord imposed).

  • timeout (Float)

    The amount of time in seconds after which the message sent will be deleted.

  • tts (true, false) (defaults to: false)

    Whether or not this message should be sent using Discord text-to-speech.

  • embed (Hash, Discordrb::Webhooks::Embed, nil) (defaults to: nil)

    The rich embed to append to this message.


365
366
367
368
369
370
371
372
373
374
375
# File 'lib/discordrb/bot.rb', line 365

def send_temporary_message(channel, content, timeout, tts = false, embed = nil)
  Thread.new do
    Thread.current[:discordrb_name] = "#{@current_thread}-temp-msg"

    message = send_message(channel, content, tts, embed)
    sleep(timeout)
    message.delete
  end

  nil
end

#serversHash<Integer => Server>

The list of servers the bot is currently in.

Returns:


153
154
155
156
# File 'lib/discordrb/bot.rb', line 153

def servers
  gateway_check
  @servers
end

#stop(no_sync = false) ⇒ Object

Stops the bot gracefully, disconnecting the websocket without immediately killing the thread. This means that Discord is immediately aware of the closed connection and makes the bot appear offline instantly.

Parameters:

  • no_sync (true, false) (defaults to: false)

    Whether or not to disable use of synchronize in the close method. This should be true if called from a trap context.


245
246
247
# File 'lib/discordrb/bot.rb', line 245

def stop(no_sync = false)
  @gateway.stop(no_sync)
end

#stream(name, url) ⇒ String

Sets the currently online stream to the specified name and Twitch URL.

Parameters:

  • name (String)

    The name of the stream to display.

  • url (String)

    The url of the current Twitch stream.

Returns:

  • (String)

    The stream name that is being displayed now.


481
482
483
484
485
# File 'lib/discordrb/bot.rb', line 481

def stream(name, url)
  gateway_check
  update_status(@status, name, url)
  name
end

#suppress_ready_debugObject

Prevents the READY packet from being printed regardless of debug mode.


527
528
529
# File 'lib/discordrb/bot.rb', line 527

def suppress_ready_debug
  @prevent_ready = true
end

#syncObject

Blocks execution until the websocket stops, which should only happen manually triggered or due to an error. This is necessary to have a continuously running bot.


238
239
240
# File 'lib/discordrb/bot.rb', line 238

def sync
  @gateway.sync
end

#tokenString

The Discord API token received when logging in. Useful to explicitly call API methods.

Returns:


211
212
213
214
# File 'lib/discordrb/bot.rb', line 211

def token
  API.bot_name = @name
  @token
end

#unignore_user(user) ⇒ Object

Remove a user from the ignore list.

Parameters:

  • user (User, Integer, #resolve_id)

    The user, or its ID, to be unignored.


555
556
557
# File 'lib/discordrb/bot.rb', line 555

def unignore_user(user)
  @ignored_ids.delete(user.resolve_id)
end

#update_oauth_application(name, redirect_uris, description = '', icon = nil) ⇒ Object

Changes information about your OAuth application

Parameters:

  • name (String)

    What your application should be called.

  • redirect_uris (Array<String>)

    URIs that Discord should redirect your users to after authorizing.

  • description (String) (defaults to: '')

    A string that describes what your application does.

  • icon (String, nil) (defaults to: nil)

    A data URI for your icon image (for example a base 64 encoded image), or nil if no icon should be set or changed.


420
421
422
# File 'lib/discordrb/bot.rb', line 420

def update_oauth_application(name, redirect_uris, description = '', icon = nil)
  API.update_oauth_application(@token, name, redirect_uris, description, icon)
end

#update_status(status, game, url, since = 0, afk = false) ⇒ Object

Updates presence status.

Parameters:

  • status (String)

    The status the bot should show up as.

  • game (String, nil)

    The name of the game to be played/stream name on the stream.

  • url (String, nil)

    The Twitch URL to display as a stream. nil for no stream.

  • since (Integer) (defaults to: 0)

    When this status was set.

  • afk (true, false) (defaults to: false)

    Whether the bot is AFK.

See Also:


453
454
455
456
457
458
459
460
461
462
463
464
465
466
# File 'lib/discordrb/bot.rb', line 453

def update_status(status, game, url, since = 0, afk = false)
  gateway_check

  @game = game
  @status = status
  @streamurl = url
  type = url ? 1 : 0

  game_obj = game || url ? { 'name' => game, 'url' => url, 'type' => type } : nil
  @gateway.send_status_update(status, since, game_obj, afk)

  # Update the status in the cache
  profile.update_presence('status' => status.to_s, 'game' => game_obj)
end

#usersHash<Integer => User>

The list of users the bot shares a server with.

Returns:


146
147
148
149
# File 'lib/discordrb/bot.rb', line 146

def users
  gateway_check
  @users
end

#voice(thing) ⇒ Voice::VoiceBot?

Gets the voice bot for a particular server or channel. You can connect to a new channel using the #voice_connect method.

Parameters:

  • thing (Channel, Server, Integer)

    the server or channel you want to get the voice bot for, or its ID.

Returns:

  • (Voice::VoiceBot, nil)

    the VoiceBot for the thing you specified, or nil if there is no connection yet


280
281
282
283
284
285
286
287
288
289
290
291
# File 'lib/discordrb/bot.rb', line 280

def voice(thing)
  id = thing.resolve_id
  return @voices[id] if @voices[id]

  channel = channel(id)
  return nil unless channel

  server_id = channel.server.id
  return @voices[server_id] if @voices[server_id]

  nil
end

#voice_connect(chan, encrypted = true) ⇒ Voice::VoiceBot

Connects to a voice channel, initializes network connections and returns the Voice::VoiceBot over which audio data can then be sent. After connecting, the bot can also be accessed using #voice. If the bot is already connected to voice, the existing connection will be terminated - you don't have to call Voice::VoiceBot#destroy before calling this method.

Parameters:

  • chan (Channel, Integer, #resolve_id)

    The voice channel to connect to.

  • encrypted (true, false) (defaults to: true)

    Whether voice communication should be encrypted using RbNaCl's SecretBox (uses an XSalsa20 stream cipher for encryption and Poly1305 for authentication)

Returns:

  • (Voice::VoiceBot)

    the initialized bot over which audio data can then be sent.


301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
# File 'lib/discordrb/bot.rb', line 301

def voice_connect(chan, encrypted = true)
  chan = channel(chan.resolve_id)
  server_id = chan.server.id
  @should_encrypt_voice = encrypted

  if @voices[chan.id]
    debug('Voice bot exists already! Destroying it')
    @voices[chan.id].destroy
    @voices.delete(chan.id)
  end

  debug("Got voice channel: #{chan}")

  @should_connect_to_voice[server_id] = chan
  @gateway.send_voice_state_update(server_id.to_s, chan.id.to_s, false, false)

  debug('Voice channel init packet sent! Now waiting.')

  sleep(0.05) until @voices[server_id]
  debug('Voice connect succeeded!')
  @voices[server_id]
end

#voice_destroy(server, destroy_vws = true) ⇒ Object

Disconnects the client from a specific voice connection given the server ID. Usually it's more convenient to use Voice::VoiceBot#destroy rather than this.

Parameters:

  • server (Server, Integer, #resolve_id)

    The server the voice connection is on.

  • destroy_vws (true, false) (defaults to: true)

    Whether or not the VWS should also be destroyed. If you're calling this method directly, you should leave it as true.


329
330
331
332
333
334
# File 'lib/discordrb/bot.rb', line 329

def voice_destroy(server, destroy_vws = true)
  server = server.resolve_id
  @gateway.send_voice_state_update(server.to_s, nil, false, false)
  @voices[server].destroy if @voices[server] && destroy_vws
  @voices.delete(server)
end