2003-07-20 20:32:24 +00:00
|
|
|
# $Dwarf: article.rb,v 1.74 2003/07/14 22:12:18 ward Exp $
|
2002-04-28 16:29:56 +00:00
|
|
|
# $Source$
|
2003-07-20 20:32:24 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Copyright (c) 2002, 2003 Ward Wouts <ward@wouts.nl>
|
2002-06-28 21:21:47 +00:00
|
|
|
#
|
2003-07-20 20:32:24 +00:00
|
|
|
# Permission to use, copy, modify, and distribute this software for any
|
|
|
|
|
# purpose with or without fee is hereby granted, provided that the above
|
|
|
|
|
# copyright notice and this permission notice appear in all copies.
|
2002-06-28 21:21:47 +00:00
|
|
|
#
|
2003-07-20 20:32:24 +00:00
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
|
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
2002-06-28 21:21:47 +00:00
|
|
|
#
|
2002-04-28 16:29:56 +00:00
|
|
|
|
2002-04-28 22:06:03 +00:00
|
|
|
require 'set/intspan'
|
2002-04-28 16:29:56 +00:00
|
|
|
require 'net/nntp'
|
2002-05-05 20:07:03 +00:00
|
|
|
require 'news/newsrc'
|
2002-05-01 22:16:01 +00:00
|
|
|
require 'tempfile'
|
2002-05-17 09:32:50 +00:00
|
|
|
require 'timeout'
|
2002-04-28 16:29:56 +00:00
|
|
|
|
2002-07-03 22:18:40 +00:00
|
|
|
class ArticleError < RuntimeError; end
|
2002-07-04 22:29:38 +00:00
|
|
|
class TempError < ArticleError; end
|
|
|
|
|
class PermError < ArticleError; end
|
2002-07-03 22:18:40 +00:00
|
|
|
|
2002-04-28 16:29:56 +00:00
|
|
|
class Article
|
|
|
|
|
|
2003-07-13 09:52:53 +00:00
|
|
|
Debuglevel = 2
|
2002-04-28 16:29:56 +00:00
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def initialize(nntpservers, groupname, newsrc="~/.newsrc")
|
2002-04-28 22:06:03 +00:00
|
|
|
@messids = []
|
2002-04-28 16:29:56 +00:00
|
|
|
@ids = []
|
2002-05-05 20:07:03 +00:00
|
|
|
@servers = []
|
2002-04-28 16:29:56 +00:00
|
|
|
@subjects = []
|
2002-05-05 20:07:03 +00:00
|
|
|
|
2002-04-28 16:29:56 +00:00
|
|
|
@sorted = false
|
|
|
|
|
@grouped = false
|
2002-04-28 22:06:03 +00:00
|
|
|
@groups = {}
|
2002-05-05 20:07:03 +00:00
|
|
|
@gotten = {}
|
|
|
|
|
@group = groupname
|
|
|
|
|
|
|
|
|
|
@serverlist = nntpservers.split('|')
|
|
|
|
|
@connections = {}
|
|
|
|
|
@serverlist.collect{|server|
|
|
|
|
|
@connections[server] = {}
|
2002-05-18 17:39:32 +00:00
|
|
|
begin
|
|
|
|
|
@connections[server]["nntp"] = Net::NNTP.new(server)
|
|
|
|
|
@connections[server]["skip_ids"] = Set::IntSpan.new()
|
|
|
|
|
@connections[server]["newsrc"] = News::Newsrc.new("#{newsrc}.#{server}")
|
|
|
|
|
set_skip_ids(server, @connections[server]["newsrc"].marked_articles(@group))
|
2003-07-13 09:52:53 +00:00
|
|
|
rescue SocketError, Errno::EINVAL, EOFError
|
2002-08-02 12:09:33 +00:00
|
|
|
print "Connection to #{server} failed: #{$!}\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
del_server(server)
|
2002-05-18 17:39:32 +00:00
|
|
|
end
|
2002-05-05 20:07:03 +00:00
|
|
|
}
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
|
2002-05-08 22:08:32 +00:00
|
|
|
def reconnect(server)
|
2002-05-18 17:39:32 +00:00
|
|
|
begin
|
|
|
|
|
@connections[server]["nntp"] = Net::NNTP.new(server)
|
2003-07-13 09:52:53 +00:00
|
|
|
rescue SocketError, Errno::EINVAL, EOFError
|
2002-08-02 12:09:33 +00:00
|
|
|
print "Reconnect to #{server} failed: #{$!}\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
del_server(server)
|
2002-07-04 22:29:38 +00:00
|
|
|
raise PermError, "Couldn't connect to #{server}"
|
2002-05-18 17:39:32 +00:00
|
|
|
end
|
|
|
|
|
print "Succesfully reconnected to #{server}\n"
|
2002-05-08 22:08:32 +00:00
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def add(messid, id, server, subject)
|
|
|
|
|
# print "Messid: #{messid}\n"
|
|
|
|
|
# print "Id: #{id}\n"
|
|
|
|
|
# print "Server: #{server}\n"
|
|
|
|
|
# print "Subject: #{subject}\n"
|
2002-08-01 09:22:29 +00:00
|
|
|
@messids.push(messid)
|
|
|
|
|
@ids.push(id.to_i)
|
|
|
|
|
@servers.push(server)
|
|
|
|
|
@subjects.push(subject)
|
2002-04-28 16:29:56 +00:00
|
|
|
@sorted = false
|
|
|
|
|
@grouped = false
|
|
|
|
|
end
|
|
|
|
|
|
2002-07-03 22:18:40 +00:00
|
|
|
def del_server(server)
|
|
|
|
|
print "Removing server #{server} from list\n"
|
|
|
|
|
@connections.delete(server)
|
|
|
|
|
@serverlist.delete(server)
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def get_articles(cachedir=false)
|
2003-07-03 14:03:11 +00:00
|
|
|
if cachedir != false
|
|
|
|
|
check_cache(cachedir)
|
|
|
|
|
end
|
2002-05-05 20:07:03 +00:00
|
|
|
for server in @connections.keys
|
2002-07-03 22:18:40 +00:00
|
|
|
begin
|
|
|
|
|
first, last = get_group_info(server)
|
2002-07-04 22:29:38 +00:00
|
|
|
rescue PermError
|
2002-08-02 12:09:33 +00:00
|
|
|
print "Error: #{$!}\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
del_server(server)
|
|
|
|
|
next
|
|
|
|
|
end
|
2003-07-13 09:52:53 +00:00
|
|
|
if first.to_i <= last.to_i
|
|
|
|
|
# available articles on server
|
|
|
|
|
@connections[server]["first"] = first ? first.to_i : 0
|
|
|
|
|
@connections[server]["last"] = last ? last.to_i : 0
|
2003-04-28 20:30:18 +00:00
|
|
|
if Debuglevel > 0
|
|
|
|
|
print " Server: #{server}\n"
|
|
|
|
|
print " First: #{first}\n"
|
|
|
|
|
print " Last: #{last}\n"
|
|
|
|
|
end
|
2003-04-22 21:30:07 +00:00
|
|
|
# clean up old newsrc entries
|
2003-04-24 07:43:21 +00:00
|
|
|
if @connections[server]["first"].to_i > 0
|
2003-04-24 07:26:41 +00:00
|
|
|
@connections[server]["newsrc"].unmark_range(@group, 0, (@connections[server]["first"].to_i-1).to_s)
|
|
|
|
|
@connections[server]["newsrc"].save
|
|
|
|
|
end
|
2002-05-25 13:41:27 +00:00
|
|
|
else
|
2002-07-03 22:18:40 +00:00
|
|
|
print " First article has higher number than last article on server #{server}.\n"
|
|
|
|
|
del_server(server)
|
2002-05-25 13:41:27 +00:00
|
|
|
end
|
2002-05-05 20:07:03 +00:00
|
|
|
end
|
|
|
|
|
read_cache(cachedir)
|
2003-07-14 22:12:18 +00:00
|
|
|
# for server in @connections.keys
|
|
|
|
|
# print "############################################################\n"
|
|
|
|
|
# print "skip_ids #{server}: #{@connections[server]["skip_ids"].run_list}\n"
|
|
|
|
|
# end
|
2002-05-05 20:07:03 +00:00
|
|
|
for server in @connections.keys
|
2002-05-25 13:41:27 +00:00
|
|
|
print " reading articles from server: #{server}\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
range = Set::IntSpan.new("#{@connections[server]["first"]}-#{@connections[server]["last"]}")
|
2002-05-07 11:48:18 +00:00
|
|
|
rangelist = rechunk_runlist(range.diff(@connections[server]["skip_ids"]).run_list)
|
2002-08-02 12:09:33 +00:00
|
|
|
print "rangelist: #{rangelist}\n" if Debuglevel > 2
|
|
|
|
|
print "rangelist: #{rangelist.type.to_s}\n" if Debuglevel > 2
|
2003-07-13 09:52:53 +00:00
|
|
|
print "rangelist elements: #{range.diff(@connections[server]["skip_ids"]).elements}\n" if Debuglevel > 2
|
2002-07-04 22:29:38 +00:00
|
|
|
begin
|
2002-05-05 20:07:03 +00:00
|
|
|
unless rangelist == nil or rangelist =~ /^$/
|
2003-07-13 11:28:32 +00:00
|
|
|
headerlines = 0
|
2002-05-05 20:07:03 +00:00
|
|
|
for i in rangelist.split(',')
|
2002-08-02 12:09:33 +00:00
|
|
|
print "i: #{i}\n" if Debuglevel > 2
|
2002-07-03 22:18:40 +00:00
|
|
|
begin
|
2002-05-19 10:23:36 +00:00
|
|
|
resp, subj_lines = get_xhdr(server, i, "subject")
|
|
|
|
|
resp, messid_lines = get_xhdr(server, i, "message-id")
|
2002-07-04 22:29:38 +00:00
|
|
|
rescue TempError
|
2002-08-04 21:30:11 +00:00
|
|
|
print "Caught: #{$!} reading from #{server} (get_articles)\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
next
|
|
|
|
|
end
|
2002-05-19 10:23:36 +00:00
|
|
|
|
|
|
|
|
art = {}
|
|
|
|
|
subj_lines.collect{|x|
|
|
|
|
|
art[x[0]] = {} unless art.has_key?(x[0])
|
|
|
|
|
art[x[0]]["subject"] = x[1]
|
2003-07-13 09:52:53 +00:00
|
|
|
print "art id: #{x[0]} subj: #{x[1]}\n" if Debuglevel > 2
|
2002-05-19 10:23:36 +00:00
|
|
|
}
|
|
|
|
|
messid_lines.collect{|x|
|
|
|
|
|
art[x[0]] = {} unless art.has_key?(x[0])
|
|
|
|
|
art[x[0]]["messid"] = x[1]
|
2003-07-13 09:52:53 +00:00
|
|
|
print "art id: #{x[0]} messid: #{x[1]}\n" if Debuglevel > 2
|
2002-05-19 10:23:36 +00:00
|
|
|
}
|
|
|
|
|
for id in art.keys
|
|
|
|
|
if art[id].has_key?("subject") and art[id].has_key?("messid")
|
2003-07-13 09:52:53 +00:00
|
|
|
print "adding: #{art[id]["messid"]}, #{id}, #{server}, #{art[id]["subject"]}\n" if Debuglevel > 2
|
2002-05-19 10:23:36 +00:00
|
|
|
add(art[id]["messid"], id, server, art[id]["subject"])
|
2002-05-05 20:07:03 +00:00
|
|
|
end
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
2003-07-13 11:28:32 +00:00
|
|
|
headerlines += subj_lines.length
|
2003-07-14 22:12:18 +00:00
|
|
|
if headerlines >= 10000 # hmmm, dit lijkt niet te werken...
|
|
|
|
|
save_cache(cachedir, server)
|
2003-07-13 11:28:32 +00:00
|
|
|
headerlines = 0
|
|
|
|
|
end
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
end
|
2002-07-04 22:29:38 +00:00
|
|
|
rescue PermError
|
2002-08-02 12:09:33 +00:00
|
|
|
print "Error: #{$!}\n"
|
2002-07-04 22:29:38 +00:00
|
|
|
del_server(server)
|
|
|
|
|
next
|
|
|
|
|
end
|
2003-07-14 22:12:18 +00:00
|
|
|
save_cache(cachedir, server)
|
2002-05-19 10:23:36 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-19 15:06:53 +00:00
|
|
|
def get_group_info(server)
|
2002-05-19 10:23:36 +00:00
|
|
|
timedout = 0
|
|
|
|
|
resp = ""
|
|
|
|
|
first = ""
|
|
|
|
|
last = ""
|
|
|
|
|
begin
|
2002-05-19 15:06:53 +00:00
|
|
|
timeout(30) do
|
2002-05-19 10:23:36 +00:00
|
|
|
begin
|
2002-05-19 15:06:53 +00:00
|
|
|
resp, count, first, last, name = @connections[server]["nntp"].group(@group)
|
2002-05-19 10:23:36 +00:00
|
|
|
rescue Net::NNTP::RuntimeError
|
2002-11-05 09:19:41 +00:00
|
|
|
print "Caught #{$!.type} from #{server}\n"
|
2002-07-07 19:12:24 +00:00
|
|
|
raise PermError, "#{$!}"
|
2002-11-05 10:29:51 +00:00
|
|
|
rescue Errno::EPIPE, Errno::ECONNRESET, EOFError
|
2002-11-03 08:58:48 +00:00
|
|
|
print "Caught #{$!.type} reading from server #{server} (get_group_info)\n"
|
2002-05-19 10:23:36 +00:00
|
|
|
print "Error: #{$!}\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
reconnect(server)
|
|
|
|
|
retry
|
2002-05-19 10:23:36 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
rescue TimeoutError
|
|
|
|
|
timedout += 1
|
2002-07-07 19:12:24 +00:00
|
|
|
raise PermError, "Too many timeouts! (get_group_info)" if timedout > 1
|
2002-08-04 21:30:11 +00:00
|
|
|
print "Time out, reconnecting to server... (get_group_info)\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
reconnect(server)
|
|
|
|
|
retry
|
2002-05-19 10:23:36 +00:00
|
|
|
end
|
2002-07-03 22:18:40 +00:00
|
|
|
return first, last
|
2002-05-19 10:23:36 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def get_xhdr(server, range, header)
|
|
|
|
|
timedout = 0
|
|
|
|
|
resp = ""
|
|
|
|
|
lines = []
|
|
|
|
|
begin
|
|
|
|
|
timeout(180) do
|
|
|
|
|
begin
|
2003-07-13 09:52:53 +00:00
|
|
|
print "getting headers: #{header}, #{range}\n" if Debuglevel > 1
|
2002-05-19 10:23:36 +00:00
|
|
|
resp, lines = @connections[server]["nntp"].xhdr(header, range)
|
2002-07-04 14:48:01 +00:00
|
|
|
if resp.to_i == 500
|
|
|
|
|
print "xhdr not implemented\n"
|
|
|
|
|
print "Error: #{$!}\n"
|
|
|
|
|
end
|
2002-05-19 10:23:36 +00:00
|
|
|
unless resp.to_i >= 200 and resp.to_i < 300
|
|
|
|
|
print "got response #{resp} while reading group #{@group} from #{server}\n"
|
2002-07-04 22:40:24 +00:00
|
|
|
raise TempError
|
2002-05-19 10:23:36 +00:00
|
|
|
end
|
|
|
|
|
rescue Net::NNTP::RuntimeError
|
2002-11-03 08:58:48 +00:00
|
|
|
print "Caught #{$!.type} reading from server #{server} (get_xhdr)\n"
|
2002-05-19 10:23:36 +00:00
|
|
|
print "Error: #{$!}\n"
|
2002-10-28 20:48:40 +00:00
|
|
|
if ( $!.to_s =~ /^503|^400/ )
|
2002-09-09 15:19:22 +00:00
|
|
|
reconnect(server)
|
|
|
|
|
get_group_info(server)
|
|
|
|
|
retry
|
2002-10-29 20:34:56 +00:00
|
|
|
else
|
2003-07-13 09:52:53 +00:00
|
|
|
print "Won't handle this... yet :(\n"
|
2002-09-09 15:19:22 +00:00
|
|
|
end
|
2002-10-29 21:00:37 +00:00
|
|
|
rescue Errno::EPIPE, Errno::ECONNRESET, EOFError
|
2002-11-03 08:58:48 +00:00
|
|
|
print "Caught #{$!.type} reading from server #{server} (get_xhdr)\n"
|
2002-05-19 10:23:36 +00:00
|
|
|
print "Error: #{$!}\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
reconnect(server)
|
|
|
|
|
get_group_info(server)
|
|
|
|
|
retry
|
2002-05-19 10:23:36 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return resp, lines
|
|
|
|
|
rescue TimeoutError
|
2002-08-04 21:30:11 +00:00
|
|
|
print "Time out, reconnecting to server (get_xhdr)\n"
|
2002-05-19 10:23:36 +00:00
|
|
|
timedout += 1
|
2002-07-07 19:12:24 +00:00
|
|
|
raise PermError, "Too many timeouts! (get_xhrd)" if timedout > 1
|
2002-07-03 22:18:40 +00:00
|
|
|
reconnect(server)
|
|
|
|
|
get_group_info(server)
|
|
|
|
|
retry
|
2002-05-19 10:23:36 +00:00
|
|
|
end
|
|
|
|
|
end
|
2002-05-05 20:07:03 +00:00
|
|
|
|
|
|
|
|
# if xhdr doesn't work, this should be used
|
|
|
|
|
# for i in (range.diff(@connections[server]["skip_ids"]).elements)
|
|
|
|
|
# begin
|
|
|
|
|
# @connections[server]["nntp"].stat(i)
|
|
|
|
|
# resp, id, messid, list = @connections[server]["nntp"].head(i)
|
|
|
|
|
# for j in list
|
|
|
|
|
# if j =~ /Subject: (.*)/
|
|
|
|
|
# subj=$1
|
|
|
|
|
# end
|
|
|
|
|
# end
|
|
|
|
|
# print "get_articles messid: #{messid}\n" if Debuglevel > 1
|
|
|
|
|
# print "get_articles id: #{id}\n" if Debuglevel > 1
|
|
|
|
|
# print "get_articles server: #{server}\n" if Debuglevel > 1
|
|
|
|
|
# print "get_articles subject: #{subj}\n" if Debuglevel > 1
|
|
|
|
|
# add(messid, id, server, subj)
|
|
|
|
|
# rescue Net::NNTP::RuntimeError
|
|
|
|
|
# print "whoopsie couldn't stat #{i}\n" if Debuglevel > 1
|
|
|
|
|
# end
|
|
|
|
|
# end
|
2002-04-28 16:29:56 +00:00
|
|
|
|
|
|
|
|
def get_groups
|
|
|
|
|
group_subjects unless @grouped
|
2002-04-28 22:06:03 +00:00
|
|
|
return @groups
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
|
2002-05-06 11:46:56 +00:00
|
|
|
def get_groupname
|
|
|
|
|
return @group
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-17 09:32:50 +00:00
|
|
|
def get_body(server, message)
|
|
|
|
|
timedout = 0
|
|
|
|
|
resp = ""
|
|
|
|
|
id = ""
|
|
|
|
|
messid = ""
|
|
|
|
|
list = []
|
2002-08-06 23:06:59 +00:00
|
|
|
retries = 0
|
2002-05-17 09:32:50 +00:00
|
|
|
begin
|
|
|
|
|
timeout(180) do
|
|
|
|
|
begin
|
|
|
|
|
resp, id, messid, list = @connections[server]["nntp"].body(message)
|
|
|
|
|
rescue Net::NNTPReplyError
|
2002-08-06 16:07:48 +00:00
|
|
|
a = ''
|
|
|
|
|
a += $!
|
2002-11-03 08:58:48 +00:00
|
|
|
print "Caught #{$!.type} reading article #{message} from #{server} (get_body)\n"
|
2002-08-04 21:30:11 +00:00
|
|
|
print "Error: #{$!}\n"
|
2002-08-07 20:51:44 +00:00
|
|
|
if retries == 0 && (a =~ /^503/ || a =~ /^400/)
|
2002-08-06 16:07:48 +00:00
|
|
|
reconnect(server)
|
|
|
|
|
get_group_info(server)
|
2002-08-06 23:06:59 +00:00
|
|
|
retries = 1
|
2002-08-06 16:07:48 +00:00
|
|
|
retry
|
|
|
|
|
end
|
2002-08-04 21:30:11 +00:00
|
|
|
return false
|
2003-07-13 09:52:53 +00:00
|
|
|
rescue EOFError, NameError
|
2002-11-03 08:58:48 +00:00
|
|
|
print "Caught #{$!.type} reading article #{message} from #{server} (get_body)\n"
|
2002-05-17 09:32:50 +00:00
|
|
|
print "Error: #{$!}\n"
|
|
|
|
|
return false
|
|
|
|
|
rescue Errno::EPIPE, Errno::ECONNRESET
|
2002-11-03 08:58:48 +00:00
|
|
|
print "Caught #{$!.type} reading from server #{server} (get_body)\n"
|
2002-05-17 09:32:50 +00:00
|
|
|
print "Error: #{$!}\n"
|
2002-07-03 22:18:40 +00:00
|
|
|
reconnect(server)
|
|
|
|
|
get_group_info(server)
|
|
|
|
|
retry
|
2002-05-17 09:32:50 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return resp, id, messid, list
|
|
|
|
|
rescue TimeoutError
|
2002-08-04 21:30:11 +00:00
|
|
|
print "Time out, reconnecting to server (get_body)\n"
|
2002-05-17 09:32:50 +00:00
|
|
|
timedout += 1
|
2002-07-07 19:12:24 +00:00
|
|
|
raise PermError, "Too many timeouts! (get_body)" if timedout > 1
|
2002-07-03 22:18:40 +00:00
|
|
|
reconnect(server)
|
|
|
|
|
get_group_info(server)
|
|
|
|
|
retry
|
2002-05-17 09:32:50 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2002-04-28 16:29:56 +00:00
|
|
|
def get_group_body(subj)
|
|
|
|
|
result = []
|
2002-05-06 11:46:56 +00:00
|
|
|
group_subject_sort(subj)
|
2002-05-05 20:07:03 +00:00
|
|
|
for i in (0...@groups[subj]["messages"].length)
|
|
|
|
|
unless @gotten.has_key?(@groups[subj]["messages"][i])
|
2002-05-08 10:57:05 +00:00
|
|
|
print "getting article: #{i}\n" if Debuglevel > 1
|
2002-05-08 13:11:38 +00:00
|
|
|
print "getting article: #{subj}\n" if Debuglevel > 1
|
|
|
|
|
print "full subject: #{@groups[subj]["subject"][i]}\n" if Debuglevel > 0
|
|
|
|
|
print "message id: #{@groups[subj]["messages"][i]}\n" if Debuglevel > 1
|
|
|
|
|
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
|
|
|
|
print "server: #{@groups[subj]["servers"][i]}\n" if Debuglevel > 0
|
2002-08-06 16:07:48 +00:00
|
|
|
resp = false
|
|
|
|
|
while resp == false
|
2002-08-04 21:30:11 +00:00
|
|
|
if @serverlist.include?(@groups[subj]["servers"][i])
|
|
|
|
|
resp, id, messid, list = get_body(@groups[subj]["servers"][i], @groups[subj]["messages"][i])
|
|
|
|
|
else
|
|
|
|
|
resp = false
|
|
|
|
|
end
|
2002-05-17 09:32:50 +00:00
|
|
|
if resp == false
|
2003-04-28 20:34:15 +00:00
|
|
|
if Debuglevel > 1
|
|
|
|
|
print "mess-id i: #{@groups[subj]["messages"][i]}\n"
|
|
|
|
|
print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n"
|
|
|
|
|
end
|
2002-05-17 09:32:50 +00:00
|
|
|
if (i+1 < @groups[subj]["messages"].length) and
|
|
|
|
|
(@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1])
|
2003-04-28 20:50:43 +00:00
|
|
|
print " Trying next server...\n"
|
2002-05-17 09:32:50 +00:00
|
|
|
i += 1
|
|
|
|
|
else
|
2003-04-28 20:34:15 +00:00
|
|
|
raise TempError, " Message-id not on another server"
|
2002-05-17 09:32:50 +00:00
|
|
|
end
|
2002-05-08 10:57:05 +00:00
|
|
|
end
|
2002-05-05 20:07:03 +00:00
|
|
|
end
|
2002-05-08 13:11:38 +00:00
|
|
|
@gotten[ @groups[subj]["messages"][i] ] = true
|
2002-05-05 20:07:03 +00:00
|
|
|
result = list
|
2002-04-30 21:11:53 +00:00
|
|
|
end
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
return result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def get_group_body_first(subj)
|
2002-05-06 11:46:56 +00:00
|
|
|
group_subject_sort(subj)
|
2002-05-08 10:57:05 +00:00
|
|
|
i = 0
|
2002-05-08 13:11:38 +00:00
|
|
|
while @gotten.has_key?(@groups[subj]["messages"][0]) == false
|
|
|
|
|
print "getting article: #{subj}\n" if Debuglevel > 0
|
|
|
|
|
print "full subject: #{@groups[subj]["subject"][0]}\n" if Debuglevel > 0
|
|
|
|
|
print "message id: #{@groups[subj]["messages"][i]}\n" if Debuglevel > 1
|
|
|
|
|
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
|
|
|
|
print "server: #{@groups[subj]["servers"][0]}\n" if Debuglevel > 0
|
2002-08-06 16:07:48 +00:00
|
|
|
resp = false
|
|
|
|
|
while resp == false
|
2002-05-17 09:32:50 +00:00
|
|
|
resp, id, messid, list = get_body(@groups[subj]["servers"][i], @groups[subj]["messages"][i])
|
|
|
|
|
if resp == false
|
|
|
|
|
print "mess-id i: #{@groups[subj]["messages"][i]}\n"
|
|
|
|
|
print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n"
|
|
|
|
|
if (i+1 < @groups[subj]["messages"].length) and
|
|
|
|
|
(@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1])
|
|
|
|
|
print "Trying next server...\n"
|
|
|
|
|
i += 1
|
|
|
|
|
else
|
2002-07-07 19:12:24 +00:00
|
|
|
raise TempError, "Message-id not on another server"
|
2002-05-17 09:32:50 +00:00
|
|
|
end
|
2002-05-08 10:57:05 +00:00
|
|
|
end
|
|
|
|
|
end
|
2002-05-08 13:11:38 +00:00
|
|
|
@gotten[@groups[subj]["messages"][i]] = true
|
2002-04-30 15:33:13 +00:00
|
|
|
end
|
2002-04-28 16:29:56 +00:00
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def get_group_body_rest(subj, file=nil)
|
|
|
|
|
result = []
|
2002-05-05 20:07:03 +00:00
|
|
|
for i in (1...@groups[subj]["messages"].length)
|
|
|
|
|
unless @gotten.has_key?(@groups[subj]["messages"][i])
|
2002-05-08 10:57:05 +00:00
|
|
|
print "getting article: #{i}\n" if Debuglevel > 1
|
2002-05-08 13:11:38 +00:00
|
|
|
print "getting article: #{subj}\n" if Debuglevel > 1
|
|
|
|
|
print "full subject: #{@groups[subj]["subject"][i]}\n" if Debuglevel > 0
|
|
|
|
|
print "message id: #{@groups[subj]["messages"][i]}\n" if Debuglevel > 1
|
|
|
|
|
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
|
|
|
|
print "server: #{@groups[subj]["servers"][i]}\n" if Debuglevel > 0
|
2002-08-06 16:07:48 +00:00
|
|
|
resp = false
|
|
|
|
|
while resp == false
|
2002-05-17 09:32:50 +00:00
|
|
|
resp, id, messid, list = get_body(@groups[subj]["servers"][i], @groups[subj]["messages"][i])
|
2002-05-05 22:18:44 +00:00
|
|
|
if resp == false
|
2002-05-17 09:32:50 +00:00
|
|
|
print "mess-id i: #{@groups[subj]["messages"][i]}\n"
|
|
|
|
|
print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n"
|
|
|
|
|
if (i+1 < @groups[subj]["messages"].length) and
|
|
|
|
|
(@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1])
|
|
|
|
|
print "Trying next server...\n"
|
|
|
|
|
i += 1
|
|
|
|
|
else
|
2002-07-07 19:12:24 +00:00
|
|
|
raise TempError, "Message-id not on another server"
|
2002-05-17 09:32:50 +00:00
|
|
|
end
|
2002-05-08 10:57:05 +00:00
|
|
|
end
|
2002-05-05 20:07:03 +00:00
|
|
|
end
|
2002-05-08 13:11:38 +00:00
|
|
|
@gotten[ @groups[subj]["messages"][i] ] = true
|
2002-05-06 11:46:56 +00:00
|
|
|
if file
|
|
|
|
|
list.collect{|line| file.print "#{line}\n"}
|
|
|
|
|
else
|
2002-08-01 11:50:09 +00:00
|
|
|
result.concat(list)
|
2002-05-06 11:46:56 +00:00
|
|
|
end
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def get_group_subjects
|
|
|
|
|
group_subjects unless @grouped
|
2002-04-28 22:06:03 +00:00
|
|
|
return @groups.keys
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def get_group_messids(subject)
|
2002-04-28 22:06:03 +00:00
|
|
|
group_subjects unless @grouped
|
2002-05-05 20:07:03 +00:00
|
|
|
return @groups[subject]["messages"]
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def group_is_complete(subj)
|
2002-04-28 16:29:56 +00:00
|
|
|
group_subjects unless @grouped
|
2002-08-01 09:22:29 +00:00
|
|
|
#print "Subject: #{subj}\n"
|
2002-04-28 22:06:03 +00:00
|
|
|
print "length: #{@groups[subj]["messages"].length} total: #{@groups[subj]["total"].to_i}\n" if Debuglevel > 1
|
2002-05-05 20:07:03 +00:00
|
|
|
umessids = @groups[subj]["messages"].uniq
|
|
|
|
|
if (umessids.length ) >= @groups[subj]["total"].to_i
|
2002-04-28 16:29:56 +00:00
|
|
|
return true
|
|
|
|
|
else
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def group_is_singlepart(subj)
|
2002-05-01 22:16:01 +00:00
|
|
|
@groups[subj]["total"].to_i == 1
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def group_is_multipart(subj)
|
2002-05-01 22:16:01 +00:00
|
|
|
@groups[subj]["total"].to_i > 1
|
|
|
|
|
end
|
|
|
|
|
|
2002-04-28 22:06:03 +00:00
|
|
|
def get_messids
|
|
|
|
|
return @messids
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def get_subjects
|
|
|
|
|
return @subjects
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def group_subjects
|
2002-04-28 22:06:03 +00:00
|
|
|
@groups = {}
|
2002-05-05 20:07:03 +00:00
|
|
|
for i in (0...@subjects.length)
|
2003-07-13 09:52:53 +00:00
|
|
|
print "group subjects: #{i} #{@subjects[i]}\n" if Debuglevel > 3
|
2002-04-28 16:29:56 +00:00
|
|
|
if @subjects[i] =~ /(.*)\((\d+)\/(\d+)\)(.*)/ || @subjects[i] =~ /(.*)\[(\d+)\/(\d+)\](.*)/
|
2002-08-01 09:22:29 +00:00
|
|
|
j = "#{$1}#{$4} (#{$3})"
|
2002-04-28 16:29:56 +00:00
|
|
|
number = $2
|
|
|
|
|
total = $3
|
|
|
|
|
else
|
|
|
|
|
j = @subjects[i]
|
|
|
|
|
number = 1
|
|
|
|
|
total = 1
|
|
|
|
|
end
|
2002-08-01 09:22:29 +00:00
|
|
|
if @groups.has_key?(j) and number.to_i != 0
|
|
|
|
|
@groups[j]["messages"].push(@messids[i])
|
|
|
|
|
@groups[j]["ids"].push(@ids[i].to_i)
|
|
|
|
|
@groups[j]["servers"].push(@servers[i])
|
|
|
|
|
@groups[j]["subject"].push(@subjects[i])
|
|
|
|
|
elsif number.to_i != 0
|
2002-05-06 11:46:56 +00:00
|
|
|
@groups[j] = {}
|
|
|
|
|
@groups[j]["total"] = total
|
|
|
|
|
@groups[j]["messages"] = [ @messids[i] ]
|
|
|
|
|
@groups[j]["ids"] = [ @ids[i].to_i ]
|
|
|
|
|
@groups[j]["servers"] = [ @servers[i] ]
|
|
|
|
|
@groups[j]["subject"] = [ @subjects[i] ]
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
@grouped = true
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def set_skip_ids(server, ids)
|
2002-04-28 22:06:03 +00:00
|
|
|
set = Set::IntSpan.new(ids)
|
|
|
|
|
set.finite or return false
|
|
|
|
|
min = set.min
|
|
|
|
|
min != nil and min < 0 and return false
|
2002-05-05 20:07:03 +00:00
|
|
|
@connections[server]["skip_ids"] = set
|
2002-04-28 22:06:03 +00:00
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def group_update_newsrc(subject)
|
2003-07-13 09:52:53 +00:00
|
|
|
print "running group_update_newsrc\n";
|
2002-05-05 20:07:03 +00:00
|
|
|
for i in (0...@groups[subject]["messages"].length)
|
2003-07-13 09:52:53 +00:00
|
|
|
if @connections[@groups[subject]["servers"][i]]
|
|
|
|
|
@connections[@groups[subject]["servers"][i]]["newsrc"].mark(@group, @groups[subject]["ids"][i])
|
|
|
|
|
end
|
2002-05-05 20:07:03 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def save_newsrc()
|
|
|
|
|
for server in @connections.keys
|
|
|
|
|
@connections[server]["newsrc"].save
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2003-07-03 14:03:11 +00:00
|
|
|
def check_cache(cachedir)
|
|
|
|
|
if ! FileTest.exists?(cachedir)
|
|
|
|
|
print "Cachedir '#{cachedir}' doesn't exists, performance will suffer\n"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-05 20:07:03 +00:00
|
|
|
def read_cache(cachedir)
|
|
|
|
|
filename = "#{cachedir}/#{@group}.ripnewscache"
|
2002-04-30 14:09:06 +00:00
|
|
|
excludes = {}
|
2002-05-05 20:07:03 +00:00
|
|
|
for server in @connections.keys
|
|
|
|
|
excludes[server] = {}
|
|
|
|
|
@connections[server]["skip_ids"].elements.collect!{|x| excludes[server][x]=true}
|
2003-07-14 22:12:18 +00:00
|
|
|
if FileTest.directory?( cachedir) and FileTest.file?( "#{filename}.#{server}" ) and FileTest.readable?( "#{filename}.#{server}" )
|
|
|
|
|
file = File.new( "#{filename}.#{server}" )
|
|
|
|
|
lines = file.readlines
|
|
|
|
|
lines.collect{|line|
|
|
|
|
|
# id | messageid | subject
|
|
|
|
|
if line =~ /^(\d+)\|(.*?)\|(.*)$/
|
|
|
|
|
unless excludes.has_key?(server) and excludes[server].has_key?($1.to_i) or
|
|
|
|
|
$1.to_i < @connections[server]["first"].to_i or
|
|
|
|
|
$1.to_i > @connections[server]["last"].to_i
|
|
|
|
|
add($2, $1, server, $3)
|
|
|
|
|
@connections[server]["skip_ids"].insert($1.to_i)
|
2002-05-05 22:18:44 +00:00
|
|
|
end
|
2002-04-30 14:09:06 +00:00
|
|
|
end
|
2003-07-14 22:12:18 +00:00
|
|
|
}
|
|
|
|
|
file.close
|
|
|
|
|
end
|
2002-04-29 21:44:36 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2003-07-14 22:12:18 +00:00
|
|
|
def save_cache(cachedir, server)
|
2002-05-05 20:07:03 +00:00
|
|
|
filename = "#{cachedir}/#{@group}.ripnewscache"
|
2002-04-30 14:09:06 +00:00
|
|
|
if FileTest.directory?( cachedir )
|
2003-07-14 22:12:18 +00:00
|
|
|
file = File.new( "#{filename}.#{server}.new", "w" ) or print "couldn't open cachefile for writing\n"
|
|
|
|
|
print "Updating cache...\n"
|
|
|
|
|
# cache = []
|
|
|
|
|
# for i in (0...@subjects.length)
|
|
|
|
|
# cache.push("#{@ids[i]}|#{@messids[i]}|#{@servers[i]}|#{@subjects[i]}\n")
|
|
|
|
|
# end
|
|
|
|
|
# cache.sort!
|
|
|
|
|
# file.print cache
|
2002-04-29 21:44:36 +00:00
|
|
|
for i in (0...@subjects.length)
|
2003-07-14 22:12:18 +00:00
|
|
|
if @servers[i] == server
|
|
|
|
|
file.print "#{@ids[i]}|#{@messids[i]}|#{@subjects[i]}\n"
|
|
|
|
|
end
|
2002-04-29 21:44:36 +00:00
|
|
|
end
|
2002-05-07 07:45:00 +00:00
|
|
|
file.close
|
2003-07-14 22:12:18 +00:00
|
|
|
if ( File.move("#{filename}.#{server}.new", "#{filename}.#{server}") )
|
|
|
|
|
print "Cache updated for #{server}\n"
|
2003-07-13 09:52:53 +00:00
|
|
|
else
|
2003-07-14 22:12:18 +00:00
|
|
|
print "Couldn't update #{server} cache\n"
|
2003-07-13 09:52:53 +00:00
|
|
|
end
|
2002-04-29 21:44:36 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2002-04-28 16:29:56 +00:00
|
|
|
###############################################################
|
|
|
|
|
|
2003-07-14 22:12:18 +00:00
|
|
|
# a base64 decoder...
|
2002-08-04 21:30:11 +00:00
|
|
|
def decode64(str)
|
|
|
|
|
string = ''
|
|
|
|
|
for line in str.split("\n")
|
|
|
|
|
line.delete!('^A-Za-z0-9+') # remove non-base64 chars
|
|
|
|
|
line.tr!('A-Za-z0-9+', ' -_') # convert to uuencoded format
|
|
|
|
|
len = ["#{32 + line.length * 3 / 4}"].pack("c")
|
|
|
|
|
# compute length byte
|
|
|
|
|
string += "#{len}#{line}".unpack("u") # uudecode and concatenate
|
|
|
|
|
end
|
|
|
|
|
return string
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
###############################################################
|
|
|
|
|
|
2002-05-06 11:46:56 +00:00
|
|
|
def group_subject_sort(subj)
|
2002-05-07 22:07:17 +00:00
|
|
|
#print "Sorting articles\n"
|
2002-05-07 20:31:05 +00:00
|
|
|
serverhash = {}
|
|
|
|
|
for i in (0...@serverlist.length)
|
|
|
|
|
serverhash[@serverlist[i]] = i
|
|
|
|
|
end
|
2002-05-06 11:46:56 +00:00
|
|
|
sort_arr = []
|
|
|
|
|
for i in (0...@groups[subj]["subject"].length)
|
|
|
|
|
print "subj sort #{@groups[subj]["subject"][i]}\n" if Debuglevel > 2
|
|
|
|
|
print "subj sort #{@groups[subj]["messages"][i]}\n" if Debuglevel > 2
|
|
|
|
|
print "subj sort #{@groups[subj]["ids"][i]}\n" if Debuglevel > 2
|
|
|
|
|
print "subj sort #{@groups[subj]["servers"][i]}\n" if Debuglevel > 2
|
2002-08-01 09:22:29 +00:00
|
|
|
sort_arr.push( [
|
2002-05-07 22:07:17 +00:00
|
|
|
@groups[subj]["subject"][i].dup,
|
|
|
|
|
@groups[subj]["messages"][i].dup,
|
|
|
|
|
@groups[subj]["ids"][i].dup,
|
|
|
|
|
@groups[subj]["servers"][i].dup
|
2002-08-01 09:22:29 +00:00
|
|
|
] )
|
2002-05-07 20:31:05 +00:00
|
|
|
end
|
|
|
|
|
sort_arr.sort!{|a,b|
|
|
|
|
|
r = ward_sort(a[0], b[0])
|
2003-07-13 09:52:53 +00:00
|
|
|
if serverhash[a[3]] == nil or serverhash[b[3]] == nil
|
|
|
|
|
print "serverhash[a[3]]: #{serverhash[a[3]]}\n"
|
|
|
|
|
print "serverhash[b[3]]: #{serverhash[b[3]]}\n"
|
|
|
|
|
print "a[3]: #{a[3]}\n"
|
|
|
|
|
print "b[3]: #{a[3]}\n"
|
|
|
|
|
print "strange things going on here...\n"
|
|
|
|
|
end
|
2002-05-07 22:07:17 +00:00
|
|
|
if r == 0
|
|
|
|
|
r = serverhash[a[3]] <=> serverhash[b[3]]
|
|
|
|
|
end
|
|
|
|
|
r
|
2002-05-07 20:31:05 +00:00
|
|
|
}
|
2002-05-06 11:46:56 +00:00
|
|
|
@groups[subj].clear
|
|
|
|
|
sort_arr.collect{|i|
|
|
|
|
|
if @groups[subj].has_key?("messages")
|
2002-08-01 09:22:29 +00:00
|
|
|
@groups[subj]["subject"].push(i[0])
|
|
|
|
|
@groups[subj]["messages"].push(i[1])
|
|
|
|
|
@groups[subj]["ids"].push(i[2])
|
|
|
|
|
@groups[subj]["servers"].push(i[3])
|
2002-05-06 11:46:56 +00:00
|
|
|
else
|
2002-05-07 20:31:05 +00:00
|
|
|
@groups[subj]["subject"] = [i[0]]
|
|
|
|
|
@groups[subj]["messages"] = [i[1]]
|
|
|
|
|
@groups[subj]["ids"] = [i[2]]
|
|
|
|
|
@groups[subj]["servers"] = [i[3]]
|
2002-05-06 11:46:56 +00:00
|
|
|
end
|
2002-05-07 20:31:05 +00:00
|
|
|
print "subject sort: #{i[0]}\n" if Debuglevel > 2
|
|
|
|
|
print "server: #{i[3]}\n" if Debuglevel > 2
|
2002-05-06 11:46:56 +00:00
|
|
|
}
|
2002-05-07 22:07:17 +00:00
|
|
|
#print "Done sorting\n"
|
2002-05-06 11:46:56 +00:00
|
|
|
end
|
|
|
|
|
|
2002-04-28 16:29:56 +00:00
|
|
|
def ward_sort(a, b)
|
2002-05-07 20:31:05 +00:00
|
|
|
c = a.to_s.split(/([0-9]+)/)
|
|
|
|
|
d = b.to_s.split(/([0-9]+)/)
|
2002-04-28 16:29:56 +00:00
|
|
|
|
2002-05-07 22:07:17 +00:00
|
|
|
c.collect{|x|
|
2002-04-28 16:29:56 +00:00
|
|
|
y = d.shift
|
|
|
|
|
r = ((x.to_s =~ /^[0-9]+$/) && (y.to_s =~ /^[0-9]+$/)) ?
|
|
|
|
|
(x.to_i <=> y.to_i) :
|
|
|
|
|
(x.to_s <=> y.to_s)
|
|
|
|
|
if r != 0
|
|
|
|
|
return r
|
|
|
|
|
end
|
2002-05-07 22:07:17 +00:00
|
|
|
}
|
|
|
|
|
return -1 if (d != [])
|
2002-04-28 16:29:56 +00:00
|
|
|
return 0
|
|
|
|
|
end
|
|
|
|
|
|
2002-05-07 11:48:18 +00:00
|
|
|
def rechunk_runlist(runlist)
|
2002-05-07 13:46:17 +00:00
|
|
|
return nil if runlist == nil
|
2003-07-13 10:38:53 +00:00
|
|
|
chunksize = 1000
|
2002-05-07 11:48:18 +00:00
|
|
|
blalist = runlist.split(',')
|
2003-07-13 09:52:53 +00:00
|
|
|
|
|
|
|
|
# hmmm, als het aantal articles wat tussen de komma's ligt < pak um beet 3
|
|
|
|
|
# dan is het volgens mij heel erg de moeite die 3 ook gewoon binnen te halen
|
|
|
|
|
# en minder network requests te doen...
|
|
|
|
|
# de manier om dat te doen is dan iets van die komma weghalen en
|
|
|
|
|
# een van de 2 getallen...
|
|
|
|
|
|
2002-05-07 11:48:18 +00:00
|
|
|
blalist.collect!{|x|
|
2002-05-08 10:57:05 +00:00
|
|
|
result = ""
|
|
|
|
|
if x =~ /(.*)-(.*)/
|
|
|
|
|
a = $1
|
2003-07-13 09:52:53 +00:00
|
|
|
while ($2.to_i - a.to_i) > chunksize
|
|
|
|
|
result << "#{a}-#{a.to_i+(chunksize-1)},"
|
|
|
|
|
a = a.to_i + chunksize
|
2002-05-08 10:57:05 +00:00
|
|
|
end
|
2002-08-01 11:50:09 +00:00
|
|
|
result << "#{a}-#{$2}"
|
2002-05-08 10:57:05 +00:00
|
|
|
else
|
|
|
|
|
x
|
2002-05-07 11:48:18 +00:00
|
|
|
end
|
2002-05-08 10:57:05 +00:00
|
|
|
}
|
2003-07-13 09:52:53 +00:00
|
|
|
blup = blalist.join(",")
|
|
|
|
|
return blup
|
2002-05-07 11:48:18 +00:00
|
|
|
end
|
|
|
|
|
|
2002-04-28 16:29:56 +00:00
|
|
|
def quit
|
2002-05-05 20:07:03 +00:00
|
|
|
for server in @connections.keys
|
2002-07-04 14:48:01 +00:00
|
|
|
begin
|
2002-05-05 20:07:03 +00:00
|
|
|
@connections[server]["nntp"].quit
|
2003-07-06 08:14:05 +00:00
|
|
|
rescue Errno::EPIPE, Errno::ECONNRESET, EOFError
|
2002-07-04 14:48:01 +00:00
|
|
|
end
|
2002-05-05 20:07:03 +00:00
|
|
|
end
|
2002-04-28 16:29:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private :ward_sort
|
|
|
|
|
|
|
|
|
|
end # class
|