tkellem 0.8.11 → 0.9.0.beta1
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/Gemfile +9 -0
- data/lib/tkellem/bouncer.rb +50 -15
- data/lib/tkellem/bouncer_connection.rb +46 -60
- data/lib/tkellem/celluloid_tools.rb +131 -0
- data/lib/tkellem/daemon.rb +3 -7
- data/lib/tkellem/irc_message.rb +1 -1
- data/lib/tkellem/migrations/001_init_db.rb +39 -22
- data/lib/tkellem/migrations/002_at_connect_columns.rb +21 -4
- data/lib/tkellem/migrations/003_settings.rb +18 -9
- data/lib/tkellem/models/host.rb +2 -2
- data/lib/tkellem/models/listen_address.rb +13 -1
- data/lib/tkellem/models/network.rb +11 -7
- data/lib/tkellem/models/network_user.rb +22 -6
- data/lib/tkellem/models/setting.rb +3 -3
- data/lib/tkellem/models/user.rb +13 -6
- data/lib/tkellem/plugins/backlog.rb +45 -27
- data/lib/tkellem/socket_server.rb +15 -7
- data/lib/tkellem/tkellem_bot.rb +11 -19
- data/lib/tkellem/tkellem_server.rb +84 -61
- data/lib/tkellem/version.rb +1 -1
- data/lib/tkellem.rb +1 -10
- data/spec/spec_helper.rb +5 -18
- data/tkellem.gemspec +6 -4
- metadata +56 -28
- data/lib/tkellem/irc_server.rb +0 -124
- data/spec/bouncer_connection_spec.rb +0 -37
- data/spec/irc_server_spec.rb +0 -145
data/tkellem.gemspec
CHANGED
@@ -17,10 +17,12 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.default_executable = %q{tkellem}
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
s.add_dependency "
|
21
|
-
s.add_dependency "
|
22
|
-
s.add_dependency "
|
20
|
+
s.add_dependency "celluloid", "~> 0.13.0"
|
21
|
+
s.add_dependency "celluloid-io", "~> 0.13.0"
|
22
|
+
s.add_dependency "activesupport", "3.2.10"
|
23
|
+
s.add_dependency "sequel", "3.42.0"
|
24
|
+
s.add_dependency "sqlite3", "1.3.6"
|
23
25
|
|
26
|
+
s.add_development_dependency "rake"
|
24
27
|
s.add_development_dependency "rspec", "~> 2.5"
|
25
|
-
s.add_development_dependency "rcov"
|
26
28
|
end
|
metadata
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tkellem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.9.0.beta1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Brian Palmer
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: celluloid
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.13.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,15 +26,15 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.
|
29
|
+
version: 0.13.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
31
|
+
name: celluloid-io
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
37
|
+
version: 0.13.0
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,41 +42,57 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
45
|
+
version: 0.13.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
47
|
+
name: activesupport
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
none: false
|
50
50
|
requirements:
|
51
|
-
- -
|
51
|
+
- - '='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
53
|
+
version: 3.2.10
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 3.2.10
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
63
|
+
name: sequel
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
none: false
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - '='
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
70
|
-
type: :
|
69
|
+
version: 3.42.0
|
70
|
+
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
|
-
- -
|
75
|
+
- - '='
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
77
|
+
version: 3.42.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: sqlite3
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - '='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.3.6
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.3.6
|
78
94
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
95
|
+
name: rake
|
80
96
|
requirement: !ruby/object:Gem::Requirement
|
81
97
|
none: false
|
82
98
|
requirements:
|
@@ -91,6 +107,22 @@ dependencies:
|
|
91
107
|
- - ! '>='
|
92
108
|
- !ruby/object:Gem::Version
|
93
109
|
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rspec
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.5'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '2.5'
|
94
126
|
description:
|
95
127
|
email:
|
96
128
|
- brian@codekitchen.net
|
@@ -120,9 +152,9 @@ files:
|
|
120
152
|
- lib/tkellem.rb
|
121
153
|
- lib/tkellem/bouncer.rb
|
122
154
|
- lib/tkellem/bouncer_connection.rb
|
155
|
+
- lib/tkellem/celluloid_tools.rb
|
123
156
|
- lib/tkellem/daemon.rb
|
124
157
|
- lib/tkellem/irc_message.rb
|
125
|
-
- lib/tkellem/irc_server.rb
|
126
158
|
- lib/tkellem/migrations/001_init_db.rb
|
127
159
|
- lib/tkellem/migrations/002_at_connect_columns.rb
|
128
160
|
- lib/tkellem/migrations/003_settings.rb
|
@@ -141,9 +173,7 @@ files:
|
|
141
173
|
- lib/tkellem/version.rb
|
142
174
|
- resources/bot_command_descriptions.yml
|
143
175
|
- resources/setting_descriptions.yml
|
144
|
-
- spec/bouncer_connection_spec.rb
|
145
176
|
- spec/irc_message_spec.rb
|
146
|
-
- spec/irc_server_spec.rb
|
147
177
|
- spec/spec_helper.rb
|
148
178
|
- tkellem.gemspec
|
149
179
|
homepage: http://github.com/codekitchen/tkellem
|
@@ -161,9 +191,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
161
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
192
|
none: false
|
163
193
|
requirements:
|
164
|
-
- - ! '
|
194
|
+
- - ! '>'
|
165
195
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
196
|
+
version: 1.3.1
|
167
197
|
requirements: []
|
168
198
|
rubyforge_project:
|
169
199
|
rubygems_version: 1.8.23
|
@@ -171,8 +201,6 @@ signing_key:
|
|
171
201
|
specification_version: 3
|
172
202
|
summary: IRC bouncer with multi-client support
|
173
203
|
test_files:
|
174
|
-
- spec/bouncer_connection_spec.rb
|
175
204
|
- spec/irc_message_spec.rb
|
176
|
-
- spec/irc_server_spec.rb
|
177
205
|
- spec/spec_helper.rb
|
178
206
|
has_rdoc:
|
data/lib/tkellem/irc_server.rb
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
require 'eventmachine'
|
2
|
-
require 'set'
|
3
|
-
require 'socket'
|
4
|
-
|
5
|
-
require 'tkellem/irc_message'
|
6
|
-
require 'tkellem/bouncer_connection'
|
7
|
-
|
8
|
-
module Tkellem
|
9
|
-
|
10
|
-
module IrcServerConnection
|
11
|
-
include EM::Protocols::LineText2
|
12
|
-
|
13
|
-
def initialize(connection_state, bouncer, do_ssl)
|
14
|
-
set_delimiter "\r\n"
|
15
|
-
@bouncer = bouncer
|
16
|
-
@ssl = do_ssl
|
17
|
-
@connection_state = connection_state
|
18
|
-
@connected = false
|
19
|
-
end
|
20
|
-
|
21
|
-
def connection_completed
|
22
|
-
if @ssl
|
23
|
-
@bouncer.failsafe(:connection_completed) do
|
24
|
-
@bouncer.debug "starting TLS"
|
25
|
-
# TODO: support strict cert checks
|
26
|
-
start_tls :verify_peer => false
|
27
|
-
end
|
28
|
-
else
|
29
|
-
ssl_handshake_completed
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def ssl_handshake_completed
|
34
|
-
@bouncer.failsafe(:ssl_handshake_completed) do
|
35
|
-
@connected = true
|
36
|
-
@bouncer.connection_established(self)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def receive_line(line)
|
41
|
-
@bouncer.failsafe(:receive_line) do
|
42
|
-
@bouncer.trace "from server: #{line}"
|
43
|
-
return if line.blank?
|
44
|
-
msg = IrcMessage.parse(line)
|
45
|
-
@bouncer.server_msg(msg)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def unbind
|
50
|
-
@bouncer.failsafe(:unbind) do
|
51
|
-
if @connected
|
52
|
-
@bouncer.disconnected!
|
53
|
-
else
|
54
|
-
@bouncer.debug "Connection failed, trying next"
|
55
|
-
@connection_state.connect!
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
class ConnectionState < Struct.new(:bouncer, :network, :attempted, :getting)
|
61
|
-
def initialize(bouncer, network)
|
62
|
-
super(bouncer, network, Set.new, false)
|
63
|
-
reset
|
64
|
-
end
|
65
|
-
|
66
|
-
def connect!
|
67
|
-
raise("already in the process of getting an address") if getting
|
68
|
-
self.getting = true
|
69
|
-
network.reload
|
70
|
-
host_infos = network.hosts.map { |h| h.attributes }
|
71
|
-
EM.defer(proc { find_address(host_infos) }, method(:got_address))
|
72
|
-
end
|
73
|
-
|
74
|
-
def reset
|
75
|
-
self.attempted.clear
|
76
|
-
end
|
77
|
-
|
78
|
-
# runs in threadpool
|
79
|
-
def find_address(hosts)
|
80
|
-
candidates = Set.new
|
81
|
-
hosts.each do |host|
|
82
|
-
Socket.getaddrinfo(host['address'], host['port'], Socket::AF_INET, Socket::SOCK_STREAM, Socket::IPPROTO_TCP).each do |found|
|
83
|
-
candidates << [found[3], host['port'], host['ssl']]
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
to_try = candidates.to_a.sort_by { rand }.find { |c| !attempted.include?(c) }
|
88
|
-
if to_try.nil?
|
89
|
-
# we've tried all possible hosts, start over
|
90
|
-
return nil
|
91
|
-
end
|
92
|
-
|
93
|
-
return to_try
|
94
|
-
end
|
95
|
-
|
96
|
-
# back on event thread
|
97
|
-
def got_address(to_try)
|
98
|
-
self.getting = false
|
99
|
-
|
100
|
-
if !to_try
|
101
|
-
# sleep for a bit and try again
|
102
|
-
bouncer.debug "All available addresses failed, sleeping 5s and then trying over"
|
103
|
-
reset
|
104
|
-
EM.add_timer(5) { connect! }
|
105
|
-
return
|
106
|
-
end
|
107
|
-
|
108
|
-
attempted << to_try
|
109
|
-
address, port, ssl = to_try
|
110
|
-
|
111
|
-
bouncer.debug "Connecting to: #{Host.address_string(address, port, ssl)}"
|
112
|
-
bouncer.failsafe("connect: #{Host.address_string(address, port, ssl)}") do
|
113
|
-
EM.connect(address, port, IrcServerConnection, self, bouncer, ssl)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def self.connector(bouncer, network)
|
119
|
-
ConnectionState.new(bouncer, network)
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'tkellem/bouncer_connection'
|
3
|
-
|
4
|
-
include Tkellem
|
5
|
-
|
6
|
-
describe BouncerConnection, "connect" do
|
7
|
-
before do
|
8
|
-
@u = User.create(:username => 'speccer')
|
9
|
-
@u.password = 'test123'
|
10
|
-
@u.save
|
11
|
-
@tk = mock(TkellemServer)
|
12
|
-
@b = mock(Bouncer)
|
13
|
-
@bc = em(BouncerConnection).new(@tk, false)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should ignore blank lines" do
|
17
|
-
@bc.should_receive(:error!).never
|
18
|
-
@bc.receive_line("")
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should connect after receiving credentials" do
|
22
|
-
@tk.should_receive(:find_bouncer).with(@u, 'testhost').and_return(@b)
|
23
|
-
@bc.receive_line("NICK speccer")
|
24
|
-
@bc.receive_line("PASS test123")
|
25
|
-
@b.should_receive(:connect_client).with(@bc)
|
26
|
-
@bc.receive_line("USER speccer@testhost")
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should connect when receiving user before pass" do
|
30
|
-
@tk.should_receive(:find_bouncer).with(@u, 'testhost').and_return(@b)
|
31
|
-
@bc.receive_line("USER speccer@testhost")
|
32
|
-
@bc.receive_line("PASS test123")
|
33
|
-
@b.should_receive(:connect_client).with(@bc)
|
34
|
-
@bc.receive_line("NICK speccer")
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
data/spec/irc_server_spec.rb
DELETED
@@ -1,145 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'tkellem/irc_server'
|
3
|
-
|
4
|
-
include Tkellem
|
5
|
-
|
6
|
-
describe Bouncer, "connection" do
|
7
|
-
before do
|
8
|
-
EM.stub!(:add_timer).and_return(nil)
|
9
|
-
end
|
10
|
-
|
11
|
-
def make_server
|
12
|
-
network = Network.create!(:hosts => [Host.create!(:address => 'localhost', :port => 4321)], :name => 'test')
|
13
|
-
b = Bouncer.new(NetworkUser.create!(:user => User.new(:username => 'speccer'), :network => network))
|
14
|
-
b
|
15
|
-
end
|
16
|
-
|
17
|
-
def send_welcome(s, &just_before_last)
|
18
|
-
s.should_receive(:send_msg).with("USER speccer somehost tkellem :speccer@tkellem")
|
19
|
-
s.should_receive(:send_msg).with("NICK speccer")
|
20
|
-
s.should_receive(:send_msg).with("AWAY :Away")
|
21
|
-
s.connection_established(nil)
|
22
|
-
s.server_msg(IrcMessage.parse("001 blah blah"))
|
23
|
-
s.server_msg(IrcMessage.parse("002 more blah"))
|
24
|
-
s.server_msg(IrcMessage.parse("003 even more blah"))
|
25
|
-
just_before_last && just_before_last.call
|
26
|
-
s.server_msg(IrcMessage.parse("376 :end of MOTD"))
|
27
|
-
end
|
28
|
-
|
29
|
-
def connected_server
|
30
|
-
s = make_server
|
31
|
-
send_welcome(s)
|
32
|
-
s.connected?.should be_true
|
33
|
-
s
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should connect to the server on creation" do
|
37
|
-
s = make_server
|
38
|
-
s.connected?.should_not be_true
|
39
|
-
s.should_receive(:send_msg).with("USER speccer somehost tkellem :speccer@tkellem")
|
40
|
-
s.should_receive(:send_msg).with("NICK speccer")
|
41
|
-
s.connection_established(nil)
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should pong" do
|
45
|
-
s = connected_server
|
46
|
-
s.should_receive(:send_msg).with("PONG tkellem!tkellem :HAI")
|
47
|
-
s.server_msg(IrcMessage.parse(":speccer!test@host ping :HAI"))
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should ignore blank lines" do
|
51
|
-
b = mock("bouncer", :trace => nil)
|
52
|
-
b.should_receive(:failsafe).and_yield
|
53
|
-
s = em(IrcServerConnection).new('connected', b, false)
|
54
|
-
b.should_receive(:server_msg).never
|
55
|
-
s.receive_line("")
|
56
|
-
end
|
57
|
-
|
58
|
-
def tk_server
|
59
|
-
$tk_server ||= TkellemServer.new
|
60
|
-
end
|
61
|
-
|
62
|
-
after(:each) do
|
63
|
-
$tk_server.stop if $tk_server
|
64
|
-
$tk_server = nil
|
65
|
-
end
|
66
|
-
|
67
|
-
def network_user(opts = {})
|
68
|
-
opts[:user] ||= @user ||= User.create!(:username => 'speccer', :password => 'test123')
|
69
|
-
opts[:network] ||= @network ||= Network.create!(:name => 'localhost')
|
70
|
-
@network_user ||= NetworkUser.create!(opts)
|
71
|
-
end
|
72
|
-
|
73
|
-
def bouncer(opts = {})
|
74
|
-
tk_server
|
75
|
-
network_user
|
76
|
-
@bouncer = $tk_server.bouncers.values.last
|
77
|
-
if opts[:connect]
|
78
|
-
@server_conn = em(IrcServerConnection).new(nil, @bouncer, false)
|
79
|
-
@server_conn.stub!(:send_data)
|
80
|
-
@bouncer.connection_established(@server_conn)
|
81
|
-
@bouncer.send :ready!
|
82
|
-
end
|
83
|
-
@bouncer
|
84
|
-
end
|
85
|
-
|
86
|
-
def client_connection(opts = {})
|
87
|
-
@client ||= em(BouncerConnection).new(tk_server, false)
|
88
|
-
if opts[:connect]
|
89
|
-
end
|
90
|
-
@client
|
91
|
-
end
|
92
|
-
|
93
|
-
it "should force the client nick on connect" do
|
94
|
-
network_user(:nick => 'mynick')
|
95
|
-
bouncer(:connect => true)
|
96
|
-
@bouncer.server_msg(m ":mynick JOIN #t1")
|
97
|
-
client_connection
|
98
|
-
@client.should_receive(:send_msg).with(":some_other_nick NICK mynick")
|
99
|
-
@client.should_receive(:send_msg).with(":mynick JOIN #t1")
|
100
|
-
@client.receive_line("PASS test123")
|
101
|
-
@client.receive_line("NICK some_other_nick")
|
102
|
-
@client.receive_line("USER #{@user.username}@#{@network.name} a b :c")
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should attempt another nick if the default is taken" do
|
106
|
-
network_user(:nick => 'mynick')
|
107
|
-
bouncer
|
108
|
-
@server_conn = em(IrcServerConnection).new(nil, @bouncer, false)
|
109
|
-
@server_conn.stub!(:send_data)
|
110
|
-
@bouncer.connection_established(@server_conn)
|
111
|
-
@server_conn.should_receive(:send_data).with("NICK mynick_\r\n")
|
112
|
-
@bouncer.server_msg(m ":server 433 * mynick :Nickname already in use")
|
113
|
-
@bouncer.nick.should == 'mynick_'
|
114
|
-
@bouncer.send :ready!
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should change nicks if a client sends nick after connecting" do
|
118
|
-
network_user(:nick => 'mynick')
|
119
|
-
bouncer(:connect => true)
|
120
|
-
@bouncer.server_msg(m ":mynick JOIN #t1")
|
121
|
-
client_connection
|
122
|
-
@client.should_receive(:send_msg).with(":mynick JOIN #t1")
|
123
|
-
@client.receive_line("PASS test123")
|
124
|
-
@client.receive_line("NICK mynick")
|
125
|
-
@client.receive_line("USER #{@user.username}@#{@network.name} a b :c")
|
126
|
-
@bouncer.nick.should == 'mynick'
|
127
|
-
@bouncer.client_msg(@client, m("NICK some_other"))
|
128
|
-
@bouncer.nick.should == 'some_other'
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should change nicks if a server forces nick change" do
|
132
|
-
network_user(:nick => 'mynick')
|
133
|
-
bouncer(:connect => true)
|
134
|
-
@bouncer.server_msg(m ":mynick JOIN #t1")
|
135
|
-
client_connection
|
136
|
-
@client.should_receive(:send_msg).with(":mynick JOIN #t1")
|
137
|
-
@client.receive_line("PASS test123")
|
138
|
-
@client.receive_line("NICK mynick")
|
139
|
-
@client.receive_line("USER #{@user.username}@#{@network.name} a b :c")
|
140
|
-
@bouncer.nick.should == 'mynick'
|
141
|
-
@client.should_receive(:send_msg).with(m ":mynick NICK some_other")
|
142
|
-
@bouncer.server_msg(m ":mynick NICK some_other")
|
143
|
-
@bouncer.nick.should == 'some_other'
|
144
|
-
end
|
145
|
-
end
|