changeset 48:05de5274c110 draft

Another ml-address can be set. Refine header operation.
author HIROSE Yuuji <yuuji@gentei.org>
date Mon, 18 Jun 2012 09:16:59 +0900
parents d65174b867aa
children 42f196a6c6c0
files after5.rb
diffstat 1 files changed, 182 insertions(+), 93 deletions(-) [+]
line wrap: on
line diff
--- a/after5.rb	Mon Jun 11 23:47:45 2012 +0900
+++ b/after5.rb	Mon Jun 18 09:16:59 2012 +0900
@@ -4,7 +4,7 @@
 # Associative Scheduling Table - after5
 # (C)2003, 2004, 2006, 2008, 2012 by HIROSE Yuuji [yuuji<at>gentei.org]
 # $Id: after5.rb,v 1.19 2012/04/01 11:52:25 yuuji Exp yuuji $
-# Last modified Mon Jun 11 23:37:31 2012 on firestorm
+# Last modified Mon Jun 18 09:15:28 2012 on firestorm
 # See http://www.gentei.org/~yuuji/software/after5/
 # このスクリプトはEUCで保存してください。
 $hgid = <<_HGID_.split[1..-2].join(" ")
@@ -1123,6 +1123,14 @@
       ['nt7d',	"7"+msg('days', 'before')],
       ['nt30d',	"30"+msg('days', 'before')],
     ]
+    @subjtags = [['[GroupID:#]', "[%i:%c]"],
+                 ['[GroupID:#####]', "[%i:%5c]"],
+                 ['[GroupName:#]', "[%n:%c]"],
+                 ['[GroupName:#####]', "[%n:%5c]"],
+                 ['(GroupID:#)', "(%i:%c)"],
+                 ['(GroupID:#####)', "(%i:%5c)"],
+                 ['(GroupName:#)', "(%n:%c)"],
+                 ['(GroupName:#####)', "(%n:%5c)"]]
     ##@job = "today"
     @wnames = %w[sun mon tue wed thu fri sat]
     @job = "login"
@@ -1185,7 +1193,7 @@
 	'loginfirst'	=> ['最初にログインすべし', 'Login first'],
 	'autherror'	=> ['認証エラーがあったと管理者に伝えてくれっす',
 	  'Unexpected authentication error. Please tell this to the administrator'],
-	'yourmail'	=> ['あなたのメイルアドレス', 'Your email address'],
+	 'yourmail'	=> ['あなたのメイルアドレス', 'Your email address'],
 	'passwd'	=> ['パスワード<br>(初回時は空欄)',
 	  'Passowrd<br>Left blank, first time'],
 	'error'		=> ['エラー:', 'Error: '],
@@ -1270,15 +1278,21 @@
 	  'it is mischief by someone else'],
 	'user'		=> ['ユーザ', 'user'],
 	'group'		=> ['グループ', 'group'],
-        'fromhack'	=> ['ML配送時のFrom:を常にMLのアドレスにする',
-'Set From: address of all ML messages to ML address.'],
+        'mladdress'	=> ['公開MLアドレス(%s以外にしたい場合設定する)',
+"Public ML address(if you set to diffrent address than `%s')"],
+        'fromhack'	=> ['ML配送時のFrom:を常にMLのアドレスにする
+(From:にしか返さないケータイ参加者が多いときにオススメ)',
+'Set From: address of all ML messages to ML address, which is convenient
+to keep responses from cellular phones surely to ML address.  Most cellular
+phones tend to return only from: address.'],
 	'personal'	=> ['個人で', 'personal'],
 	'registas'	=> ['グループ予定として登録?', 'Register as group?'],
         'headsched'	=> ['下の枠内に予定を記入: 1行以内で短めに。
 長くなるときは2行目以降に詳細を。',
 'Put shortest sentence as possible within 1 line.
 Or, put short subject in the first line, details in latter lines.'],
-	'joinquit'	=> ['入退', 'joining/quiting'],
+	'joinquit'	=> ['入退会', 'joining/quiting'],
+        'operation'	=> ['操作', 'operation'],
 	'of'		=> ['の', "'s"],
 	'id'		=> ['ID(英単語かローマ字の分かりやすい1単語半角空白なしで)', 'ID(without spaces)'],
 	'name'		=> ['名前', 'name'],
@@ -1332,6 +1346,7 @@
 	  'This is the final decision.  Make sure and sure.'],
 	'joinmyself'	=> ['自分自身が既存のグループに対して入る(IN)か出る(OUT)かを決めるのがここ。自分管理のグループに誰かを足すなら「管理操作」、新たにグループを作るなら',
 	  'In this page, you can decide put yourself IN or OUT of the existing groups.  If you want to manage the member of your own group, go to'],
+        'aboutgroup'	=> ['グループ %s の操作', "Operations on group `%s'"],
 	'groupwarn'	=> ['自分が参加してないグループAに、自分が参加しているグループBが含まれている場合、グループAにも加入していると見なされるので気をつけよう。管理者はグループのニックネームを変えられるよ。',
 	  'Though you are not member of group A, you are treated as a member of A, if you join to the group B, which is a member of A.  Think the nesting of groups carefully, please.  Group administrator can change the group nickname.'],
 	'wholemembers'	=> ['グループ内グループを考慮した上で、現在グループ %s への通知は以下のメンバーに送られる。',
@@ -1426,10 +1441,11 @@
     sprintf "%s=%s; expires=%s", name, encode(str), ex
   end
 
-  def login()
+  def login(altaction = nil)
     @O.print @H.elementln("h1", nil){msg('title')}
     @O.print @H.elementln("h2", nil){msg('login')}
-    format = {'method'=>'POST', 'action'=>@myname+"?-today"}
+    format = {'method'=>'POST',
+      'action'=> @myname+"?" +(altaction || "-today")}
     @O.print @H.elementln("form", format){
       @H.elementln("table", nil){
 	@H.elementln("tr", nil){
@@ -1475,7 +1491,8 @@
     end
     auth = catch(:auth) {
       unless @params['user']
-	outputError(@H.a(@myname, msg('loginfirst')))
+	#outputError(@H.a(@myname, msg('loginfirst')))
+        login(@oldargv.join('+'))
 	throw :auth, nil 
       end
       unless pm=open_pm()
@@ -1632,6 +1649,7 @@
           m.puts "Mime-Version: 1.0
 Content-Transfer-Encoding: 7bit
 Content-Type: Text/Plain; charset=iso-2022-jp"
+          m.puts "Date: #{Time.now.strftime("%a, %d %Y %T %z")}"
           m.print "\n"
         end
 	m.print body, "\n"
@@ -2655,31 +2673,31 @@
       when /^$/
         hold << "\n"
         break
-      when /^(subject|from): /i
-        skip = $1.downcase
+      ## when /^(subject|from): /i
+      when /^(\S+): /i             # if new header comes
+        if /^subject:/i =~ hold[0] # check previous header in hold space
+          sj = hold.join.toeuc.sub("Subject: ", "").gsub(tag, "").strip
+          sj.gsub!(removeregexp, "")
+          sj = sj.sub(/^(re: *)+/i, "Re: ").gsub("\n", "")
+          hold = ["Subject: "+NKF.nkf('-jM', tag+" "+sj).strip+"\n"]
+        elsif /^from/i =~ hold[0] && fromhack.is_a?(String)
+          from = hold.join.toeuc.sub(/From: */i, "").strip
+          email, comment = parseaddress(from)
+          hold = ["From: "+rewritefrom(email, comment, fromhack)+"\n"]
+        end
         ret += hold
         hold = [line]
       when /^\s/                # continued line
         hold << line
-      else
-        if skip=="subject"
-          sj = hold.join.toeuc.sub("Subject: ", "").gsub(tag, "").strip
-          sj.gsub!(removeregexp, "")
-          sj = sj.sub(/^(re: *)+/i, "Re: ").gsub("\n", "")
-          ret << "Subject: "+NKF.nkf('-jM', tag+" "+sj).strip+"\n"
-        elsif skip=="from" && fromhack.is_a?(String)
-          from = hold.join.toeuc.sub(/From: */i, "").strip
-          email, comment = parseaddress(from)
-          ret << "From: "+rewritefrom(email, comment, fromhack)+"\n"
-        else
-          ret += hold
-        end
-        skip = false
-        hold = [line]
       end
     end
     ret + hold + body
   end
+  def defaultmladdress(name)
+    prefix = (@opt['mailprefix'] || "")
+    dash = prefix > '' ? "-" : ""
+    sprintf("%s%s%s@%s", prefix, dash, name, @opt['maildomain'])
+  end
   def list()
     # For debug:
     #  LOCAL=1 DEFAULT=name ./after5.rb -list
@@ -2705,16 +2723,15 @@
       from = sprintf("%s <%s>", nick, @params['user'])
       body = @params['body'].gsub("\r", "").untaint
     end
+    bracket = @sc.getgroupattr(name, 'subjtag') || @params['mailbracket']
     fromhack = @sc.getgroupattr(name, 'fromhack')
     mldir = "ml/"+name
-    prefix = (@opt['mailprefix'] || "")
-    dash = prefix > '' ? "-" : ""
-    to = sprintf("%s%s%s@%s", prefix, dash, name, @opt['maildomain'])
+    to = @sc.getgroupattr(name, 'mladdress') || defaultmladdress(name)
     subj = @params['subject'] || "Message from "+@myname
-    sjtag = @opt['mailbracket'].gsub("%n", nickname(name)).
+    sjtag = bracket.gsub("%n", nickname(name)).
       gsub("%i", name).
       gsub(/%(\d*)c/){("%0"+$1+"d") % [mlseq(mldir)]}
-    tagpt = Regexp.quote(@opt['mailbracket']). # compute bracket pattern
+    tagpt = Regexp.quote(bracket). # compute bracket pattern
       gsub("%n", Regexp.quote(nickname(name))).
       gsub("%i", Regexp.quote(name)).
       gsub(/%(\d*)c/, '\d+')
@@ -2731,6 +2748,7 @@
       "X-ML-Driver" => ($hgid || @myname),
       "X-ML-Driver-URI" => $myurl,
       "X-ML-Name" => name,
+      "X-ML-URI" => sprintf("%s?-groupman+%s", @opt['url'], name),
       "Errors-to" => @opt['maintainer'],
       "Return-path" => @opt['maintainer']}
     Dir.chdir @mydir
@@ -2944,7 +2962,7 @@
   end
   #
   # Display form of group management
-  def groupman()
+  def groupman(grp = nil)
     if !checkauth
       return nil
     end
@@ -2959,6 +2977,12 @@
       @mybase+' '+msg('group', 'management')
     }
     $KCODE='e' if $DEBUG
+    if grp && group = grepgroup(grp)
+      @O.print @H.elementln("h2"){
+        sprintf(msg('aboutgroup'), group)
+      }
+      grmap = {group => grmap[group]}
+    end
     @O.print grmap.inspect if $DEBUG
     @O.print @H.p(msg('joinmyself')+
 		  @H.a(@myname+"?-newgroup", msg('newgroup')))
@@ -3126,6 +3150,7 @@
     userlist = ([user] + users()).uniq.sort
     myselfclass = {'class'=>'admin'}
     colspan2 = {'colspan'=>'2'}
+    colspan3 = {'colspan'=>'3'}
     warnclass = {'class'=>'warn'}
     warnp = nil
 
@@ -3148,67 +3173,98 @@
 	}
       end + \
       @H.elementln("div", {'class'=>'memlist'}){
-       @H.elementln("table", {'border'=>'1'}){
-	@H.elementln("tr"){
-	  @H.element("th"){msg('join')} + \
-	  @H.element("th"){msg('administrator')} + \
-	  @H.element("th"){msg('member')}
-	} + \
-	userlist.collect{|u|
-	  recursememp = nil
-	  if group
-	    memberp = (@sc.ismember(u, group) && true)
-	    adminp = (@sc.isadmin(u, group) && true)
-	    if !memberp && @sc.members(group).grep(u)[0]
-	      recursememp = true
-	    end
-	  else
-	    memberp = adminp = (u == user)
-	  end
-	  @H.elementln("tr", (u==user ? myselfclass : nil)){
-	    @H.element("td"){
-	      @H.radio('mem-'+u, 'yes', 'YES / ', memberp) + \
-	      @H.radio('mem-'+u, 'no', 'NO', !memberp)
-	    } + \
-	    @H.element("td"){
-	      @H.radio('adm-'+u, 'yes', 'YES / ', adminp) + \
-	      @H.radio('adm-'+u, 'no', 'NO', !adminp)
-	    } + \
-	    @H.element("td"){
-	      @sc.nickname(u) + \
-	      if recursememp
-		warnp = true
-		@H.element("span", warnclass){"(*)"}
-	      end.to_s
-	    }
-	  }
-	}.join + \
-	# group names
-	@H.elementln("tr"){
-	  @H.element("th", colspan2){msg('join')} + \
-	  @H.element("th"){msg('group')}
-	} + \
-	@sc.groups().sort.collect{|g|
-	  next if group == g
-	  memberp = @sc.ismember(g, group)
-	  @H.element("tr"){
-	    @H.element("td", colspan2){
-	      @H.radio('mem-'+g, 'yes', 'YES / ', memberp) + \
-	      @H.radio('mem-'+g, 'no', 'NO', !memberp)
-	    } + \
-	    @H.element("td"){
-	      if @sc.isadmin(user, g)
-		@H.a(@myname+"?-admgroup+#{g}", @sc.groupname(g))
-	      else
-		@sc.groupname(g)
-	      end
-	    }
-	  }
-	}.join
-       }
-      } + "<br>\n" + \
+        @H.elementln("table", {'border'=>'1'}){
+          @H.elementln("tr") {
+            @H.elementln("th", colspan3) {
+              msg('member', 'of', 'joinquit', 'operation')}
+          } + \
+          @H.elementln("tr"){
+            @H.element("th"){msg('join')} + \
+            @H.element("th"){msg('administrator')} + \
+            @H.element("th"){msg('member')}
+          } + \
+          userlist.collect{|u|
+            recursememp = nil
+            if group
+              memberp = (@sc.ismember(u, group) && true)
+              adminp = (@sc.isadmin(u, group) && true)
+              if !memberp && @sc.members(group).grep(u)[0]
+                recursememp = true
+              end
+            else
+              memberp = adminp = (u == user)
+            end
+            @H.elementln("tr", (u==user ? myselfclass : nil)){
+              @H.element("td"){
+                @H.radio('mem-'+u, 'yes', 'YES / ', memberp) + \
+                @H.radio('mem-'+u, 'no', 'NO', !memberp)
+              } + \
+              @H.element("td"){
+                @H.radio('adm-'+u, 'yes', 'Admin / ', adminp) + \
+                @H.radio('adm-'+u, 'no', 'NO', !adminp)
+              } + \
+              @H.element("td"){
+                @H.element("abbr", "title"=>mailaddress(u)) {
+                  @sc.nickname(u)
+                } + \
+                if recursememp
+                  warnp = true
+                  @H.element("span", warnclass){"(*)"}
+                end.to_s
+              }
+            }
+          }.join + \
+          # group names
+          @H.elementln("tr") {
+            @H.elementln("th", colspan3) {
+              msg('group', 'of', 'joinquit', 'operation')}
+          } + \
+          @H.elementln("tr"){
+            @H.element("th", colspan2){msg('join')} + \
+            @H.element("th"){msg('group')}
+          } + \
+          @sc.groups().sort.collect{|g|
+            next if group == g
+            memberp = @sc.ismember(g, group)
+            @H.element("tr"){
+              @H.element("td", colspan2){
+                @H.radio('mem-'+g, 'yes', 'YES / ', memberp) + \
+                @H.radio('mem-'+g, 'no', 'NO', !memberp)
+              } + \
+              @H.element("td"){
+                if @sc.isadmin(user, g)
+                  @H.a(@myname+"?-admgroup+#{g}", @sc.groupname(g))
+                else
+                  @sc.groupname(g)
+                end
+              }
+            }
+          }.join
+        }
+      } + \
       @H.checkbox("fromhack", "yes", msg('fromhack'),
                   @sc.getgroupattr(group, 'fromhack')) + "<br>\n" + \
+      @H.elementln("p") {
+        sprintf(msg('mladdress'), defaultmladdress(group)) + \
+        @H.text("mladdress", @sc.getgroupattr(group, 'mladdress'),
+                @opt['size'], 80)
+      } + \
+      @H.elementln('p') {
+        n = -1
+        curtag = @sc.getgroupattr(group, 'subjtag')
+        values = @subjtags.collect {|x|
+          sprintf('	 <option value="%d"%s>%s</option>', n+=1,
+                  curtag==@subjtags[n][1] ? ' selected' : "",
+                  x[0])
+        }.join("\n")
+        "Subject tag: " + \
+        <<-_EOF_
+	<select name="subjtag">
+	 <option value="">DEFAULT</option>
+	 #{values}
+	</select>
+	_EOF_
+      } + \
       @H.submit_reset("GO")
     } # form
     @O.print @H.p(@H.element("span", warnclass){"(*)"}+
@@ -3407,14 +3463,43 @@
     # To be more generic...
     fhsetp = (@params['fromhack'] && /^yes/i =~ @params['fromhack'])
     cusetp = (@sc.getgroupattr(group, 'fromhack')!=nil)
-    if  cusetp ^ fhsetp
+    if cusetp ^ fhsetp
       @sc.putgroupattr(group, 'fromhack', @params['fromhack'])
       @O.print @H.elementln("p") {
-        putLog(sprintf("%s[fromhack] -&gt; %s",
+        putLog(sprintf("group: %s[fromhack] -&gt; %s",
                        group, @params['fromhack'].inspect))
       }
       somethingdone = true
     end
+    # mladdress
+    newmladdress = @params['mladdress']
+    newmladdress = nil if newmladdress == ""
+    curmladdress = @sc.getgroupattr(group, 'mladdress')
+    if newmladdress != curmladdress
+      defmladdress = defaultmladdress(group)
+      @sc.putgroupattr(group, 'mladdress', newmladdress)
+      @O.print @H.elementln("p") {
+        putLog(sprintf("group: %s[mladdress] &lt;%s&gt; -> &lt;%s&gt;",
+                       group,
+                       curmladdress || defmladdress,
+                       newmladdress || defmladdress))
+      }
+      somethingdone = true
+    end
+    # Subject tag bracket
+    newtag = @params['subjtag']
+    if newtag == ''
+      newtag = nil 
+    else
+      newtag = @subjtags[newtag.to_i % @subjtags.length][1]
+    end
+    @sc.putgroupattr(group, 'subjtag', newtag)
+    if newtag && newtag > ""
+      @O.print @H.elementln("p") {
+        putLog(sprintf("group: %s[subjtag] set to '%s'", group, newtag))
+      }
+      somethingdone = true
+    end
     unless somethingdone
       # @O.print @H.p(msg('nothingtodo'))
     end
@@ -3700,6 +3785,7 @@
 
   def getarg()
     argument = {}
+    @oldargv = ARGV.dup
 
     while /^-/ =~ ARGV[0]
       case ARGV[0]
@@ -3750,7 +3836,10 @@
       when "-groupsubmit"
 	@job = "groupsubmit"
       when "-groupman"
-	@job = "groupman"
+        ARGV.shift
+        x=ARGV[0]
+        @prc = proc {groupman(x)}
+	@job = "@prc.call"
       when "-groupmod"
 	@job = "groupmod"
       when "-notify"

yatex.org