Class: Cakewalk::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/cakewalk/message.rb

Overview

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.

Instance Attribute Summary collapse

Type checking collapse

Replying collapse

Instance Method Summary collapse

Constructor Details

#initialize(msg, bot) ⇒ Message

Returns a new instance of Message.



87
88
89
90
91
92
93
94
95
# File 'lib/cakewalk/message.rb', line 87

def initialize(msg, bot)
  @raw     = msg
  @bot     = bot
  @matches = {ctcp: {}, action: {}, other: {}}
  @events  = []
  @time    = Time.now
  @statusmsg_mode = nil
  parse if msg
end

Instance Attribute Details

#action_messageString? (readonly)

Returns The action message.

Returns:

  • (String, nil)

    The action message

Since:

  • 2.0.0



67
68
69
# File 'lib/cakewalk/message.rb', line 67

def action_message
  @action_message
end

#botBot (readonly)

Returns:

Since:

  • 1.1.0



39
40
41
# File 'lib/cakewalk/message.rb', line 39

def bot
  @bot
end

#channelChannel (readonly)

Returns The channel in which this message was sent.

Returns:

  • (Channel)

    The channel in which this message was sent



54
55
56
# File 'lib/cakewalk/message.rb', line 54

def channel
  @channel
end

#commandString (readonly)

Returns:



20
21
22
# File 'lib/cakewalk/message.rb', line 20

def command
  @command
end

#ctcp_argsArray<String>? (readonly)

Returns:



60
61
62
# File 'lib/cakewalk/message.rb', line 60

def ctcp_args
  @ctcp_args
end

#ctcp_commandString? (readonly)

Returns the command part of an CTCP message.

Returns:

  • (String, nil)

    the command part of an CTCP message



51
52
53
# File 'lib/cakewalk/message.rb', line 51

def ctcp_command
  @ctcp_command
end

#ctcp_messageString? (readonly)

Returns the CTCP message, without \001 control characters.

Returns:

  • (String, nil)

    the CTCP message, without \001 control characters



57
58
59
# File 'lib/cakewalk/message.rb', line 57

def ctcp_message
  @ctcp_message
end

#errorInteger? (readonly)

Returns the numeric error code, if any.

Returns:

  • (Integer, nil)

    the numeric error code, if any



48
49
50
# File 'lib/cakewalk/message.rb', line 48

def error
  @error
end

#eventsArray<Symbol>

Returns:

  • (Array<Symbol>)


29
30
31
# File 'lib/cakewalk/message.rb', line 29

def events
  @events
end

#messageString? (readonly)

Returns:



63
64
65
# File 'lib/cakewalk/message.rb', line 63

def message
  @message
end

#paramsArray<String> (readonly)

Returns:



23
24
25
# File 'lib/cakewalk/message.rb', line 23

def params
  @params
end

#prefixString (readonly)

Returns:



17
18
19
# File 'lib/cakewalk/message.rb', line 17

def prefix
  @prefix
end

#rawString (readonly)

Returns:



14
15
16
# File 'lib/cakewalk/message.rb', line 14

def raw
  @raw
end

#serverString? (readonly)

Returns:



45
46
47
# File 'lib/cakewalk/message.rb', line 45

def server
  @server
end

#statusmsg_modeString? (readonly)

The STATUSMSG mode a channel message was sent to.

Some IRC servers allow sending messages limited to people in a channel who have a certain mode. For example, by sending a message to +#channel, only people who are voiced, or have a higher mode (op) will receive the message.

This attribute contains the mode character the message was sent to, or nil if it was a normal message. For the previous example, this attribute would be set to "v", for voiced.

Returns:

Since:

  • 2.3.0



85
86
87
# File 'lib/cakewalk/message.rb', line 85

def statusmsg_mode
  @statusmsg_mode
end

#tagsHash (readonly)

Returns:

  • (Hash)


26
27
28
# File 'lib/cakewalk/message.rb', line 26

def tags
  @tags
end

#targetTarget (readonly)

Returns:



70
71
72
# File 'lib/cakewalk/message.rb', line 70

def target
  @target
end

#timeTime (readonly)

Returns:

  • (Time)

Since:

  • 2.0.0



35
36
37
# File 'lib/cakewalk/message.rb', line 35

def time
  @time
end

#userUser (readonly)

Returns The user who sent this message.

Returns:

  • (User)

    The user who sent this message



42
43
44
# File 'lib/cakewalk/message.rb', line 42

def user
  @user
end

Instance Method Details

#action?Boolean

Returns true if the message is an action (/me).

Returns:

  • (Boolean)

    true if the message is an action (/me)

Since:

  • 2.0.0



150
151
152
# File 'lib/cakewalk/message.rb', line 150

def action?
  @ctcp_command == "ACTION"
end

#action_reply(text)

This method returns an undefined value.

Reply to a message with an action.

For its behaviour with regard to STATUSMSG, see #reply.

Parameters:

  • text (String)

    the action message



219
220
221
222
# File 'lib/cakewalk/message.rb', line 219

def action_reply(text)
  text = text.to_s
  reply_target.action(text)
end

#channel?Boolean

Returns true if this message was sent in a channel.

Returns:

  • (Boolean)

    true if this message was sent in a channel



139
140
141
# File 'lib/cakewalk/message.rb', line 139

def channel?
  !@channel.nil?
end

#ctcp?Boolean

Returns true if the message is an CTCP message.

Returns:

  • (Boolean)

    true if the message is an CTCP message



144
145
146
# File 'lib/cakewalk/message.rb', line 144

def ctcp?
  !!(@params.last =~ /\001.+\001/)
end

#ctcp_reply(answer)

This method returns an undefined value.

Reply to a CTCP message



236
237
238
239
# File 'lib/cakewalk/message.rb', line 236

def ctcp_reply(answer)
  return unless ctcp?
  @user.notice "\001#{@ctcp_command} #{answer}\001"
end

#error?Boolean

Returns true if the message describes an error.

Returns:

  • (Boolean)

    true if the message describes an error



134
135
136
# File 'lib/cakewalk/message.rb', line 134

def error?
  !@error.nil?
end

#match(regexp, type, strip_colors) ⇒ MatchData

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (MatchData)


158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/cakewalk/message.rb', line 158

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 = Cakewalk::Formatting.unformat(text)
  end

  @matches[type][regexp] ||= text.match(regexp)
end

#numeric_reply?Boolean

Returns true if the message is an numeric reply (as opposed to a command).

Returns:

  • (Boolean)

    true if the message is an numeric reply (as opposed to a command)



129
130
131
# File 'lib/cakewalk/message.rb', line 129

def numeric_reply?
  !!@command.match(/^\d{3}$/)
end

#parse

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method returns an undefined value.



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/cakewalk/message.rb', line 99

def parse
  match = @raw.match(/(?:^@([^:]+))?(?::?(\S+) )?(\S+)(.*)/)
  if match.captures[3].empty?
    # no IRCv3 tags 
    @prefix, @command, raw_params = match.captures
  else
    tags, @prefix, @command, raw_params = match.captures
  end

  @params  = parse_params(raw_params)
  @tags    = parse_tags(tags)

  @user    = parse_user
  @channel, @statusmsg_mode = 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

#reply(text, prefix = false)

This method returns an undefined value.

Replies to a message, automatically determining if it was a channel or a private message.

If the message is a STATUSMSG, i.e. it was send to +#channel or @#channel instead of #channel, the reply will be sent as the same kind of STATUSMSG. See #statusmsg_mode for more information on STATUSMSG.

Parameters:

  • text (String)

    the message

  • prefix (Boolean) (defaults to: false)

    if prefix is true and the message was in a channel, the reply will be prefixed by the nickname of whoever send the mesage



192
193
194
195
196
197
198
199
# File 'lib/cakewalk/message.rb', line 192

def reply(text, prefix = false)
  text = text.to_s
  if @channel && prefix
    text = text.split("\n").map {|l| "#{user.nick}: #{l}"}.join("\n")
  end

  reply_target.send(text)
end

#safe_action_reply(text)

This method returns an undefined value.

Like #action_reply, but using Target#safe_action instead

Parameters:

  • text (String)

    the action message



228
229
230
231
# File 'lib/cakewalk/message.rb', line 228

def safe_action_reply(text)
  text = text.to_s
  reply_target.safe_action(text)
end

#safe_reply(text, prefix = false)

This method returns an undefined value.

Like #reply, but using Target#safe_send instead

Parameters:

  • text (String)

    the message

  • prefix (Boolean) (defaults to: false)

    if prefix is true and the message was in a channel, the reply will be prefixed by the nickname of whoever send the mesage



205
206
207
208
209
210
211
# File 'lib/cakewalk/message.rb', line 205

def safe_reply(text, prefix = false)
  text = text.to_s
  if channel && prefix
    text = "#{@user.nick}: #{text}"
  end
  reply_target.safe_send(text)
end

#to_sString

Returns:

Since:

  • 1.1.0



245
246
247
# File 'lib/cakewalk/message.rb', line 245

def to_s
  "#<Cakewalk::Message @raw=#{@raw.chomp.inspect} @params=#{@params.inspect} channel=#{@channel.inspect} user=#{@user.inspect}>"
end

#to_symbol(string) ⇒ Object



276
277
278
# File 'lib/cakewalk/message.rb', line 276

def to_symbol(string)
  return string.gsub(/-/, "_").downcase.to_sym
end