class Cinch::Message
This class serves two purposes. For one, it simply represents incoming messages and allows for querying various details (who sent the message, what kind of message it is, etc).
At the same time, it allows *responding* to messages, which means sending messages to either users or channels.
Attributes
@return [String, nil] The action message @since 2.0.0
@return [Bot] @since 1.1.0
@return [Channel] The channel in which this message was sent
@return [String]
@return [Array<String>, nil]
@return [String, nil] the command part of an CTCP message
@return [String, nil] the CTCP message, without 001 control characters
@return [Integer, nil] the numeric error code, if any
@return [Array<Symbol>]
@return [String, nil]
@return [Array<String>]
@return [String]
@return [String]
@return [String, nil]
@return [Target]
@return [Time] @since 2.0.0
@return [User] The user who sent this message
Public Class Methods
# File lib/cinch/message.rb, line 68 def initialize(msg, bot) @raw = msg @bot = bot @matches = {:ctcp => {}, :action => {}, :other => {}} @events = [] @time = Time.now parse if msg end
Public Instance Methods
@return [Boolean] true if the message is an action (/me) @since 2.0.0
# File lib/cinch/message.rb, line 130 def action? @ctcp_command == "ACTION" end
Reply to a message with an action.
@param [String] text the action message @return [void]
# File lib/cinch/message.rb, line 192 def action_reply(text) text = text.to_s @target.action(text) end
@return [Boolean] true if this message was sent in a channel
# File lib/cinch/message.rb, line 119 def channel? !@channel.nil? end
@return [Boolean] true if the message is an CTCP message
# File lib/cinch/message.rb, line 124 def ctcp? !!(@params.last =~ /\001.+\001/) end
Reply to a CTCP message
@return [void]
# File lib/cinch/message.rb, line 209 def ctcp_reply(answer) return unless ctcp? @user.notice "\001#{@ctcp_command} #{answer}\001" end
@return [Boolean] true if the message describes an error
# File lib/cinch/message.rb, line 114 def error? !@error.nil? end
@api private @return [MatchData]
# File lib/cinch/message.rb, line 138 def match(regexp, type, strip_colors) text = "" case type when :ctcp text = ctcp_message when :action text = action_message else text = message.to_s type = :other end if strip_colors text = Cinch::Utilities::String.strip_colors(text) end @matches[type][regexp] ||= text.match(regexp) end
@return [Boolean] true if the message is an numeric reply (as
opposed to a command)
# File lib/cinch/message.rb, line 109 def numeric_reply? !!@command.match(/^\d{3}$/) end
@api private @return [void]
# File lib/cinch/message.rb, line 79 def parse match = @raw.match(/(^:(\S+) )?(\S+)(.*)/) _, @prefix, @command, raw_params = match.captures if @bot.irc.network.ngametv? if @prefix != "ngame" @prefix = "%s!%s@%s" % [@prefix, @prefix, @prefix] end end @params = parse_params(raw_params) @user = parse_user @channel = parse_channel @target = @channel || @user @server = parse_server @error = parse_error @message = parse_message @ctcp_message = parse_ctcp_message @ctcp_command = parse_ctcp_command @ctcp_args = parse_ctcp_args @action_message = parse_action_message end
Replies to a message, automatically determining if it was a channel or a private message.
@param [String] text the message @param [Boolean] prefix if prefix is true and the message was in
a channel, the reply will be prefixed by the nickname of whoever send the mesage
@return [void]
# File lib/cinch/message.rb, line 167 def reply(text, prefix = false) text = text.to_s if @channel && prefix text = text.split("\n").map {|l| "#{user.nick}: #{l}"}.join("\n") end @target.send(text) end
Like action_reply, but using {Target#safe_action} instead
@param (see action_reply) @return (see action_reply)
# File lib/cinch/message.rb, line 201 def safe_action_reply(text) text = text.to_s @target.safe_action(text) end
@return [String] @since 1.1.0
# File lib/cinch/message.rb, line 218 def to_s "#<Cinch::Message @raw=#{@raw.chomp.inspect} @params=#{@params.inspect} channel=#{@channel.inspect} user=#{@user.inspect}>" end
Private Instance Methods
# File lib/cinch/message.rb, line 305 def parse_action_message # has to be called after parse_ctcp_message return nil unless action? @ctcp_message.split(" ", 2).last end
# File lib/cinch/message.rb, line 250 def parse_channel # has to be called after parse_params case @command when "INVITE", Constants::RPL_CHANNELMODEIS.to_s, Constants::RPL_BANLIST.to_s @bot.channel_list.find_ensured(@params[1]) when Constants::RPL_NAMEREPLY.to_s @bot.channel_list.find_ensured(@params[2]) else chantypes = @bot.irc.isupport["CHANTYPES"] if chantypes.include?(@params.first[0]) @bot.channel_list.find_ensured(@params.first) elsif numeric_reply? and @params.size > 1 and chantypes.include?(@params[1][0]) @bot.channel_list.find_ensured(@params[1]) end end end
# File lib/cinch/message.rb, line 299 def parse_ctcp_args # has to be called after parse_ctcp_message return unless ctcp? @ctcp_message.split(" ")[1..-1] end
# File lib/cinch/message.rb, line 293 def parse_ctcp_command # has to be called after parse_ctcp_message return unless ctcp? @ctcp_message.split(" ").first end
# File lib/cinch/message.rb, line 286 def parse_ctcp_message # has to be called after parse_params return unless ctcp? @params.last =~ /\001(.+)\001/ $1 end
# File lib/cinch/message.rb, line 273 def parse_error return @command.to_i if numeric_reply? && @command[/[45]\d\d/] end
# File lib/cinch/message.rb, line 277 def parse_message # has to be called after parse_params if error? @error.to_s elsif regular_command? @params.last end end
# File lib/cinch/message.rb, line 227 def parse_params(raw_params) raw_params = raw_params.strip params = [] if match = raw_params.match(/(?:^:| :)(.*)$/) params = match.pre_match.split(" ") params << match[1] else params = raw_params.split(" ") end return params end
# File lib/cinch/message.rb, line 267 def parse_server return unless @prefix return if @prefix.match(/[@!]/) return @prefix[/^(\S+)/, 1] end
# File lib/cinch/message.rb, line 240 def parse_user return unless @prefix nick = @prefix[/^(\S+)!/, 1] user = @prefix[/^\S+!(\S+)@/, 1] host = @prefix[/@(\S+)$/, 1] return nil if nick.nil? return @bot.user_list.find_ensured(user, nick, host) end
# File lib/cinch/message.rb, line 223 def regular_command? !numeric_reply? # a command can only be numeric or "regular"… end