fantasy-irc 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source :rubygems
2
+
3
+ gem "array-unique", "~> 1.1.1"
4
+ gem "rake"
5
+
6
+ group :test do
7
+ gem "rspec"
8
+ gem "rspec-mocks"
9
+ end
@@ -0,0 +1,29 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ array-hooked (1.1.4)
5
+ identifies_as
6
+ module-cluster
7
+ array-unique (1.1.1)
8
+ array-hooked
9
+ diff-lcs (1.1.3)
10
+ identifies_as (1.1.0)
11
+ module-cluster (2.0.5)
12
+ rake (0.9.2.2)
13
+ rspec (2.12.0)
14
+ rspec-core (~> 2.12.0)
15
+ rspec-expectations (~> 2.12.0)
16
+ rspec-mocks (~> 2.12.0)
17
+ rspec-core (2.12.2)
18
+ rspec-expectations (2.12.1)
19
+ diff-lcs (~> 1.1.3)
20
+ rspec-mocks (2.12.1)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ array-unique (~> 1.1.1)
27
+ rake
28
+ rspec
29
+ rspec-mocks
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # fantasy-irc
2
2
 
3
- A modular, event-driven IRC client gem for Ruby with plugin support
3
+ A modular, event-driven IRC client/bot Ruby gem with plugin support
4
4
 
5
5
  ## Installation
6
6
 
@@ -32,7 +32,6 @@ TLDR:
32
32
  Support?
33
33
 
34
34
  irc.jdqirc.net #fantasy
35
-
36
35
  irc://irc.jdqirc.net/fantasy
37
36
 
38
37
  ## Contributing
@@ -43,3 +42,7 @@ Support?
43
42
  4. Push to the branch (`git push origin my-new-feature`)
44
43
  5. Create new Pull Request
45
44
 
45
+
46
+
47
+ [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/v2px/fantasy-irc/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
48
+
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -9,15 +9,13 @@ bot.plugins.load 'corecommands'
9
9
 
10
10
  # log in once we are connected
11
11
  connected = Proc.new do
12
- bot.login :nickname => "example", :username => "example", :realname => "GECOS field"
12
+ bot.login nickname: "example", username: "example", realname: "GECOS field"
13
13
  end
14
14
  bot.events.by_name('connected').register &connected
15
15
 
16
16
  # join a room and say hi
17
17
  loggedin = Proc.new do
18
- %w{#lobby}.each do |r|
19
- room = bot.rooms.new(r).join.say "ohai"
20
- end
18
+ bot.rooms.new("#test").join.say "ohai"
21
19
  end
22
20
  bot.events.by_name('loggedin').register &loggedin
23
21
 
@@ -33,5 +31,5 @@ channel_message = Proc.new do |room, user, text|
33
31
  end
34
32
  bot.events.by_name('channel_message').register &channel_message
35
33
 
36
- bot.connect :server => "irc.example.com", :ssl => true, :port => 6697
34
+ bot.connect server: "irc.example.com", ssl: true, port: 6697
37
35
  bot.run
@@ -1,14 +1,14 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.authors = ["Jens Becker"]
3
3
  s.email = ["v2px@v2px.de"]
4
- s.description = "A modular, event-driven IRC client/bot gem for Ruby with plugin support"
5
- s.summary = "A modular, event-driven IRC client/bot gem for Ruby with plugin support"
4
+ s.description = "A modular, event-driven IRC client/bot Ruby gem with plugin support"
5
+ s.summary = "A modular, event-driven IRC client/bot Ruby gem with plugin support"
6
6
  s.homepage = "http://v2px.github.com/fantasy-irc"
7
7
 
8
8
  s.files = `git ls-files`.split("\n")
9
9
  s.name = "fantasy-irc"
10
10
  s.require_paths = ['lib']
11
- s.version = "0.1.1"
11
+ s.version = "0.1.2"
12
12
 
13
13
  s.rubyforge_project = s.name
14
14
  s.add_runtime_dependency "array-unique", "~> 1.1.1"
@@ -5,28 +5,28 @@ module Fantasy
5
5
  class Factory
6
6
  def initialize
7
7
  puts "Initializing new Event::Factory #{self}"
8
- @data, @data[:events] = Hash.new, Hash.new
8
+ @events = Hash.new
9
9
  end
10
10
 
11
11
  def create name
12
12
  name.downcase!
13
13
 
14
- if not @data[:events][name].nil? then
15
- return @data[:events][name]
14
+ if not @events[name].nil? then
15
+ return @events[name]
16
16
  # TODO: log warning
17
17
  end
18
18
 
19
- @data[:events][name] = Event.new(name)
19
+ @events[name] = Event.new(name)
20
20
  end
21
21
 
22
22
  def by_name name
23
23
  name.downcase!
24
24
 
25
- if not @data[:events][name] then
25
+ if not @events[name] then
26
26
  raise "Tried to access unknown event \"#{name}\" in Event::Factory \"#{self}\""
27
27
  end
28
28
 
29
- @data[:events][name]
29
+ @events[name]
30
30
  end
31
31
  end
32
32
 
@@ -36,26 +36,22 @@ module Fantasy
36
36
  def initialize(name)
37
37
  puts "New Event with name #{name}"
38
38
  @name = name
39
- @data = Hash.new
39
+ @callbacks = Hash.new
40
40
  end
41
41
 
42
42
  def register(&callback)
43
43
  uuid = SecureRandom.uuid()
44
44
 
45
- if @data[:callbacks].nil? then
46
- @data[:callbacks] = Hash.new
47
- end
48
-
49
- @data[:callbacks][uuid] = callback
45
+ @callbacks[uuid] = callback
50
46
  puts "#{self}: registered callback #{callback} with uuid #{uuid}."
51
47
  end
52
48
 
53
49
  def call(args=nil)
54
- if @data[:callbacks].nil? or @data[:callbacks].empty? then
50
+ if @callbacks.empty? then
55
51
  return
56
52
  end
57
53
 
58
- @data[:callbacks].each { |uuid, proc|
54
+ @callbacks.each { |uuid, proc|
59
55
  proc.call(args)
60
56
  }
61
57
  end
@@ -2,11 +2,6 @@ require 'socket' # TCPSocket
2
2
  require 'openssl'
3
3
  require 'array-unique'
4
4
 
5
- #require "fantasy-irc/rooms"
6
- #require "fantasy-irc/users"
7
- #require "fantasy-irc/events"
8
- #require "fantasy-irc/plugins"
9
-
10
5
  module Fantasy
11
6
  class IRC
12
7
  attr_reader :events, :rooms, :users, :plugins
@@ -26,7 +21,7 @@ module Fantasy
26
21
  @users = User::Factory.new self
27
22
  @plugins = Plugins.new
28
23
 
29
- %w{tick loggedin connected user_joined channel_message}.each do |e|
24
+ %w{tick loggedin connected user_joined user_parted user_quit channel_message}.each do |e|
30
25
  @events.create(e)
31
26
  end
32
27
  end
@@ -39,7 +34,7 @@ module Fantasy
39
34
  data[:username] = data[:nickname]
40
35
  end
41
36
  if not data[:realname] then
42
- data[:realname] = "https://bitbucket.org/v2px/fantasy-irc"
37
+ data[:realname] = "https://rubygems.org/gems/fantasy-irc"
43
38
  end
44
39
 
45
40
  if not data[:nickname] then
@@ -123,8 +118,6 @@ module Fantasy
123
118
  self.events.by_name('user_joined').call([room, user])
124
119
 
125
120
  elsif (tok[1] == "PRIVMSG") then
126
- # tok = s.split(' ', 4)
127
-
128
121
  # channel or private message
129
122
  if (tok[2][0,1] == "#") then
130
123
  # channel message
@@ -146,7 +139,35 @@ module Fantasy
146
139
  end
147
140
  end
148
141
 
142
+ elsif (tok[1] == "PART") then
143
+ # user parted
144
+ room = self.rooms.by_name(tok[2])
145
+ user = self.users.create(tok[0][1,tok[0].length])
146
+
147
+ # remove user from room and room from user
148
+ room.users.delete user
149
+ user.rooms.delete room
150
+
151
+ return if user.ignored?
152
+
153
+ # TODO part text?
154
+ self.events.by_name('user_parted').call([room, user])
155
+
156
+ elsif (tok[1] == "QUIT") then
157
+ # user quit
158
+ user = self.users.create(tok[0][1,tok[0].length])
159
+
160
+ puts "!!! user #{user} quit."
161
+ # remove user from all rooms
162
+ self.rooms.all.values.each do |room|
163
+ room.users.delete user
164
+ end
165
+ user.reset
166
+
167
+ self.events.by_name('user_quit').call([user])
168
+
149
169
  else
170
+
150
171
  # puts "[!] UNKNOWN PROTOCOL PART: #{s}"
151
172
  end
152
173
  else
@@ -1,5 +1,3 @@
1
- #require "fantasy-irc/connection"
2
-
3
1
  module Fantasy
4
2
  module Room
5
3
  class Factory
@@ -26,10 +24,15 @@ module Fantasy
26
24
 
27
25
  if not @data[:rooms][name] then
28
26
  raise "Tried to access unknown room \"#{name}\" in Room::Factory \"#{self}\""
27
+ #TODO: log
29
28
  end
30
29
 
31
30
  @data[:rooms][name]
32
31
  end
32
+
33
+ def all
34
+ @data[:rooms]
35
+ end
33
36
  end
34
37
 
35
38
  class Room
@@ -48,6 +48,12 @@ module Fantasy
48
48
  @rooms = Array::Unique.new
49
49
  end
50
50
 
51
+ # resets user information
52
+ def reset
53
+ puts "Resetting user #{self.object_id} with name #{@name}"
54
+ @rooms = Array::Unique.new
55
+ end
56
+
51
57
  def say message
52
58
  @connection.send('PRIVMSG '+@name+' :'+message)
53
59
  return self
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fantasy::Event do
4
+ describe Fantasy::Event::Event do
5
+ describe "#new" do
6
+ it "takes a name as arument and returns a Fantasy::Event::Event object" do
7
+ e = Fantasy::Event::Event.new("rspec_event")
8
+ e.should be_an_instance_of Fantasy::Event::Event
9
+ end
10
+ end
11
+ end
12
+
13
+ describe Fantasy::Event::Factory do
14
+ before :each do
15
+ @fac = Fantasy::Event::Factory.new
16
+ end
17
+
18
+ describe "#new" do
19
+ it "takes no arguments and returns a Fantasy::Event::Factory object" do
20
+ @fac.should be_an_instance_of Fantasy::Event::Factory
21
+ end
22
+ end
23
+
24
+ describe "create" do
25
+ it "takes a name as arument, creates a new event with this name in lowercase and returns it" do
26
+ event = @fac.create("rspec_event")
27
+ event.should be_an_instance_of Fantasy::Event::Event
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fantasy::IRC do
4
+ before :each do
5
+ @bot = Fantasy::IRC.new
6
+
7
+ # stub the send ethod
8
+ @bot.stub(:send) { }
9
+ end
10
+
11
+ describe "#new" do
12
+ it "takes no parameter and returns a Fantasy::IRC object" do
13
+ @bot.should be_an_instance_of Fantasy::IRC
14
+ end
15
+ end
16
+
17
+ describe "login" do
18
+ it "takes no arguments and raises an error" do
19
+ expect { @bot.login }.to raise_error
20
+ end
21
+
22
+ it "takes a nickname as argument and proceeds to log in" do
23
+ @bot.should_receive(:send).with(/^USER rspec_nick /)
24
+ @bot.should_receive(:send).with(/^NICK rspec_nick$/)
25
+ @bot.login(:nickname => 'rspec_nick')
26
+ end
27
+
28
+ it "takes a username as argument and proceeds to log in" do
29
+ @bot.should_receive(:send).with(/^USER rspec_uname /)
30
+ @bot.should_receive(:send).with(/^NICK rspec_uname$/)
31
+ @bot.login(:username => 'rspec_uname')
32
+ end
33
+
34
+ it "takes a username and a nickname as argument and proceeds to log in with both" do
35
+ @bot.should_receive(:send).with(/^USER rspec_uname /)
36
+ @bot.should_receive(:send).with(/^NICK rspec_nick$/)
37
+ @bot.login(:username => 'rspec_uname', :nickname => 'rspec_nick')
38
+ end
39
+
40
+ it "takes a (username and a) realname and sets the realname too" do
41
+ @bot.should_receive(:send).with(/^USER rspec_uname [^:]+:rspec realname$/)
42
+ @bot.login(:username => 'rspec_uname', :realname => "rspec realname")
43
+ end
44
+ end
45
+
46
+ describe "connect" do
47
+ it "takes no arguments and raises an error" do
48
+ expect { @bot.connect }.to raise_error
49
+ end
50
+ end
51
+
52
+ describe "parse" do
53
+ it "parses at least the PING message" do
54
+ @bot.should_receive(:send).with(/^PONG :rspec_test$/)
55
+ @bot.parse("PING :rspec_test")
56
+ end
57
+ end
58
+ end
@@ -0,0 +1 @@
1
+ require 'fantasy-irc'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fantasy-irc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
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: 2013-01-26 00:00:00.000000000 Z
12
+ date: 2013-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: array-unique
@@ -27,15 +27,18 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.1.1
30
- description: A modular, event-driven IRC client/bot gem for Ruby with plugin support
30
+ description: A modular, event-driven IRC client/bot Ruby gem with plugin support
31
31
  email:
32
32
  - v2px@v2px.de
33
33
  executables: []
34
34
  extensions: []
35
35
  extra_rdoc_files: []
36
36
  files:
37
+ - Gemfile
38
+ - Gemfile.lock
37
39
  - LICENSE.md
38
40
  - README.md
41
+ - Rakefile
39
42
  - docs/PLUGINS.md
40
43
  - docs/example.rb
41
44
  - fantasy-irc.gemspec
@@ -46,6 +49,9 @@ files:
46
49
  - lib/fantasy-irc/rooms.rb
47
50
  - lib/fantasy-irc/users.rb
48
51
  - lib/plugins/corecommands.rb
52
+ - spec/lib/fantasy-event_spec.rb
53
+ - spec/lib/fantasy-irc_spec.rb
54
+ - spec/spec_helper.rb
49
55
  homepage: http://v2px.github.com/fantasy-irc
50
56
  licenses: []
51
57
  post_install_message:
@@ -69,5 +75,5 @@ rubyforge_project: fantasy-irc
69
75
  rubygems_version: 1.8.25
70
76
  signing_key:
71
77
  specification_version: 3
72
- summary: A modular, event-driven IRC client/bot gem for Ruby with plugin support
78
+ summary: A modular, event-driven IRC client/bot Ruby gem with plugin support
73
79
  test_files: []