# HG changeset patch # User HIROSE Yuuji # Date 1339978619 -32400 # Node ID 05de5274c110b2d9d21cfca4c4ad8245cd2073f4 # Parent d65174b867aaeb2a26f6b1019e362f98b44c8e6b Another ml-address can be set. Refine header operation. diff -r d65174b867aa -r 05de5274c110 after5.rb --- 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 [yuujigentei.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' => ['パスワード
(初回時は空欄)', 'Passowrd
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 - } - } + "
\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')) + "
\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(' ', n+=1, + curtag==@subjtags[n][1] ? ' selected' : "", + x[0]) + }.join("\n") + "Subject tag: " + \ + <<-_EOF_ + + _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] -> %s", + putLog(sprintf("group: %s[fromhack] -> %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] <%s> -> <%s>", + 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"