class MijDiscord::Data::Server

Constants

CHANNEL_TYPES
CONTENT_FILTER_LEVEL
DEFAULT_NOTIFICATIONS
VERIFICATION_LEVEL

Attributes

afk_channel[R]
afk_timeout[R]
bot[R]
cache[R]
content_filter[R]
content_filter_level[R]
default_notifications[R]
embed_enabled[R]
embed_enabled?[R]
features[R]
has_embed?[R]
icon_id[R]
large[R]
large?[R]
member_count[R]
name[R]
owner[R]
verification_level[R]

Public Class Methods

new(data, bot, invalid = false) click to toggle source
# File lib/mij-discord/data/server.rb, line 64
def initialize(data, bot, invalid = false)
  @bot = bot

  @id = data['id'].to_i
  @large = data['large']
  @member_count = data['member_count']

  @cache = MijDiscord::Cache::ServerCache.new(self, @bot)

  data['channels']&.each {|ch| @cache.put_channel(ch) }

  data['roles']&.each {|ro| @cache.put_role(ro) }

  update_synced_data(data)

  @voice_states = {}
  data['voice_states']&.each {|vs| update_voice_state(vs) }

  update_emojis(data)
  update_data(data)

  @owner = member(data['owner_id'])
end

Public Instance Methods

afk_channel=(channel, reason = nil)
Alias for: set_afk_channel
afk_timeout=(timeout, reason = nil)
Alias for: set_afk_timeout
available_regions() click to toggle source
# File lib/mij-discord/data/server.rb, line 343
def available_regions
  return @voice_regions if @voice_regions

  response = MijDiscord::Core::API::Server.regions(@bot.auth, @id)
  @voice_regions = JSON.parse(response).map {|x| VoiceRegion.new(x) }
end
ban(user, message_days = 0, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 299
def ban(user, message_days = 0, reason = nil)
  MijDiscord::Core::API::Server.ban_user(@bot.auth, @id, user.to_id, message_days, reason)
  nil
end
bans() click to toggle source
# File lib/mij-discord/data/server.rb, line 294
def bans
  response = MijDiscord::Core::API::Server.bans(@bot.auth, @id)
  JSON.parse(response).map {|x| @bot.cache.put_user(x['user']) }
end
channel(id) click to toggle source
# File lib/mij-discord/data/server.rb, line 174
def channel(id)
  @cache.get_channel(id)
end
channels() click to toggle source
# File lib/mij-discord/data/server.rb, line 170
def channels
  @cache.list_channels
end
create_channel(name, reason = nil, type: :text, bitrate: nil, user_limit: nil, permissions: [], nsfw: false) click to toggle source
# File lib/mij-discord/data/server.rb, line 279
def create_channel(name, reason = nil, type: :text, bitrate: nil, user_limit: nil, permissions: [], nsfw: false)
  raise ArgumentError, 'Invalid channel type specified' unless CHANNEL_TYPES.has_key?(type)

  permissions = permissions.map {|x| x.is_a(Overwrite) ? x.to_hash : x }
  response = MijDiscord::Core::API::Server.create_channel(@bot.auth, @id,
    name, CHANNEL_TYPES[type], bitrate, user_limit, permissions, nsfw, reason)
  @cache.put_channel(JSON.parse(response))
end
create_role(name, reason = nil, color: 0, hoist: false, mentionable: false, permissions: 104_324_161) click to toggle source
# File lib/mij-discord/data/server.rb, line 288
def create_role(name, reason = nil, color: 0, hoist: false, mentionable: false, permissions: 104_324_161)
  response = MijDiscord::Core::API::Server.create_role(@bot.auth, @id,
    name, color.to_i, hoist, mentionable, permissions.to_i, reason)
  @cache.put_role(JSON.parse(response))
end
default_channel(can_send = false) click to toggle source
# File lib/mij-discord/data/server.rb, line 221
def default_channel(can_send = false)
  text_channels.sort_by {|ch| [ch.position, ch.id] }.find do |ch|
    if (overwrite = ch.permission_overwrites[id])
      if can_send
        overwrite.allow.send_messages? || !overwrite.deny.send_messages?
      else
        overwrite.allow.read_messages? || !overwrite.deny.read_messages?
      end
    else
      if can_send
        everyone_role.permissions.send_messages
      else
        everyone_role.permissions.read_messages
      end
    end
  end
end
Also aliased as: general_channel
delete() click to toggle source
# File lib/mij-discord/data/server.rb, line 319
def delete
  MijDiscord::Core::API::Server.delete(@bot.auth, @id)
  nil
end
embed_url(style = :shield) click to toggle source
# File lib/mij-discord/data/server.rb, line 396
def embed_url(style = :shield)
  return nil unless @embed_enabled
  MijDiscord::Core::API.widget_url(@id, style)
end
emoji(id) click to toggle source
# File lib/mij-discord/data/server.rb, line 205
def emoji(id)
  @emojis[id&.to_id]
end
emojis() click to toggle source
# File lib/mij-discord/data/server.rb, line 201
def emojis
  @emojis.values
end
everyone_role() click to toggle source
# File lib/mij-discord/data/server.rb, line 209
def everyone_role
  role(@id)
end
general_channel(can_send = false)
Alias for: default_channel
icon=(icon, reason = nil)
Alias for: set_icon
icon_url(format = :png) click to toggle source
# File lib/mij-discord/data/server.rb, line 391
def icon_url(format = :png)
  return nil unless @icon_id
  MijDiscord::Core::API.icon_url(@id, @icon_id, format)
end
inspect() click to toggle source
# File lib/mij-discord/data/server.rb, line 438
def inspect
  MijDiscord.make_inspect(self,
  :id, :name, :owner, :member_count, :features, :embed_enabled, :verification_level,
  :content_filter_level, :default_notifications, :afk_timeout, :afk_channel)
end
invites() click to toggle source
# File lib/mij-discord/data/server.rb, line 247
def invites
  response = MijDiscord::Core::API::Server.invites(@bot.auth, @id)
  JSON.parse(response).map {|x| Invite.new(x, @bot) }
end
kick(user, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 309
def kick(user, reason = nil)
  MijDiscord::Core::API::Server.remove_member(@bot.auth, @id, user.to_id, reason)
  nil
end
leave() click to toggle source
# File lib/mij-discord/data/server.rb, line 314
def leave
  MijDiscord::Core::API::User.leave_server(@bot.auth, @id)
  nil
end
member(id) click to toggle source
# File lib/mij-discord/data/server.rb, line 197
def member(id)
  @cache.get_member(id)
end
members(full = false) click to toggle source
# File lib/mij-discord/data/server.rb, line 186
def members(full = false)
  if full && !@members_chunk_sent
    @members_chunked, @members_chunk_sent = 0, true
    @bot.gateway.send_request_members(@id, '', 0)
  end

  sleep(0.05) while @members_chunked

  @cache.list_members
end
name=(name, reason = nil)
Alias for: set_name
online_members(idle: true, bots: false) click to toggle source
# File lib/mij-discord/data/server.rb, line 241
def online_members(idle: true, bots: false)
  members.select! do |m|
    ((idle ? m.idle? : false) || m.online?) && (bots ? true : !m.bot_account?)
  end
end
owner=(user, reason = nil)
Alias for: set_owner
prune(days, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 264
def prune(days, reason = nil)
  raise ArgumentError, 'Days must be between 1 and 30' unless days.between?(1, 30)

  response = MijDiscord::Core::API::Server.begin_prune(@bot.auth, @id, days, reason)
  JSON.parse(response)['pruned']
end
prune_count(days) click to toggle source
# File lib/mij-discord/data/server.rb, line 257
def prune_count(days)
  raise ArgumentError, 'Days must be between 1 and 30' unless days.between?(1, 30)

  response = MijDiscord::Core::API::Server.prune_count(@bot.auth, @id, days)
  JSON.parse(response)['pruned']
end
region() click to toggle source
# File lib/mij-discord/data/server.rb, line 350
def region
  available_regions.find {|x| x.id == @region_id }
end
region=(region, reason = nil)
Alias for: set_region
role(id) click to toggle source
# File lib/mij-discord/data/server.rb, line 182
def role(id)
  @cache.get_role(id)
end
roles() click to toggle source
# File lib/mij-discord/data/server.rb, line 178
def roles
  @cache.list_roles
end
search_messages(limit: 25, offset: 0, sort_by: nil, sort_asc: false, nsfw: true, around: 2, content: nil, author: nil, channel: nil, mentions: nil, author_is: nil, author_not: nil, has: nil, has_not: nil, before: nil, after: nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 401
def search_messages(limit: 25, offset: 0, sort_by: nil, sort_asc: false,
nsfw: true, around: 2, content: nil, author: nil, channel: nil, mentions: nil,
author_is: nil, author_not: nil, has: nil, has_not: nil, before: nil, after: nil)
  author = author ? [*author].map(&:to_id) : nil
  channel = channel ? [*channel].map(&:to_id) : nil
  mentions = mentions ? [*mentions].map(&:to_id) : nil

  has_not = has_not ? [*has_not].map {|x| "-#{x}" } : []
  author_not = author_not ? [*author_not].map {|x| "-#{x}" } : []

  has = has_not | (has ? [*has].map(&:to_s) : [])
  author_is = author_not | (author_is ? [*author_is].map(&:to_s) : [])

  before = before ? IDObject.synthesize(before) : nil
  after = after ? IDObject.synthesize(after) : nil

  options = {
    limit: limit,
    offset: offset,
    sort_by: sort_by,
    sort_order: sort_asc ? 'asc' : 'desc',
    context_size: around,
    include_nsfw: nsfw,
    author_id: author,
    author_type: author_is,
    channel_id: channel,
    mentions: mentions,
    max_id: before,
    min_id: after,
    content: content,
    has: has,
  }.delete_if {|_,v| v.nil? }

  response = MijDiscord::Core::API::Server.search_messages(@bot.auth, @id, options)
  SearchResults.new(JSON.parse(response), @bot)
end
set_afk_channel(channel, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 377
def set_afk_channel(channel, reason = nil)
  set_options(reason, afk_channel: channel.to_id)
  nil
end
Also aliased as: afk_channel=
set_afk_timeout(timeout, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 384
def set_afk_timeout(timeout, reason = nil)
  set_options(reason, afk_timeout: timeout)
  nil
end
Also aliased as: afk_timeout=
set_icon(icon, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 364
def set_icon(icon, reason = nil)
  if icon.respond_to?(:read)
    buffer = Base64.strict_encode64(icon.read)
    icon = "data:image/jpg;base64,#{buffer}"
    set_options(reason, icon: icon)
  else
    set_options(reason, icon: icon.to_s)
  end
  nil
end
Also aliased as: icon=
set_name(name, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 336
def set_name(name, reason = nil)
  set_options(reason, name: name)
  nil
end
Also aliased as: name=
set_options(reason = nil, name: nil, region: nil, icon: nil, afk_channel: nil, afk_timeout: nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 330
def set_options(reason = nil, name: nil, region: nil, icon: nil, afk_channel: nil, afk_timeout: nil)
  response = MijDiscord::Core::API::Server.update(@bot.auth, @id,
    name, region, icon, afk_channel&.to_id, afk_timeout, reason)
  @bot.cache.put_server(JSON.parse(response), update: true)
end
set_owner(user, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 324
def set_owner(user, reason = nil)
  MijDiscord::Core::API::Server.transfer_ownership(@bot.auth, @id, user.to_id, reason)
end
Also aliased as: owner=
set_region(region, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 354
def set_region(region, reason = nil)
  region = region.to_s
  raise ArgumentError, 'Invalid region' unless available_regions.find {|x| x.id == region }

  set_options(reason, region: region)
  nil
end
Also aliased as: region=
text_channels() click to toggle source
# File lib/mij-discord/data/server.rb, line 271
def text_channels
  channels.select!(&:text?)
end
unban(user, reason = nil) click to toggle source
# File lib/mij-discord/data/server.rb, line 304
def unban(user, reason = nil)
  MijDiscord::Core::API::Server.unban_user(@bot.auth, @id, user.to_id, reason)
  nil
end
update_data(data) click to toggle source
# File lib/mij-discord/data/server.rb, line 88
def update_data(data)
  @name = data.fetch('name', @name)
  @region_id = data.fetch('region', @region_id)
  @icon_id = data.fetch('icon', @icon_id)
  @afk_timeout = data.fetch('afk_timeout', @afk_timeout)
  @embed_enabled = data.fetch('embed_enabled', @embed_enabled)
  @verification_level = VERIFICATION_LEVEL.fetch(data['verification_level'], @verification_level)
  @content_filter_level = CONTENT_FILTER_LEVEL.fetch(data['explicit_content_filter'], @content_filter_level)
  @default_notifications = DEFAULT_NOTIFICATIONS.fetch(data['default_message_notifications'], @default_notifications)

  begin
    if data.has_key?('afk_channel_id')
      id = data['afk_channel_id'].to_i
      @afk_channel = @bot.channel(id, self)
    end
  rescue MijDiscord::Errors::Forbidden
    @afk_channel = nil
  end
end
update_emojis(data) click to toggle source
# File lib/mij-discord/data/server.rb, line 108
def update_emojis(data)
  if (emojis = data['emojis'])
    @emojis = emojis.each_with_object({}) do |el, p|
      p[el['id'].to_i] = Emoji.new(el, self)
    end
  end
  @emojis ||= {}
end
update_member(data, mode) click to toggle source
# File lib/mij-discord/data/server.rb, line 156
def update_member(data, mode)
  case mode
    when :add
      @member_count += 1
      @cache.put_member(data)
    when :remove
      @member_count -= 1
      key = data['user']['id']
      @cache.remove_member(key)
    when :update
      @cache.put_member(data, update: true)
  end
end
update_members_chunk(data) click to toggle source
# File lib/mij-discord/data/server.rb, line 135
def update_members_chunk(data)
  return if @members_chunked.nil?

  @members_chunked += data.length
  data.each {|mb| @cache.put_member(mb, update: true) }

  @members_chunked = nil if @members_chunked == @member_count
end
update_synced_data(data) click to toggle source
# File lib/mij-discord/data/server.rb, line 144
def update_synced_data(data)
  data['members']&.each {|mb| @cache.put_member(mb, update: true) }

  data['presences']&.each do |pr|
    next unless pr['user']

    user_id = pr['user']['id'].to_i
    user = @cache.get_member(user_id, local: true)
    user.update_presence(pr) if user
  end
end
update_voice_state(data) click to toggle source
# File lib/mij-discord/data/server.rb, line 117
def update_voice_state(data)
  user = @cache.get_member(data['user_id'])

  if (chan_id = data['channel_id']&.to_i)
    state = (@voice_states[user.id] ||= VoiceState.new(user))
    channel = @cache.get_channel(chan_id)

    state.update_data(channel, data) if channel
    state
  else
    state = @voice_states.delete(user.id)
    state ||= VoiceState.new(user)

    state.update_data(nil, data)
    state
  end
end
voice_channels() click to toggle source
# File lib/mij-discord/data/server.rb, line 275
def voice_channels
  channels.select!(&:voice?)
end
voice_state(id) click to toggle source
# File lib/mij-discord/data/server.rb, line 217
def voice_state(id)
  @voice_states[id&.to_id]
end
voice_states() click to toggle source
# File lib/mij-discord/data/server.rb, line 213
def voice_states
  @voice_states.values
end
webhooks() click to toggle source
# File lib/mij-discord/data/server.rb, line 252
def webhooks
  response = MijDiscord::Core::API::Server.webhooks(@bot.auth, @id)
  JSON.parse(response).map {|x| Webhook.new(x, @bot) }
end