def initialize message, type_arg=nil
@m = message
body = reply_body_lines message
hook_reply_from = HookManager.run "reply-from", :message => @m
if hook_reply_from && !(hook_reply_from.is_a? Person)
info "reply-from returned non-Person, using default from."
hook_reply_from = nil
end
from = if hook_reply_from
hook_reply_from
elsif @m.recipient_email && (a = AccountManager.account_for(@m.recipient_email))
Person.new a.name, @m.recipient_email
elsif(b = (@m.to + @m.cc).find { |p| AccountManager.is_account? p })
b
else
AccountManager.default_account
end
to = @m.is_list_message? ? @m.from : (@m.replyto || @m.from)
cc = (@m.to + @m.cc - [from, to]).uniq
useful_recipient = !(cc.empty? || @m.is_list_message?)
@headers = {}
@headers[:recipient] = {
"To" => cc.map { |p| p.full_address },
} if useful_recipient
@headers[:sender] = { "To" => [to.full_address], } if !AccountManager.is_account?(to) || !useful_recipient
@headers[:user] = {}
not_me_ccs = cc.select { |p| !AccountManager.is_account?(p) }
@headers[:all] = {
"To" => [to.full_address],
"Cc" => not_me_ccs.map { |p| p.full_address },
} unless not_me_ccs.empty?
@headers[:list] = {
"To" => [@m.list_address.full_address],
} if @m.is_list_message?
refs = gen_references
@headers.each do |k, v|
@headers[k] = {
"From" => from.full_address,
"To" => [],
"Cc" => [],
"Bcc" => [],
"In-reply-to" => "<#{@m.id}>",
"Subject" => Message.reify_subj(@m.subj),
"References" => refs,
}.merge v
end
types = REPLY_TYPES.select { |t| @headers.member?(t) }
@type_selector = HorizontalSelector.new "Reply to:", types, types.map { |x| TYPE_DESCRIPTIONS[x] }
hook_reply = HookManager.run "reply-to", :modes => types
@type_selector.set_to(
if types.include? type_arg
type_arg
elsif types.include? hook_reply
hook_reply
elsif @m.is_list_message?
:list
elsif @headers.member? :sender
:sender
else
:recipient
end)
@headers.each do |k, v|
HookManager.run "before-edit", :header => v, :body => body
end
super :header => @headers[@type_selector.val], :body => body, :twiddles => false
add_selector @type_selector
end