Class: Tkellem::TkellemBot::NetworkCommand

Inherits:
Command
  • Object
show all
Defined in:
lib/tkellem/tkellem_bot.rb

Instance Attribute Summary

Attributes inherited from Command

#args, #bouncer, #conn, #options, #opts

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Command

admin_option, admin_user?, build_options, #initialize, option, register, resources, #respond, run, #show_help, #user

Constructor Details

This class inherits a constructor from Tkellem::TkellemBot::Command

Class Method Details

.admin_only?Boolean

Returns:

  • (Boolean)


338
339
340
# File 'lib/tkellem/tkellem_bot.rb', line 338

def self.admin_only?
  false
end

Instance Method Details

#executeObject



362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
# File 'lib/tkellem/tkellem_bot.rb', line 362

def execute
  # TODO: this got gross
  if args.empty? && !opts['remove']
    list
    return
  end

  if opts['network'].present?
    target = Network.where(["name = ? AND user_id = ?", opts['network'].downcase, user.try(:id)]).first
    target ||= Network.where(["name = ? AND user_id IS NULL", opts['network'].downcase]).first if self.class.admin_user?(user)
  else
    target = bouncer.try(:network)
    if target && target.public? && !self.class.admin_user?(user)
      raise(Command::ArgumentError, "Only admins can modify public networks")
    end
    raise(Command::ArgumentError, "No network found") unless target
  end

  uri = ListenCommand.get_uri(args.shift) unless args.empty?
  addr_args = { :address => uri.host, :port => uri.port, :ssl => (uri.scheme == 'ircs') } if uri

  if opts['remove']
    raise(Command::ArgumentError, "No network found") unless target
    raise(Command::ArgumentError, "You must explicitly specify the network to remove") unless opts['network']
    if uri
      target.hosts.where(addr_args).first.try(:destroy)
      respond "    #{show(target)}"
    else
      target.destroy
      r "Network #{target.name} removed"
    end
  else
    unless target
      create_public = (self.class.admin_user?(user) && opts['public'])
      raise(Command::ArgumentError, "Only public networks can be created without a user") unless create_public || user
      admin_or_user_networks = self.class.admin_user?(user) || Setting.get('allow_user_networks') == 'true'
      raise(Command::ArgumentError, "Creating user networks has been disabled by the admins") unless admin_or_user_networks
      target = Network.create(:name => opts['network'], :user => (create_public ? nil : user))
      unless create_public
        NetworkUser.create(:user => user, :network => target)
      end
    end

    target.attributes = { :hosts_attributes => [addr_args] }
    target.save
    if target.errors.any?
      respond "Error:"
      target.errors.full_messages.each { |m| respond "    #{m}" }
      respond "    #{show(target)}"
    else
      respond("updated:")
      respond "    #{show(target)}"
    end
  end
end

#listObject



346
347
348
349
350
351
352
353
354
355
356
# File 'lib/tkellem/tkellem_bot.rb', line 346

def list
  public_networks = Network.where('user_id IS NULL').to_a
  user_networks = user.try(:reload).try(:networks) || []
  if user_networks.present? && public_networks.present?
    r "Public networks are prefixed with [P], user-specific networks with [U]."
  end
  (public_networks + user_networks).each do |net|
    prefix = net.public? ? 'P' : 'U'
    r "    [#{prefix}] #{show(net)}"
  end
end

#show(network) ⇒ Object



358
359
360
# File 'lib/tkellem/tkellem_bot.rb', line 358

def show(network)
  "#{network.name} " + network.hosts.map { |h| "[#{h}]" }.join(' ')
end