]> git.donarmstrong.com Git - infobot.git/blob - scripts/irclog2html.pl
ws
[infobot.git] / scripts / irclog2html.pl
1 #!/usr/bin/perl
2
3 # irclog2html.pl Version 1.5 - 11th May 2000
4 # Copyright (C) 2000, Jeffrey W. Waugh
5
6 # Author:
7 #   Jeff Waugh <jdub@aphid.net>
8
9 # Contributors:
10 #   Rick Welykochy <rick@praxis.com.au>
11 #   Alexander Else <aelse@uu.net>
12
13 # Released under the terms of the GNU GPL
14 # http://www.gnu.org/copyleft/gpl.html
15
16 # Modified by Tim Riker <Tim@Rikers.org>
17 # to work with infobot logs
18 # then modified again for blootbot
19
20 # Usage: irclog2html <date> < logfile
21
22 # irclog2html will write out a colourised irc log, appending a .html
23 # extension to the output file.
24
25
26 ####################################################################################
27 # Perl Configuration
28
29 use strict;
30 $^W = 1;        #RW# turn on warnings
31 use POSIX qw(strftime);
32
33
34 ####################################################################################
35 # Preferences
36
37 # Comment out the "table" assignment to use the plain version
38
39 #my $STYLE              =       "tt";
40 #my $STYLE              =       "simplett";
41 #my $STYLE              =       "table";
42 my $STYLE               =       "simpletable";
43
44 my $colour_left         =       "#000099";      # nick leaving channel
45 my $colour_joined       =       "#009900";      # nick joining channel
46 my $colour_server       =       "#009900";      # server message (***)
47 my $colour_nickchange   =       "#009900";      # nick change
48 my $colour_action       =       "#CC00CC";      # nick action (/me waves)
49
50 my %prefs_colour_nick = (
51         "jdub"          =>      "#993333",
52         "cantanker"     =>      "#006600",
53         "chuckd"        =>      "#339999",
54 );
55
56
57 ####################################################################################
58 # Utility Functions
59
60 sub header {
61         my ($channel, $date) = @_;
62         my $return = '';
63
64         $return .= qq{<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
65 <html>
66 <head>
67         <title>irclog2html for $channel on $date</title>
68         <meta name="generator" content="irclog2html.pl by Jeff Waugh">
69         <meta name="version" content="Version 0.9 - 5th April 2000">
70         <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
71 </head>
72 <body text="#000000" bgcolor="#ffffff"><tt>
73 <h1>irclog2html for $channel on $date</h1>
74 };
75
76         if ($STYLE =~ /table/) {
77                 $return .= "<table cellspacing=3 cellpadding=2 border=0>\n";
78         }
79         return $return;
80 }
81
82 sub footer {
83         my $return = '';
84         if ($STYLE =~ /table/) {
85                 $return .= "</table>\n";
86         }
87
88         $return .= qq{
89 <br>Generated by irclog2html.pl by
90 <a href="mailto:jdub\@NOSPAMaphid.net">Jeff Waugh</a> - find it at
91 <a href="http://freshmeat.net/appindex/2000/03/28/954251322.html">freshmeat.net</a>!
92 Modified by <a href="http://www.Rikers.org">Tim Riker</a> to work with
93 <a href="http://blootbot.sourceforge.net/">blootbot</a> logs, split per channel, etc.
94 </tt></body></html>
95 };
96         return $return;
97 }
98
99 my $lastdate = '';
100
101 sub add_footers {
102         my $filename;
103
104         return if not $lastdate;
105
106         my @files=`ls $lastdate.html */$lastdate.html`;
107         foreach $filename (@files) {
108                 chomp $filename;
109                 if (!open(OUTPUT, ">>$filename")) {
110                         die "Cannot open $filename for writing!\n\n";
111                 }
112                 print OUTPUT footer();
113                 close OUTPUT;
114         }
115 }
116
117 sub output_line {
118         my ($date, $time, $channel, $lineout) = @_;
119
120         add_footers() if $lastdate ne $date;
121
122         $lastdate = $date;
123         my $filename = "";
124         $filename .= "$channel/" if $channel;
125         $filename .= "$date.html";
126
127         mkdir($channel,oct('755')) if ($channel && ! -d $channel);
128         if (!open(OUTPUT, ">>$filename")) {
129                 die "Cannot open $filename for writing!\n\n";
130         }
131         # Begin output #
132   print OUTPUT header($channel, $date) if -z $filename;
133
134         print OUTPUT $lineout;
135
136         close OUTPUT;
137 }
138
139 sub output_timenicktext {
140         my ($date, $time, $channel, $nick, $text, $htmlcolour) = @_;
141         my $lineout = '';
142
143         if ($STYLE eq "table") {
144                 $lineout .= "<tr>";
145                 $lineout .= "<td bgcolor=\"$htmlcolour\"><font color=\"#ffffff\"><tt>$time</tt></font></td>" if $time;
146                 $lineout .= "<td bgcolor=\"$htmlcolour\"><font color=\"#ffffff\"><tt>$nick</tt></font></td>";
147                 $lineout .= "<td width=\"100%\" bgcolor=\"#eeeeee\"><tt><font color=\"$htmlcolour\">$text<\/font></tt></td></tr>\n";
148         }
149         elsif ($STYLE eq "simpletable") {
150                 $lineout .= "<tr bgcolor=\"#eeeeee\">";
151                 $lineout .= "<td><tt>$time</tt></td>" if $time;
152                 $lineout .= "<td><font color=\"$htmlcolour\"><tt>$nick</tt></font></td>";
153                 $lineout .= "<td width=\"100%\"><tt>$text</tt></td></tr>\n";
154         }
155         elsif ($STYLE eq "simplett") {
156                 $lineout .= "$time " if $time;
157                 $lineout .= "&lt\;$nick&gt\; $text<br>\n";
158         }
159         else {
160                 $lineout .= "$time " if $time;
161                 $lineout .= "<font color=\"$htmlcolour\">&lt\;$nick&gt\; $text<\/font><br>\n";
162         }
163         output_line($date, $time,$channel,$lineout);
164 }
165
166 sub output_timeservermsg {
167         my ($date, $time, $line) = @_;
168         my $lineout = '';
169
170         if ($STYLE =~ /table/) {
171                 $lineout .= "<tr>";
172                 $lineout .= "<td><tt>$time</tt></td>" if $time;
173                 $lineout .= "<td colspan=2><tt>$line</tt></td></tr>\n";
174         }
175         else {
176                 $lineout .= "$time " if $time;
177                 $lineout .= "$line<br>\n";
178         }
179         output_line($date, $time,'',$lineout);
180 }
181
182 sub html_rgb
183 {
184         my ($i,$ncolours) = @_;
185         $ncolours = 1 if $ncolours == 0;
186
187         my $rgbmax = 125;               # tune these two for the outmost ranges of colour depth
188         my $rgbmin = 240;
189
190         my $a = 0.95;                   # tune these for the starting and ending concentrations of R,G,B
191         my $b = 0.5;
192
193         my $rgb = [ [$a,$b,$b], [$b,$a,$b], [$b,$b,$a], [$a,$a,$b], [$a,$b,$a], [$b,$a,$a] ];
194         my $n = $i % @$rgb;
195         my $m = $rgbmin + ($rgbmax - $rgbmin) * ($ncolours - $i) / $ncolours;
196
197         my $r = $rgb->[$n][0] * $m;
198         my $g = $rgb->[$n][1] * $m;
199         my $b = $rgb->[$n][2] * $m;
200         sprintf("#%02x%02x%02x",$r,$g,$b);
201 }
202
203 ####################################################################################
204 # Main
205
206 sub main {
207         my ($date) = @_;
208         my $files;
209
210         my $line;
211   my $time;
212   my $lastdate = "";
213         my $nick;
214         my $channel;
215         my $text;
216
217         my $htmlcolour;
218         my $nickcount = 0;
219         my $NICKMAX = 30;
220
221         my %colour_nick = %prefs_colour_nick;
222
223         while ($line = <STDIN>) {
224
225                 chomp $line;
226
227                 if (!$line eq "") {
228
229                         # parse out the time
230                         if ($line =~ s/^([0-9:\.]*) (.*)$/\2/) {
231                                 $time = $1;
232                         } else {
233                                 $time = "";
234                         }
235
236                         # Replace ampersands, pointies, control characters #
237                         $line =~ s/&/&amp\;/g;
238                         $line =~ s/</&lt\;/g;
239                         $line =~ s/>/&gt\;/g;
240                         $line =~ s/\e\[[0-1]*m//g;
241                         $line =~ s/[\x00-\x1f]+//g;
242
243                         # Replace possible URLs with links #
244                         $line =~ s/((http|https|ftp|gopher|news):\/\/\S*)/<a href="$1">$1<\/a>/g;
245
246                         # Colourise the comments
247                         if ($line =~ /^&lt\;[^\/]*?\/\#.*?&gt\; .*$/) {
248                                 # Split $nick, $channel and $line
249                                 $nick = $line;
250                                 $nick =~ s/^&lt\;([^\/]*?)\/\#.*?&gt\; .*$/$1/;
251                                 $channel = $line;
252                                 $channel =~ s/^&lt\;[^\/]*?\/\#(.*?)&gt\; .*$/$1/;
253
254                                 # $nick =~ tr/[A-Z]/[a-z]/;
255                                 # <======= move this into another function when getting nick colour
256
257                                 $text = $line;
258                                 $text =~ s/^&lt\;.*?&gt\; (.*)$/$1/;
259                                 $text =~ s/  /&nbsp\;&nbsp\;/g;
260
261                                 $htmlcolour = $colour_nick{$nick};
262                                 if (!defined($htmlcolour)) {
263                                         # new nick
264                                         $nickcount++;
265
266                                         # if we've exceeded our estimate of the number of nicks, double it
267                                         $NICKMAX *= 2 if $nickcount >= $NICKMAX;
268
269                                         $htmlcolour = $colour_nick{$nick} = html_rgb($nickcount, $NICKMAX);
270                                 }
271                                 output_timenicktext($date, $time, $channel, $nick, $text, $htmlcolour);
272                         }
273
274                         elsif ($line =~ /^&gt\;&gt\;&gt\; /) {
275                                 $line =~ s/^&gt\;&gt\;&gt\; /\*\*\* /;
276
277                                 # Process changed nick results, and remember colours accordingly #
278                                 if ($line =~ /\*\*\* (.*?) are|is now known as (.*)/) {
279                                         my $nick_old;
280                                         my $nick_new;
281
282                                         $nick_old = $line;
283                                         $nick_old =~ s/\*\*\* (.*?) (are|is) now known as .*/$1/;
284
285                                         $nick_new = $line;
286                                         $nick_new =~ s/\*\*\* .*? (are|is) now known as (.*)/$2/;
287
288                                         $colour_nick{$nick_new} = $colour_nick{$nick_old};
289                                         $colour_nick{$nick_old} = undef;
290
291                                         $line =~ s/(\*\*\* .*)/<font color=\"$colour_nickchange\">$1<\/font>/
292                                 }
293
294                                 # Colourise joined/left/server messages #
295                                 elsif ($line =~ /\*\*\* .*left|quit/) {
296                                         $line =~ s/(\*\*\* .*)/<font color=\"$colour_left\">$1<\/font>/;
297                                 }
298                                 elsif ($line =~ /\*\*\* .*joined/) {
299                                         $line =~ s/(\*\*\* .*)/<font color=\"$colour_joined\">$1<\/font>/;
300                                 }
301                                 elsif ($line =~ /\*\*\* /) {
302                                         $line =~ s/(\*\*\* .*)$/<font color=\"$colour_server\">$1<\/font>/;
303                                 }
304
305                                 # Colourise the /me's #
306                                 elsif ($line =~ /^\* .*$/) {
307                                         $line =~ s/^(\*.*)$/<font color=\"$colour_action\">$1<\/font>/;
308                                 }
309
310                                 output_timeservermsg($date, $time, $line);
311                         }
312                 }
313         }
314
315         add_footers();
316
317         return 0;
318 }
319
320 if (!scalar @ARGV) {
321                 print "Usage: irclog2html.pl <date> < logfile\n";
322     print "Example: bzcat log/blootbot.log-20021104.bz2 | irclog2html.pl 20021104\n";
323     exit 0;
324 }
325 my $date = shift;
326 exit &main($date);
327 # vim: ts=2