cinch 2.0.0.pre.2 → 2.0.0.pre.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/docs/readme.md +1 -0
- data/lib/cinch/formatting.rb +9 -1
- data/lib/cinch/message.rb +142 -114
- data/lib/cinch/version.rb +1 -1
- metadata +2 -2
data/docs/readme.md
CHANGED
data/lib/cinch/formatting.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
module Cinch
|
2
|
-
#
|
2
|
+
# This module can be used for adding colors and formatting to
|
3
|
+
# messages.
|
4
|
+
#
|
5
|
+
# The format codes used are those defined by mIRC, which are also
|
6
|
+
# the ones supported by most clients.
|
7
|
+
#
|
8
|
+
# For usage instructions and examples, see {.format}.
|
3
9
|
#
|
4
10
|
# List of valid colors
|
5
11
|
# =========================
|
@@ -30,6 +36,8 @@ module Cinch
|
|
30
36
|
# Other
|
31
37
|
# =====
|
32
38
|
# - reset (Resets all formatting to the client's defaults)
|
39
|
+
#
|
40
|
+
# @since 2.0.0
|
33
41
|
module Formatting
|
34
42
|
# @private
|
35
43
|
Colors = {
|
data/lib/cinch/message.rb
CHANGED
@@ -8,29 +8,18 @@ module Cinch
|
|
8
8
|
#
|
9
9
|
# At the same time, it allows **responding** to messages, which
|
10
10
|
# means sending messages to either users or channels.
|
11
|
-
#
|
12
|
-
# @attr_reader user
|
13
|
-
# @attr_reader error
|
14
|
-
# @attr_reader message
|
15
|
-
# @attr_reader server
|
16
|
-
# @attr_reader target
|
17
|
-
# @attr_reader channel
|
18
|
-
# @attr_reader action_message
|
19
|
-
# @attr_reader ctcp_args
|
20
|
-
# @attr_reader ctcp_command
|
21
|
-
# @attr_reader ctcp_message
|
22
11
|
class Message
|
23
12
|
# @return [String]
|
24
|
-
|
13
|
+
attr_reader :raw
|
25
14
|
|
26
15
|
# @return [String]
|
27
|
-
|
16
|
+
attr_reader :prefix
|
28
17
|
|
29
18
|
# @return [String]
|
30
|
-
|
19
|
+
attr_reader :command
|
31
20
|
|
32
21
|
# @return [Array<String>]
|
33
|
-
|
22
|
+
attr_reader :params
|
34
23
|
|
35
24
|
# @return [Array<Symbol>]
|
36
25
|
attr_reader :events
|
@@ -45,6 +34,37 @@ module Cinch
|
|
45
34
|
# @since 1.1.0
|
46
35
|
attr_reader :bot
|
47
36
|
|
37
|
+
# @return [User] The user who sent this message
|
38
|
+
attr_reader :user
|
39
|
+
|
40
|
+
# @return [String, nil]
|
41
|
+
attr_reader :server
|
42
|
+
|
43
|
+
# @return [Integer, nil] the numeric error code, if any
|
44
|
+
attr_reader :error
|
45
|
+
|
46
|
+
# @return [String, nil] the command part of an CTCP message
|
47
|
+
attr_reader :ctcp_command
|
48
|
+
|
49
|
+
# @return [Channel] The channel in which this message was sent
|
50
|
+
attr_reader :channel
|
51
|
+
|
52
|
+
# @return [String, nil] the CTCP message, without \001 control characters
|
53
|
+
attr_reader :ctcp_message
|
54
|
+
|
55
|
+
# @return [Array<String>, nil]
|
56
|
+
attr_reader :ctcp_args
|
57
|
+
|
58
|
+
# @return [String, nil]
|
59
|
+
attr_reader :message
|
60
|
+
|
61
|
+
# @return [String, nil] The action message
|
62
|
+
# @since 2.0.0
|
63
|
+
attr_reader :action_message
|
64
|
+
|
65
|
+
# @return [Target]
|
66
|
+
attr_reader :target
|
67
|
+
|
48
68
|
def initialize(msg, bot)
|
49
69
|
@raw = msg
|
50
70
|
@bot = bot
|
@@ -62,40 +82,24 @@ module Cinch
|
|
62
82
|
|
63
83
|
if @bot.irc.network.ngametv?
|
64
84
|
if @prefix != "ngame"
|
65
|
-
@prefix = "%s
|
85
|
+
@prefix = "%s!%s@%s" % [@prefix, @prefix, @prefix]
|
66
86
|
end
|
67
87
|
end
|
68
88
|
|
69
|
-
raw_params
|
70
|
-
if match = raw_params.match(/(?:^:| :)(.*)$/)
|
71
|
-
@params = match.pre_match.split(" ")
|
72
|
-
@params << match[1]
|
73
|
-
else
|
74
|
-
@params = raw_params.split(" ")
|
75
|
-
end
|
76
|
-
end
|
89
|
+
@params = parse_params(raw_params)
|
77
90
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
91
|
+
@user = parse_user
|
92
|
+
@channel = parse_channel
|
93
|
+
@target = @user || @channel
|
94
|
+
@server = parse_server
|
95
|
+
@error = parse_error
|
96
|
+
@message = parse_message
|
84
97
|
|
85
|
-
|
86
|
-
@
|
87
|
-
|
88
|
-
|
89
|
-
# @return [String, nil]
|
90
|
-
def server
|
91
|
-
return unless @prefix
|
92
|
-
return if @prefix.match(/[@!]/)
|
93
|
-
@server ||= @prefix[/^(\S+)/, 1]
|
94
|
-
end
|
98
|
+
@ctcp_message = parse_ctcp_message
|
99
|
+
@ctcp_command = parse_ctcp_command
|
100
|
+
@ctcp_args = parse_ctcp_args
|
95
101
|
|
96
|
-
|
97
|
-
def error
|
98
|
-
@error ||= (command.to_i if numeric_reply? && command[/[45]\d\d/])
|
102
|
+
@action_message = parse_action_message
|
99
103
|
end
|
100
104
|
|
101
105
|
# @group Type checking
|
@@ -103,68 +107,32 @@ module Cinch
|
|
103
107
|
# @return [Boolean] true if the message is an numeric reply (as
|
104
108
|
# opposed to a command)
|
105
109
|
def numeric_reply?
|
106
|
-
|
110
|
+
!!@command.match(/^\d{3}$/)
|
107
111
|
end
|
108
112
|
|
109
113
|
# @return [Boolean] true if the message describes an error
|
110
114
|
def error?
|
111
|
-
|
115
|
+
!@error.nil?
|
112
116
|
end
|
113
117
|
|
114
118
|
# @return [Boolean] true if this message was sent in a channel
|
115
119
|
def channel?
|
116
|
-
|
120
|
+
!@channel.nil?
|
117
121
|
end
|
118
122
|
|
119
123
|
# @return [Boolean] true if the message is an CTCP message
|
120
124
|
def ctcp?
|
121
|
-
!!(params.last =~ /\001.+\001/)
|
125
|
+
!!(@params.last =~ /\001.+\001/)
|
122
126
|
end
|
123
127
|
|
124
128
|
# @return [Boolean] true if the message is an action (/me)
|
125
129
|
# @since 2.0.0
|
126
130
|
def action?
|
127
|
-
ctcp_command == "ACTION"
|
131
|
+
@ctcp_command == "ACTION"
|
128
132
|
end
|
129
133
|
|
130
134
|
# @endgroup
|
131
135
|
|
132
|
-
# @return [String, nil] The action message
|
133
|
-
# @since 2.0.0
|
134
|
-
def action_message
|
135
|
-
return nil unless action?
|
136
|
-
ctcp_message.split(" ", 2).last
|
137
|
-
end
|
138
|
-
|
139
|
-
# @return [String, nil] the command part of an CTCP message
|
140
|
-
def ctcp_command
|
141
|
-
return unless ctcp?
|
142
|
-
ctcp_message.split(" ").first
|
143
|
-
end
|
144
|
-
|
145
|
-
# @return [Channel] The channel in which this message was sent
|
146
|
-
def channel
|
147
|
-
@channel ||= begin
|
148
|
-
case command
|
149
|
-
when "INVITE", Constants::RPL_CHANNELMODEIS.to_s, Constants::RPL_BANLIST.to_s
|
150
|
-
@bot.channel_list.find_ensured(params[1])
|
151
|
-
when Constants::RPL_NAMEREPLY.to_s
|
152
|
-
@bot.channel_list.find_ensured(params[2])
|
153
|
-
else
|
154
|
-
if params.first.start_with?("#")
|
155
|
-
@bot.channel_list.find_ensured(params.first)
|
156
|
-
elsif numeric_reply? and params[1].start_with?("#")
|
157
|
-
@bot.channel_list.find_ensured(params[1])
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
# @return [Target]
|
164
|
-
def target
|
165
|
-
channel || user
|
166
|
-
end
|
167
|
-
|
168
136
|
# @api private
|
169
137
|
# @return [MatchData]
|
170
138
|
def match(regexp, type)
|
@@ -177,30 +145,6 @@ module Cinch
|
|
177
145
|
end
|
178
146
|
end
|
179
147
|
|
180
|
-
# @return [String, nil] the CTCP message, without \001 control characters
|
181
|
-
def ctcp_message
|
182
|
-
return unless ctcp?
|
183
|
-
params.last =~ /\001(.+)\001/
|
184
|
-
$1
|
185
|
-
end
|
186
|
-
|
187
|
-
# @return [Array<String>, nil]
|
188
|
-
def ctcp_args
|
189
|
-
return unless ctcp?
|
190
|
-
ctcp_message.split(" ")[1..-1]
|
191
|
-
end
|
192
|
-
|
193
|
-
# @return [String, nil]
|
194
|
-
def message
|
195
|
-
@message ||= begin
|
196
|
-
if error?
|
197
|
-
error.to_s
|
198
|
-
elsif regular_command?
|
199
|
-
params.last
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
148
|
# @group Replying
|
205
149
|
|
206
150
|
# Replies to a message, automatically determining if it was a
|
@@ -213,11 +157,11 @@ module Cinch
|
|
213
157
|
# @return [void]
|
214
158
|
def reply(text, prefix = false)
|
215
159
|
text = text.to_s
|
216
|
-
if channel && prefix
|
160
|
+
if @channel && prefix
|
217
161
|
text = text.split("\n").map {|l| "#{user.nick}: #{l}"}.join("\n")
|
218
162
|
end
|
219
163
|
|
220
|
-
target.send(text)
|
164
|
+
@target.send(text)
|
221
165
|
end
|
222
166
|
|
223
167
|
# Like #reply, but using {Target#safe_send} instead
|
@@ -227,9 +171,9 @@ module Cinch
|
|
227
171
|
def safe_reply(text, prefix = false)
|
228
172
|
text = text.to_s
|
229
173
|
if channel && prefix
|
230
|
-
text = "#{user.nick}: #{text}"
|
174
|
+
text = "#{@user.nick}: #{text}"
|
231
175
|
end
|
232
|
-
target.safe_send(text)
|
176
|
+
@target.safe_send(text)
|
233
177
|
end
|
234
178
|
|
235
179
|
# Reply to a CTCP message
|
@@ -237,7 +181,7 @@ module Cinch
|
|
237
181
|
# @return [void]
|
238
182
|
def ctcp_reply(answer)
|
239
183
|
return unless ctcp?
|
240
|
-
user.notice "\001#{ctcp_command} #{answer}\001"
|
184
|
+
@user.notice "\001#{@ctcp_command} #{answer}\001"
|
241
185
|
end
|
242
186
|
|
243
187
|
# @endgroup
|
@@ -245,12 +189,96 @@ module Cinch
|
|
245
189
|
# @return [String]
|
246
190
|
# @since 1.1.0
|
247
191
|
def to_s
|
248
|
-
"#<Cinch::Message @raw=#{raw.chomp.inspect} @params=#{@params.inspect} channel=#{channel.inspect} user=#{user.inspect}>"
|
192
|
+
"#<Cinch::Message @raw=#{@raw.chomp.inspect} @params=#{@params.inspect} channel=#{@channel.inspect} user=#{@user.inspect}>"
|
249
193
|
end
|
250
194
|
|
251
195
|
private
|
252
196
|
def regular_command?
|
253
197
|
!numeric_reply? # a command can only be numeric or "regular"…
|
254
198
|
end
|
199
|
+
|
200
|
+
def parse_params(raw_params)
|
201
|
+
raw_params = raw_params.strip
|
202
|
+
params = []
|
203
|
+
if match = raw_params.match(/(?:^:| :)(.*)$/)
|
204
|
+
params = match.pre_match.split(" ")
|
205
|
+
params << match[1]
|
206
|
+
else
|
207
|
+
params = raw_params.split(" ")
|
208
|
+
end
|
209
|
+
|
210
|
+
return params
|
211
|
+
end
|
212
|
+
|
213
|
+
def parse_user
|
214
|
+
return unless @prefix
|
215
|
+
nick = @prefix[/^(\S+)!/, 1]
|
216
|
+
user = @prefix[/^\S+!(\S+)@/, 1]
|
217
|
+
host = @prefix[/@(\S+)$/, 1]
|
218
|
+
|
219
|
+
return nil if nick.nil?
|
220
|
+
return @bot.user_list.find_ensured(user, nick, host)
|
221
|
+
end
|
222
|
+
|
223
|
+
def parse_channel
|
224
|
+
# has to be called after parse_params
|
225
|
+
case @command
|
226
|
+
when "INVITE", Constants::RPL_CHANNELMODEIS.to_s, Constants::RPL_BANLIST.to_s
|
227
|
+
@bot.channel_list.find_ensured(@params[1])
|
228
|
+
when Constants::RPL_NAMEREPLY.to_s
|
229
|
+
@bot.channel_list.find_ensured(@params[2])
|
230
|
+
else
|
231
|
+
if @params.first.start_with?("#")
|
232
|
+
@bot.channel_list.find_ensured(@params.first)
|
233
|
+
elsif numeric_reply? and @params[1].start_with?("#")
|
234
|
+
@bot.channel_list.find_ensured(@params[1])
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def parse_server
|
240
|
+
return unless @prefix
|
241
|
+
return if @prefix.match(/[@!]/)
|
242
|
+
return @prefix[/^(\S+)/, 1]
|
243
|
+
end
|
244
|
+
|
245
|
+
def parse_error
|
246
|
+
return @command.to_i if numeric_reply? && @command[/[45]\d\d/]
|
247
|
+
end
|
248
|
+
|
249
|
+
def parse_message
|
250
|
+
# has to be called after parse_params
|
251
|
+
if error?
|
252
|
+
@error.to_s
|
253
|
+
elsif regular_command?
|
254
|
+
@params.last
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def parse_ctcp_message
|
259
|
+
# has to be called after parse_params
|
260
|
+
return unless ctcp?
|
261
|
+
@params.last =~ /\001(.+)\001/
|
262
|
+
$1
|
263
|
+
end
|
264
|
+
|
265
|
+
def parse_ctcp_command
|
266
|
+
# has to be called after parse_ctcp_message
|
267
|
+
return unless ctcp?
|
268
|
+
@ctcp_message.split(" ").first
|
269
|
+
end
|
270
|
+
|
271
|
+
def parse_ctcp_args
|
272
|
+
# has to be called after parse_ctcp_message
|
273
|
+
return unless ctcp?
|
274
|
+
@ctcp_message.split(" ")[1..-1]
|
275
|
+
end
|
276
|
+
|
277
|
+
def parse_action_message
|
278
|
+
# has to be called after parse_ctcp_message
|
279
|
+
return nil unless action?
|
280
|
+
@ctcp_message.split(" ", 2).last
|
281
|
+
end
|
282
|
+
|
255
283
|
end
|
256
284
|
end
|
data/lib/cinch/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cinch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.pre.
|
4
|
+
version: 2.0.0.pre.3
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-07 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A simple, friendly DSL for creating IRC bots
|
15
15
|
email:
|