cinch 2.1.0 → 2.2.0
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/README.md +2 -17
- data/docs/bot_options.md +1 -1
- data/docs/changes.md +52 -3
- data/docs/common_tasks.md +1 -1
- data/examples/basic/autovoice.rb +2 -2
- data/examples/basic/google.rb +1 -1
- data/examples/basic/join_part.rb +4 -4
- data/examples/basic/memo.rb +6 -6
- data/examples/basic/seen.rb +5 -5
- data/examples/plugins/google.rb +1 -1
- data/examples/plugins/last_nick.rb +2 -2
- data/lib/cinch.rb +0 -1
- data/lib/cinch/channel.rb +46 -5
- data/lib/cinch/formatting.rb +14 -3
- data/lib/cinch/helpers.rb +43 -1
- data/lib/cinch/irc.rb +11 -12
- data/lib/cinch/message.rb +9 -3
- data/lib/cinch/mode_parser.rb +8 -6
- data/lib/cinch/target.rb +51 -17
- data/lib/cinch/user.rb +12 -3
- data/lib/cinch/user_list.rb +2 -2
- data/lib/cinch/utilities/deprecation.rb +8 -4
- data/lib/cinch/utilities/encoding.rb +4 -21
- data/lib/cinch/utilities/kernel.rb +2 -2
- data/lib/cinch/version.rb +1 -1
- metadata +2 -3
- data/lib/cinch/utilities/string.rb +0 -17
data/README.md
CHANGED
@@ -12,10 +12,8 @@ profits flourish.
|
|
12
12
|
Cinch will do all of the hard work for you, so you can spend time creating cool
|
13
13
|
plugins and extensions to wow your internet peers.
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
[irc.freenode.org](irc://irc.freenode.org/cinch-bots). For general
|
18
|
-
support, join [#cinch](irc://irc.freenode.org/cinch).
|
15
|
+
For general support, join [#cinch](irc://irc.freenode.org/cinch) – but
|
16
|
+
please don't bring any bots.
|
19
17
|
|
20
18
|
Installation
|
21
19
|
------------
|
@@ -156,11 +154,6 @@ on :message, /hello/ do |m|
|
|
156
154
|
end
|
157
155
|
```
|
158
156
|
|
159
|
-
Authors
|
160
|
-
-------
|
161
|
-
|
162
|
-
* [Dominik Honnef](http://dominik.honnef.co)
|
163
|
-
|
164
157
|
Contribute
|
165
158
|
----------
|
166
159
|
|
@@ -175,11 +168,3 @@ of supporting Ruby versions below 1.9.1.
|
|
175
168
|
Fork the project, implement your awesome feature in its own branch, and send
|
176
169
|
a pull request to one of the Cinch collaborators. We'll be more than happy
|
177
170
|
to check it out.
|
178
|
-
|
179
|
-
### Contributors
|
180
|
-
- darix <darix [at] nordisch.org> (wrote the message splitting algorithm)
|
181
|
-
- robgleeson (thanks for testing, contributing a lot of ideas,
|
182
|
-
discussing design decisions etc)
|
183
|
-
- Emil Loer (http://github.com/thedjinn) for improving the handling of
|
184
|
-
unexpected disconnects and reconnects.
|
185
|
-
- Check the list of authors for smaller contributions
|
data/docs/bot_options.md
CHANGED
data/docs/changes.md
CHANGED
@@ -1,6 +1,54 @@
|
|
1
1
|
# @title What has changed?
|
2
2
|
# @markup kramdown
|
3
3
|
|
4
|
+
# What has changed in 2.2?
|
5
|
+
|
6
|
+
## Getting rid of CP1252 in favour of UTF-8
|
7
|
+
|
8
|
+
In versions before 2.2, when using the `irc` encoding (the default),
|
9
|
+
Cinch would use CP1252 for outgoing messages, only falling back to
|
10
|
+
UTF-8 if a message wouldn't fit into CP1252. This is a so called
|
11
|
+
hybrid encoding, which is used by X-Chat and the like.
|
12
|
+
|
13
|
+
This encoding, however, is based on the state of 10 years ago, where
|
14
|
+
the most popular IRC clients, such as mIRC, weren't capable of
|
15
|
+
handling UTF-8. Nowadays, there are more clients that support UTF-8
|
16
|
+
than there are clients that can deal with this hybrid encoding, or
|
17
|
+
CP1252 itself. That's why, from now on, we will always use UTF-8.
|
18
|
+
|
19
|
+
If you depend on outgoing messages being encoded in CP1252, please see
|
20
|
+
{file:docs/encodings.md} on how to change the encoding.
|
21
|
+
|
22
|
+
## API improvements
|
23
|
+
|
24
|
+
### New methods
|
25
|
+
|
26
|
+
- {Cinch::Channel#remove} has been added to support the non-standard
|
27
|
+
REMOVE command, a friendlier alternative to kicking people.
|
28
|
+
|
29
|
+
- {Cinch::Helpers.sanitize} and {Cinch::Formatting.unformat} have been
|
30
|
+
added to help with removing unprintable characters and mIRC
|
31
|
+
formatting codes from strings.
|
32
|
+
|
33
|
+
### Deprecated methods
|
34
|
+
|
35
|
+
In order to reduce the amount of aliases, the following ones have been
|
36
|
+
deprecated and will be removed in a future release:
|
37
|
+
|
38
|
+
- {Cinch::Channel#msg}
|
39
|
+
- {Cinch::Channel#privmsg}
|
40
|
+
- {Cinch::Target#msg}
|
41
|
+
- {Cinch::Target#privmsg}
|
42
|
+
- {Cinch::Target#safe_msg}
|
43
|
+
- {Cinch::Target#safe_privmsg}
|
44
|
+
- {Cinch::User#whois}
|
45
|
+
- {Cinch::Helpers#Color}
|
46
|
+
|
47
|
+
Additionally, the following method is deprecated and will be removed
|
48
|
+
in the future:
|
49
|
+
|
50
|
+
- {Cinch::Channel#to_str}
|
51
|
+
|
4
52
|
# What has changed in 2.1?
|
5
53
|
1. Color stripping
|
6
54
|
1. Per group hooks
|
@@ -11,12 +59,13 @@
|
|
11
59
|
|
12
60
|
## Color stripping
|
13
61
|
|
14
|
-
The new method
|
15
|
-
of mIRC color codes from
|
62
|
+
The new method <del>`Cinch::Utilities::String.strip_colors`</del>
|
63
|
+
{Cinch::Formatting.unformat} allows removal of mIRC color codes from
|
64
|
+
messages.
|
16
65
|
|
17
66
|
Additionally, a new match option called `strip_colors` makes it
|
18
67
|
possible to automatically and temporarily strip color codes before
|
19
|
-
|
68
|
+
attempting to match a message.
|
20
69
|
|
21
70
|
## Per group hooks
|
22
71
|
|
data/docs/common_tasks.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
# Checking if a user is online
|
5
5
|
|
6
6
|
Cinch by itself tries to keep track of the online state of users.
|
7
|
-
Whenever it sees someone speak, change
|
7
|
+
Whenever it sees someone speak, change their nick or be in a channel the
|
8
8
|
bot is also in, it'll set the user to being online. And when a user
|
9
9
|
quits, gets killed or cannot be whoised/contacted, its state will be
|
10
10
|
set to offline.
|
data/examples/basic/autovoice.rb
CHANGED
@@ -5,6 +5,8 @@ require 'cinch'
|
|
5
5
|
#
|
6
6
|
# Enable with !autovoice on
|
7
7
|
# Disable with !autovoice off
|
8
|
+
#
|
9
|
+
# It starts out disabled.
|
8
10
|
|
9
11
|
bot = Cinch::Bot.new do
|
10
12
|
configure do |c|
|
@@ -12,8 +14,6 @@ bot = Cinch::Bot.new do
|
|
12
14
|
c.server = "irc.freenode.org"
|
13
15
|
c.verbose = true
|
14
16
|
c.channels = ["#cinch-bots"]
|
15
|
-
|
16
|
-
@autovoice = true
|
17
17
|
end
|
18
18
|
|
19
19
|
on :join do |m|
|
data/examples/basic/google.rb
CHANGED
@@ -15,7 +15,7 @@ bot = Cinch::Bot.new do
|
|
15
15
|
# or "No results found" otherwise
|
16
16
|
def google(query)
|
17
17
|
url = "http://www.google.com/search?q=#{CGI.escape(query)}"
|
18
|
-
res = Nokogiri
|
18
|
+
res = Nokogiri.parse(open(url).read).at("h3.r")
|
19
19
|
|
20
20
|
title = res.text
|
21
21
|
link = res.at('a')[:href]
|
data/examples/basic/join_part.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
require 'cinch'
|
2
2
|
|
3
|
+
# Who should be able to access these plugins
|
4
|
+
$admin = "injekt"
|
5
|
+
|
3
6
|
bot = Cinch::Bot.new do
|
4
7
|
configure do |c|
|
5
8
|
c.server = "irc.freenode.org"
|
6
9
|
c.nick = "CinchBot"
|
7
10
|
c.channels = ["#cinch-bots"]
|
8
|
-
|
9
|
-
# Who should be able to access these plugins
|
10
|
-
@admin = "injekt"
|
11
11
|
end
|
12
12
|
|
13
13
|
helpers do
|
14
14
|
def is_admin?(user)
|
15
|
-
true if user.nick ==
|
15
|
+
true if user.nick == $admin
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
data/examples/basic/memo.rb
CHANGED
@@ -8,29 +8,29 @@ class Memo < Struct.new(:nick, :channel, :text, :time)
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
$memos = {}
|
12
|
+
|
11
13
|
bot = Cinch::Bot.new do
|
12
14
|
configure do |c|
|
13
15
|
c.server = "irc.freenode.org"
|
14
16
|
c.channels = ["#cinch-bots"]
|
15
|
-
|
16
|
-
@memos = {}
|
17
17
|
end
|
18
18
|
|
19
19
|
on :message do |m|
|
20
|
-
if
|
21
|
-
m.user.send
|
20
|
+
if $memos.has_key?(m.user.nick)
|
21
|
+
m.user.send $memos.delete(m.user.nick).to_s
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
on :message, /^!memo (.+?) (.+)/ do |m, nick, message|
|
26
|
-
if
|
26
|
+
if $memos.key?(nick)
|
27
27
|
m.reply "There's already a memo for #{nick}. You can only store one right now"
|
28
28
|
elsif nick == m.user.nick
|
29
29
|
m.reply "You can't leave memos for yourself.."
|
30
30
|
elsif nick == bot.nick
|
31
31
|
m.reply "You can't leave memos for me.."
|
32
32
|
else
|
33
|
-
|
33
|
+
$memos[nick] = Memo.new(m.user.nick, m.channel, message, Time.now)
|
34
34
|
m.reply "Added memo for #{nick}"
|
35
35
|
end
|
36
36
|
end
|
data/examples/basic/seen.rb
CHANGED
@@ -6,17 +6,17 @@ class Seen < Struct.new(:who, :where, :what, :time)
|
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
+
$users = {}
|
10
|
+
|
9
11
|
bot = Cinch::Bot.new do
|
10
12
|
configure do |c|
|
11
13
|
c.server = 'irc.freenode.org'
|
12
14
|
c.channels = ["#cinch-bots"]
|
13
|
-
|
14
|
-
@users = {}
|
15
15
|
end
|
16
16
|
|
17
17
|
# Only log channel messages
|
18
18
|
on :channel do |m|
|
19
|
-
|
19
|
+
$users[m.user.nick] = Seen.new(m.user.nick, m.channel, m.message, Time.new)
|
20
20
|
end
|
21
21
|
|
22
22
|
on :channel, /^!seen (.+)/ do |m, nick|
|
@@ -24,8 +24,8 @@ bot = Cinch::Bot.new do
|
|
24
24
|
m.reply "That's me!"
|
25
25
|
elsif nick == m.user.nick
|
26
26
|
m.reply "That's you!"
|
27
|
-
elsif
|
28
|
-
m.reply
|
27
|
+
elsif $users.key?(nick)
|
28
|
+
m.reply $users[nick].to_s
|
29
29
|
else
|
30
30
|
m.reply "I haven't seen #{nick}"
|
31
31
|
end
|
data/examples/plugins/google.rb
CHANGED
@@ -5,8 +5,8 @@ class Nickchange
|
|
5
5
|
listen_to :nick
|
6
6
|
|
7
7
|
def listen(m)
|
8
|
-
# This will send a PM to the user who changed
|
9
|
-
#
|
8
|
+
# This will send a PM to the user who changed their nick and inform
|
9
|
+
# them of their old nick.
|
10
10
|
m.reply "Your old nick was: #{m.user.last_nick}" ,true
|
11
11
|
end
|
12
12
|
end
|
data/lib/cinch.rb
CHANGED
data/lib/cinch/channel.rb
CHANGED
@@ -332,6 +332,21 @@ module Cinch
|
|
332
332
|
@bot.irc.send("KICK #@name #{user} :#{reason}")
|
333
333
|
end
|
334
334
|
|
335
|
+
# Removes a user from the channel.
|
336
|
+
#
|
337
|
+
# This uses the REMOVE command, which is a non-standardized
|
338
|
+
# extension. Unlike a kick, it makes a user part. This prevents
|
339
|
+
# auto-rejoin scripts from firing and might also be perceived as
|
340
|
+
# less aggressive by some. Not all IRC networks support this
|
341
|
+
# command.
|
342
|
+
#
|
343
|
+
# @param [User] user the user to remove
|
344
|
+
# @param [String] reason a reason for the removal
|
345
|
+
# @return [void]
|
346
|
+
def remove(user, reason = nil)
|
347
|
+
@bot.irc.send("REMOVE #@name #{user} :#{reason}")
|
348
|
+
end
|
349
|
+
|
335
350
|
# Sets or unsets modes. Most of the time you won't need this but
|
336
351
|
# use setter methods like {Channel#invite_only=}.
|
337
352
|
#
|
@@ -388,17 +403,34 @@ module Cinch
|
|
388
403
|
@users.clear
|
389
404
|
end
|
390
405
|
|
391
|
-
|
406
|
+
# @note The aliases `msg` and `privmsg` are deprecated and will be
|
407
|
+
# removed in a future version.
|
408
|
+
def send(text, notice = false)
|
409
|
+
# TODO deprecate 'notice' argument
|
392
410
|
text = text.to_s
|
393
411
|
if @modes["c"]
|
394
412
|
# Remove all formatting and colors if the channel doesn't
|
395
413
|
# allow colors.
|
396
|
-
text.
|
414
|
+
text = Cinch::Formatting.unformat(text)
|
397
415
|
end
|
398
416
|
super(text, notice)
|
399
417
|
end
|
400
|
-
alias_method :
|
401
|
-
alias_method :privmsg, :
|
418
|
+
alias_method :msg, :send # deprecated
|
419
|
+
alias_method :privmsg, :send # deprecated
|
420
|
+
undef_method(:msg) # yardoc hack
|
421
|
+
undef_method(:privmsg) # yardoc hack
|
422
|
+
|
423
|
+
# @deprecated
|
424
|
+
def msg(*args)
|
425
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "Channel#msg", "Channel#send")
|
426
|
+
send(*args)
|
427
|
+
end
|
428
|
+
|
429
|
+
# @deprecated
|
430
|
+
def privmsg(*args)
|
431
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "Channel#privmsg", "Channel#send")
|
432
|
+
send(*args)
|
433
|
+
end
|
402
434
|
|
403
435
|
# @return [Fixnum]
|
404
436
|
def hash
|
@@ -406,10 +438,19 @@ module Cinch
|
|
406
438
|
end
|
407
439
|
|
408
440
|
# @return [String]
|
441
|
+
# @note The alias `to_str` is deprecated and will be removed in a
|
442
|
+
# future version. Channel objects should not be treated like
|
443
|
+
# strings.
|
409
444
|
def to_s
|
410
445
|
@name
|
411
446
|
end
|
412
|
-
alias_method :to_str, :to_s
|
447
|
+
alias_method :to_str, :to_s # deprecated
|
448
|
+
undef_method(:to_str) # yardoc hack
|
449
|
+
|
450
|
+
def to_str
|
451
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "Channel#to_str", "Channel#to_s")
|
452
|
+
to_s
|
453
|
+
end
|
413
454
|
|
414
455
|
# @return [String]
|
415
456
|
def inspect
|
data/lib/cinch/formatting.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Cinch
|
2
|
-
# This module can be used for adding colors and
|
3
|
-
# messages.
|
2
|
+
# This module can be used for adding and removing colors and
|
3
|
+
# formatting to/from messages.
|
4
4
|
#
|
5
5
|
# The format codes used are those defined by mIRC, which are also
|
6
6
|
# the ones supported by most clients.
|
@@ -74,7 +74,7 @@ module Cinch
|
|
74
74
|
# When supplying two colors, the first will be used for the
|
75
75
|
# foreground and the second for the background.
|
76
76
|
# @param [String] string The string to format.
|
77
|
-
# @return [String]
|
77
|
+
# @return [String] the formatted string
|
78
78
|
# @since 2.0.0
|
79
79
|
# @raise [ArgumentError] When passing more than two colors as arguments.
|
80
80
|
# @see Helpers#Format Helpers#Format for easier access to this method.
|
@@ -110,5 +110,16 @@ module Cinch
|
|
110
110
|
string.gsub!(/#{Attributes[:reset]}/, Attributes[:reset] + prepend)
|
111
111
|
return prepend + string + append
|
112
112
|
end
|
113
|
+
|
114
|
+
# Deletes all mIRC formatting codes from the string. This strips
|
115
|
+
# formatting for bold, underline and so on, as well as color
|
116
|
+
# codes. This does include removing the numeric arguments.
|
117
|
+
#
|
118
|
+
# @param [String] string The string to filter
|
119
|
+
# @return [String] The filtered string
|
120
|
+
# @since 2.2.0
|
121
|
+
def self.unformat(string)
|
122
|
+
string.gsub(/[\x02\x0f\x16\x1f\x12]|\x03(\d{1,2}(,\d{1,2})?)?/, '')
|
123
|
+
end
|
113
124
|
end
|
114
125
|
end
|
data/lib/cinch/helpers.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
module Cinch
|
2
3
|
# The Helpers module contains a number of methods whose purpose is
|
3
4
|
# to make writing plugins easier by hiding parts of the API. The
|
@@ -182,7 +183,48 @@ module Cinch
|
|
182
183
|
def Format(*settings, string)
|
183
184
|
Formatting.format(*settings, string)
|
184
185
|
end
|
185
|
-
alias_method :Color, :Format
|
186
|
+
alias_method :Color, :Format # deprecated
|
187
|
+
undef_method(:Color) # yardoc hack
|
188
|
+
|
189
|
+
def Color(*args)
|
190
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "Helpers.Color", "Helpers.Format")
|
191
|
+
Format(*args)
|
192
|
+
end
|
193
|
+
|
194
|
+
# (see .sanitize)
|
195
|
+
def Sanitize(string)
|
196
|
+
Cinch::Helpers.sanitize(string)
|
197
|
+
end
|
198
|
+
|
199
|
+
# Deletes all characters in the ranges 0–8, 10–31 as well as the
|
200
|
+
# character 127, that is all non-printable characters and
|
201
|
+
# newlines.
|
202
|
+
#
|
203
|
+
# This method is useful for filtering text from external sources
|
204
|
+
# before sending it to IRC.
|
205
|
+
#
|
206
|
+
# Note that this method does not gracefully handle mIRC color
|
207
|
+
# codes, because it will leave the numeric arguments behind. If
|
208
|
+
# your text comes from IRC, you may want to filter it through
|
209
|
+
# {#Unformat} first. If you want to send sanitized input that
|
210
|
+
# includes your own formatting, first use this method, then add
|
211
|
+
# your formatting.
|
212
|
+
#
|
213
|
+
# There exist methods for sending messages that automatically
|
214
|
+
# call this method, namely {Target#safe_msg},
|
215
|
+
# {Target#safe_notice}, and {Target#safe_action}.
|
216
|
+
#
|
217
|
+
# @param [String] string The string to filter
|
218
|
+
# @return [String] The filtered string
|
219
|
+
# @since 2.2.0
|
220
|
+
def self.sanitize(string)
|
221
|
+
string.gsub(/[\x00-\x08\x10-\x1f\x7f]/, '')
|
222
|
+
end
|
223
|
+
|
224
|
+
# (see Formatting.unformat)
|
225
|
+
def Unformat(string)
|
226
|
+
Formatting.unformat(string)
|
227
|
+
end
|
186
228
|
|
187
229
|
# @endgroup
|
188
230
|
end
|
data/lib/cinch/irc.rb
CHANGED
@@ -632,7 +632,7 @@ module Cinch
|
|
632
632
|
def on_313(msg, events)
|
633
633
|
# RPL_WHOISOPERATOR
|
634
634
|
user = User(msg.params[1])
|
635
|
-
|
635
|
+
update_whois(user, {:oper? => true})
|
636
636
|
end
|
637
637
|
|
638
638
|
def on_317(msg, events)
|
@@ -648,21 +648,21 @@ module Cinch
|
|
648
648
|
# RPL_ENDOFWHOIS
|
649
649
|
user = User(msg.params[1])
|
650
650
|
|
651
|
-
if @whois_updates[user]
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
user.end_of_whois(@whois_updates[user])
|
656
|
-
end
|
657
|
-
@whois_updates.delete user
|
651
|
+
if @whois_updates[user].nil? ||
|
652
|
+
(@whois_updates[user].empty? && !user.attr(:unknown?, true, true))
|
653
|
+
user.end_of_whois(nil)
|
654
|
+
return
|
658
655
|
end
|
656
|
+
|
657
|
+
user.end_of_whois(@whois_updates[user])
|
658
|
+
@whois_updates.delete user
|
659
659
|
end
|
660
660
|
|
661
661
|
def on_319(msg, events)
|
662
662
|
# RPL_WHOISCHANNELS
|
663
663
|
user = User(msg.params[1])
|
664
664
|
channels = msg.params[2].scan(/[#{@isupport["CHANTYPES"].join}][^ ]+/o).map {|c| Channel(c) }
|
665
|
-
|
665
|
+
update_whois(user, {:channels => channels})
|
666
666
|
end
|
667
667
|
|
668
668
|
def on_324(msg, events)
|
@@ -685,8 +685,7 @@ module Cinch
|
|
685
685
|
# RPL_WHOISACCOUNT
|
686
686
|
user = User(msg.params[1])
|
687
687
|
authname = msg.params[2]
|
688
|
-
|
689
|
-
@whois_updates[user].merge!({:authname => authname})
|
688
|
+
update_user(user, {:authname => authname})
|
690
689
|
end
|
691
690
|
|
692
691
|
def on_331(msg, events)
|
@@ -851,7 +850,7 @@ module Cinch
|
|
851
850
|
|
852
851
|
def on_671(msg, events)
|
853
852
|
user = User(msg.params[1])
|
854
|
-
|
853
|
+
update_whois(user, {:secure? => true})
|
855
854
|
end
|
856
855
|
|
857
856
|
# @since 2.0.0
|
data/lib/cinch/message.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "time"
|
3
|
-
require "cinch/
|
3
|
+
require "cinch/formatting"
|
4
4
|
|
5
5
|
module Cinch
|
6
6
|
# This class serves two purposes. For one, it simply
|
@@ -149,7 +149,7 @@ module Cinch
|
|
149
149
|
end
|
150
150
|
|
151
151
|
if strip_colors
|
152
|
-
text = Cinch::
|
152
|
+
text = Cinch::Formatting.unformat(text)
|
153
153
|
end
|
154
154
|
|
155
155
|
@matches[type][regexp] ||= text.match(regexp)
|
@@ -226,7 +226,6 @@ module Cinch
|
|
226
226
|
end
|
227
227
|
|
228
228
|
def parse_params(raw_params)
|
229
|
-
raw_params = raw_params.strip
|
230
229
|
params = []
|
231
230
|
if match = raw_params.match(/(?:^:| :)(.*)$/)
|
232
231
|
params = match.pre_match.split(" ")
|
@@ -250,12 +249,19 @@ module Cinch
|
|
250
249
|
|
251
250
|
def parse_channel
|
252
251
|
# has to be called after parse_params
|
252
|
+
return nil if @params.empty?
|
253
|
+
|
253
254
|
case @command
|
254
255
|
when "INVITE", Constants::RPL_CHANNELMODEIS.to_s, Constants::RPL_BANLIST.to_s
|
255
256
|
@bot.channel_list.find_ensured(@params[1])
|
256
257
|
when Constants::RPL_NAMEREPLY.to_s
|
257
258
|
@bot.channel_list.find_ensured(@params[2])
|
258
259
|
else
|
260
|
+
# Note that this will also find channels for messages that
|
261
|
+
# don't actually include a channel parameter. For example
|
262
|
+
# `QUIT :#sometext` will be interpreted as a channel. The
|
263
|
+
# alternative to the currently used heuristic would be to
|
264
|
+
# hardcode a list of commands that provide a channel argument.
|
259
265
|
chantypes = @bot.irc.isupport["CHANTYPES"]
|
260
266
|
if chantypes.include?(@params.first[0])
|
261
267
|
@bot.channel_list.find_ensured(@params.first)
|
data/lib/cinch/mode_parser.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "cinch/exceptions"
|
2
|
+
|
1
3
|
module Cinch
|
2
4
|
# @api private
|
3
5
|
# @since 1.1.0
|
@@ -8,11 +10,11 @@ module Cinch
|
|
8
10
|
# A mapping describing which modes require parameters
|
9
11
|
def self.parse_modes(modes, params, param_modes = {})
|
10
12
|
if modes.size == 0
|
11
|
-
raise InvalidModeString, 'Empty mode string'
|
13
|
+
raise Exceptions::InvalidModeString, 'Empty mode string'
|
12
14
|
end
|
13
15
|
|
14
16
|
if modes[0] !~ /[+-]/
|
15
|
-
raise InvalidModeString, "Malformed modes string: %s" % modes
|
17
|
+
raise Exceptions::InvalidModeString, "Malformed modes string: %s" % modes
|
16
18
|
end
|
17
19
|
|
18
20
|
changes = []
|
@@ -23,7 +25,7 @@ module Cinch
|
|
23
25
|
modes.each_char do |ch|
|
24
26
|
if ch =~ /[+-]/
|
25
27
|
if count == 0
|
26
|
-
raise InvalidModeString, 'Empty mode sequence: %s' % modes
|
28
|
+
raise Exceptions::InvalidModeString, 'Empty mode sequence: %s' % modes
|
27
29
|
end
|
28
30
|
|
29
31
|
direction = case ch
|
@@ -39,7 +41,7 @@ module Cinch
|
|
39
41
|
if params.size > 0
|
40
42
|
param = params.shift
|
41
43
|
else
|
42
|
-
raise InvalidModeString, 'Not enough parameters: %s' % ch.inspect
|
44
|
+
raise Exceptions::InvalidModeString, 'Not enough parameters: %s' % ch.inspect
|
43
45
|
end
|
44
46
|
end
|
45
47
|
changes << [direction, ch, param]
|
@@ -48,11 +50,11 @@ module Cinch
|
|
48
50
|
end
|
49
51
|
|
50
52
|
if params.size > 0
|
51
|
-
raise InvalidModeString, 'Too many parameters: %s %s' % [modes, params]
|
53
|
+
raise Exceptions::InvalidModeString, 'Too many parameters: %s %s' % [modes, params]
|
52
54
|
end
|
53
55
|
|
54
56
|
if count == 0
|
55
|
-
raise InvalidModeString, 'Empty mode sequence: %
|
57
|
+
raise Exceptions::InvalidModeString, 'Empty mode sequence: %s' % modes
|
56
58
|
end
|
57
59
|
|
58
60
|
return changes
|
data/lib/cinch/target.rb
CHANGED
@@ -27,7 +27,11 @@ module Cinch
|
|
27
27
|
# @param [Boolean] notice Use NOTICE instead of PRIVMSG?
|
28
28
|
# @return [void]
|
29
29
|
# @see #safe_msg
|
30
|
-
|
30
|
+
# @note The aliases `msg` and `privmsg` are deprecated and will be
|
31
|
+
# removed in a future version.
|
32
|
+
def send(text, notice = false)
|
33
|
+
# TODO deprecate `notice` argument, put splitting into own
|
34
|
+
# method
|
31
35
|
text = text.to_s
|
32
36
|
split_start = @bot.config.message_split_start || ""
|
33
37
|
split_end = @bot.config.message_split_end || ""
|
@@ -58,25 +62,55 @@ module Cinch
|
|
58
62
|
end
|
59
63
|
end
|
60
64
|
end
|
61
|
-
alias_method :
|
62
|
-
alias_method :privmsg, :
|
65
|
+
alias_method :msg, :send # deprecated
|
66
|
+
alias_method :privmsg, :send # deprecated
|
67
|
+
undef_method(:msg) # yardoc hack
|
68
|
+
undef_method(:privmsg) # yardoc hack
|
69
|
+
|
70
|
+
# @deprecated
|
71
|
+
def msg(*args)
|
72
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "Target#msg", "Target#send")
|
73
|
+
send(*args)
|
74
|
+
end
|
75
|
+
|
76
|
+
# @deprecated
|
77
|
+
def privmsg(*args)
|
78
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "Target#privmsg", "Target#send")
|
79
|
+
send(*args)
|
80
|
+
end
|
63
81
|
|
64
|
-
# Like {#
|
82
|
+
# Like {#send}, but remove any non-printable characters from
|
65
83
|
# `text`. The purpose of this method is to send text of untrusted
|
66
84
|
# sources, like other users or feeds.
|
67
85
|
#
|
68
86
|
# Note: this will **break** any mIRC color codes embedded in the
|
69
|
-
# string.
|
87
|
+
# string. For more fine-grained control, use
|
88
|
+
# {Helpers#Sanitize} and
|
89
|
+
# {Formatting.unformat} directly.
|
70
90
|
#
|
71
|
-
# @return (see #
|
72
|
-
# @param (see #
|
73
|
-
# @see #
|
74
|
-
|
75
|
-
|
76
|
-
|
91
|
+
# @return (see #send)
|
92
|
+
# @param (see #send)
|
93
|
+
# @see #send
|
94
|
+
def safe_send(text, notice = false)
|
95
|
+
send(Cinch::Helpers.sanitize(text), notice)
|
96
|
+
end
|
97
|
+
alias_method :safe_msg, :safe_send # deprecated
|
98
|
+
alias_method :safe_privmsg, :safe_msg # deprecated
|
99
|
+
undef_method(:safe_msg) # yardoc hack
|
100
|
+
undef_method(:safe_privmsg) # yardoc hack
|
101
|
+
|
102
|
+
# @deprecated
|
103
|
+
def safe_msg(*args)
|
104
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "Target#safe_msg", "Target#safe_send")
|
105
|
+
send(*args)
|
77
106
|
end
|
78
|
-
|
79
|
-
|
107
|
+
|
108
|
+
# @deprecated
|
109
|
+
def safe_privmsg(*args)
|
110
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "Target#safe_privmsg", "Target#safe_send")
|
111
|
+
send(*args)
|
112
|
+
end
|
113
|
+
|
80
114
|
|
81
115
|
# Like {#safe_msg} but for notices.
|
82
116
|
#
|
@@ -84,7 +118,6 @@ module Cinch
|
|
84
118
|
# @param (see #safe_msg)
|
85
119
|
# @see #safe_notice
|
86
120
|
# @see #notice
|
87
|
-
# @todo (see #safe_msg)
|
88
121
|
def safe_notice(text)
|
89
122
|
safe_msg(text, true)
|
90
123
|
end
|
@@ -103,14 +136,15 @@ module Cinch
|
|
103
136
|
# untrusted sources, like other users or feeds.
|
104
137
|
#
|
105
138
|
# Note: this will **break** any mIRC color codes embedded in the
|
106
|
-
# string.
|
139
|
+
# string. For more fine-grained control, use
|
140
|
+
# {Helpers#Sanitize} and
|
141
|
+
# {Formatting.unformat} directly.
|
107
142
|
#
|
108
143
|
# @param (see #action)
|
109
144
|
# @return (see #action)
|
110
145
|
# @see #action
|
111
|
-
# @todo Handle mIRC color codes more gracefully.
|
112
146
|
def safe_action(text)
|
113
|
-
action(Cinch::
|
147
|
+
action(Cinch::Helpers.Sanitize(text))
|
114
148
|
end
|
115
149
|
|
116
150
|
# Send a CTCP to the target.
|
data/lib/cinch/user.rb
CHANGED
@@ -239,7 +239,9 @@ module Cinch
|
|
239
239
|
# received, the object will be set back to synced.
|
240
240
|
#
|
241
241
|
# @return [void]
|
242
|
-
|
242
|
+
# @note The alias `whois` is deprecated and will be removed in a
|
243
|
+
# future version.
|
244
|
+
def refresh
|
243
245
|
return if @in_whois
|
244
246
|
@data.keys.each do |attr|
|
245
247
|
unsync attr
|
@@ -252,7 +254,14 @@ module Cinch
|
|
252
254
|
@bot.irc.send "WHOIS #@name #@name"
|
253
255
|
end
|
254
256
|
end
|
255
|
-
alias_method :
|
257
|
+
alias_method :whois, :refresh # deprecated
|
258
|
+
undef_method(:whois) # yardoc hack
|
259
|
+
|
260
|
+
# @deprecated
|
261
|
+
def whois
|
262
|
+
Cinch::Utilities::Deprecation.print_deprecation("2.2.0", "User#whois", "User#refresh")
|
263
|
+
refresh
|
264
|
+
end
|
256
265
|
|
257
266
|
# @param [Hash, nil] values A hash of values gathered from WHOIS,
|
258
267
|
# or `nil` if no data was returned
|
@@ -463,7 +472,7 @@ module Cinch
|
|
463
472
|
@last_nick, @name = @name, new_nick
|
464
473
|
# Unsync authname because some networks tie authentication to
|
465
474
|
# the nick, so the user might not be authenticated anymore after
|
466
|
-
# changing
|
475
|
+
# changing their nick
|
467
476
|
unsync(:authname)
|
468
477
|
@bot.user_list.update_nick(self)
|
469
478
|
end
|
data/lib/cinch/user_list.rb
CHANGED
@@ -7,12 +7,12 @@ module Cinch
|
|
7
7
|
class UserList < CachedList
|
8
8
|
# Finds or creates a user.
|
9
9
|
# @overload find_ensured(nick)
|
10
|
-
# Finds or creates a user based on
|
10
|
+
# Finds or creates a user based on their nick.
|
11
11
|
#
|
12
12
|
# @param [String] nick The user's nickname
|
13
13
|
# @return [User]
|
14
14
|
# @overload find_ensured(user, nick, host)
|
15
|
-
# Finds or creates a user based on
|
15
|
+
# Finds or creates a user based on their nick but already
|
16
16
|
# setting user and host.
|
17
17
|
#
|
18
18
|
# @param [String] user The username
|
@@ -1,10 +1,14 @@
|
|
1
1
|
module Cinch
|
2
|
-
# @since 2.0.0
|
3
|
-
# @api private
|
4
2
|
module Utilities
|
3
|
+
# @since 2.0.0
|
4
|
+
# @api private
|
5
5
|
module Deprecation
|
6
|
-
def self.print_deprecation(version, method)
|
7
|
-
|
6
|
+
def self.print_deprecation(version, method, instead = nil)
|
7
|
+
s = "Deprecation warning: Beginning with version #{version}, #{method} should not be used anymore."
|
8
|
+
if instead != nil
|
9
|
+
s << " Use ${instead} instead."
|
10
|
+
end
|
11
|
+
$stderr.puts s
|
8
12
|
$stderr.puts caller
|
9
13
|
end
|
10
14
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Cinch
|
2
|
-
# @since 2.0.0
|
3
|
-
# @api private
|
4
2
|
module Utilities
|
3
|
+
# @since 2.0.0
|
4
|
+
# @api private
|
5
5
|
module Encoding
|
6
6
|
def self.encode_incoming(string, encoding)
|
7
7
|
string = string.dup
|
@@ -27,27 +27,10 @@ module Cinch
|
|
27
27
|
def self.encode_outgoing(string, encoding)
|
28
28
|
string = string.dup
|
29
29
|
if encoding == :irc
|
30
|
-
|
31
|
-
# code page (aka Windows Latin-1), the entire line will be sent
|
32
|
-
# that way. mIRC users should see it correctly. XChat users who
|
33
|
-
# are using UTF-8 will also see it correctly, because it will fail
|
34
|
-
# UTF-8 validation and will be assumed to be CP1252, even by older
|
35
|
-
# XChat versions.
|
36
|
-
#
|
37
|
-
# If the text doesn't fit inside the CP1252 code page, (for example if you
|
38
|
-
# type Eastern European characters, or Russian) it will be sent as UTF-8. Only
|
39
|
-
# UTF-8 capable clients will be able to see these characters correctly
|
40
|
-
#
|
41
|
-
# (from http://xchat.org/encoding/#hybrid)
|
42
|
-
begin
|
43
|
-
string.encode!("CP1252")
|
44
|
-
rescue ::Encoding::UndefinedConversionError
|
45
|
-
end
|
46
|
-
else
|
47
|
-
string.encode!(encoding, {:invalid => :replace, :undef => :replace}).force_encoding("ASCII-8BIT")
|
30
|
+
encoding = "UTF-8"
|
48
31
|
end
|
49
32
|
|
50
|
-
return string
|
33
|
+
return string.encode!(encoding, {:invalid => :replace, :undef => :replace}).force_encoding("ASCII-8BIT")
|
51
34
|
end
|
52
35
|
end
|
53
36
|
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.
|
4
|
+
version: 2.2.0
|
5
5
|
prerelease:
|
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: 2014-
|
12
|
+
date: 2014-12-31 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A simple, friendly DSL for creating IRC bots
|
15
15
|
email:
|
@@ -69,7 +69,6 @@ files:
|
|
69
69
|
- lib/cinch/version.rb
|
70
70
|
- lib/cinch/utilities/deprecation.rb
|
71
71
|
- lib/cinch/utilities/kernel.rb
|
72
|
-
- lib/cinch/utilities/string.rb
|
73
72
|
- lib/cinch/utilities/encoding.rb
|
74
73
|
- lib/cinch/constants.rb
|
75
74
|
- lib/cinch/mode_parser.rb
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Cinch
|
2
|
-
# @since 2.0.0
|
3
|
-
# @api private
|
4
|
-
module Utilities
|
5
|
-
module String
|
6
|
-
# @return [String]
|
7
|
-
# @todo Handle mIRC color codes more gracefully.
|
8
|
-
def self.filter_string(string)
|
9
|
-
string.gsub(/[\x00-\x1f]/, '')
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.strip_colors(string)
|
13
|
-
string.gsub(/[\x02\x0f\x16\x1f\x12]|\x03(\d{1,2}(,\d{1,2})?)?/, '')
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|