cinch 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
-