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.
@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
# File lib/cinch/message.rb, line 67 def initialize(msg, bot) @raw = msg @bot = bot @matches = {:ctcp => {}, :action => {}, :other => {}} @events = [] @time = Time.now parse if msg end
@return [Boolean] true if the message is an action (/me) @since 2.0.0
# File lib/cinch/message.rb, line 129 def action? @ctcp_command == "ACTION" end
@return [Boolean] true if this message was sent in a channel
# File lib/cinch/message.rb, line 118 def channel? !@channel.nil? end
@return [Boolean] true if the message is an CTCP message
# File lib/cinch/message.rb, line 123 def ctcp? !!(@params.last =~ /\001.+\001/) end
Reply to a CTCP message
@return [void]
# File lib/cinch/message.rb, line 181 def ctcp_reply(answer) return unless ctcp? @user.notice "\0001#{@ctcp_command} #{answer}\0001" end
@return [Boolean] true if the message describes an error
# File lib/cinch/message.rb, line 113 def error? !@error.nil? end
@api private @return [MatchData]
# File lib/cinch/message.rb, line 137 def match(regexp, type) if type == :ctcp @matches[:ctcp][regexp] ||= ctcp_message.match(regexp) elsif type == :action @matches[:action][regexp] ||= action_message.match(regexp) else @matches[:other][regexp] ||= message.to_s.match(regexp) end end
@return [Boolean] true if the message is an numeric reply (as
opposed to a command)
# File lib/cinch/message.rb, line 108 def numeric_reply? !!@command.match(/^\d{3}$/) end
@api private @return [void]
# File lib/cinch/message.rb, line 78 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 157 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
@return [String] @since 1.1.0
# File lib/cinch/message.rb, line 190 def to_s "#<Cinch::Message @raw=#{@raw.chomp.inspect} @params=#{@params.inspect} channel=#{@channel.inspect} user=#{@user.inspect}>" end
# File lib/cinch/message.rb, line 277 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 222 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 chantypes.include?(@params[1][0]) @bot.channel_list.find_ensured(@params[1]) end end end
# File lib/cinch/message.rb, line 271 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 265 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 258 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 245 def parse_error return @command.to_i if numeric_reply? && @command[/[45]\d\d/] end
# File lib/cinch/message.rb, line 249 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 199 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 239 def parse_server return unless @prefix return if @prefix.match(/[@!]/) return @prefix[/^(\S+)/, 1] end
# File lib/cinch/message.rb, line 212 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 195 def regular_command? !numeric_reply? # a command can only be numeric or "regular"… end