diff -r 1d3cfd4837a8 -r 7b5a0131d5cd lib/ezmlm/list.rb --- a/lib/ezmlm/list.rb Wed May 07 18:22:04 2008 +0000 +++ b/lib/ezmlm/list.rb Thu May 08 21:12:48 2008 +0000 @@ -25,6 +25,108 @@ ### A Ruby interface to an ezmlm-idx mailing list directory class Ezmlm::List + ### Create a new Ezmlm::List object for the specified +listdir+, which should be + ### an ezmlm-idx mailing list directory. + def initialize( listdir ) + listdir = Pathname.new( listdir ) if !listdir.is_a?( Pathname ) + @listdir = listdir + end + + + ###### + public + ###### + + # The Pathname object for the list directory + attr_reader :listdir + + + ### Return the email address of the list's owner. + def owner + config = self.listdir + 'config' + if config.read =~ /^5:([^\n]+)$/m + return $1 + else + return nil + end + end + + + ### Fetch an Array of the email addresses for all of the list's subscribers. + def subscribers + subscribers_dir = self.listdir + 'subscribers' + return self.read_subscriber_dir( subscribers_dir ) + end + + + ### Returns +true+ if subscription to the list is moderated. + def closed? + return (self.listdir + 'modsub').exist? || (self.listdir + 'remote').exist? + end + + + ### Returns +true+ if posting to the list is moderated. + def moderated? + return (self.listdir + 'modpost').exist? + end + + + ### Returns an Array of email addresses of people responsible for moderating subscription + ### of a closed list. + def subscription_moderators + return [] unless self.closed? + + modsubfile = self.listdir + 'modsub' + remotefile = self.listdir + 'remote' + + subdir = nil + if modsubfile.exist? && modsubfile.read(1) == '/' + subdir = Pathname.new( modsubfile.read.chomp ) + elsif remotefile.exist? && remotefile.read(1) == '/' + subdir = Pathname.new( remotefile.read.chomp ) + else + subdir = self.listdir + 'mod/subscribers' + end + + return self.read_subscriber_dir( subdir ) + end + + + ### Returns an Array of email addresses of people responsible for moderating posts + ### sent to the list. + def message_moderators + return [] unless self.moderated? + + modpostfile = self.listdir + 'modpost' + subdir = nil + + if modpostfile.exist? && modpostfile.read(1) == '/' + subdir = Pathname.new( modpostfile.read.chomp ) + else + subdir = self.listdir + 'mod/subscribers' + end + + return self.read_subscriber_dir( subdir ) + end + + + + ######### + protected + ######### + + ### Read the hashed subscriber email addresses from the specified +directory+ and return them in + ### an Array. + def read_subscriber_dir( directory ) + rval = [] + Pathname.glob( directory + '*' ) do |hashfile| + rval.push( hashfile.read.scan(/T([^\0]+)\0/) ) + end + + return rval.flatten + end + + end # vim: set nosta noet ts=4 sw=4: