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.



260
261
262
263
264
265
266
267
268
269
# File 'lib/discorb/permission.rb', line 260

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:



286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# File 'lib/discorb/permission.rb', line 286

def from_hash(hash)
  allow = 0
  deny = 0
  hash
    .filter do |k, v|
      self.class.bits.keys.include?(k) && [true, false].include?(v)
    end
    .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:



210
211
212
213
214
215
216
217
218
219
220
# File 'lib/discorb/permission.rb', line 210

def +(other)
  result = to_hash
  self.class.bits.each_key do |field|
    next if other[field].nil?
    result[field] = (
      other[field] ||
        raise(KeyError, "field #{field} not found in #{other.inspect}")
    )
  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.



229
230
231
232
233
234
235
# File 'lib/discorb/permission.rb', line 229

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.



243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/discorb/permission.rb', line 243

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

#allowObject Also known as: +@



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

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

#allow_valueObject



173
174
175
# File 'lib/discorb/permission.rb', line 173

def allow_value
  @allow
end

#denyObject Also known as: -@



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

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

#deny_valueObject



177
178
179
# File 'lib/discorb/permission.rb', line 177

def deny_value
  @deny
end

#inspectObject



181
182
183
# File 'lib/discorb/permission.rb', line 181

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

#respond_to_missing?(method, _arg) ⇒ Boolean

Returns:

  • (Boolean)


271
272
273
# File 'lib/discorb/permission.rb', line 271

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

#to_hashHash

Converts the permission overwrite to a hash.

Returns:

  • (Hash)

    The permission overwrite as a hash.



190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/discorb/permission.rb', line 190

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