cinch 1.0.2 → 1.1.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.
Files changed (46) hide show
  1. data/README.md +25 -44
  2. data/examples/basic/autovoice.rb +1 -1
  3. data/examples/basic/join_part.rb +0 -4
  4. data/examples/plugins/autovoice.rb +2 -5
  5. data/examples/plugins/google.rb +1 -2
  6. data/examples/plugins/hooks.rb +36 -0
  7. data/examples/plugins/lambdas.rb +35 -0
  8. data/examples/plugins/last_nick.rb +24 -0
  9. data/examples/plugins/multiple_matches.rb +1 -10
  10. data/examples/plugins/own_events.rb +37 -0
  11. data/examples/plugins/timer.rb +22 -0
  12. data/examples/plugins/url_shorten.rb +1 -1
  13. data/lib/cinch.rb +50 -1
  14. data/lib/cinch/ban.rb +5 -2
  15. data/lib/cinch/bot.rb +360 -193
  16. data/lib/cinch/cache_manager.rb +15 -0
  17. data/lib/cinch/callback.rb +6 -0
  18. data/lib/cinch/channel.rb +150 -96
  19. data/lib/cinch/channel_manager.rb +26 -0
  20. data/lib/cinch/constants.rb +6 -4
  21. data/lib/cinch/exceptions.rb +9 -0
  22. data/lib/cinch/irc.rb +197 -82
  23. data/lib/cinch/logger/formatted_logger.rb +8 -8
  24. data/lib/cinch/logger/zcbot_logger.rb +37 -0
  25. data/lib/cinch/mask.rb +17 -3
  26. data/lib/cinch/message.rb +14 -7
  27. data/lib/cinch/message_queue.rb +8 -4
  28. data/lib/cinch/mode_parser.rb +56 -0
  29. data/lib/cinch/pattern.rb +45 -0
  30. data/lib/cinch/plugin.rb +129 -34
  31. data/lib/cinch/rubyext/string.rb +4 -4
  32. data/lib/cinch/syncable.rb +8 -0
  33. data/lib/cinch/user.rb +68 -13
  34. data/lib/cinch/user_manager.rb +60 -0
  35. metadata +17 -35
  36. data/Rakefile +0 -66
  37. data/lib/cinch/PLANNED +0 -4
  38. data/spec/bot_spec.rb +0 -5
  39. data/spec/channel_spec.rb +0 -5
  40. data/spec/cinch_spec.rb +0 -5
  41. data/spec/irc_spec.rb +0 -5
  42. data/spec/message_spec.rb +0 -5
  43. data/spec/plugin_spec.rb +0 -5
  44. data/spec/spec.opts +0 -2
  45. data/spec/spec_helper.rb +0 -8
  46. data/spec/user_spec.rb +0 -5
@@ -2,9 +2,9 @@ class String
2
2
  def irc_downcase(mapping)
3
3
  case mapping
4
4
  when :rfc1459
5
- self.tr("A-Z[]\\^", "a-z{}|~")
5
+ self.tr("A-Z[]\\\\^", "a-z{}|~")
6
6
  when :"strict-rfc1459"
7
- self.tr("A-Z[]\\", "a-z{}|")
7
+ self.tr("A-Z[]\\\\", "a-z{}|")
8
8
  else
9
9
  # when :ascii or unknown/nil
10
10
  self.tr("A-Z", "a-z")
@@ -16,9 +16,9 @@ class String
16
16
  when :ascii
17
17
  self.tr("a-z", "A-Z")
18
18
  when :rfc1459
19
- self.tr("a-z{}|~", "A-Z[]\\^")
19
+ self.tr("a-z{}|~", "A-Z[]\\\\^")
20
20
  when :strict-rfc1459
21
- self.tr("a-z{}|", "A-Z[]\\")
21
+ self.tr("a-z{}|", "A-Z[]\\\\")
22
22
  end
23
23
  end
24
24
  end
@@ -3,6 +3,7 @@ module Cinch
3
3
  # Blocks until the object is synced.
4
4
  #
5
5
  # @return [void]
6
+ # @api private
6
7
  def wait_until_synced(attr)
7
8
  attr = attr.to_sym
8
9
  while true
@@ -22,14 +23,21 @@ module Cinch
22
23
  @synced_attributes << attribute
23
24
  end
24
25
 
26
+ # @return [Boolean]
27
+ # @api private
25
28
  def synced?(attribute)
26
29
  @synced_attributes.include?(attribute)
27
30
  end
28
31
 
32
+ # @return [void]
33
+ # @api private
29
34
  def unsync(attribute)
30
35
  @synced_attributes.delete(attribute)
31
36
  end
32
37
 
38
+ # @return [void]
39
+ # @api private
40
+ # @since 1.0.1
33
41
  def unsync_all
34
42
  @synced_attributes.clear
35
43
  end
@@ -3,7 +3,7 @@ module Cinch
3
3
  class User
4
4
  include Syncable
5
5
 
6
- @users = {}
6
+ @users = {} # this will be removed with version 2.0.0
7
7
  class << self
8
8
 
9
9
  # @overload find_ensured(nick, bot)
@@ -21,35 +21,54 @@ module Cinch
21
21
  # @param [Bot] bot An instance of bot
22
22
  #
23
23
  # @return [User]
24
+ # @deprecated See {Bot#user_manager} and {UserManager#find_ensured} instead
25
+ # @note This method does not work properly if running more than one bot
26
+ # @note This method will be removed in Cinch 2.0.0
24
27
  def find_ensured(*args)
25
- # FIXME CASEMAPPING
28
+ $stderr.puts "Deprecation warning: Beginning with version 1.1.0, User.find_ensured should not be used anymore."
29
+ puts caller
30
+
26
31
  case args.size
27
32
  when 2
28
33
  nick = args.first
29
- bargs = [args.first]
30
34
  bot = args.last
35
+ bargs = [nick]
31
36
  when 4
32
37
  nick = args[1]
33
- bot = args.pop
38
+ bot = args.pop
34
39
  bargs = args
35
40
  else
36
41
  raise ArgumentError
37
42
  end
38
- downcased_nick = nick.irc_downcase(bot.irc.isupport["CASEMAPPING"])
39
- @users[downcased_nick] ||= new(*bargs, bot)
40
- @users[downcased_nick]
43
+ downcased_nick = nick.irc_downcase(@bot.irc.isupport["CASEMAPPING"])
44
+ @users[downcased_nick] = args.last.user_manager.find_ensured(*args[0..-2])
45
+ # note: the complete case statement and the assignment to
46
+ # @users is only for keeping compatibility with older
47
+ # versions, which still use User.find and User.all.
41
48
  end
42
49
 
43
50
  # Finds a user.
44
51
  #
45
52
  # @param [String] nick nick of a user
46
53
  # @return [User, nil]
54
+ # @deprecated See {Bot#user_manager} and {UserManager#find} instead
55
+ # @note This method does not work properly if running more than one bot
56
+ # @note This method will be removed in Cinch 2.0.0
47
57
  def find(nick)
48
- @users[nick]
58
+ $stderr.puts "Deprecation warning: Beginning with version 1.1.0, User.find should not be used anymore."
59
+ puts caller
60
+
61
+ @users[downcased_nick]
49
62
  end
50
63
 
51
64
  # @return [Array<User>] Returns all users
65
+ # @deprecated See {Bot#user_manager} and {CacheManager#each} instead
66
+ # @note This method does not work properly if running more than one bot
67
+ # @note This method will be removed in Cinch 2.0.0
52
68
  def all
69
+ $stderr.puts "Deprecation warning: Beginning with version 1.1.0, User.all should not be used anymore."
70
+ puts caller
71
+
53
72
  @users.values
54
73
  end
55
74
  end
@@ -57,12 +76,16 @@ module Cinch
57
76
 
58
77
  # @return [String]
59
78
  attr_reader :nick
79
+ # @return [String]
80
+ attr_reader :last_nick
60
81
  # @return [Bot]
61
82
  attr_reader :bot
62
83
  # @return [Boolean]
63
84
  attr_reader :synced
64
85
  # @return [Boolean]
65
86
  attr_reader :in_whois
87
+ # @api private
88
+ attr_writer :in_whois
66
89
 
67
90
  # @return [String]
68
91
  attr_reader :user
@@ -115,12 +138,12 @@ module Cinch
115
138
  # By default, you can use methods like User#user, User#host and
116
139
  # alike – If you however fear that another thread might change
117
140
  # data while you're using it and if this means a critical issue to
118
- # your code, you can store the result of this method and work with
119
- # that instead.
141
+ # your code, you can store a clone of the result of this method
142
+ # and work with that instead.
120
143
  #
121
144
  # @example
122
- # on :channel do
123
- # data = user.data
145
+ # on :channel do |m|
146
+ # data = m.user.data.dup
124
147
  # do_something_with(data.user)
125
148
  # do_something_with(data.host)
126
149
  # end
@@ -165,7 +188,7 @@ module Cinch
165
188
  #
166
189
  # @return [Boolean] true if the user is identified
167
190
  def authed?
168
- @data[:authname]
191
+ !attr(:authname).nil?
169
192
  end
170
193
 
171
194
  # @see Syncable#attr
@@ -196,6 +219,7 @@ module Cinch
196
219
  # an unknown user
197
220
  # @return [void]
198
221
  # @api private
222
+ # @since 1.0.1
199
223
  def end_of_whois(values, not_found = false)
200
224
  @in_whois = false
201
225
  if not_found
@@ -236,12 +260,17 @@ module Cinch
236
260
  @synced = true
237
261
  end
238
262
 
263
+ # @return [void]
264
+ # @since 1.0.1
239
265
  # @api private
266
+ # @see Syncable#unsync_all
240
267
  def unsync_all
241
268
  @synced = false
242
269
  super
243
270
  end
244
271
 
272
+ # @group Sending messages
273
+
245
274
  # Send a message to the user.
246
275
  #
247
276
  # @param [String] message the message
@@ -252,6 +281,24 @@ module Cinch
252
281
  alias_method :privmsg, :send
253
282
  alias_method :msg, :send
254
283
 
284
+ # Send a notice to the user.
285
+ #
286
+ # @param [String] message the message
287
+ # @return [void]
288
+ def notice(message)
289
+ @bot.notice(@nick, message)
290
+ end
291
+
292
+ # Like {#safe_send} but for notices.
293
+ #
294
+ # @param (see #safe_send)
295
+ # @return (see #safe_send)
296
+ # @see #safe_send
297
+ # @todo (see #safe_send)
298
+ def safe_notice(message)
299
+ @bot.safe_notice(@nick, message)
300
+ end
301
+
255
302
  # Send a message to the user, but remove any non-printable
256
303
  # characters. The purpose of this method is to send text from
257
304
  # untrusted sources, like other users or feeds.
@@ -303,6 +350,8 @@ module Cinch
303
350
  @bot.safe_action(@name, message)
304
351
  end
305
352
 
353
+ # @endgroup
354
+
306
355
  # @return [String]
307
356
  def to_s
308
357
  @nick
@@ -343,6 +392,12 @@ module Cinch
343
392
  Mask.new(s)
344
393
  end
345
394
 
395
+ # @api private
396
+ def update_nick(new_nick)
397
+ @last_nick, @nick = @nick, new_nick
398
+ @bot.user_manager.update_nick(self)
399
+ end
400
+
346
401
  # Provides synced access to user attributes.
347
402
  def method_missing(m, *args)
348
403
  if m.to_s =~ /^(.+)_unsynced$/
@@ -0,0 +1,60 @@
1
+ require "cinch/cache_manager"
2
+
3
+ module Cinch
4
+ class UserManager < CacheManager
5
+ # Finds or creates a user.
6
+ # @overload find_ensured(nick)
7
+ # Finds or creates a user based on his nick.
8
+ #
9
+ # @param [String] nick The user's nickname
10
+ # @return [User]
11
+ # @overload find_ensured(user, nick, host)
12
+ # Finds or creates a user based on his nick but already
13
+ # setting user and host.
14
+ #
15
+ # @param [String] user The username
16
+ # @param [String] nick The nickname
17
+ # @param [String] host The user's hostname
18
+ # @return [User]
19
+ # @return [User]
20
+ # @see Bot#User
21
+ def find_ensured(*args)
22
+ case args.size
23
+ when 1
24
+ nick = args.first
25
+ bargs = [nick]
26
+ when 3
27
+ nick = args[1]
28
+ bargs = args
29
+ else
30
+ raise ArgumentError
31
+ end
32
+ downcased_nick = nick.irc_downcase(@bot.irc.isupport["CASEMAPPING"])
33
+ @mutex.synchronize do
34
+ @cache[downcased_nick] ||= User.new(*bargs, @bot)
35
+ end
36
+ end
37
+
38
+ # Finds a user.
39
+ #
40
+ # @param [String] nick nick of a user
41
+ # @return [User, nil]
42
+ def find(nick)
43
+ downcased_nick = nick.irc_downcase(@bot.irc.isupport["CASEMAPPING"])
44
+ @cache[downcased_nick]
45
+ end
46
+
47
+ # @api private
48
+ def update_nick(user)
49
+ @mutex.synchronize do
50
+ @cache[user.nick.irc_downcase(@bot.irc.isupport["CASEMAPPING"])] = user
51
+ @cache.delete user.last_nick.irc_downcase(@bot.irc.isupport["CASEMAPPING"])
52
+ end
53
+ end
54
+
55
+ # @api private
56
+ def delete(user)
57
+ @cache.delete_if {|n, u| u == user }
58
+ end
59
+ end
60
+ end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cinch
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
4
  prerelease: false
6
5
  segments:
7
6
  - 1
7
+ - 1
8
8
  - 0
9
- - 2
10
- version: 1.0.2
9
+ version: 1.1.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Lee Jarvis
@@ -16,25 +15,10 @@ autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2010-09-02 00:00:00 +02:00
18
+ date: 2011-01-16 00:00:00 +01:00
20
19
  default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
23
- name: rspec
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
26
- none: false
27
- requirements:
28
- - - "="
29
- - !ruby/object:Gem::Version
30
- hash: 27
31
- segments:
32
- - 1
33
- - 3
34
- - 0
35
- version: 1.3.0
36
- type: :development
37
- version_requirements: *id001
20
+ dependencies: []
21
+
38
22
  description: A simple, friendly DSL for creating IRC bots
39
23
  email:
40
24
  - lee@jarvis.co
@@ -47,19 +31,11 @@ extra_rdoc_files: []
47
31
 
48
32
  files:
49
33
  - LICENSE
50
- - Rakefile
51
34
  - README.md
52
- - spec/user_spec.rb
53
- - spec/plugin_spec.rb
54
- - spec/spec_helper.rb
55
- - spec/bot_spec.rb
56
- - spec/spec.opts
57
- - spec/channel_spec.rb
58
- - spec/message_spec.rb
59
- - spec/cinch_spec.rb
60
- - spec/irc_spec.rb
61
35
  - lib/cinch/irc.rb
36
+ - lib/cinch/channel_manager.rb
62
37
  - lib/cinch/mask.rb
38
+ - lib/cinch/cache_manager.rb
63
39
  - lib/cinch/exceptions.rb
64
40
  - lib/cinch/rubyext/module.rb
65
41
  - lib/cinch/rubyext/queue.rb
@@ -71,24 +47,32 @@ files:
71
47
  - lib/cinch/user.rb
72
48
  - lib/cinch/constants.rb
73
49
  - lib/cinch/callback.rb
74
- - lib/cinch/PLANNED
75
50
  - lib/cinch/syncable.rb
51
+ - lib/cinch/pattern.rb
76
52
  - lib/cinch/message_queue.rb
53
+ - lib/cinch/mode_parser.rb
77
54
  - lib/cinch/helpers.rb
78
55
  - lib/cinch/ban.rb
79
56
  - lib/cinch/plugin.rb
57
+ - lib/cinch/user_manager.rb
80
58
  - lib/cinch/isupport.rb
81
59
  - lib/cinch/logger/logger.rb
82
60
  - lib/cinch/logger/formatted_logger.rb
61
+ - lib/cinch/logger/zcbot_logger.rb
83
62
  - lib/cinch/logger/null_logger.rb
84
63
  - lib/cinch.rb
85
64
  - examples/plugins/urban_dict.rb
86
65
  - examples/plugins/multiple_matches.rb
87
66
  - examples/plugins/autovoice.rb
88
67
  - examples/plugins/hello.rb
68
+ - examples/plugins/lambdas.rb
69
+ - examples/plugins/last_nick.rb
70
+ - examples/plugins/hooks.rb
71
+ - examples/plugins/timer.rb
89
72
  - examples/plugins/url_shorten.rb
90
73
  - examples/plugins/seen.rb
91
74
  - examples/plugins/join_part.rb
75
+ - examples/plugins/own_events.rb
92
76
  - examples/plugins/google.rb
93
77
  - examples/plugins/memo.rb
94
78
  - examples/plugins/msg.rb
@@ -103,7 +87,7 @@ files:
103
87
  - examples/basic/memo.rb
104
88
  - examples/basic/msg.rb
105
89
  has_rdoc: true
106
- homepage: http://doc.injekt.net/cinch
90
+ homepage: http://rubydoc.info/github/cinchrb/cinch
107
91
  licenses: []
108
92
 
109
93
  post_install_message:
@@ -116,7 +100,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
100
  requirements:
117
101
  - - ">="
118
102
  - !ruby/object:Gem::Version
119
- hash: 49
120
103
  segments:
121
104
  - 1
122
105
  - 9
@@ -127,7 +110,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
110
  requirements:
128
111
  - - ">="
129
112
  - !ruby/object:Gem::Version
130
- hash: 3
131
113
  segments:
132
114
  - 0
133
115
  version: "0"
data/Rakefile DELETED
@@ -1,66 +0,0 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require 'rake/clean'
4
-
5
- $LOAD_PATH.unshift('lib') unless $LOAD_PATH.include?('lib')
6
- require 'cinch'
7
-
8
- CLEAN.include ["doc"]
9
-
10
- require 'spec/rake/spectask'
11
- Spec::Rake::SpecTask.new(:spec) do |spec|
12
- spec.libs << 'lib' << 'spec'
13
- spec.spec_files = FileList['spec/**/*_spec.rb']
14
- end
15
-
16
- require 'yard'
17
- YARD::Rake::YardocTask.new do |t|
18
- t.files = ['lib/**/*.rb', 'README.md']
19
- t.options = [
20
- '-m', 'markdown',
21
- '--hide-void-return',
22
- '--quiet',
23
- '--title', "Cinch #{Cinch::VERSION} Documentation",
24
- '--main', 'README.md',
25
- ]
26
- end
27
-
28
- namespace :gem do
29
- desc "Build gem"
30
- task :build => ["rake:clean"] do
31
- sh("gem build cinch.gemspec")
32
- end
33
-
34
- desc "Uninstall gem (not root)"
35
- task :uninstall do
36
- sh("gem uninstall cinch -v #{Cinch::VERSION}")
37
- end
38
-
39
- desc "Release to rubygems"
40
- task :release => [:build] do
41
- sh("gem push ./cinch-#{Cinch::VERSION}.gem")
42
- end
43
-
44
- desc "Install gem (not root)"
45
- task :install => :build do
46
- sh("gem install ./cinch-#{Cinch::VERSION} --local")
47
- end
48
- end
49
-
50
- namespace :doc do
51
- desc "Upload documentation"
52
- task :push => [:yard] do
53
- # XXX rename once merge is complete
54
- sh("scp -r doc injekt:injekt.net/doc/cinch-merge")
55
- end
56
- end
57
-
58
- task :version do
59
- puts "Cinch version #{Cinch::VERSION}"
60
- end
61
-
62
- desc "Install gem (not root)"
63
- task :install => "gem:install"
64
-
65
- task :default => :spec
66
-