Class: Discordrb::Channel

Inherits:
Object
  • Object
show all
Includes:
IDObject
Defined in:
lib/discordrb/data.rb

Overview

A Discord channel, including data like the topic

Constant Summary collapse

TEXT_TYPE =

The type string that stands for a text channel

See Also:

'text'.freeze
VOICE_TYPE =

The type string that stands for a voice channel

See Also:

'voice'.freeze

Instance Attribute Summary collapse

Attributes included from IDObject

#id

Instance Method Summary collapse

Methods included from IDObject

#==, #creation_time

Instance Attribute Details

#nameString

Returns this channel's name.

Returns:

  • (String)

    this channel's name.



812
813
814
# File 'lib/discordrb/data.rb', line 812

def name
  @name
end

#permission_overwritesHash<Integer => OpenStruct> (readonly)

This channel's permission overwrites, represented as a hash of role/user ID to an OpenStruct which has the allow and deny properties which are Permissions objects respectively.

Returns:

  • (Hash<Integer => OpenStruct>)

    the channel's permission overwrites



832
833
834
# File 'lib/discordrb/data.rb', line 832

def permission_overwrites
  @permission_overwrites
end

#positionInteger

Returns the channel's position on the channel list.

Returns:

  • (Integer)

    the channel's position on the channel list



827
828
829
# File 'lib/discordrb/data.rb', line 827

def position
  @position
end

#recipientRecipient? (readonly)

Returns the recipient of the private messages, or nil if this is not a PM channel.

Returns:

  • (Recipient, nil)

    the recipient of the private messages, or nil if this is not a PM channel



821
822
823
# File 'lib/discordrb/data.rb', line 821

def recipient
  @recipient
end

#serverServer? (readonly)

Returns the server this channel is on. If this channel is a PM channel, it will be nil.

Returns:

  • (Server, nil)

    the server this channel is on. If this channel is a PM channel, it will be nil.



815
816
817
# File 'lib/discordrb/data.rb', line 815

def server
  @server
end

#topicString

Returns the channel's topic.

Returns:

  • (String)

    the channel's topic



824
825
826
# File 'lib/discordrb/data.rb', line 824

def topic
  @topic
end

#typeString (readonly)

Returns the type of this channel (currently either 'text' or 'voice').

Returns:

  • (String)

    the type of this channel (currently either 'text' or 'voice')



818
819
820
# File 'lib/discordrb/data.rb', line 818

def type
  @type
end

Instance Method Details

#await(key, attributes = {}, &block) ⇒ Object

Add an Await for a message in this channel. This is identical in functionality to adding a Events::MessageEvent await with the in attribute as this channel.

See Also:



1028
1029
1030
# File 'lib/discordrb/data.rb', line 1028

def await(key, attributes = {}, &block)
  @bot.add_await(key, Discordrb::Events::MessageEvent, { in: @id }.merge(attributes), &block)
end

#define_overwrite(thing, allow, deny) ⇒ Object

Defines a permission overwrite for this channel that sets the specified thing to the specified allow and deny permission sets, or change an existing one.

Examples:

Define a permission overwrite for a user that can then mention everyone and use TTS, but not create any invites

allow = Discordrb::Permissions.new
allow.can_mention_everyone = true
allow.can_send_tts_messages = true

deny = Discordrb::Permissions.new
deny.can_create_instant_invite = true

channel.define_overwrite(user, allow, deny)

Parameters:

  • thing (User, Role)

    What to define an overwrite for.

  • allow (#bits, Permissions, Integer)

    The permission sets that should receive an allow override (i. e. a green checkmark on Discord)

  • deny (#bits, Permissions, Integer)

    The permission sets that should receive a deny override (i. e. a red cross on Discord)



961
962
963
964
965
966
967
968
969
970
# File 'lib/discordrb/data.rb', line 961

def define_overwrite(thing, allow, deny)
  allow_bits = allow.respond_to?(:bits) ? allow.bits : allow
  deny_bits = deny.respond_to?(:bits) ? deny.bits : deny

  if thing.is_a? User
    API.update_user_overrides(@bot.token, @id, thing.id, allow_bits, deny_bits)
  elsif thing.is_a? Role
    API.update_role_overrides(@bot.token, @id, thing.id, allow_bits, deny_bits)
  end
end

#deleteObject

Permanently deletes this channel



920
921
922
# File 'lib/discordrb/data.rb', line 920

def delete
  API.delete_channel(@bot.token, @id)
end

#history(amount, before_id = nil, after_id = nil) ⇒ Array<Message>

Retrieves some of this channel's message history.

Parameters:

  • amount (Integer)

    How many messages to retrieve. This must be less than or equal to 100, if it is higher than 100 it will be treated as 100 on Discord's side.

  • before_id (Integer) (defaults to: nil)

    The ID of the most recent message the retrieval should start at, or nil if it should start at the current message.

  • after_id (Integer) (defaults to: nil)

    The ID of the oldest message the retrieval should start at, or nil if it should start as soon as possible with the specified amount.

Returns:

  • (Array<Message>)

    the retrieved messages.



1003
1004
1005
1006
# File 'lib/discordrb/data.rb', line 1003

def history(amount, before_id = nil, after_id = nil)
  logs = API.channel_log(@bot.token, @id, amount, before_id, after_id)
  JSON.parse(logs).map { |message| Message.new(message, @bot) }
end

#inspectObject

The inspect method is overwritten to give more useful output



1055
1056
1057
# File 'lib/discordrb/data.rb', line 1055

def inspect
  "<Channel name=#{@name} id=#{@id} topic=\"#{@topic}\" type=#{@type} position=#{@position} server=#{@server}>"
end

#make_invite(max_age = 0, max_uses = 0, temporary = false, xkcd = false) ⇒ Invite Also known as: invite

Creates a new invite to this channel.

Parameters:

  • max_age (Integer) (defaults to: 0)

    How many seconds this invite should last.

  • max_uses (Integer) (defaults to: 0)

    How many times this invite should be able to be used.

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

    Whether membership should be temporary (kicked after going offline).

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

    Whether or not the invite should be human-readable.

Returns:

  • (Invite)

    the created invite.



1038
1039
1040
1041
# File 'lib/discordrb/data.rb', line 1038

def make_invite(max_age = 0, max_uses = 0, temporary = false, xkcd = false)
  response = API.create_invite(@bot.token, @id, max_age, max_uses, temporary, xkcd)
  Invite.new(JSON.parse(response), @bot)
end

#mentionString

Returns a string that will mention the channel as a clickable link on Discord.

Returns:

  • (String)

    a string that will mention the channel as a clickable link on Discord.



840
841
842
# File 'lib/discordrb/data.rb', line 840

def mention
  "<##{@id}>"
end

#private?true, false

Returns whether or not this channel is a PM channel.

Returns:

  • (true, false)

    whether or not this channel is a PM channel.



835
836
837
# File 'lib/discordrb/data.rb', line 835

def private?
  @server.nil?
end

#prune(amount) ⇒ Object

Delete the last N messages on this channel.

Parameters:

  • amount (Integer)

    How many messages to delete. Must be a value between 2 and 100 (Discord limitation)

Raises:

  • (ArgumentError)

    if the amount of messages is not a value between 2 and 100



1011
1012
1013
1014
1015
1016
# File 'lib/discordrb/data.rb', line 1011

def prune(amount)
  raise ArgumentError, 'Can only prune between 2 and 100 messages!' unless amount.between?(2, 100)

  messages = history(amount).map(&:id)
  API.bulk_delete(@bot.token, @id, messages)
end

#send_file(file) ⇒ Object

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

Parameters:

  • file (File)

    The file to send. There's no clear size limit for this, you'll have to attempt it for yourself (most non-image files are fine, large images may fail to embed)



915
916
917
# File 'lib/discordrb/data.rb', line 915

def send_file(file)
  @bot.send_file(@id, file)
end

#send_message(content, tts = false) ⇒ Message Also known as: send, message

Sends a message to this channel.

Parameters:

  • content (String)

    The content to send. Should not be longer than 2000 characters or it will result in an error.

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

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

Returns:

  • (Message)

    the message that was sent.



897
898
899
# File 'lib/discordrb/data.rb', line 897

def send_message(content, tts = false)
  @bot.send_message(@id, content, tts, @server && @server.id)
end

#send_multiple(content) ⇒ Object

Sends multiple messages to a channel

Parameters:

  • content (Array<String>)

    The messages to send.



903
904
905
# File 'lib/discordrb/data.rb', line 903

def send_multiple(content)
  content.each { |e| send_message(e) }
end

#split_send(content) ⇒ Object

Splits a message into chunks whose length is at most the Discord character limit, then sends them individually. Useful for sending long messages, but be wary of rate limits!



909
910
911
# File 'lib/discordrb/data.rb', line 909

def split_send(content)
  send_multiple(Discordrb.split_message(content))
end

#start_typingObject

Starts typing, which displays the typing indicator on the client for five seconds. If you want to keep typing you'll have to resend this every five seconds. (An abstraction for this will eventually be coming)



1046
1047
1048
# File 'lib/discordrb/data.rb', line 1046

def start_typing
  API.start_typing(@bot.token, @id)
end

#text?true, false

Returns whether or not this channel is a text channel.

Returns:

  • (true, false)

    whether or not this channel is a text channel



884
885
886
# File 'lib/discordrb/data.rb', line 884

def text?
  @type == TEXT_TYPE
end

#usersArray<Member>

The list of users currently in this channel. This is mostly useful for a voice channel, for a text channel it will just return the users on the server that are online.

Returns:

  • (Array<Member>)

    the users in this channel



985
986
987
988
989
990
991
992
993
# File 'lib/discordrb/data.rb', line 985

def users
  if @type == 'text'
    @server.members.select { |u| u.status != :offline }
  else
    @server.members.select do |user|
      user.voice_channel.id == @id if user.voice_channel
    end
  end
end

#voice?true, false

Returns whether or not this channel is a voice channel.

Returns:

  • (true, false)

    whether or not this channel is a voice channel



889
890
891
# File 'lib/discordrb/data.rb', line 889

def voice?
  @type == VOICE_TYPE
end