|
1 <?php |
|
2 |
|
3 /** |
|
4 * EnanoBot - copyright (C) 2008 Dan Fuhry |
|
5 * All rights reserved. |
|
6 */ |
|
7 |
|
8 /***************************************************************** |
|
9 * YOU NEED TO SET THE PATH TO THE REST OF THE EnanoBot FILES HERE. |
|
10 * Include a trailing slash. |
|
11 * This script MUST be placed in an Enano installation directory. |
|
12 *****************************************************************/ |
|
13 |
|
14 define('ENANOBOT_ROOT', './'); |
|
15 |
|
16 // We're authed. |
|
17 // Load config |
|
18 require(ENANOBOT_ROOT . 'config.php'); |
|
19 |
|
20 // check config |
|
21 if ( empty($mysql_host) || empty($mysql_user) || empty($mysql_dbname) ) |
|
22 { |
|
23 die("Bad config file - have a look at config-sample.php.\n"); |
|
24 } |
|
25 |
|
26 $title_append = ''; |
|
27 if ( isset($_GET['channel']) ) |
|
28 $title_append .= ' - #' . $_GET['channel']; |
|
29 |
|
30 $title = "Enano IRC logs$title_append"; |
|
31 require('includes/common.php'); |
|
32 |
|
33 // unset($template); |
|
34 // $template = new template(); |
|
35 // $template->load_theme('oxygen', 'bleu'); |
|
36 |
|
37 $template->header(); |
|
38 |
|
39 $q = $db->sql_query('USE `' . $mysql_dbname . '`;'); |
|
40 if ( !$q ) |
|
41 $db->_die(); |
|
42 |
|
43 $days_in_month = array( |
|
44 1 => 31, |
|
45 2 => ( intval(date('Y')) % 4 == 0 ? 29 : 28 ), |
|
46 3 => 31, |
|
47 4 => 30, |
|
48 5 => 31, |
|
49 6 => 30, |
|
50 7 => 31, |
|
51 8 => 31, |
|
52 9 => 30, |
|
53 10 => 31, |
|
54 11 => 30, |
|
55 12 => 31 |
|
56 ); |
|
57 |
|
58 function irc_make_calendar($year = 0, $month = 0, $days_to_link = array()) |
|
59 { |
|
60 global $session; |
|
61 global $days_in_month, $channel; |
|
62 |
|
63 if ( $year < 1970 || $month < 1 || $month > 12 ) |
|
64 { |
|
65 $year = intval(date('Y')); |
|
66 $month = intval(date('n')); |
|
67 } |
|
68 |
|
69 $month = intval($month); |
|
70 $year = intval($year); |
|
71 |
|
72 $this_month = mktime(0, 0, 1, $month, 1, $year); |
|
73 |
|
74 $next_month = mktime(0, 0, 1, ( $month + 1 ), 1, $year); |
|
75 $next_year = mktime(0, 0, 1, $month, 1, ( $year + 1 ) ); |
|
76 $prev_month = mktime(0, 0, 1, ( $month - 1 ), 1, $year); |
|
77 $prev_year = mktime(0, 0, 1, $month, 1, ( $year - 1 ) ); |
|
78 |
|
79 $a_next_month = '<a href="' . htmlspecialchars($session->append_sid(scriptPath . '/irclogs.php?year=' . date('Y', $next_month) . '&month=' . date('n', $next_month) . '&channel=' . $channel)) . '">></a>'; |
|
80 $a_next_year = '<a href="' . htmlspecialchars($session->append_sid(scriptPath . '/irclogs.php?year=' . date('Y', $next_year) . '&month=' . $month . '&channel=' . $channel)) . '">>></a>'; |
|
81 $a_prev_month = ( $year == 1970 && $month == 1 ) ? '<' : '<a href="' . htmlspecialchars($session->append_sid(scriptPath . '/irclogs.php?year=' . date('Y', $prev_month) . '&month=' . date('n', $prev_month) . '&channel=' . $channel)) . '"><</a>'; |
|
82 $a_prev_year = ( $year == 1970 ) ? '<<' : '<a href="' . htmlspecialchars($session->append_sid(scriptPath . '/irclogs.php?year=' . date('Y', $prev_year) . '&month=' . $month . '&channel=' . $channel)) . '"><<</a>'; |
|
83 |
|
84 $dow = intval(date('w', $this_month)); |
|
85 |
|
86 $return = ''; |
|
87 |
|
88 $return .= '<div class="tblholder" style="display: table; text-align: center;"> |
|
89 <table border="0" cellspacing="1" cellpadding="6"> |
|
90 <tr> |
|
91 <th colspan="7">' . "$a_prev_year $a_prev_month " . date('F', $this_month) . ' ' . $year . " $a_next_month $a_next_year" . '</th> |
|
92 </tr>'; |
|
93 |
|
94 $return .= '<tr>'; |
|
95 $class = 'row1'; |
|
96 for ( $i = 0; $i < $dow; $i++ ) |
|
97 { |
|
98 $class = ( $class == 'row1' ) ? 'row3' : 'row1'; |
|
99 $return .= '<td class="' . $class . '"></td>'; |
|
100 } |
|
101 |
|
102 if ( $month == 2 ) |
|
103 { |
|
104 $days_in_this_month = ( $year % 4 == 0 ) ? 29 : 28; |
|
105 } |
|
106 else |
|
107 { |
|
108 $days_in_this_month = $days_in_month[$month]; |
|
109 } |
|
110 |
|
111 for ( $i = 1; $i <= $days_in_this_month; $i++ ) |
|
112 { |
|
113 if ( $dow == 7 ) |
|
114 { |
|
115 $return .= '</tr>'; |
|
116 if ( $i < $days_in_this_month ) |
|
117 $return .= '<tr>'; |
|
118 $dow = 0; |
|
119 } |
|
120 $dow++; |
|
121 $class = ( $class == 'row1' ) ? 'row3' : 'row1'; |
|
122 $a = "<span style=\"color: #808080;\">$i</span>"; |
|
123 if ( in_array($i, $days_to_link) ) |
|
124 { |
|
125 $a = '<a class="wikilink-nonexistent" href="' . htmlspecialchars($session->append_sid(scriptPath . '/irclogs.php?year=' . $year . '&month=' . $month . '&day=' . $i . '&channel=' . $channel)) . '"><b>' . $i . '</b></a>'; |
|
126 } |
|
127 $return .= "<td class=\"$class\">$a</td>"; |
|
128 } |
|
129 |
|
130 while ( $dow < 7 ) |
|
131 { |
|
132 $class = ( $class == 'row1' ) ? 'row3' : 'row1'; |
|
133 $return .= "<td class=\"$class\"></td>"; |
|
134 $dow++; |
|
135 } |
|
136 |
|
137 $return .= '</table></div>'; |
|
138 return $return; |
|
139 } |
|
140 |
|
141 $get_valid_year = isset($_GET['year']); |
|
142 $get_valid_month = ( isset($_GET['month']) && intval($_GET['month']) > 0 && intval($_GET['month']) < 13 ); |
|
143 |
|
144 $year = ( $get_valid_year ) ? intval($_GET['year']) : intval(date('Y')); |
|
145 $month = ( $get_valid_month ) ? intval($_GET['month']) : intval(date('n')); |
|
146 |
|
147 function make_nick_color($username) |
|
148 { |
|
149 if ( $username == '' ) |
|
150 return ''; |
|
151 $hash = substr(sha1($username), 0, 6); |
|
152 $hash = enano_str_split($hash); |
|
153 for ( $i = 0; $i < count($hash); $i++ ) |
|
154 { |
|
155 if ( $i % 2 == 1 ) |
|
156 continue; |
|
157 |
|
158 // call this a cheap hack or whatever, but intval() doesn't accept 0x???? |
|
159 $digit = eval("return 0x{$hash[$i]};"); |
|
160 if ( $digit > 0x9 ) |
|
161 $digit = "9"; |
|
162 else |
|
163 $digit = strval($digit); |
|
164 $hash[$i] = $digit; |
|
165 } |
|
166 $color = implode('', $hash); |
|
167 $span = "<span style=\"color: #$color;\">" . htmlspecialchars($username) . "</span>"; |
|
168 return $span; |
|
169 } |
|
170 |
|
171 function irclog_autoparse_links($text) |
|
172 { |
|
173 $sid = md5(microtime()); |
|
174 preg_match_all('/((https?|ftp|irc):\/\/([^@\s\]"\':]+)?((([a-z0-9-]+\.)*)[a-z0-9-]+)(\/[A-z0-9_%\|~`!\!@#\$\^&\*\(\):;\.,\/-]*(\?(([a-' |
|
175 . 'z0-9_-]+)(=[A-z0-9_%\|~`\!@#\$\^&\*\(\):;\.,\/-\[\]]*)?((&([a-z0-9_-]+)(=[A-z0-9_%\|~`!\!@#\$\^&\*\(\):;\.,\/-]*)?)*))' |
|
176 . '?)?)?)/', $text, $matches); |
|
177 foreach ( $matches[0] as $i => $match ) |
|
178 { |
|
179 $text = str_replace_once($match, "{AUTOLINK:$sid:$i}", $text); |
|
180 } |
|
181 $text = htmlspecialchars($text); |
|
182 foreach ( $matches[0] as $i => $match ) |
|
183 { |
|
184 $match_short = $match; |
|
185 if ( strlen($match) > 75 ) |
|
186 { |
|
187 $match_short = htmlspecialchars(substr($match, 0, 25)) . '...' . htmlspecialchars(substr($match, -25)); |
|
188 } |
|
189 $match = htmlspecialchars($match); |
|
190 $text = str_replace_once("{AUTOLINK:$sid:$i}", "<a href=\"$match\">$match_short</a>", $text); |
|
191 } |
|
192 return $text; |
|
193 } |
|
194 |
|
195 function irclog_protect_emails($text) |
|
196 { |
|
197 global $email; |
|
198 preg_match_all('/([a-z0-9_-]+@(([a-z0-9-]+\.)*)[a-z0-9-]+)/', $text, $matches); |
|
199 foreach ( $matches[0] as $match ) |
|
200 { |
|
201 $text = str_replace_once($match, $email->encryptEmail($match), $text); |
|
202 } |
|
203 return $text; |
|
204 } |
|
205 |
|
206 function irclog_format_row($_, $row) |
|
207 { |
|
208 static $class = 'row1'; |
|
209 $class = ( $class == 'row1' ) ? 'row3' : 'row1'; |
|
210 |
|
211 $time = date('H:i', $row['timestamp']); |
|
212 $nick = make_nick_color($row['nick']); |
|
213 |
|
214 $message = irclog_autoparse_links($row['line']); |
|
215 $message = irclog_protect_emails($message); |
|
216 $message = RenderMan::smilieyize($message); |
|
217 if ( $row['nick'] == '' ) |
|
218 $message = "<span style=\"color: #808080;\">" . $message . "</span>"; |
|
219 return " <tr> |
|
220 <td class=\"$class\">$time</td> |
|
221 <td class=\"$class\">$nick</td> |
|
222 <td class=\"$class\">$message</td> |
|
223 </tr>\n"; |
|
224 } |
|
225 |
|
226 if ( $get_valid_year && $get_valid_month && isset($_GET['day']) && isset($_GET['channel']) ) |
|
227 { |
|
228 $days_in_this_month = $days_in_month[$month]; |
|
229 if ( $month == 2 && $year !== intval(date('n')) ) |
|
230 $days_in_this_month = ( $year % 4 == 0 ) ? 29 : 28; |
|
231 $day = intval($_GET['day']); |
|
232 if ( $day < 1 || $day > $days_in_this_month ) |
|
233 { |
|
234 $day = intval(date('j')); |
|
235 } |
|
236 // mode is view logs, and we have the date on which to display them |
|
237 $channel = $db->escape($_GET['channel']); |
|
238 if ( !preg_match('/^[a-z0-9_-]+$/i', $channel) ) |
|
239 die('Channel contains XSS attempt'); |
|
240 |
|
241 $datekey = $year . '-' . |
|
242 ( $month < 10 ? "0$month" : $month ) . '-' . |
|
243 ( $day < 10 ? "0$day" : $day ); |
|
244 |
|
245 $q = $db->sql_query("SELECT * FROM irclog WHERE day='$datekey' AND channel = '#$channel' ORDER BY timestamp ASC;"); |
|
246 if ( !$q ) |
|
247 $db->_die(); |
|
248 |
|
249 echo '<p><a href="' . htmlspecialchars($session->append_sid(scriptPath . "/irclogs.php?year=$year&month=$month&channel=$channel")) . '">< Back to date listings</a></p>'; |
|
250 |
|
251 if ( $db->numrows() < 1 ) |
|
252 { |
|
253 echo '<p>No chat logs for today.</p>'; |
|
254 } |
|
255 else |
|
256 { |
|
257 $count = $db->numrows(); |
|
258 |
|
259 $start = ( isset($_GET['start']) ) ? intval($_GET['start']) : 0; |
|
260 |
|
261 // ($q, $tpl_text, $num_results, $result_url, $start = 0, $perpage = 10, $callers = Array(), $header = '', $footer = '') |
|
262 $html = paginate($q, '{id}', $count, $session->append_sid(scriptPath . "/irclogs.php?year=$year&month=$month&day=$day&channel=$channel&start=%s"), $start, 100, array('id' => 'irclog_format_row'), '<p>All times are UTC.</p><div class="tblholder"><table border="0" cellspacing="1" cellpadding="4">', '</table></div>'); |
|
263 |
|
264 echo $html; |
|
265 } |
|
266 } |
|
267 else if ( isset($_GET['channel']) ) |
|
268 { |
|
269 // show log calendar |
|
270 $channel = $db->escape($_GET['channel']); |
|
271 if ( !preg_match('/^[a-z0-9_-]+$/i', $channel) ) |
|
272 die('Channel contains XSS attempt'); |
|
273 |
|
274 echo "<h3>Chat logs for #$channel</h3>"; |
|
275 |
|
276 echo '<p><a href="' . htmlspecialchars($session->append_sid(scriptPath . "/irclogs.php")) . '">< Back to channel list</a></p>'; |
|
277 |
|
278 $year = strval($year); |
|
279 $month = strval($month); |
|
280 |
|
281 if ( $month < 10 ) |
|
282 $month = "0" . $month; |
|
283 |
|
284 $q = $db->sql_query("SELECT day FROM irclog WHERE day LIKE '$year-$month-__' AND channel = '#$channel' GROUP BY day ORDER BY timestamp ASC;"); |
|
285 if ( !$q ) |
|
286 $db->_die(); |
|
287 |
|
288 $days = array(); |
|
289 while ( $row = $db->fetchrow() ) |
|
290 { |
|
291 if ( !preg_match('/^[0-9]+-[0-9]+-([0-9]+)$/', $row['day'], $match) ) |
|
292 { |
|
293 continue; |
|
294 } |
|
295 $days[] = intval($match[1]); |
|
296 } |
|
297 |
|
298 echo irc_make_calendar($year, $month, $days); |
|
299 } |
|
300 else |
|
301 { |
|
302 // list channels |
|
303 $q = $db->sql_query("SELECT channel FROM irclog GROUP BY channel;"); |
|
304 if ( !$q ) |
|
305 $db->_die(); |
|
306 echo '<h3>List of available channels</h3>'; |
|
307 if ( $row = $db->fetchrow() ) |
|
308 { |
|
309 echo '<p>'; |
|
310 do |
|
311 { |
|
312 $channel = preg_replace('/^#/', '', $row['channel']); |
|
313 echo '<a href="' . htmlspecialchars($session->append_sid(scriptPath . "/irclogs.php?channel={$channel}")) . '">' . $row['channel'] . '</a><br />'; |
|
314 } |
|
315 while ( $row = $db->fetchrow() ); |
|
316 echo '</p>'; |
|
317 } |
|
318 else |
|
319 { |
|
320 echo '<p>No channels logged.</p>'; |
|
321 } |
|
322 } |
|
323 |
|
324 $q = $db->sql_query('USE enano_www;'); |
|
325 if ( !$q ) |
|
326 $db->_die(); |
|
327 |
|
328 $template->footer(); |
|
329 |