better internal structures
This commit is contained in:
parent
9854cf1ab7
commit
2140862d3e
1 changed files with 64 additions and 29 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
# $Id$
|
# $Id$
|
||||||
# $Source$
|
# $Source$
|
||||||
|
|
||||||
|
require 'set/intspan'
|
||||||
require 'net/nntp'
|
require 'net/nntp'
|
||||||
|
|
||||||
class Article
|
class Article
|
||||||
|
|
@ -10,16 +11,19 @@ class Article
|
||||||
Debuglevel = 1
|
Debuglevel = 1
|
||||||
|
|
||||||
def initialize(server)
|
def initialize(server)
|
||||||
|
@messids = []
|
||||||
@ids = []
|
@ids = []
|
||||||
@subjects = []
|
@subjects = []
|
||||||
@sorted = false
|
@sorted = false
|
||||||
@grouped = false
|
@grouped = false
|
||||||
@agroups = {}
|
@groups = {}
|
||||||
@nntp = Net::NNTP.new(server)
|
@nntp = Net::NNTP.new(server)
|
||||||
|
@skip_ids = Set::IntSpan.new()
|
||||||
end
|
end
|
||||||
|
|
||||||
def add(id, subject)
|
def add(messid, id, subject)
|
||||||
@ids += [id]
|
@messids += [messid]
|
||||||
|
@ids += [id.to_i]
|
||||||
@subjects += [subject]
|
@subjects += [subject]
|
||||||
@sorted = false
|
@sorted = false
|
||||||
@grouped = false
|
@grouped = false
|
||||||
|
|
@ -27,48 +31,54 @@ end
|
||||||
|
|
||||||
def get_articles(group)
|
def get_articles(group)
|
||||||
resp, count, first, last,name = @nntp.group(group)
|
resp, count, first, last,name = @nntp.group(group)
|
||||||
for i in (first.to_i..last.to_i)
|
range = Set::IntSpan.new("#{first}-#{last}")
|
||||||
|
# for i in (first.to_i..last.to_i)
|
||||||
|
for i in (range.diff(@skip_ids).elements)
|
||||||
begin
|
begin
|
||||||
@nntp.stat(i)
|
@nntp.stat(i)
|
||||||
resp, nr, messid, list = @nntp.head(i)
|
resp, id, messid, list = @nntp.head(i)
|
||||||
for j in list
|
for j in list
|
||||||
if j =~ /Subject: (.*)/
|
if j =~ /Subject: (.*)/
|
||||||
subj=$1
|
subj=$1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
add(messid, subj)
|
print "get_articles messid: #{messid}\n" if Debuglevel > 1
|
||||||
|
print "get_articles id: #{id}\n" if Debuglevel > 1
|
||||||
|
print "get_articles subject: #{subj}\n" if Debuglevel > 1
|
||||||
|
add(messid, id, subj)
|
||||||
rescue Net::NNTP::RuntimeError
|
rescue Net::NNTP::RuntimeError
|
||||||
print "whoopsie couldn't stat #{i}\n" if Debuglevel > 0
|
print "whoopsie couldn't stat #{i}\n" if Debuglevel > 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_groups
|
def get_groups
|
||||||
group_subjects unless @grouped
|
group_subjects unless @grouped
|
||||||
return @agroups
|
return @groups
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_group_body(subj)
|
def get_group_body(subj)
|
||||||
result = []
|
result = []
|
||||||
for i in @agroups[subj][1..@agroups[subj].length]
|
for i in @groups[subj]["messages"][1..@groups[subj]["messages"].length]
|
||||||
resp, nr, id, list = @nntp.body(i)
|
resp, id, messid, list = @nntp.body(i)
|
||||||
result = list
|
result = list
|
||||||
end
|
end
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_group_body_first(subj)
|
def get_group_body_first(subj)
|
||||||
resp, nr, id, list = @nntp.body(@agroups[subj][1])
|
resp, id, messid, list = @nntp.body(@groups[subj]["messages"][0])
|
||||||
print "getting article: #{subj}\n" if Debuglevel > 0
|
print "getting article: #{subj}\n" if Debuglevel > 0
|
||||||
print "article id: #{id}\n" if Debuglevel > 0
|
print "message id: #{messid}\n" if Debuglevel > 0
|
||||||
|
print "id: #{id}\n" if Debuglevel > 0
|
||||||
return list
|
return list
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_group_body_rest(subj, file=nil)
|
def get_group_body_rest(subj, file=nil)
|
||||||
result = []
|
result = []
|
||||||
for i in @agroups[subj][2..@agroups[subj].length]
|
for i in @groups[subj]["messages"][1..@groups[subj]["messages"].length]
|
||||||
print "getting article: #{i}\n" if Debuglevel > 0
|
print "getting article: #{i}\n" if Debuglevel > 0
|
||||||
resp, nr, id, list = @nntp.body(i)
|
resp, id, messid, list = @nntp.body(i)
|
||||||
if file
|
if file
|
||||||
for line in list
|
for line in list
|
||||||
file.print "#{line}\n"
|
file.print "#{line}\n"
|
||||||
|
|
@ -82,21 +92,26 @@ end
|
||||||
|
|
||||||
def get_group_subjects
|
def get_group_subjects
|
||||||
group_subjects unless @grouped
|
group_subjects unless @grouped
|
||||||
return @agroups.keys
|
return @groups.keys
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_group_ids(subject)
|
||||||
|
group_subjects unless @grouped
|
||||||
|
return @groups[subject]["ids"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def group_complete(subj)
|
def group_complete(subj)
|
||||||
group_subjects unless @grouped
|
group_subjects unless @grouped
|
||||||
print "length: #{@agroups[subj].length} total: #{@agroups[subj][0].to_i}\n" if Debuglevel > 0
|
print "length: #{@groups[subj]["messages"].length} total: #{@groups[subj]["total"].to_i}\n" if Debuglevel > 1
|
||||||
if (@agroups[subj].length - 1 ) >= @agroups[subj][0].to_i
|
if (@groups[subj]["messages"].length ) >= @groups[subj]["total"].to_i
|
||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_ids
|
def get_messids
|
||||||
return @ids
|
return @messids
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_subjects
|
def get_subjects
|
||||||
|
|
@ -104,10 +119,11 @@ def get_subjects
|
||||||
end
|
end
|
||||||
|
|
||||||
def group_subjects
|
def group_subjects
|
||||||
@agroups = {}
|
@groups = {}
|
||||||
subject_sort unless @sorted
|
subject_sort unless @sorted
|
||||||
prev_subj = ""
|
prev_subj = ""
|
||||||
for i in (0..@subjects.length)
|
for i in (0..@subjects.length)
|
||||||
|
print "group subjects: #{i} #{@subjects[i]}\n" if Debuglevel > 1
|
||||||
if @subjects[i] =~ /(.*)\((\d+)\/(\d+)\)(.*)/ || @subjects[i] =~ /(.*)\[(\d+)\/(\d+)\](.*)/
|
if @subjects[i] =~ /(.*)\((\d+)\/(\d+)\)(.*)/ || @subjects[i] =~ /(.*)\[(\d+)\/(\d+)\](.*)/
|
||||||
j = "#{$1}#{$4}"
|
j = "#{$1}#{$4}"
|
||||||
number = $2
|
number = $2
|
||||||
|
|
@ -117,18 +133,31 @@ def group_subjects
|
||||||
number = 1
|
number = 1
|
||||||
total = 1
|
total = 1
|
||||||
end
|
end
|
||||||
if j == prev_subj
|
if j == prev_subj and number.to_i !=0
|
||||||
@agroups[j] += [ @ids[i] ]
|
@groups[j]["messages"] += [ @messids[i] ]
|
||||||
|
@groups[j]["ids"] += [ @ids[i].to_i ]
|
||||||
else
|
else
|
||||||
unless number == 0
|
unless number.to_i == 0
|
||||||
prev_subj = j
|
prev_subj = j
|
||||||
@agroups[j] = [ total, @ids[i] ]
|
@groups[j] = {}
|
||||||
|
@groups[j]["total"] = total
|
||||||
|
@groups[j]["messages"] = [ @messids[i] ]
|
||||||
|
@groups[j]["ids"] = [ @ids[i].to_i ]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@grouped = true
|
@grouped = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_skip_ids(ids)
|
||||||
|
set = Set::IntSpan.new(ids)
|
||||||
|
set.finite or return false
|
||||||
|
min = set.min
|
||||||
|
min != nil and min < 0 and return false
|
||||||
|
@skip_ids = set
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
def uudecode(data, outfile=nil)
|
def uudecode(data, outfile=nil)
|
||||||
case data.type.to_s
|
case data.type.to_s
|
||||||
when "Array"
|
when "Array"
|
||||||
|
|
@ -292,23 +321,29 @@ end
|
||||||
def subject_sort
|
def subject_sort
|
||||||
sort_arr = []
|
sort_arr = []
|
||||||
for i in (0..@subjects.length)
|
for i in (0..@subjects.length)
|
||||||
sort_arr += ["#{@subjects[i]} #{@ids[i]}"]
|
print "subj sort #{@subjects[i]}\n" if Debuglevel >2
|
||||||
|
print "subj sort #{@messids[i]}\n" if Debuglevel >2
|
||||||
|
print "subj sort #{@ids[i]}\n" if Debuglevel >2
|
||||||
|
sort_arr += ["#{@subjects[i]} #{@messids[i]} #{@ids[i]}"]
|
||||||
end
|
end
|
||||||
sort_arr.sort!{|a,b| ward_sort(a, b)}
|
sort_arr.sort!{|a,b| ward_sort(a, b)}
|
||||||
|
@messids = []
|
||||||
@ids = []
|
@ids = []
|
||||||
@subjects = []
|
@subjects = []
|
||||||
for i in sort_arr
|
for i in sort_arr
|
||||||
i =~ /^(.*) (<[^<]*>)$/ || i =~ /^(.*) \[<[^<]*>\]$/
|
i =~ /^(.*) (<[^<]*>) (\d+)$/ || i =~ /^(.*) \[<[^<]*>\] (\d+)$/
|
||||||
@ids += [$2]
|
@messids += [$2]
|
||||||
|
@ids += [$3]
|
||||||
@subjects += [$1]
|
@subjects += [$1]
|
||||||
|
print "subject sort: #{$1}\n" if Debuglevel >2
|
||||||
end
|
end
|
||||||
@sorted = true
|
@sorted = true
|
||||||
end
|
end
|
||||||
|
|
||||||
def ward_sort(a, b)
|
def ward_sort(a, b)
|
||||||
a =~ /^(.*) (<[^<]*>)$/
|
a =~ /^(.*) (<[^<]*> \d+)$/
|
||||||
c = $1.to_s.split(/([0-9]+)/)
|
c = $1.to_s.split(/([0-9]+)/)
|
||||||
b =~ /^(.*) (<[^<]*>)$/
|
b =~ /^(.*) (<[^<]*> \d+)$/
|
||||||
d = $1.to_s.split(/([0-9]+)/)
|
d = $1.to_s.split(/([0-9]+)/)
|
||||||
|
|
||||||
for x in c
|
for x in c
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue