Parent

Included Modules

Class/Module Index [+]

Quicksearch

Cinch::User

@attr_reader [String] user @attr_reader [String] host @attr_reader [String] realname @attr_reader [String] authname @attr_reader [Integer] idle How long this user has been idle, in seconds.

This is a snapshot of the last WHOIS.

@attr_reader [Time] signed_on_at @attr_reader [Array<Channel>] channels All channels the user is in. @attr_reader [String, nil] away The user's away message, or

`nil` if not away.

@version 2.0.0

Attributes

data[R]

By default, you can use methods like User#user, User#host and alike – If you however fear that another thread might change data while you're using it and if this means a critical issue to your code, you can store a clone of the result of this method and work with that instead.

@example

on :channel do |m|
  data = m.user.data.dup
  do_something_with(data.user)
  do_something_with(data.host)
end

@return [Hash]

in_whois[RW]

@return [Boolean]

last_nick[R]

@return [String] @since 1.1.0

monitored[RW]

@return [Boolean] True if the user is being monitored @see monitor @see unmonitor

online[R]

@return [Boolean] True if the user is online. @note This attribute will be updated by various events, but unless {monitor} is being used, this information cannot be ensured to be always correct.

online?[R]

@return [Boolean] True if the user is online. @note This attribute will be updated by various events, but unless {monitor} is being used, this information cannot be ensured to be always correct.

secure[R]

@return [Boolean] True if the user is using a secure connection, i.e. SSL.

secure?[R]

@return [Boolean] True if the user is using a secure connection, i.e. SSL.

synced[R]

@return [Boolean]

unknown[R]

@return [Boolean] True if the instance references an user who

cannot be found on the server.
unknown?[R]

@return [Boolean] True if the instance references an user who

cannot be found on the server.

Public Class Methods

new(*args) click to toggle source
# File lib/cinch/user.rb, line 90
def initialize(*args)
  @data = {
    :user         => nil,
    :host         => nil,
    :realname     => nil,
    :authname     => nil,
    :idle         => 0,
    :signed_on_at => nil,
    :unknown?     => false,
    :online?      => false,
    :channels     => [],
    :secure?      => false,
    :away         => nil,
  }
  case args.size
  when 2
    @name, @bot = args
  when 4
    @data[:user], @name, @data[:host], @bot = args
  else
    raise ArgumentError
  end

  @synced_attributes  = Set.new

  @when_requesting_synced_attribute = lambda {|attr|
    unless synced?(attr)
      @data[:unknown?] = false
      unsync :unknown?

      whois
    end
  }

  @monitored = false
end

Public Instance Methods

=~(other) click to toggle source
Alias for: match
attr(attribute, data = true, unsync = false) click to toggle source

@see Syncable#attr

# File lib/cinch/user.rb, line 137
def attr(attribute, data = true, unsync = false)
  super
end
authed?() click to toggle source

Checks if the user is identified. Currently officially supports Quakenet and Freenode.

@return [Boolean] true if the user is identified @version 1.1.0

# File lib/cinch/user.rb, line 132
def authed?
  !attr(:authname).nil?
end
dcc_send(io, filename = File.basename(io.path)) click to toggle source

Send data via DCC SEND to a user.

@param [DCC::DCCableObject] io @param [String] filename @since 2.0.0 @return [void] @note This method blocks.

# File lib/cinch/user.rb, line 309
def dcc_send(io, filename = File.basename(io.path))
  own_ip = bot.config.dcc.own_ip || @bot.irc.socket.addr[2]
  dcc = DCC::Outgoing::Send.new(receiver: self,
                                filename: filename,
                                io: io,
                                own_ip: own_ip
                                )

  dcc.start_server

  handler = Handler.new(@bot, :message,
                        Pattern.new(/^/,
                                    /\0001DCC RESUME #{filename} #{dcc.port} (\d+)\0001/,
                                    /$/)) do |m, position|
    next unless m.user == self
    dcc.seek(position.to_i)
    m.user.send "\0001DCC ACCEPT #{filename} #{dcc.port} #{position}\0001"

    handler.unregister
  end
  @bot.handlers.register(handler)

  @bot.loggers.info "DCC: Outgoing DCC SEND: File name: %s - Size: %dB - IP: %s - Port: %d - Status: waiting" % [filename, io.size, own_ip, dcc.port]
  dcc.send_handshake
  begin
    dcc.listen
    @bot.loggers.info "DCC: Outgoing DCC SEND: File name: %s - Size: %dB - IP: %s - Port: %d - Status: done" % [filename, io.size, own_ip, dcc.port]
  rescue Timeout::Error
    @bot.loggers.info "DCC: Outgoing DCC SEND: File name: %s - Size: %dB - IP: %s - Port: %d - Status: failed (timeout)" % [filename, io.size, own_ip, dcc.port]
  ensure
    handler.unregister
  end
end
end_of_whois(values, not_found = false) click to toggle source

@param [Hash, nil] values A hash of values gathered from WHOIS,

or `nil` if no data was returned

@param [Boolean] not_found Has to be true if WHOIS resulted in

an unknown user

@return [void] @api private @since 1.0.1

# File lib/cinch/user.rb, line 168
def end_of_whois(values, not_found = false)
  @in_whois = false
  if not_found
    sync(:unknown?, true, true)
    self.online = false
    sync(:idle, 0, true)
    sync(:channels, [], true)

    fields = @data.keys
    fields.delete(:unknown?)
    fields.delete(:idle)
    fields.delete(:channels)
    fields.each do |field|
      sync(field, nil, true)
    end

    return
  end

  if values.nil?
    # for some reason, we did not receive user information. one
    # reason is freenode throttling WHOIS
    Thread.new do
      sleep 2
      whois
    end
    return
  end

  {
    :authname => nil,
    :idle => 0,
    :secure? => false,
    :channels => [],
  }.merge(values).each do |attr, value|
    sync(attr, value, true)
  end

  sync(:unknown?, false, true)
  self.online = true
end
inspect() click to toggle source

@return [String]

# File lib/cinch/user.rb, line 224
def inspect
  "#<User nick=#{@name.inspect}>"
end
mask(s = "%n!%u@%h") click to toggle source

Generates a mask for the user.

@param [String] s a pattern for generating the mask.

- %n = nickname
- %u = username
- %h = host
- %r = realname
- %a = authname

@return [Mask]

# File lib/cinch/user.rb, line 239
def mask(s = "%n!%u@%h")
  s = s.gsub(/%(.)/) {
    case $1
    when "n"
      @name
    when "u"
      self.user
    when "h"
      self.host
    when "r"
      self.realname
    when "a"
      self.authname
    end
  }

  Mask.new(s)
end
match(other) click to toggle source

Check if the user matches a mask.

@param [Ban, Mask, User, String] other The user or mask to match against @return [Boolean]

# File lib/cinch/user.rb, line 262
def match(other)
  Mask.from(other) =~ Mask.from(self)
end
Also aliased as: =~
method_missing(m, *args) click to toggle source

Provides synced access to user attributes.

# File lib/cinch/user.rb, line 371
def method_missing(m, *args)
  if m.to_s =~ /^(.+)_unsynced$/
    m = $1.to_sym
    unsync = true
  end

  if @data.has_key?(m)
    attr(m, true, unsync)
  else
    super
  end
end
monitor() click to toggle source

Starts monitoring a user's online state by either using MONITOR or periodically running WHOIS.

@since 2.0.0 @return [void] @see unmonitor

# File lib/cinch/user.rb, line 273
def monitor
  if @bot.irc.isupport["MONITOR"] > 0
    @bot.irc.send "MONITOR + #@name"
  else
    refresh
    @monitored_timer = Timer.new(@bot, interval: 30) {
      refresh
    }
    @monitored_timer.start
  end

  @monitored = true
end
online=(bool) click to toggle source

Updates the user's online state and dispatch the correct event.

@since 2.0.0 @return [void] @api private

# File lib/cinch/user.rb, line 348
def online=(bool)
  notify = self.__send__("online?_unsynced") != bool && @monitored
  sync(:online?, bool, true)

  return unless notify
  if bool
    @bot.handlers.dispatch(:online, nil, self)
  else
    @bot.handlers.dispatch(:offline, nil, self)
  end
end
refresh() click to toggle source
Alias for: whois
respond_to?(m) click to toggle source

@since 1.1.2

# File lib/cinch/user.rb, line 385
def respond_to?(m)
  if m.to_s =~ /^(.+)_unsynced$/
    m = $1.to_sym
  end

  return @data.has_key?(m) || super
end
to_s() click to toggle source

@return [String]

# File lib/cinch/user.rb, line 219
def to_s
  @name
end
unmonitor() click to toggle source

Stops monitoring a user's online state.

@since 2.0.0 @return [void] @see monitor

# File lib/cinch/user.rb, line 292
def unmonitor
  if @bot.irc.isupport["MONITOR"] > 0
    @bot.irc.send "MONITOR - #@name"
  else
    @monitored_timer.stop if @monitored_timer
  end

  @monitored = false
end
unsync_all() click to toggle source

@return [void] @since 1.0.1 @api private @see Syncable#unsync_all

# File lib/cinch/user.rb, line 214
def unsync_all
  super
end
update_nick(new_nick) click to toggle source

Used to update the user's nick on nickchange events.

@param [String] new_nick The user's new nick @api private @return [void]

# File lib/cinch/user.rb, line 365
def update_nick(new_nick)
  @last_nick, @name = @name, new_nick
  @bot.user_list.update_nick(self)
end
whois() click to toggle source

Queries the IRC server for information on the user. This will set the User's state to not synced. After all information are received, the object will be set back to synced.

@return [void]

# File lib/cinch/user.rb, line 146
def whois
  return if @in_whois
  @data.keys.each do |attr|
    unsync attr
  end

  @in_whois = true
  if @bot.irc.network.whois_only_one_argument?
    @bot.irc.send "WHOIS #@name"
  else
    @bot.irc.send "WHOIS #@name #@name"
  end
end
Also aliased as: refresh

[Validate]

Generated with the Darkfish Rdoc Generator 2.