On Sat, 7 Jan 2017 22:57:43 +0000 (UTC), you wrote:
> I've added it as a comment to the code I maintain for future use.
Here is the latest code with all your comments added, and,
with suggestions by Bernd Rose in another thread in the a.s.r newsgroups
also added.
http://pastebin.com/6Md5m67X
========= < obligatory cut here > ============
// JJAddAndRemoveHeadersWhileCheckingNewsgroupsIdentitiesAndServers
// version 1.00 January 8th 2017 "
http://pastebin.com/6Md5m67X"
// version 0.02 "
http://pastebin.com/sgVDqcqu"
// version 0.01 "
http://pastebin.com/2tMYRKM4"
// From: JJ <
jj4p...@vfemail.net>
// Newsgroups: news.software.readers,alt.windows7.general
// Subject: Re: Request help with 40tude dialog program syntax
// Date: Thu, 5 Jan 2017 23:06:19 +0700
// Message-ID: <7vpx5y09pu98.1sukl5d600sda$.
d...@40tude.net>
// Original code for just checking identity, ng, & servers:
//
http://dialog.datalist.org/scripts/CheckingIdentity.html
// Original code for just removing headers:
//
http://dialog.datalist.org/scripts/RemoveHeaders.html
// This script will add & remove headers based on a decision tree.
// It will also check for mistakes between business & personal use.
// DOCUMENTATION:
// The scripting language used by Dialog is Delphi which is based on the
// Pascal programming language. You can use Free Pascal Compiler (FPC)
// documentations if you have any interest on understanding the Pascal
// programming language. You can also ask Pascal/Delphi related question to
// comp.lang.pascal.delphi.misc.
// NOTES:
// The original StrMatch fct is case sensitive & matches only the 1st item
found!
// Instead, we define a StrContains fct to match multiple either/or
newsgroups.
// CAVEATS:
// For some headers you have to remove them first, then add them back.
// Dialog will error when sending if you add headers sans (CR+LF) syntax!
// CUSTOMIZATION: Search for "CUSTOMIZATION:"
// 1. Set the "ForNewsgroup" Boolean as desired (search for "ForNewsgroup
:")
// 2. Set the "ForEmail" Boolean as desired (search for "ForEmail :")
// 3. Change identity(ies) as desired (search for "from,")
// 4. Change newsgroup(s) as desired (search for "newsgroup,")
// 5. Change server(s) as desired (search for "server,")
// 6. Change remove header(s) as desired (search for "Remove_Headers :")
// 7. Change add header(s) as desired (search for "Add_Headers :")
// OPTIONS:
// If you don't set Remove_Header, then none will be removed.
// If you don't set Add_Header, then none will be added.
// End of initial comments
program OnBeforeSendingMessage;
(*
Format for Remove_Headers: {} = required, [] = optional
{HeaderName: }[,HeaderName: ][,HeaderName: ][...]
Examples:
- Single header: 'User-Agent: '
- Multiple headers: 'User-Agent: ,X-Face: '
*)
// The user is not expected to need to customize "RemoveHeaders()".
Posting article failed: 437 Space before colon in "On Fri, 6 Jan 2017"
header;
*)
// The user is not expected to need to customize "AddHeaders()".
procedure AddHeaders(var Message : TStringlist;
const Add_Headers: String
);
var
SeparatorIndex: integer;
s: string;
begin
s:= Message.Text;
// writetolog('***before***'#13#10+s, 7);
SeparatorIndex:= pos(#13#10#13#10, s);
Insert(Add_Headers, s, SeparatorIndex+2);
Message.Text:= s;
// writetolog('***after***'#13#10+s, 7);
end;
// The user is not expected to need to customize "StrMatch()".
// WARNING: The StrMatch function can only check the first listed
newsgroup!
// Define a StrContains function if you want to match either/or newsgroups!
// function StrContains(const Str: string; const Pattern: string): boolean;
// begin
// result:= pos(Pattern, Str) > 0;
// end;
// These will return `true`:
// StrMatch('abc', 'abc') //"abc" is at start of "abc"
// StrMatch('abc', 'ab') //"ab" is at start of "abc"
// StrMatch('abc', 'a') //"a" is at start of "abc"
// These will return `false`:
// StrMatch('abc', 'abcd') //"abcd" is not at start of "abc"
// StrMatch('abc', 'bc') //"bc" is not at start of "abc"
// StrMatch('abc', 'b') //"b" is not at start of "abc"
// StrMatch('abc', 'c') //"c" is not at start of "abc"
// EXAMPLE: This StrMatch will only match if either n.s.r or a.f.n is the
*first* ng in the Newsgroups header:
// if (StrMatch (newsgroup, 'news.software.readers') or StrMatch(newsgroup,
'alt.free.newsservers')) then result := 'id1'
// If defined, this StrContains will match either newsgroup or both in the
outgoing Newsgroup header:
// if StrContains(newsgroup, 'news.software.readers') or
StrContains(newsgroup, 'alt.free.newssservers') then result := 'id1'
// End of comments
function StrMatch(str: String; pattern: String):Boolean;
var
patternSize : Integer;
subStr : String;
compareRes : Integer;
begin
patternSize := Length(pattern);
subStr := Copy(str, 1, patternSize);
compareRes := CompareStr(pattern, subStr);
if (compareRes = 0) then
result := true
else
result := false;
end;
// CUSTOMIZATION: identity id1, id2, etc.
// The user is expected to modify to their own identity(ies) below.
//the xxx2Identity() functions must return an empty string if specified
string is not identified
// This is probably case sensitive!
function From2Identity(from: String): String;
begin
if (StrMatch(from, 'First1 Last1 <
ema...@domain.com>')) then
result := 'id1'
else if (StrMatch(from, 'First2 Last2 <
ema...@domain.com>')) then
result := 'id2'
else if (StrMatch(from, 'First3 Last3 <
ema...@domain.com>')) then
result := 'id3'
else
result := '';
end;
// The user is not expected to need to customize "StrContains()".
function StrContains(const Str: string; const Pattern: string): boolean;
begin
result:= pos(Pattern, Str) > 0;
end;
// CUSTOMIZATION: newsgroups ng1, ng2, etc.
// The user is expected to modify to their own newsgroup(s) below.
function NewsGroup2Identity(newsgroup: String): String;
begin
if StrContains(newsgroup, 'ng1') or StrContains(newsgroup, 'ng2') then
result := 'id1'
else if StrContains(newsgroup, 'ng3') then
result := 'id2'
else if StrContains(newsgroup, 'ng4') then
result := 'id3'
else
result := '';
end;
// CUSTOMIZATION: servers server1, server2, etc.
// The user is expected to modify to their own server(s) below.
// The name of the server is what Dialog lists in the "Available Servers"
GUI
function Server2Identity(server: String): String;
begin
if (CompareStr(server, 'server1') = 0) then
result := 'id1'
else if (CompareStr(server, 'server2') = 0) then
result := 'id2'
else
result := '';
end;
// The user is not expected to need to customize "GetIdentities()".
procedure GetIdentities(var message: TStringlist; servername: string;
isEmail: boolean; var FromIdentity: String; var NewsgroupIdentity:
String;
var ServerIdentity: String);
var i : Integer;
begin
FromIdentity := '';
NewsgroupIdentity := '';
ServerIdentity := '';
if (not IsEmail) then
begin
for i := 0 to Message.Count - 1 do
begin
if (strMatch(Message[i], 'From:')) then
fromIdentity := Copy(Message[i], 7, Length(Message[i]) - 6);
if (strMatch(Message[i], 'Newsgroups:')) then
newsgroupIdentity := Copy(Message[i], 13, Length(Message[i]) - 12);
end;
fromIdentity := From2Identity(fromIdentity);
newsgroupIdentity := NewsGroup2Identity(newsgroupIdentity);
serverIdentity := Server2Identity(servername);
// The default log file is C:/Program Files/40tude/logs/YYYYMMDD.log
WriteToLog(' fromIdentity = ' + fromIdentity, 7);
WriteToLog(' newsgroupIdentity = ' + newsgroupIdentity, 7);
WriteToLog(' serverIdentity = ' + serverIdentity, 7);
// Note that "WriteLn" will never work so don't even think of using it.
end;
end;
// The user is not expected to need to customize "LogHeaders()".
// CUSTOMIZATION: main decision tree
// The user is expected to wish to customize this main decision tree.
//get the identities of the message
GetIdentities(message, servername, isEmail, FromIdentity,
NewsgroupIdentity, ServerIdentity);
// Four program decisions to be made if you wish to change the program
defaults:
// 1. This Boolean sets whether email headers are modified:
// ForEmail := false; //false means don't do email message by
default
// ForEmail := true; //true means do email headers
// 2. This Boolean sets whether newsgroup headers are modified:
// ForNewsgroup := false; //false means don't do newsgroup message by
default
// ForNewsgroup := true; //true means do newsgroup messages
// 3. This string syntax sets the default headers to remove (if not
redefined):
// Remove_Headers := ''; //null means don't remove any header by
default
// Remove_Headers := 'User-Agent: ,Message-ID: '; //string means remove
these headers
// 4. This string syntax sets the default headers to add (if not
redefined):
// Add_Headers := ''; //null means don't add any header by default
// Add_Headers := 'X-Comment: John Doe was here'; //string means add
these header strings
// NOTE: By default, 40Tude-Dialog generates a dialog-specific message id.
// You can turn off this message-id autogeneration in the Dialog GUI.
// Or you can remove that message-id after the fact in this script.
// NOTE: By default, 40Tude-Dialog sends the system date to the news
server.
// The news server will use that system date in the Date: header.
// The news server will generate a GMT date if there is no Date:
header.
//
// DEFAULT SETTINGS:
ForEmail := false; //false means don't do email message by default
ForNewsgroup := true; //true means do newsgroup messages
Remove_Headers := ''; //null means don't remove any header by default
Remove_Headers := 'User-Agent: ,Message-ID: ,Date: '; //remove these
outgoing headers by default
Add_Headers := ''; //null means don't add any header by default
{The main decision.
For FromIdentity, comparison must match against string returned by
From2Identity() function.
Same applies to NewsgroupIdentity and ServerIdentity.
Note that identities may be an empty string.
Set Remove_Header to remove header(s).
Set Add_Header to add header(s).
Set ForEmail and/or ForNewsgroup to `true` to add/remove header for
email/newsgroup messages.
}
// EXAMPLES:
// Remove_Headers = 'User-Agent: ';
// Remove_Headers = 'X-Newsreader: ,X-Scoring: ';
// Remove_Headers := 'Message-ID: ,Date: ,Mime-Version: ,Content-Type:
,Content-Transfer-Encoding: ';
//
// Add_Headers := 'User-Agent: slrn/1.0.2 (Darwin)'#13#10;
// Add_Headers := 'Organization: DNLA GmbH'#13#10;
// Add_Headers := 'MIME-Version: 1.0'#13#10 + 'Content-Type: text/plain;
charset=UTF-8'#13#10;
//
if FromIdentity = 'id1' then
begin
ForNewsgroup := true;
Remove_Headers := 'User-Agent: ,Message-ID: ';
end // id1
else
if (FromIdentity = 'id2') and (NewsgroupIdentity = 'id2') then
//else if (FromIdentity = 'id2') then
begin
ForNewsgroup := true;
Remove_Headers := 'User-Agent: ,Content-Transfer-Encoding: '
Add_Headers := 'X-Comment: Caveat emptor!'#13#10;
end // id2
else
if (FromIdentity = 'id3') and (NewsgroupIdentity = 'id2') and
(ServerIdentity = 'id1') then
// else if (FromIdentity = 'id3') and (NewsgroupIdentity = 'id3') and
(Server = 'id3') then
begin
ForEmail := true;
ForNewsgroup := true;
Add_Headers := 'X-Comment: Jane Doe was here'#13#10 + 'X-Greeting:
Hello there!'#13#10;
end; // id3
if (IsEmail and ForEmail) or ((not IsEmail) and ForNewsgroup) then
begin
if Remove_Headers <> '' then RemoveHeaders(Message, Remove_Headers);
if Add_Headers <> '' then AddHeaders(Message, Add_Headers);
end;
result := true;
// result := false; //uncomment this line for testing purposes (doesn't
send the message)
end;
// ----------------------------------------------------------------------
begin
end.
========= < obligatory cut here > ============