Advertisement
Guest User

Untitled

a guest
Jan 6th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.38 KB | None | 0 0
  1. // JJAddAndRemoveHeadersWhileDoubleCheckingIdentityNgAndServers
  2. // <http://pastebin.com/fcYjL9Vb> newer version
  3. // <http://pastebin.com/2tMYRKM4> older version
  4. // From: JJ <jj4public@vfemail.net>
  5. // Newsgroups: news.software.readers,alt.windows7.general
  6. // Subject: Re: Request help with 40tude dialog program syntax
  7. // Date: Thu, 5 Jan 2017 23:06:19 +0700
  8. // Message-ID: <7vpx5y09pu98.1sukl5d600sda$.dlg@40tude.net>
  9. // Original code for checking identity:
  10. // http://dialog.datalist.org/scripts/CheckingIdentity.html
  11. // Original code for modifying headers:
  12. // http://dialog.datalist.org/scripts/RemoveHeaders.html
  13. // NOTES:
  14. // The StrMatch fct is case sensitive and only matches the first item found!
  15. // Define a StrContains fct to match multiple either/or newsgroups.
  16. // If you don't set Remove_Header, then none will be removed.
  17. // If you don't set Add_Header, then none will be added.
  18. // For some headers you have to remove them first, then add them back.
  19. // Dialog will error when sending if you add headers sans (CR+LF) syntax!
  20. // WriteLn doesn't seem to do anything.
  21. // CUSTOMIZATION ORDER OF OPERATIONS:
  22. // 1. Set the "ForNewsgroup" Boolean as desired (search for "ForNewsgroup :")
  23. // 2. Set the "ForEmail" Boolean as desired (search for "ForEmail :")
  24. // 3. Change identity(ies) as desired (search for "from,")
  25. // 4. Change newsgroup(s) as desired (search for "newsgroup,")
  26. // 5. Change server(s) as desired (search for "server,")
  27. // 6. Change remove header(s) as desired (search for "Remove_Headers :")
  28. // 7. Change add header(s) as desired (search for "Add_Headers :")
  29. // End of initial comments.
  30.  
  31. program OnBeforeSendingMessage;
  32.  
  33. (*
  34. Format for Remove_Headers: {} = required, [] = optional
  35. {HeaderName: }[,HeaderName: ][,HeaderName: ][...]
  36. Examples:
  37. - Single header: 'User-Agent: '
  38. - Multiple headers: 'User-Agent: ,X-Face: '
  39. *)
  40. procedure RemoveHeaders(Message : TStringlist;
  41. const Remove_Headers: String
  42. );
  43. var i : integer;
  44. k : integer;
  45. s : string;
  46. CommaPos : integer;
  47. DelHeader : TStringlist;
  48. RemoveH : String;
  49. begin
  50. RemoveH := Remove_Headers;
  51. i := 0;
  52. If ( RemoveH <> '' ) then begin
  53. try
  54. DelHeader := TStringlist.Create;
  55. if ansipos ( ',', RemoveH) = 0 then begin
  56. DelHeader.Add ( LowerCase ( TrimLeft( RemoveH )));
  57. end // if
  58. else begin
  59. CommaPos := 0;
  60. for k := 1 to length ( RemoveH ) do begin
  61. If RemoveH[k] = ',' then begin
  62. DelHeader.Add ( LowerCase ( TrimLeft (copy ( RemoveH, CommaPos + 1, k - ( CommaPos + 1 )))));
  63. CommaPos := k;
  64. end; // if
  65. if k = length ( RemoveH ) then
  66. DelHeader.Add ( LowerCase ( TrimLeft (copy ( RemoveH, CommaPos + 1, k - CommaPos ))));
  67. end; // for
  68. end; // else
  69. s:= Message.text;
  70. while (Message.Strings[i]<>'') do begin
  71. k := 0;
  72. while k <= ( DelHeader.Count - 1 ) do begin
  73. if pos( DelHeader[k], LowerCase ( Message.Strings[i] )) = 1 then
  74. begin
  75. delete ( s, pos(DelHeader[k], LowerCase (s) ), length (Message.Strings[i] ) + 2 );
  76. i := i - 1;
  77. k := DelHeader.Count - 1;
  78. message.text := s;
  79. end; // if
  80. k := k + 1;
  81. end; // while
  82. i := i + 1;
  83. end; //while
  84. message.text:=s;
  85. finally
  86. DelHeader.Free;
  87. end; // try - finally
  88. end; // if
  89. end; // RemoveHeaders
  90.  
  91. (*
  92. Format for Add_Headers: {} = required, [] = optional
  93. {HeaderName: HeaderValue{#13#10}}[HeaderName: HeaderValue{#13#10}][...]
  94. Examples: (each header must end with CR+LF)
  95. - Single header: 'User-Agent: '#13#10
  96. - Multiple headers: 'User-Agent: MyNewsClient'#13#10'X-Comment: To be, or not to be'#13#10
  97.  
  98. WARNING: For the Add_Header, you MUST add the pound13-Pound10 as shown in the examples!
  99. If you forget to add the #13#10, then Dialog will error when you send news saying something like:
  100. Posting article failed: 437 Space before colon in "On Fri, 6 Jan 2017" header;
  101. *)
  102. procedure AddHeaders(var Message : TStringlist;
  103. const Add_Headers: String
  104. );
  105. var
  106. SeparatorIndex: integer;
  107. s: string;
  108. begin
  109. s:= Message.Text;
  110. // writetolog('***before***'#13#10+s, 7);
  111. SeparatorIndex:= pos(#13#10#13#10, s);
  112. Insert(Add_Headers, s, SeparatorIndex+2);
  113. Message.Text:= s;
  114. // writetolog('***after***'#13#10+s, 7);
  115. end;
  116.  
  117. function StrMatch(str: String; pattern: String):Boolean;
  118. var
  119. patternSize : Integer;
  120. subStr : String;
  121. compareRes : Integer;
  122. begin
  123. patternSize := Length(pattern);
  124. subStr := Copy(str, 1, patternSize);
  125. compareRes := CompareStr(pattern, subStr);
  126. if (compareRes = 0) then
  127. result := true
  128. else
  129. result := false;
  130. end;
  131.  
  132. //the xxx2Identity() functions must return an empty string if specified string is not identified
  133. // Customize your identity below for personal or business use as needed.
  134. // The string match is probably case sensitive!
  135. function From2Identity(from: String): String;
  136. begin
  137. if (StrMatch(from, 'First1 Last1 <email1@domain.net>')) then
  138. result := 'id1'
  139. else if (StrMatch(from, 'First2 Last2 <email2@domain.net>')) then
  140. result := 'id2'
  141. else if (StrMatch(from, 'First3 Last3 <email3@domain.net>')) then
  142. result := 'id3'
  143. else
  144. result := '';
  145. end;
  146.  
  147. // WARNING: The StrMatch function can only check the first listed newsgroup!
  148. // Define a StrContains function if you want to match either/or newsgroups!
  149. // function StrContains(const Str: string; const Pattern: string): boolean;
  150. // begin
  151. // result:= pos(Pattern, Str) > 0;
  152. // end;
  153. // EXAMPLE: This StrMatch will only match the first newsgroup in the outgoing Newsgroup header!
  154. // if (StrMatch (newsgroup, 'news.software.readers') or StrMatch(newsgroup, 'alt.free.newsservers')) then result := 'id1'
  155. // If defined, this StrContains will match either newsgroup or both in the outgoing Newsgroup header:
  156. // if StrContains(newsgroup, 'news.software.readers') or StrContains(newsgroup, 'alt.free.newssservers') then result := 'id1'
  157. // End of comments
  158.  
  159. function StrContains(const Str: string; const Pattern: string): boolean;
  160. begin
  161. result:= pos(Pattern, Str) > 0;
  162. end;
  163.  
  164. function NewsGroup2Identity(newsgroup: String): String;
  165. begin
  166. if StrContains(newsgroup, 'ng1') or StrContains(newsgroup, 'ng2') then
  167. result := 'id1'
  168. else if StrMatch(newsgroup, 'ng3') then
  169. result := 'id2'
  170. else if StrMatch(newsgroup, 'ng4') then
  171. result := 'id3'
  172. else
  173. result := '';
  174. end;
  175.  
  176. // The name of the server is what Dialog lists in the "Available Servers" UI.
  177. function Server2Identity(server: String): String;
  178. begin
  179. if (CompareStr(server, 'aioe_119') = 0) then
  180. result := 'id1'
  181. else if (CompareStr(server, 'albasani_563') = 0) then
  182. result := 'id2'
  183. else
  184. result := '';
  185. end;
  186.  
  187. procedure GetIdentities(var message: TStringlist; servername: string;
  188. isEmail: boolean; var FromIdentity: String; var NewsgroupIdentity: String;
  189. var ServerIdentity: String);
  190. var i : Integer;
  191. begin
  192. FromIdentity := '';
  193. NewsgroupIdentity := '';
  194. ServerIdentity := '';
  195. if (not IsEmail) then
  196. begin
  197. for i := 0 to Message.Count - 1 do
  198. begin
  199. if (strMatch(Message[i], 'From:')) then
  200. fromIdentity := Copy(Message[i], 7, Length(Message[i]) - 6);
  201. if (strMatch(Message[i], 'Newsgroups:')) then
  202. newsgroupIdentity := Copy(Message[i], 13, Length(Message[i]) - 12);
  203. end;
  204. fromIdentity := From2Identity(fromIdentity);
  205. newsgroupIdentity := NewsGroup2Identity(newsgroupIdentity);
  206. serverIdentity := Server2Identity(servername);
  207. // The default log file is C:/Program Files/40tude/logs/YYYYMMDD.log
  208. WriteToLog(' fromIdentity = ' + fromIdentity, 7);
  209. WriteToLog(' newsgroupIdentity = ' + newsgroupIdentity, 7);
  210. WriteToLog(' serverIdentity = ' + serverIdentity, 7);
  211. end;
  212. end;
  213.  
  214. procedure LogHeaders(var Message: TStringlist);
  215. var
  216. i: integer;
  217. s: string;
  218. begin
  219. s:= '';
  220. for i:= 0 to message.count-1 do
  221. begin
  222. if message[i] <> '' then s:= s+message[i]+#13#10
  223. else break;
  224. end;
  225. writetolog(s, 7);
  226. end;
  227.  
  228. function OnBeforeSendingMessage(var Message : TStringlist;
  229. Servername : string;
  230. IsEmail : boolean
  231. ):boolean;
  232. var
  233. ForEmail: boolean;
  234. ForNewsgroup : boolean;
  235. FromIdentity: String;
  236. NewsgroupIdentity: String;
  237. ServerIdentity: String;
  238. Remove_Headers: String;
  239. Add_Headers: String;
  240. begin
  241. //get the identities of the message
  242. GetIdentities(message, servername, isEmail, FromIdentity, NewsgroupIdentity, ServerIdentity);
  243.  
  244. // Four program decisions to be made if you wish to change the program defaults:
  245. // 1. This Boolean sets whether email headers are modified:
  246. // ForEmail := false; //false means don't do email message by default
  247. // ForEmail := true; //true means do email headers
  248. // 2. This Boolean sets whether newsgroup headers are modified:
  249. // ForNewsgroup := false; //false means don't do newsgroup message by default
  250. // ForNewsgroup := true; //true means do newsgroup messages
  251. // 3. This string syntax sets the default headers to remove (if not redefined):
  252. // Remove_Headers := ''; //null means don't remove any header by default
  253. // Remove_Headers := 'User-Agent: ,Message-ID: '; //string means remove these headers
  254. // 4. This string syntax sets the default headers to add (if not redefined):
  255. // Add_Headers := ''; //null means don't add any header by default
  256. // Add_Headers := 'X-Comment: John Doe was here'; //string means add these header strings
  257. //
  258. ForEmail := false; //false means don't do email message by default
  259. ForNewsgroup := true; //true means do newsgroup messages
  260. Remove_Headers := ''; //null means don't remove any header by default
  261. Remove_Headers := 'User-Agent: ,Message-ID: ,Date: '; //remove these outgoing headers
  262. Add_Headers := ''; //null means don't add any header by default
  263.  
  264. {The main decision.
  265.  
  266. For FromIdentity, comparison must match against string returned by From2Identity() function.
  267. Same applies to NewsgroupIdentity and ServerIdentity.
  268. Note that identities may be an empty string.
  269.  
  270. Set Remove_Header to remove header(s).
  271. Set Add_Header to add header(s).
  272. Set ForEmail and/or ForNewsgroup to `true` to add/remove header for email/newsgroup messages.
  273. }
  274.  
  275. // EXAMPLES:
  276. // Remove_Headers := 'User-Agent: ,Message-ID: ,Date: ,Mime-Version: ,Content-Type: ,Content-Transfer-Encoding: ';
  277. // Add_Headers := 'Organization: none whatsoever'#13#10;
  278. // Add_Headers := 'X-Comment: Jane Doe was here'#13#10 + 'X-Greeting: Hello there!'#13#10;
  279. // Note that some headers cannot be set (for example, NNTP Posting Host or Newsgroups)
  280. //
  281. if FromIdentity = 'id1' then
  282. begin
  283. ForNewsgroup := true;
  284. Remove_Headers := 'User-Agent: ,Message-ID: ';
  285. // Add_Headers := 'X-Comment: Jane Doe was here'#13#10 + 'X-Greeting: Hello there!'#13#10;
  286.  
  287. end
  288. else if (FromIdentity = 'id2') and (NewsgroupIdentity = 'id2') then
  289. begin
  290. ForNewsgroup := true;
  291. // Remove_Headers := 'User-Agent: ,Content-Transfer-Encoding: '
  292. Add_Headers := 'Organization: none whatsoever'#13#10;
  293. end
  294.  
  295. else if (FromIdentity = 'id3') and (ServerIdentity = 'id1') then
  296. begin // id3
  297. ForEmail := true;
  298. ForNewsgroup := true;
  299. Remove_Headers := 'User-Agent: ,Mime-Version: ';
  300. Add_Headers := 'User-Agent: My user agent is 40Tude Dialog on Windows 10'#13#10;
  301. // WriteLn(Remove_Headers); // This WriteLn command does not seem to do anything.
  302. // WriteLn(Add_Headers); // This WriteLn command does not seem to do anything.
  303. end; // id3
  304.  
  305. if (IsEmail and ForEmail) or ((not IsEmail) and ForNewsgroup) then
  306. begin
  307. if Remove_Headers <> '' then RemoveHeaders(Message, Remove_Headers);
  308. if Add_Headers <> '' then AddHeaders(Message, Add_Headers);
  309. end;
  310.  
  311. result := true;
  312. // result := false; //uncomment this line for testing purposes (doesn't send the message)
  313. end;
  314. // ----------------------------------------------------------------------
  315. begin
  316. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement