Class: Discorb::PermissionOverwrite

Inherits:
Object
  • Object
show all
Defined in:
lib/discorb/permission.rb

Overview

Represents a permission per channel.

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, bool = nil) -> Object

Returns the value of the flag.



239
240
241
242
243
244
245
246
247
248
# File 'lib/discorb/permission.rb', line 239

def method_missing(method, bool = nil)
  if self.class.bits.key?(method)
    self[method]
  elsif self.class.bits.key?(method.to_s.delete_suffix("=").to_sym)
    key = method.to_s.delete_suffix("=").to_sym
    self[key] = bool
  else
    super
  end
end

Class Method Details

.from_hash(hash) -> Discorb::PermissionOverwrite

Initializes a permission overwrite from a hash.

Parameters:

  • hash (Hash)

    The hash to initialize the permission overwrite from.

Returns:



265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'lib/discorb/permission.rb', line 265

def from_hash(hash)
  allow = 0
  deny = 0
  hash.filter { |k, v| self.class.bits.keys.include?(k) && [true, false].include?(v) }.each do |k, v|
    if v
      allow += self.class.bits[k]
    else
      deny += self.class.bits[k]
    end
  end

  new(allow, deny)
end

Instance Method Details

#+(other) -> Discorb::PermissionOverwrite

Union of the permission overwrites.

Parameters:

Returns:



193
194
195
196
197
198
199
# File 'lib/discorb/permission.rb', line 193

def +(other)
  result = to_hash
  self.class.bits.each_key do |field|
    result[field] = other[field] unless other[field].nil?
  end
  self.class.from_hash(result)
end

#[](field) -> true, ...

Returns whether overwrite of the given field.

Parameters:

  • field (Symbol)

    The field to check.

Returns:

  • (true, false, nil)

    Whether the field is allowed, denied or not set.



208
209
210
211
212
213
214
# File 'lib/discorb/permission.rb', line 208

def [](field)
  if @allow & self.class.bits[field] != 0
    true
  elsif @deny & self.class.bits[field] != 0
    false
  end
end

#[]=(key, bool) -> Object

Sets the given field to the given value.

Parameters:

  • key (Symbol)

    The field to set.

  • bool (Boolean)

    The value to set.



222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/discorb/permission.rb', line 222

def []=(key, bool)
  case bool
  when true
    @allow |= self.class.bits[key]
    @deny &= ~self.class.bits[key]
  when false
    @allow &= ~self.class.bits[key]
    @deny |= self.class.bits[key]
  else
    @allow &= ~self.class.bits[key]
    @deny &= ~self.class.bits[key]
  end
end

#allow -> Object Also known as: +@



147
148
149
# File 'lib/discorb/permission.rb', line 147

def allow
  self.class.bits.keys.filter { |field| @allow & self.class.bits[field] != 0 }
end

#allow_value -> Object



159
160
161
# File 'lib/discorb/permission.rb', line 159

def allow_value
  @allow
end

#deny -> Object Also known as: -@



153
154
155
# File 'lib/discorb/permission.rb', line 153

def deny
  self.class.bits.keys.filter { |field| @deny & self.class.bits[field] != 0 }
end

#deny_value -> Object



163
164
165
# File 'lib/discorb/permission.rb', line 163

def deny_value
  @deny
end

#inspect -> Object



167
168
169
# File 'lib/discorb/permission.rb', line 167

def inspect
  "#<#{self.class} allow=#{allow} deny=#{deny}>"
end

#respond_to_missing?(method, _arg) -> Boolean

Returns:

  • (Boolean)


250
251
252
# File 'lib/discorb/permission.rb', line 250

def respond_to_missing?(method, _arg)
  self.class.bits.key?(method.to_s.delete_suffix("=").to_sym) ? true : super
end

#to_hash -> Hash

Converts the permission overwrite to a hash.

Returns:

  • (Hash)

    The permission overwrite as a hash.



176
177
178
179
180
181
182
183
184
# File 'lib/discorb/permission.rb', line 176

def to_hash
  self.class.bits.keys.map do |field|
    [field, if @allow & self.class.bits[field] != 0
      true
    elsif @deny & self.class.bits[method] != 0
      false
    end]
  end.to_h
end