Target
@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
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]
@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.
@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.
# 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
@see Syncable#attr
# File lib/cinch/user.rb, line 137 def attr(attribute, data = true, unsync = false) super end
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
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
@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
@return [String]
# File lib/cinch/user.rb, line 224 def inspect "#<User nick=#{@name.inspect}>" end
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
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
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
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
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
@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
@return [String]
# File lib/cinch/user.rb, line 219 def to_s @name end
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
@return [void] @since 1.0.1 @api private @see Syncable#unsync_all
# File lib/cinch/user.rb, line 214 def unsync_all super end
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
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
Generated with the Darkfish Rdoc Generator 2.