vetinari 0.0.1 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0000606629bd97c6e36412292b86220a9279472b
4
- data.tar.gz: 5cb4790367bb5037fa4aecd97c6058a88ba56f39
3
+ metadata.gz: 8caa318b353a259ce354a4f33ac6512929a70ddc
4
+ data.tar.gz: 6b0c114d8756323c6c93c7945e44b5c1392ee852
5
5
  SHA512:
6
- metadata.gz: a40248f184e7ee83ce0f6b8e12e806d5c71cf9b6f258f53c3dc774070bdf77ce02ced8ea274d241bf8adbab732cb3779b7b480dbdcc2a1080e7c98e219e21d85
7
- data.tar.gz: 8989e04679431ca77300fb6195901a4c355e1a7047ec314b62cb14f8629afc011fecccb3d185eb0345dac6aaa9dda891129cc9b2bff39aaeb535e666b4ad696d
6
+ metadata.gz: edd9ea43bb5a3636a2a4dec5246c205c40d18c310d24782e4d43cfce515fa89558c83ae2f261b823053d45456265f38aca52e0d9d7a2ade0969894ba1f3a601d
7
+ data.tar.gz: ce1804db1898b39dfc6869dac32f98b3c2b1a9846e02a8ef8881c504e7b48bcaa71101b3ddad80a3d72009be0f106bcf14e1de00336cce6f9e223f5852d3d7d8
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Vetinari
1
+ # Vetinari [![Gem Version](https://badge.fury.io/rb/vetinari.png)](http://badge.fury.io/rb/vetinari)
2
2
  Vetinari is a Domain Specific Language for writing IRC Bots using the [Celluloid::IO](https://github.com/celluloid/celluloid-io "Celluloid::IO") library.
3
3
 
4
4
  ## Requirements
@@ -29,7 +29,7 @@ bot.on(:connect) do
29
29
  bot.join '#vetinari'
30
30
  end
31
31
 
32
- bot.on(:channel, /foo/) do |env|
32
+ bot.on(:channel, :pattern => /foo/) do |env|
33
33
  env[:channel].message('bar')
34
34
  end
35
35
 
@@ -10,14 +10,14 @@ echo_bot = Vetinari::Bot.new do |config|
10
10
  end
11
11
 
12
12
  echo_bot.on :connect do
13
- echo_bot.join '#vetinari'
13
+ echo_bot.join('#vetinari')
14
14
  end
15
15
 
16
- echo_bot.on :channel, /\Aquit!\z/ do |env|
16
+ echo_bot.on(:channel, :pattern => /\Aquit!\z/) do |env|
17
17
  echo_bot.quit
18
18
  end
19
19
 
20
- echo_bot.on :channel, //, 1 do |env|
20
+ echo_bot.on(:channel, :pattern => //) do |env|
21
21
  env[:channel].message(env[:message])
22
22
  end
23
23
 
@@ -19,8 +19,8 @@ module Vetinari
19
19
  setup_dcc
20
20
  end
21
21
 
22
- def on(event, pattern = //, worker = 0, &block)
23
- @callbacks.add(event, pattern, worker, block)
22
+ def on(event, options = {}, &block)
23
+ @callbacks.add(event, options, block)
24
24
  end
25
25
 
26
26
  exclusive :on
@@ -111,16 +111,16 @@ module Vetinari
111
111
  end
112
112
 
113
113
  # User ping request.
114
- on :query, /^\001PING \d+\001$/ do |env|
114
+ on :query, :pattern => /^\001PING \d+\001$/ do |env|
115
115
  time = env[:message].scan(/\d+/)[0]
116
116
  env[:user].notice("\001PING #{time}\001")
117
117
  end
118
118
 
119
- on :query, /^\001VERSION\001$/ do |env|
119
+ on :query, :pattern => /^\001VERSION\001$/ do |env|
120
120
  env[:user].notice("\001VERSION Vetinari #{Vetinari::VERSION} (https://github.com/tbuehlmann/vetinari)")
121
121
  end
122
122
 
123
- on :query, /^\001TIME\001$/ do |env|
123
+ on :query, :pattern => /^\001TIME\001$/ do |env|
124
124
  env[:user].notice("\001TIME #{Time.now.strftime('%a %b %d %H:%M:%S %Y')}\001")
125
125
  end
126
126
  end
@@ -306,7 +306,7 @@ module Vetinari
306
306
  env[:user] = @users[nick] || User.new(nick, @actor)
307
307
  end
308
308
 
309
- on :query, /\A\001DCC SEND \"?\S+\"? \d+ \d+ \d+\001\z/ do |env|
309
+ on :query, :pattern => /\A\001DCC SEND \"?\S+\"? \d+ \d+ \d+\001\z/ do |env|
310
310
  results = env[:message].scan(/\A\001DCC SEND \"?(\S+)\"? (\d+) (\d+) (\d+)\001\z/)
311
311
  filename, ip, port, filesize = results.first
312
312
  filename = filename.delete("/\\")
@@ -337,6 +337,15 @@ module Vetinari
337
337
  end
338
338
  end
339
339
 
340
+ on :nick_change do |env|
341
+ # TODO: Update existing users with user/host information.
342
+ env.delete(:user)
343
+ env.delete(:host)
344
+ env[:old_nick] = env.delete(:nick)
345
+ env[:user] = @users[env[:old_nick]]
346
+ env[:user].renamed_to(env.delete(:new_nick))
347
+ end
348
+
340
349
  # Response to MODE command, giving back the channel modes.
341
350
  on 324 do |env|
342
351
  split = env[:params].split(/ /)
@@ -5,9 +5,9 @@ module Vetinari
5
5
  attr_reader :event
6
6
  attr_writer :container
7
7
 
8
- def initialize(event, pattern, proc, container, uuid)
8
+ def initialize(event, options, proc, container, uuid)
9
9
  @event = event
10
- @pattern = pattern
10
+ @options = options
11
11
  @proc = proc
12
12
  @container = container
13
13
  @uuid = uuid
@@ -29,9 +29,9 @@ module Vetinari
29
29
 
30
30
  def inspect
31
31
  event = @event.inspect
32
- pattern = @pattern.inspect
32
+ options = @options.inspect
33
33
  uuid = @uuid.inspect
34
- "#<Callback event=#{event} pattern=#{pattern} uuid=#{uuid}>"
34
+ "#<Callback event=#{event} options=#{options} uuid=#{uuid}>"
35
35
  end
36
36
 
37
37
  private
@@ -39,7 +39,11 @@ module Vetinari
39
39
  def matching?(env)
40
40
  case @event
41
41
  when :channel, :query
42
- env[:message] =~ @pattern
42
+ if @options[:pattern]
43
+ env[:message] =~ @options[:pattern] ? true : false
44
+ else
45
+ true
46
+ end
43
47
  else
44
48
  true
45
49
  end
@@ -8,10 +8,10 @@ module Vetinari
8
8
  @mutex = Mutex.new
9
9
  end
10
10
 
11
- def add(event, pattern, worker, proc)
11
+ def add(event, options, proc)
12
+ worker = Integer(options.delete(:worker) || 0)
12
13
  uuid = Celluloid.uuid
13
- args = [event, pattern, proc, self, uuid]
14
- worker = Integer(worker)
14
+ args = [event, options, proc, self, uuid]
15
15
 
16
16
  case
17
17
  when worker == 1
@@ -221,6 +221,10 @@ module Vetinari
221
221
  "#<Channel name=#{@name.inspect}>"
222
222
  end
223
223
 
224
+ def to_s
225
+ @name
226
+ end
227
+
224
228
  private
225
229
 
226
230
  def set_channel_mode(mode, param)
@@ -21,7 +21,7 @@ module Vetinari
21
21
  when /^:(\S+)!(\S+)@(\S+) MODE ((?:#{chantypes})\S+) ([+-]\S+)/
22
22
  {:type => :channel_mode, :nick => $1, :user => $2, :host => $3, :channel => $4, :modes => $5, :params => $'.lstrip}
23
23
  when /^:(\S+)!(\S+)@(\S+) NICK :/
24
- {:type => :nickchange, :nick => $1, :user => $2, :host => $3, :new_nick => $'}
24
+ {:type => :nick_change, :nick => $1, :user => $2, :host => $3, :new_nick => $'}
25
25
  when /^:(\S+)!(\S+)@(\S+) KICK (\S+) (\S+) :/
26
26
  {:type => :kick, :nick => $1, :user => $2, :host => $3, :channel => $4, :kickee => $5, :message => $'}
27
27
  when /^:(\S+)!(\S+)@(\S+) TOPIC (\S+) :/
@@ -4,8 +4,8 @@ module Vetinari
4
4
  attr_reader :nick, :user, :host, :online, :observed
5
5
 
6
6
  def initialize(nick, bot)
7
+ # TODO
7
8
  @bot = bot
8
-
9
9
  @nick = nick
10
10
  @user = nil
11
11
  @host = nil
@@ -97,8 +97,16 @@ module Vetinari
97
97
  @bot.raw "NOTICE #{@nick} :#{message}"
98
98
  end
99
99
 
100
+ def renamed_to(nick)
101
+ @nick = nick
102
+ end
103
+
100
104
  def inspect
101
105
  "#<User nick=#{@nick}>"
102
106
  end
107
+
108
+ def to_s
109
+ @nick
110
+ end
103
111
  end
104
112
  end
@@ -1,3 +1,3 @@
1
1
  module Vetinari
2
- VERSION = Gem::Version.new('0.0.1')
2
+ VERSION = Gem::Version.new('0.1.0')
3
3
  end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vetinari::Channel do
4
+ bot = Vetinari::Bot.new
5
+ subject { Vetinari::Channel.new('#mended_drum', bot) }
6
+
7
+ it 'responds to #to_s' do
8
+ expect(subject.to_s).to eq('#mended_drum')
9
+ end
10
+ end
@@ -50,4 +50,27 @@ describe Vetinari::Bot do
50
50
  subject.parse(':TheLibrarian!foo@bar KICK #mended_drum Vetinari :foo')
51
51
  end
52
52
  end
53
+
54
+ describe 'on :nick_change' do
55
+ before(:each) do
56
+ subject.parse(':Vetinari!foo@bar JOIN #mended_drum')
57
+ subject.parse(':Ridcully!foo@bar JOIN #mended_drum')
58
+ end
59
+
60
+ it 'works' do
61
+ user = subject.users['Ridcully']
62
+ subject.parse(':Ridcully!foo@bar NICK :Twoflower')
63
+ expect(user.nick).to eq('Twoflower')
64
+ end
65
+
66
+ it 'sets the old nick properly' do
67
+ subject.on :nick_change do |env|
68
+ expect(env[:old_nick]).to eq('Ridcully')
69
+ @called = true
70
+ end
71
+
72
+ subject.parse(':Ridcully!foo@bar NICK :Twoflower')
73
+ expect(@called).to be_true
74
+ end
75
+ end
53
76
  end
@@ -1,6 +1,6 @@
1
1
  require 'rspec'
2
2
  require 'vetinari'
3
- # require 'pry'
3
+ require 'pry'
4
4
 
5
5
  RSpec.configure do |config|
6
6
  config.color_enabled = true
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vetinari::User do
4
+ bot = Vetinari::Bot.new
5
+ subject { Vetinari::User.new('Ridcully', bot) }
6
+
7
+ it 'responds to #to_s' do
8
+ expect(subject.to_s).to eq('Ridcully')
9
+ end
10
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vetinari
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Bühlmann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-13 00:00:00.000000000 Z
11
+ date: 2013-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: celluloid-io
@@ -116,10 +116,12 @@ files:
116
116
  - lib/vetinari/version.rb
117
117
  - spec/callback_spec.rb
118
118
  - spec/channel_management_spec.rb
119
+ - spec/channel_spec.rb
119
120
  - spec/default_callbacks_spec.rb
120
121
  - spec/isupport_spec.rb
121
122
  - spec/spec_helper.rb
122
123
  - spec/user_management_spec.rb
124
+ - spec/user_spec.rb
123
125
  - vetinari.gemspec
124
126
  homepage: https://github.com/tbuehlmann/vetinari
125
127
  licenses:
@@ -148,7 +150,9 @@ summary: Multithreaded IRC Bot Framework.
148
150
  test_files:
149
151
  - spec/callback_spec.rb
150
152
  - spec/channel_management_spec.rb
153
+ - spec/channel_spec.rb
151
154
  - spec/default_callbacks_spec.rb
152
155
  - spec/isupport_spec.rb
153
156
  - spec/spec_helper.rb
154
157
  - spec/user_management_spec.rb
158
+ - spec/user_spec.rb