fargo 0.1.1 → 0.2.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.
- data/ext/fargo/base32.c +61 -0
- data/ext/fargo/base32.h +16 -0
- data/ext/fargo/extconf.rb +8 -0
- data/ext/fargo/fargo_tth.c +34 -0
- data/ext/fargo/sboxes.c +515 -0
- data/ext/fargo/tiger.c +245 -0
- data/ext/fargo/tiger.h +41 -0
- data/ext/fargo/tigertree.c +184 -0
- data/ext/fargo/tigertree.h +48 -0
- data/ext/fargo/tth.c +100 -0
- data/ext/fargo/tth.h +18 -0
- data/lib/fargo/client.rb +47 -118
- data/lib/fargo/protocol/dc.rb +52 -0
- data/lib/fargo/{connection → protocol}/download.rb +56 -88
- data/lib/fargo/protocol/hub.rb +81 -0
- data/lib/fargo/search.rb +21 -16
- data/lib/fargo/search_result.rb +6 -6
- data/lib/fargo/supports/chat.rb +10 -7
- data/lib/fargo/supports/downloads.rb +73 -117
- data/lib/fargo/supports/file_list.rb +21 -10
- data/lib/fargo/supports/nick_list.rb +23 -14
- data/lib/fargo/supports/persistence.rb +28 -23
- data/lib/fargo/supports/searches.rb +30 -9
- data/lib/fargo/supports/timeout.rb +8 -5
- data/lib/fargo/supports/uploads.rb +5 -5
- data/lib/fargo/utils.rb +5 -4
- data/lib/fargo/version.rb +1 -1
- data/lib/fargo.rb +8 -10
- metadata +41 -19
- data/lib/fargo/connection/base.rb +0 -126
- data/lib/fargo/connection/hub.rb +0 -120
- data/lib/fargo/connection/search.rb +0 -19
- data/lib/fargo/connection/upload.rb +0 -85
- data/lib/fargo/publisher.rb +0 -42
- data/lib/fargo/server.rb +0 -52
data/lib/fargo/client.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
|
-
require '
|
2
|
-
require 'active_support/configurable'
|
1
|
+
require 'socket'
|
3
2
|
require 'active_support/core_ext/object/try'
|
3
|
+
require 'active_support/callbacks'
|
4
4
|
|
5
5
|
module Fargo
|
6
6
|
class Client
|
7
7
|
|
8
|
-
include ActiveSupport::Callbacks
|
9
8
|
include ActiveSupport::Configurable
|
9
|
+
include ActiveSupport::Callbacks
|
10
10
|
|
11
|
-
define_callbacks :
|
11
|
+
define_callbacks :initialization
|
12
12
|
|
13
|
-
include Fargo::Publisher
|
14
13
|
include Fargo::Supports::Chat
|
15
14
|
include Fargo::Supports::Uploads
|
16
15
|
include Fargo::Supports::NickList
|
@@ -20,141 +19,71 @@ module Fargo
|
|
20
19
|
include Fargo::Supports::Timeout
|
21
20
|
include Fargo::Supports::FileList
|
22
21
|
|
23
|
-
# Options
|
24
|
-
# :hub_port
|
25
|
-
# :hub_address
|
26
|
-
# :search_port
|
27
|
-
# :active_port
|
28
|
-
# :nick
|
29
|
-
# :password
|
30
|
-
# :email
|
31
|
-
# :speed
|
32
|
-
# :passive
|
33
|
-
# :download_slots
|
34
|
-
# :download_dir
|
35
|
-
# :slots
|
36
22
|
configure do |config|
|
37
|
-
config.download_dir
|
38
|
-
config.
|
39
|
-
|
40
|
-
config.
|
41
|
-
config.
|
42
|
-
config.
|
23
|
+
config.download_dir = '/tmp/fargo/downloads'
|
24
|
+
config.address = IPSocket.getaddress(Socket.gethostname)
|
25
|
+
config.passive = false
|
26
|
+
config.nick = 'fargo'
|
27
|
+
config.hub_address = '127.0.0.1'
|
28
|
+
config.hub_port = 7314
|
29
|
+
config.active_port = 7315
|
30
|
+
config.search_port = 7316
|
31
|
+
config.download_slots = 4
|
32
|
+
config.upload_slots = 4
|
33
|
+
config.password = ''
|
34
|
+
config.speed = 'DSL'
|
35
|
+
config.email = nil
|
43
36
|
end
|
44
37
|
|
45
|
-
attr_reader :hub, :
|
38
|
+
attr_reader :hub, :channel
|
46
39
|
|
47
40
|
def initialize
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
# Don't do this in initialization so we have time to set all the options
|
52
|
-
def setup
|
53
|
-
@hub = Fargo::Connection::Hub.new self
|
54
|
-
@hub.config.port = config.hub_port if config.hub_port
|
55
|
-
@hub.config.address = config.hub_address if config.hub_address
|
56
|
-
|
57
|
-
unless config.passive
|
58
|
-
# TODO: get this working again
|
59
|
-
# Always create a search connection for this.
|
60
|
-
# searcher_options = new_options.merge :port => search_port,
|
61
|
-
# :connection => Fargo::Connection::Search
|
62
|
-
# @searcher = Fargo::Server.new searcher_options
|
63
|
-
#
|
64
|
-
# # For now, being active means that you can only download things. Always make a
|
65
|
-
# # connection which downloads things.
|
66
|
-
# active_options = new_options.merge :port => active_port,
|
67
|
-
# :connection => Fargo::Connection::Download
|
68
|
-
# @active_server = Fargo::Server.new active_options
|
69
|
-
end
|
41
|
+
run_callbacks :initialization do
|
42
|
+
@channel = EventMachine::Channel.new
|
43
|
+
@connection_timeouts = {}
|
70
44
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
def get_info nick
|
75
|
-
hub.write "$GetINFO #{nick} #{config.nick}"
|
76
|
-
end
|
77
|
-
|
78
|
-
def get_ip *nicks
|
79
|
-
hub.write "$UserIP #{nicks.flatten.join '$$'}"
|
80
|
-
end
|
81
|
-
|
82
|
-
def connect_with nick
|
83
|
-
@connection_timeout_threads[nick] = Thread.start do
|
84
|
-
sleep 10
|
85
|
-
connection_timeout! nick
|
86
|
-
end
|
87
|
-
|
88
|
-
if config.passive
|
89
|
-
hub.write "$RevConnectToMe #{self.config.nick} #{nick}"
|
90
|
-
else
|
91
|
-
hub.write "$ConnectToMe #{nick} #{config.address}:#{config.active_port}"
|
45
|
+
@channel.subscribe do |type, hash|
|
46
|
+
Fargo.logger.debug "Channel received: #{type} - #{hash.inspect}"
|
47
|
+
end
|
92
48
|
end
|
93
49
|
end
|
94
50
|
|
95
|
-
def connected_with! nick
|
96
|
-
return unless @connection_timeout_threads.has_key?(nick)
|
97
|
-
@connection_timeout_threads.delete(nick).exit
|
98
|
-
end
|
99
|
-
|
100
51
|
def connect
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
52
|
+
EventMachine.error_handler{ |e|
|
53
|
+
Fargo.logger.debug "Error raised during event loop: #{e.message}"
|
54
|
+
Fargo.logger.debug e.backtrace.join("\n")
|
55
|
+
}
|
56
|
+
|
57
|
+
EventMachine.connect config.hub_address, config.hub_port,
|
58
|
+
Fargo::Protocol::Hub do |conn|
|
59
|
+
@hub = conn
|
60
|
+
@hub.client = self
|
61
|
+
end
|
105
62
|
|
106
63
|
unless config.passive
|
107
|
-
|
108
|
-
|
64
|
+
EventMachine.start_server '0.0.0.0', config.active_port,
|
65
|
+
Fargo::Protocol::Download do |conn|
|
66
|
+
conn.client = self
|
67
|
+
end
|
68
|
+
|
69
|
+
EventMachine.open_datagram_socket '0.0.0.0', config.search_port,
|
70
|
+
Fargo::Protocol::DC do |conn|
|
71
|
+
conn.client = self
|
72
|
+
end
|
109
73
|
end
|
110
|
-
|
111
|
-
true
|
112
74
|
end
|
113
75
|
|
114
76
|
def connected?
|
115
|
-
|
77
|
+
EventMachine.reactor_running?
|
116
78
|
end
|
117
79
|
|
118
80
|
def disconnect
|
119
|
-
|
120
|
-
|
121
|
-
Fargo.logger.info "Disconnecting from hub."
|
122
|
-
hub.disconnect
|
123
|
-
unless config.passive
|
124
|
-
searcher.disconnect
|
125
|
-
active_server.disconnect
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def search_hub query
|
130
|
-
raise ConnectionError.new('Not connected Yet!') if hub.nil?
|
131
|
-
|
132
|
-
if config.passive
|
133
|
-
location = "Hub:#{config.nick}"
|
134
|
-
else
|
135
|
-
location = "#{config.address}:#{config.search_port}"
|
136
|
-
end
|
137
|
-
|
138
|
-
hub.write "$Search #{location} #{query.to_s}"
|
139
|
-
end
|
140
|
-
|
141
|
-
# see hub/parser#@@search for what's passed in
|
142
|
-
# searches this client's files based on those options and returns an array
|
143
|
-
# of SearchResult(s)
|
144
|
-
def search_files options
|
145
|
-
# TODO: implement me
|
146
|
-
[]
|
81
|
+
Fargo.logger.info 'Disconnecting from hub.'
|
82
|
+
EventMachine.stop_event_loop
|
147
83
|
end
|
148
84
|
|
149
85
|
def description
|
150
|
-
"
|
151
|
-
end
|
152
|
-
|
153
|
-
private
|
154
|
-
|
155
|
-
def connection_timeout! nick
|
156
|
-
@connection_timeout_threads.delete(nick)
|
157
|
-
publish :connection_timeout, :nick => nick
|
86
|
+
"<fargo V:#{Fargo::VERSION},M:#{config.passive ? 'P' : 'A'},H:1/0/0,S:#{open_slots},Dt:1.2.6/W>"
|
158
87
|
end
|
159
88
|
|
160
89
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Fargo
|
2
|
+
module Protocol
|
3
|
+
module DC
|
4
|
+
|
5
|
+
include Fargo::Parser
|
6
|
+
attr_accessor :client
|
7
|
+
|
8
|
+
def post_init
|
9
|
+
@received_data = ''
|
10
|
+
end
|
11
|
+
|
12
|
+
def receive_message type, message
|
13
|
+
client.channel << [type, message] if client
|
14
|
+
end
|
15
|
+
|
16
|
+
def send_message method, args = nil
|
17
|
+
if args
|
18
|
+
data = "$#{method} #{args}|"
|
19
|
+
else
|
20
|
+
data = "$#{method}|"
|
21
|
+
end
|
22
|
+
|
23
|
+
Fargo.logger.debug "#{self} Sending: #{data.inspect}"
|
24
|
+
send_data data
|
25
|
+
end
|
26
|
+
|
27
|
+
def receive_data data
|
28
|
+
@received_data << data
|
29
|
+
|
30
|
+
while message = @received_data.slice!(/[^\|]+\|/)
|
31
|
+
message.chomp! '|'
|
32
|
+
Fargo.logger.debug "#{self}: Received: #{message.inspect}"
|
33
|
+
hash = parse_message message
|
34
|
+
receive_message hash[:type], hash
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def publish_args
|
39
|
+
{}
|
40
|
+
end
|
41
|
+
|
42
|
+
def unbind
|
43
|
+
if client
|
44
|
+
connection_type = self.class.name.split('::').last.downcase
|
45
|
+
args = [:"#{connection_type}_disconnected", publish_args]
|
46
|
+
client.channel << args
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,44 +1,36 @@
|
|
1
1
|
require 'zlib'
|
2
2
|
|
3
3
|
module Fargo
|
4
|
-
module
|
5
|
-
class Download <
|
4
|
+
module Protocol
|
5
|
+
class Download < EventMachine::Connection
|
6
6
|
|
7
7
|
include Fargo::Utils
|
8
|
-
include Fargo::
|
8
|
+
include Fargo::Protocol::DC
|
9
9
|
|
10
|
-
|
11
|
-
set_callback :listen, :after do |connection|
|
12
|
-
send_lock if connection.config.first
|
13
|
-
end
|
10
|
+
attr_accessor :download, :client
|
14
11
|
|
15
|
-
|
12
|
+
def post_init
|
13
|
+
super
|
16
14
|
|
17
|
-
|
18
|
-
Fargo.logger.debug "Initiating connection on: #{config.address}:#{config.port}"
|
15
|
+
set_comm_inactivity_timeout 20
|
19
16
|
|
20
|
-
|
21
|
-
@lock, @pk = generate_lock
|
17
|
+
@lock, @pk = generate_lock
|
22
18
|
@handshake_step = 0
|
23
|
-
|
24
|
-
@buffer_size = (2 << 12).freeze
|
25
19
|
end
|
26
20
|
|
27
21
|
def send_lock
|
28
|
-
|
22
|
+
@lock_sent = true
|
23
|
+
send_message 'MyNick', @client.config.nick
|
24
|
+
send_message 'Lock', "#{@lock} Pk=#{@pk}"
|
29
25
|
end
|
30
26
|
|
31
|
-
def
|
32
|
-
# only download if we're at the correct
|
27
|
+
def receive_data data
|
28
|
+
# only download if we're at the correct handshake step
|
33
29
|
return super if @handshake_step != 6
|
34
30
|
|
35
|
-
@exit_time = 20 # reset our timeout time
|
36
|
-
|
37
|
-
data = @socket.readpartial @buffer_size
|
38
|
-
|
39
31
|
if @zlib
|
40
|
-
@
|
41
|
-
data
|
32
|
+
@inflator = Zlib::Inflate.new if @inflator.nil?
|
33
|
+
data = @inflator.inflate data
|
42
34
|
end
|
43
35
|
|
44
36
|
@file << data
|
@@ -51,33 +43,29 @@ module Fargo
|
|
51
43
|
percent = @recvd.to_f / @length
|
52
44
|
if percent - @last_published > 0.05
|
53
45
|
@file.flush
|
54
|
-
|
55
|
-
:file
|
56
|
-
:nick
|
57
|
-
:download
|
58
|
-
:size
|
59
|
-
:compressed
|
46
|
+
@client.channel << [:download_progress, {:percent => percent,
|
47
|
+
:file => download_path,
|
48
|
+
:nick => @other_nick,
|
49
|
+
:download => @download,
|
50
|
+
:size => @recvd,
|
51
|
+
:compressed => @zlib}]
|
60
52
|
|
61
53
|
@last_published = percent
|
62
54
|
end
|
63
55
|
|
64
56
|
download_finished! if @recvd == @length
|
65
57
|
end
|
66
|
-
rescue IOError => e
|
67
|
-
error "#{self}: IOError, disconnecting #{e}"
|
68
58
|
end
|
69
59
|
|
70
|
-
def
|
71
|
-
|
72
|
-
|
73
|
-
case message[:type]
|
60
|
+
def receive_message type, message
|
61
|
+
case type
|
74
62
|
when :mynick
|
75
63
|
if @handshake_step == 0
|
76
64
|
@handshake_step = 1
|
77
65
|
@other_nick = message[:nick]
|
78
66
|
|
79
|
-
|
80
|
-
|
67
|
+
client.channel << [:download_opened,
|
68
|
+
publish_args.merge(:connection => self)]
|
81
69
|
@download = @client.lock_next_download! @other_nick, self
|
82
70
|
|
83
71
|
if @download.try(:file).nil?
|
@@ -91,12 +79,12 @@ module Fargo
|
|
91
79
|
if @handshake_step == 1
|
92
80
|
@remote_lock = message[:lock]
|
93
81
|
@handshake_step = 2
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
82
|
+
|
83
|
+
send_lock unless @lock_sent
|
84
|
+
|
85
|
+
send_message 'Supports', 'TTHF ADCGet ZLIG'
|
86
|
+
send_message 'Direction', "Download #{@my_num = rand(10000)}"
|
87
|
+
send_message 'Key', generate_key(@remote_lock)
|
100
88
|
else
|
101
89
|
error 'Premature disconnect when lock received'
|
102
90
|
end
|
@@ -136,18 +124,18 @@ module Fargo
|
|
136
124
|
@zlib = message[:zlib]
|
137
125
|
@length = message[:size]
|
138
126
|
|
139
|
-
|
127
|
+
send_message 'Send' unless @client_extensions.include? 'ADCGet'
|
140
128
|
|
141
|
-
|
142
|
-
:download
|
143
|
-
:nick
|
129
|
+
@client.channel << [:download_started, {:file => download_path,
|
130
|
+
:download => @download,
|
131
|
+
:nick => @other_nick}]
|
144
132
|
else
|
145
133
|
error "Premature disconnect when #{message[:type]} received"
|
146
134
|
end
|
147
135
|
|
148
136
|
when :noslots
|
149
137
|
if @download
|
150
|
-
Fargo.logger.debug "#{self}: No Slots for #{
|
138
|
+
Fargo.logger.debug "#{self}: No Slots for #{@download}"
|
151
139
|
|
152
140
|
download_failed! 'No Slots'
|
153
141
|
end
|
@@ -158,7 +146,7 @@ module Fargo
|
|
158
146
|
|
159
147
|
# This wasn't handled by us, proxy it on up to the client
|
160
148
|
else
|
161
|
-
|
149
|
+
super
|
162
150
|
|
163
151
|
end
|
164
152
|
end
|
@@ -167,8 +155,6 @@ module Fargo
|
|
167
155
|
@file = File.open download_path, 'wb'
|
168
156
|
|
169
157
|
@file.seek @download.offset
|
170
|
-
@file.sync = true
|
171
|
-
@socket.sync = true
|
172
158
|
@handshake_step = 5
|
173
159
|
@last_published = 0
|
174
160
|
|
@@ -194,24 +180,11 @@ module Fargo
|
|
194
180
|
Fargo.logger.debug "Enabling zlib compression on: #{@download.file}"
|
195
181
|
end
|
196
182
|
|
197
|
-
|
183
|
+
send_message 'ADCGET', "file #{download_query} #{@download.offset} #{@download.size} #{zlig}"
|
198
184
|
else
|
199
|
-
|
185
|
+
send_message 'Get', "#{@download.file}$#{@download.offset + 1}"
|
200
186
|
end
|
201
187
|
|
202
|
-
# This is the thread for the timeout of a connection. The @exit_time
|
203
|
-
# variable is reset to 20 after every bit of information is received.
|
204
|
-
@exit_time = 20
|
205
|
-
@exit_thread = Thread.start {
|
206
|
-
while @exit_time > 0
|
207
|
-
sleep 1
|
208
|
-
@exit_time -= 1
|
209
|
-
Fargo.logger.debug "#{self} time out in #{@exit_time} seconds"
|
210
|
-
end
|
211
|
-
|
212
|
-
download_failed! 'Download timeout!'
|
213
|
-
}
|
214
|
-
|
215
188
|
Fargo.logger.debug "#{self}: Beginning download of #{@download}"
|
216
189
|
end
|
217
190
|
|
@@ -224,12 +197,10 @@ module Fargo
|
|
224
197
|
|
225
198
|
reset_download
|
226
199
|
|
227
|
-
|
200
|
+
@client.channel << [:download_failed, opts.merge(:nick => @other_nick,
|
228
201
|
:download => download,
|
229
202
|
:file => path,
|
230
|
-
:last_error => msg)
|
231
|
-
|
232
|
-
@exit_thread = nil
|
203
|
+
:last_error => msg)]
|
233
204
|
end
|
234
205
|
|
235
206
|
def download_finished!
|
@@ -241,16 +212,21 @@ module Fargo
|
|
241
212
|
|
242
213
|
reset_download
|
243
214
|
|
244
|
-
|
245
|
-
|
246
|
-
|
215
|
+
@client.channel << [:download_finished,
|
216
|
+
{:file => path, :download => download, :nick => @other_nick}]
|
217
|
+
|
218
|
+
close_connection_after_writing if download.file_list?
|
247
219
|
end
|
248
220
|
|
249
|
-
def
|
250
|
-
|
221
|
+
def publish_args
|
222
|
+
{:nick => @other_nick}
|
223
|
+
end
|
251
224
|
|
225
|
+
def unbind
|
252
226
|
super
|
253
227
|
|
228
|
+
Fargo.logger.debug "#{self} Disconnected from: #{@other_nick}"
|
229
|
+
|
254
230
|
if @download
|
255
231
|
download_failed! @last_error, :recvd => @recvd, :length => @length
|
256
232
|
end
|
@@ -259,25 +235,16 @@ module Fargo
|
|
259
235
|
end
|
260
236
|
|
261
237
|
private
|
238
|
+
|
262
239
|
def reset_download
|
263
240
|
@file.close unless @file.nil? || @file.closed?
|
241
|
+
|
264
242
|
if @file_path && File.exists?(@file_path) && File.size(@file_path) == 0
|
265
243
|
File.delete(@file_path)
|
266
244
|
end
|
267
245
|
|
268
|
-
if @socket
|
269
|
-
@socket.sync = false
|
270
|
-
@socket.flush
|
271
|
-
end
|
272
|
-
|
273
|
-
# If this was called from exit thread, don't kill it
|
274
|
-
if @exit_thread != Thread.current
|
275
|
-
@exit_thread.exit if @exit_thread && @exit_thread.alive?
|
276
|
-
@exit_thread = nil
|
277
|
-
end
|
278
|
-
|
279
246
|
# clear out these variables
|
280
|
-
@
|
247
|
+
@inflator = @file_path = @zlib = @download = @length = @recvd = nil
|
281
248
|
|
282
249
|
# Go back to the get step
|
283
250
|
@handshake_step = 5
|
@@ -305,7 +272,8 @@ module Fargo
|
|
305
272
|
|
306
273
|
def error message
|
307
274
|
Fargo.logger.warn @last_error = message
|
308
|
-
|
275
|
+
|
276
|
+
close_connection
|
309
277
|
end
|
310
278
|
|
311
279
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Fargo
|
2
|
+
module Protocol
|
3
|
+
class Hub < EventMachine::Connection
|
4
|
+
|
5
|
+
include Fargo::Protocol::DC
|
6
|
+
include Fargo::Utils
|
7
|
+
|
8
|
+
attr_reader :hubname
|
9
|
+
|
10
|
+
# See <http://www.teamfair.info/DC-Protocol.htm> for specifics on
|
11
|
+
# the DC protocol
|
12
|
+
def receive_message type, message
|
13
|
+
case type
|
14
|
+
when :lock
|
15
|
+
@validated = false
|
16
|
+
send_message 'Key', generate_key(message[:lock])
|
17
|
+
when :hubname
|
18
|
+
@hubname = message[:name]
|
19
|
+
send_message 'ValidateNick', @client.config.nick unless @validated
|
20
|
+
when :getpass
|
21
|
+
send_message 'MyPass', @client.config.password
|
22
|
+
when :badpass, :hubfull
|
23
|
+
Fargo.logger.warn "Disconnecting because of: #{message.inspect}"
|
24
|
+
close_connection_after_writing
|
25
|
+
when :hello
|
26
|
+
if message[:who] == @client.config.nick
|
27
|
+
Fargo.logger.info "Connected to DC Hub #{@hubname}"
|
28
|
+
@validated = true
|
29
|
+
|
30
|
+
send_message 'Version', '1,0091'
|
31
|
+
send_message 'MyINFO', "$ALL #{@client.config.nick} " +
|
32
|
+
"#{@client.description}$ $#{@client.config.speed}" +
|
33
|
+
"#{@status || 1.chr}$#{@client.config.email}" +
|
34
|
+
"$#{@client.share_size}$"
|
35
|
+
send_message 'GetNickList'
|
36
|
+
end
|
37
|
+
|
38
|
+
when :connect_to_me
|
39
|
+
if !@client.nicks.include?(message[:nick])
|
40
|
+
Fargo.logger.info "Invalid connect_to_me request from: #{message[:nick]}"
|
41
|
+
return
|
42
|
+
end
|
43
|
+
|
44
|
+
EventMachine.connect message[:address], message[:port],
|
45
|
+
Fargo::Protocol::Download do |conn|
|
46
|
+
conn.client = @client
|
47
|
+
conn.send_lock # We connect first, we send lock first
|
48
|
+
end
|
49
|
+
|
50
|
+
when :search
|
51
|
+
# Let the client handle the results
|
52
|
+
@results = @client.search_files message
|
53
|
+
|
54
|
+
# Send all the results to the peer. Take care of active/passive
|
55
|
+
# connections
|
56
|
+
@results.each { |r|
|
57
|
+
if message[:address]
|
58
|
+
r.active_send @client.config.nick, message[:ip], message[:port]
|
59
|
+
else
|
60
|
+
send_message 'SR', "#{@client.config.nick} #{r}"
|
61
|
+
end
|
62
|
+
}
|
63
|
+
|
64
|
+
when :revconnect
|
65
|
+
if @client.config.passive
|
66
|
+
send_message 'RevConnectToMe',
|
67
|
+
"#{@client.config.nick} #{message[:who]}"
|
68
|
+
else
|
69
|
+
send_message 'ConnectToMe', "#{@client.config.nick} #{@client.config.address}:#{@client.config.extport}"
|
70
|
+
end
|
71
|
+
|
72
|
+
# proxy this message on up the stack if we don't handle it
|
73
|
+
else
|
74
|
+
super
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/fargo/search.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Fargo
|
2
2
|
class Search
|
3
|
-
|
3
|
+
|
4
4
|
ANY = 1
|
5
5
|
AUDIO = 2
|
6
6
|
COMPRESSED = 3
|
@@ -8,38 +8,43 @@ module Fargo
|
|
8
8
|
EXECUTABLE = 5
|
9
9
|
VIDEO = 7
|
10
10
|
FOLDER = 8
|
11
|
-
|
11
|
+
|
12
12
|
attr_accessor :size_restricted, :is_minimum_size, :size, :filetype, :pattern
|
13
|
-
|
13
|
+
|
14
14
|
def initialize opts = {}
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
@size_restricted = opts[:size_restricted]
|
16
|
+
@is_minimum_size = opts[:is_minimum_size]
|
17
|
+
@size = opts[:size]
|
18
|
+
@filetype = opts[:filetype] || ANY
|
19
|
+
|
19
20
|
if opts[:pattern]
|
20
|
-
|
21
|
+
@pattern = opts[:pattern]
|
21
22
|
elsif opts[:query]
|
22
23
|
self.query = opts[:query]
|
23
24
|
end
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
def query= query
|
27
28
|
@pattern = query.split(' ').join('$')
|
28
29
|
end
|
29
|
-
|
30
|
+
|
30
31
|
def queries
|
31
|
-
pattern.split(
|
32
|
+
pattern.split('$')
|
32
33
|
end
|
33
34
|
|
34
35
|
def query
|
35
36
|
pattern.gsub('$', ' ')
|
36
37
|
end
|
37
|
-
|
38
|
+
|
38
39
|
def matches_result? map
|
39
40
|
file = map[:file].downcase
|
40
|
-
|
41
|
+
|
42
|
+
matches_query = queries.inject(true) do |last, word|
|
43
|
+
last && file.index(word.downcase)
|
44
|
+
end
|
45
|
+
|
41
46
|
if size_restricted == 'T'
|
42
|
-
if is_minimum_size
|
47
|
+
if is_minimum_size
|
43
48
|
matches_query && map[:size] > size
|
44
49
|
else
|
45
50
|
matches_query && map[:size] < size
|
@@ -51,11 +56,11 @@ module Fargo
|
|
51
56
|
|
52
57
|
def to_s
|
53
58
|
if size_restricted
|
54
|
-
"#{size_restricted ? 'T' : 'F' }?#{!size_restricted || is_minimum_size ? 'T' : 'F'}?#{size || 0}?#{filetype}?#{pattern}"
|
59
|
+
"#{size_restricted ? 'T' : 'F' }?#{!size_restricted || is_minimum_size ? 'T' : 'F'}?#{size || 0}?#{filetype}?#{pattern}"
|
55
60
|
else
|
56
61
|
"F?T?#{size || 0}?#{filetype}?#{pattern}"
|
57
62
|
end
|
58
63
|
end
|
59
|
-
|
64
|
+
|
60
65
|
end
|
61
66
|
end
|