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
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
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
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
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
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