diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/fileoperations.c src/eggdrop-1.8.4/src/mod/logs2html.mod/fileoperations.c --- ./src/mod/logs2html.mod/fileoperations.c 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/fileoperations.c 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,134 @@ +/* + * fileoperations.c -- part of logs2html.mod + * + * Written by Fedotov Alexander aka Shmupsik aka shurikvz + * + * 2004-2009 year + */ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +/****************************************************************************/ +/* + * function FILE *openfile(char *newfilename, const char *mode, bool silent) + * + * Input: + * newfilename - имя файла, который необходимо создать + * mode - режим открытия файла + * + * Output: + * указатель на файл + * + * Discription: + * функция осуществляет создание и открытие файла в указанном режиме + * и возвращает указатель на созданный файл + */ +static FILE *openfile(char *filename, const char *mode, bool silent) { + FILE *file; + + if (filename == NULL) { + putlog(LOG_MISC, "*", "logs2html: ERROR! Can't allocate enough space for filename."); + return NULL; + } + + file = fopen(filename, mode); + if ((file == NULL) && (!silent)) { + putlog(LOG_MISC, "*", "logs2html: Warning! Can't open file \"%s\".", filename); + } + + return file; +} /* openfile() */ +/****************************************************************************/ + + +/****************************************************************************/ +/* + * function void writefromexfile(FILE *dst_file, char *exfilename) + * + * Input: + * + * + * + * + * Output: + * + * + * Discription: + * + * + */ +static void writefromexfile(FILE *dst_file, char *exfilename) { + FILE *addfile; + char buffer[512]; + size_t n; + + if (strlen(exfilename) > 0) { + if ((addfile = openfile(exfilename, "r", false)) != NULL) { + while(!feof(addfile)) { + n = fread(buffer, sizeof(char), sizeof buffer, addfile); + fwrite(buffer, sizeof(char), n, dst_file); + } + fclose(addfile); + } + } + + return; +} /* writefromexfile() */ +/****************************************************************************/ + + +/****************************************************************************/ +/* + * function void str_write(FILE *file, char *fmt, ... ) + * + * Input: + * file - файл в который пишем данные + * fmt - строка для записи со спецификаторами формата + * ... - данные для записи в строку + * + * Output: + * ничего + * + * Discription: + * функция осуществляет запись переданной строки в указанный файл, + * производя соответствующее ее форматирование + */ +static void str_write(FILE *file, char *fstr, ... ) { + va_list ap; + int nchars; + int size = 256; + static char *buffer = NULL; + + buffer = (char *)nmalloc(size); + + while (true) { + va_start(ap, fstr); + nchars = egg_vsnprintf(buffer, size, fstr, ap); + va_end(ap); + if (nchars < size) break; + size *= 2; + buffer = (char *)nrealloc(buffer, size); + } + + fwrite(buffer, sizeof(char), strlen(buffer), file); + nfree(buffer); buffer = NULL; + + return; +} /* str_write() */ +/****************************************************************************/ + diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/help/logs2html.help src/eggdrop-1.8.4/src/mod/logs2html.mod/help/logs2html.help --- ./src/mod/logs2html.mod/help/logs2html.help 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/help/logs2html.help 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,37 @@ +%{help=convertalllogs}%{+n} +### %bconvertalllogs%b + Reconverts all your logs. + +See also: convertlogs, makemainpage +%{help=convertlogs}%{+n} +### %bconvertlogs [year [month [day]]]%b + %byear%b the year to reconvert logs + %bmonth%b the month to reconvert logs + %bmonth%b the day to reconvert logs + If year equals %ball%b the command reconverts all your logs (same as %b.convertalllogs%b). + If you do not specify a parameter, the command will convert the logs for the current day. + +See also: convertalllogs, makemainpage +%{help=makemainpage}%{+n} +### %bmakemainpage%b + Redraws your mainpages. (same as %b.makeindexpage%b) + +See also: makeindexpage +%{help=makeindexpage}%{+n} +### %bmakeindexpage%b + Redraws your mainpages. (same as %b.makemainpage%b) + +See also: makemainpage +%{help=logs2html module}%{+n} +### %blogs2html module%b + This module convert all log files of your eggdrop in html format. + + The following commands are provided by the logs2html module: +%{+n} + %bconvertalllogs makemainpage%b + %bconvertlogs makeindexpage%b +%{help=all}%{+n} +### %blogs2html module%b commands +%{+n} + %bconvertalllogs makemainpage%b + %bconvertlogs makeindexpage%b diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/htmloperations.c src/eggdrop-1.8.4/src/mod/logs2html.mod/htmloperations.c --- ./src/mod/logs2html.mod/htmloperations.c 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/htmloperations.c 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,349 @@ +/* + * htmloperations.c -- part of logs2html.mod + * + * Written by Fedotov Alexander aka Shmupsik aka shurikvz + * + * 2004-2009 year + */ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/****************************************************************************/ +/* +* function void writecss +* +* Input: +* +* +* +* +* Output: +* +* +* Discription: +* +* +*/ +static void WriteCSSFile(FILE *dst_file) +{ + str_write(dst_file, "@charset \"utf-8\";\n"); + str_write(dst_file, "/* CSS Document */\n\n"); + + str_write(dst_file, " \n\n"); + + return; +} diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.danish.lang src/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.danish.lang --- ./src/mod/logs2html.mod/language/logs2html.danish.lang 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/language/logs2html.danish.lang 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,38 @@ +# logs2html.danish.lang +# language messages for the logs2html module + +# Year +0xe000,�r + +# Back to mainpage link +0xe001,Hjem + +# Up link +0xe002,top + +# Backward, forward link +0xe003,forrige +0xe004,n�ste + +# Month names +0xe005,Januar +0xe006,Februar +0xe007,Marts +0xe008,April +0xe009,M� +0xe010,Juni +0xe011,Juli +0xe012,August +0xe013,September +0xe014,Oktober +0xe015,November +0xe016,December + +# Days of week names +0xe017,S�n. +0xe018,Man. +0xe019,Tir. +0xe020,Ons. +0xe021,Tor. +0xe022,Fre. +0xe023,L�r. diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.english.lang src/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.english.lang --- ./src/mod/logs2html.mod/language/logs2html.english.lang 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/language/logs2html.english.lang 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,38 @@ +# logs2html.english.lang +# language messages for the logs2html module + +# Year +0xe000,year + +# Back to mainpage link +0xe001,Main page + +# Up link +0xe002,up + +# Backward, forward link +0xe003,back +0xe004,next + +# Month names +0xe005,January +0xe006,February +0xe007,March +0xe008,April +0xe009,May +0xe010,June +0xe011,July +0xe012,August +0xe013,September +0xe014,October +0xe015,November +0xe016,December + +# Days of week names +0xe017,Su +0xe018,Mo +0xe019,Tu +0xe020,Wn +0xe021,Th +0xe022,Fr +0xe023,St diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.finnish.lang src/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.finnish.lang --- ./src/mod/logs2html.mod/language/logs2html.finnish.lang 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/language/logs2html.finnish.lang 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,38 @@ +# logs2html.finnish.lang +# language messages for the logs2html module + +# Year +0xe000,vuosi + +# Back to mainpage link +0xe001,Koti + +# Up link +0xe002,yl�s + +# Backward, forward link +0xe003,edellinen +0xe004,seuraava + +# Month names +0xe005,Tammikuu +0xe006,Helmikuu +0xe007,Maaliskuu +0xe008,Huhtikuu +0xe009,Toukokuu +0xe010,Kes�kuu +0xe011,Hein�kuu +0xe012,Elokuu +0xe013,Syyskuu +0xe014,Lokakuu +0xe015,Marraskuu +0xe016,Joulukuu + +# Days of week names +0xe017,Su +0xe018,Ma +0xe019,Ti +0xe020,Ke +0xe021,To +0xe022,Pe +0xe023,La diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.french.lang src/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.french.lang --- ./src/mod/logs2html.mod/language/logs2html.french.lang 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/language/logs2html.french.lang 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,40 @@ +# logs2html.french.lang +# language messages for the logs2html module +# +# Thanks to skiidoo patch (2007) + +# Year +0xe000,Ann�e + +# Back to mainpage link +0xe001,Page principale + +# Up link +0xe002,haut + +# Backward, forward link +0xe003,Pr�c�dente +0xe004,Suivante + +# Month names +0xe005,Janvier +0xe006,F�vrier +0xe007,Mars +0xe008,Avril +0xe009,Mai +0xe010,Juin +0xe011,Juillet +0xe012,Ao�t +0xe013,Septembre +0xe014,Octobre +0xe015,Novembre +0xe016,D�cembre + +# Days of week names +0xe017,Di +0xe018,Lu +0xe019,Ma +0xe020,Me +0xe021,Je +0xe022,Ve +0xe023,Sa diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.german.lang src/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.german.lang --- ./src/mod/logs2html.mod/language/logs2html.german.lang 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/language/logs2html.german.lang 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,38 @@ +# logs2html.german.lang +# language messages for the logs2html module + +# Year +0xe000,jahr + +# Back to mainpage link +0xe001,Heim + +# Up link +0xe002,Spitze + +# Backward, forward link +0xe003,zur�ck +0xe004,n�chster + +# Month names +0xe005,Januar +0xe006,Februar +0xe007,M�rz +0xe008,April +0xe009,D�rfen +0xe010,Juni +0xe011,Juli +0xe012,August +0xe013,September +0xe014,Oktober +0xe015,November +0xe016,Dezember + +# Days of week names +0xe017,So +0xe018,Mo +0xe019,Di +0xe020,Mi +0xe021,Do +0xe022,Fr +0xe023,Sa diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.russian.lang src/eggdrop-1.8.4/src/mod/logs2html.mod/language/logs2html.russian.lang --- ./src/mod/logs2html.mod/language/logs2html.russian.lang 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/language/logs2html.russian.lang 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,38 @@ +# logs2html.ru.lang +# language messages for the logs2html module + +# Year +0xe000,��� + +# Back to mainpage link +0xe001,�� ������� �������� + +# Up link +0xe002,������ + +# Backward, forward link +0xe003,���������� +0xe004,��������� + +# Month names +0xe005,������ +0xe006,������� +0xe007,���� +0xe008,������ +0xe009,��� +0xe010,���� +0xe011,���� +0xe012,������ +0xe013,�������� +0xe014,������� +0xe015,������ +0xe016,������� + +# Days of week names +0xe017,�� +0xe018,�� +0xe019,�� +0xe020,�� +0xe021,�� +0xe022,�� +0xe023,�� diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/language.h src/eggdrop-1.8.4/src/mod/logs2html.mod/language.h --- ./src/mod/logs2html.mod/language.h 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/language.h 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,53 @@ +/* + * language.h -- part of logs2html.mod + * + * Written by Fedotov Alexander aka Gray_Angel aka Shmupsik + * + * 2004-2005 year + */ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef _EGG_MOD_LOGS2HTML_LANGUAGE_H +#define _EGG_MOD_LOGS2HTML_LANGUAGE_H + +#define LOGS2HTML_YEAR get_language(0xe000) +#define LOGS2HTML_MAINPAGE get_language(0xe001) +#define LOGS2HTML_UP get_language(0xe002) +#define LOGS2HTML_BACK get_language(0xe003) +#define LOGS2HTML_NEXT get_language(0xe004) + +#define LOGS2HTML_JANUARY get_language(0xe005) +#define LOGS2HTML_FEBRIARY get_language(0xe006) +#define LOGS2HTML_MARCH get_language(0xe007) +#define LOGS2HTML_APRIL get_language(0xe008) +#define LOGS2HTML_MAY get_language(0xe009) +#define LOGS2HTML_JUNE get_language(0xe010) +#define LOGS2HTML_JULY get_language(0xe011) +#define LOGS2HTML_AUGUST get_language(0xe012) +#define LOGS2HTML_SEPTEMBER get_language(0xe013) +#define LOGS2HTML_OCTOBER get_language(0xe014) +#define LOGS2HTML_NOVEMBER get_language(0xe015) +#define LOGS2HTML_DECEMBER get_language(0xe016) + +#define LOGS2HTML_SUNDAY get_language(0xe017) +#define LOGS2HTML_MONDAY get_language(0xe018) +#define LOGS2HTML_TUESDAY get_language(0xe019) +#define LOGS2HTML_WEDNESDAY get_language(0xe020) +#define LOGS2HTML_THURSDAY get_language(0xe021) +#define LOGS2HTML_FRIDAY get_language(0xe022) +#define LOGS2HTML_SATURDAY get_language(0xe023) + +#endif diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/logs2html.c src/eggdrop-1.8.4/src/mod/logs2html.mod/logs2html.c --- ./src/mod/logs2html.mod/logs2html.c 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/logs2html.c 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,1679 @@ +/* + * logs2html.c -- part of logs2html.mod + * + * Written by Fedotov Alexander aka Shmupsik aka shurikvz + * + * 2004-2009 year + * + * Patch and some changes to v.2.3.4 by skiidoo (2007) + * + */ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +#define MODULE_NAME "logs2html" +#define MAKING_LOGS2HTML +#include "src/mod/module.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "logs2html.h" +#include "language.h" + +#undef global + +#define MODULE_MAJOR 2 +#define MODULE_MINOR 4 +#define MODULE_SUBMINOR 3 +#define MODULE_BUILD "(ac100-ru fork)" + +static Function *global = NULL; + +static int shtime; +static int keep_all_logs; +static char logfile_suffix[21]; + +static int lines_per_page; +static int start_year; +static int month_block_orientation; +static int dont_print_time; +static int dont_print_join; +static int dont_print_left; +static int dont_print_modechange; +static int dont_print_nickchange; +static int dont_print_kick; +static int dont_print_else; + +static int month_cols_count = 3; +static int month_rows_count = 4; + +static char mainpage_top_filename[257] = "\0"; +static char mainpage_bottom_filename[257] = "\0"; +static char logspage_top_filename[257] = "\0"; +static char logspage_bottom_filename[257] = "\0"; +static char userstyle_filename[257] = "\0"; +static char encoding_string[31] = "\0"; + +static l2hchan_t *logs2htmlchanlist = NULL; // Here we keep list of our logs + +/* for language file */ +static char month_names[12][MAX_MONTH_LENGTH]; +static char days_names[7][MAX_DAY_LENGTH]; + +static regex_t re_uri, re_uritrunc, re_email; + +static void logs2html_hook_5minutely(void); +static void logs2html_hook_hourly(void); +static void logs2html_hook_rehash(void); +static void logs2html_hook_pre_rehash(void); +static void event_addlogs2htmlchan(void); + +#ifndef _strlcpy +#include "strlcpy.c" +#endif +#include "fileoperations.c" +#include "htmloperations.c" +#include "tcllogs2html.c" + + +/* + * Code starts here + */ + +/* + * getdayofweek() + * Input: + * year - год + * month - месяц + * day - день + * + * Output: + * 0 - Понедельник, 1 - Вторник, 2 - Среда и.т.д. + * + * Description: + * Функция вычисляет на какой день недели приходится переданная дата + */ +static int getdayofweek(int year, int month, int day) +{ + long int d1, d2, d3; + + long int tdays = year * 12 + month - 3; + month = tdays % 12; + year = (tdays - month) / 12; + + d1 = ((146097 * (year - (year % 100)) / 100) - ((146097 * (year - (year % 100)) / 100) % 4)) / 4; + d2 = ((1461 * (year % 100)) - ((1461 * (year % 100)) % 4)) / 4; + d3 = ((153 * month + 2) - ((153 * month + 2) % 5)) / 5 + day + 1721119; + + return (d1 + d2 + d3) % 7; +} /* getdayofweek() */ +/****************************************************************************/ + + +/****************************************************************************/ +static void makeindexpage(l2hchan_t *ch, int year) { + /* Compute how many rows we need */ + if (month_cols_count < 0) { month_cols_count = 3; } + if (month_cols_count > 12) { month_cols_count = 12; } + month_rows_count = (int)ceil(12.0 / (double)month_cols_count); + + time_t t = time(NULL); + struct tm tblock = *localtime(&t); + + FILE *file; + // calculate maximum possible filenamelength + int filenamelength = strlen(ch->outputpath) + strlen(SEP) + MAX(strlen(ch->mainpagename), strlen(ch->logspagename) + strlen("00") + strlen("00") + strlen("_pg000000")) + strlen("0000") + strlen(".html") + 1; + char *filename = nmalloc(filenamelength); + + egg_snprintf(filename, filenamelength, "%s%sdefault.css", ch->outputpath, SEP); + if ((file = openfile(filename, "wb", false)) == NULL) { + nfree(filename); + return; + } + WriteCSSFile(file); + fclose(file); + + if (tblock.tm_year + 1900 == year) { + egg_snprintf(filename, filenamelength, "%s%s%s.html", ch->outputpath, SEP, ch->mainpagename); + } else { + egg_snprintf(filename, filenamelength, "%s%s%s%d.html", ch->outputpath, SEP, ch->mainpagename, year); + } + if ((file = openfile(filename, "wb", false)) == NULL) { + nfree(filename); + return; + } + + str_write(file, "\n"); + str_write(file, "\n"); + str_write(file, "\n"); + if (strlen(encoding_string) > 0) {str_write(file, "\t\n", encoding_string); } + str_write(file, "\t\n", ch->mainpagetitle); + str_write(file, "\t\n", ch->mainpagetitle); + str_write(file, "\t\n", MODULE_MAJOR, MODULE_MINOR, MODULE_SUBMINOR, MODULE_BUILD); + str_write(file, "\t\n"); + str_write(file, "\t\n"); + str_write(file, "\t\n"); + str_write(file, "\t\n"); + if (strlen(userstyle_filename) > 0) str_write(file, "\t\n"); + str_write(file, "\t%s %d %s\n", ch->mainpagetitle, year, LOGS2HTML_YEAR); + str_write(file, "\t\n"); + str_write(file, "\n\n"); + + str_write(file, "\n"); + str_write(file, "\t
\n"); + + if (strlen(mainpage_top_filename) > 0) { + str_write(file, "\t\t
\n"); + writefromexfile(file, mainpage_top_filename); + str_write(file, "\n\t\t
\n"); + } + + str_write(file, "\t\t
\n

%s
%d %s

\n\t\t
\n", ch->mainpagetitle, year, LOGS2HTML_YEAR); + str_write(file, "\t\t
\n"); + + int loopyear; + for(loopyear = start_year; loopyear <= tblock.tm_year + 1900; loopyear++) { + str_write(file, "\t\t\t
"); + if (loopyear == year) { + str_write(file, "%d", loopyear); + } else { + if (tblock.tm_year + 1900 == loopyear) { + egg_snprintf(filename, filenamelength, "%s.html", ch->mainpagename); + } else { + egg_snprintf(filename, filenamelength, "%s%d.html", ch->mainpagename, loopyear); + } + str_write(file, "%d", filename, loopyear); + } + str_write(file, "
\n"); + } + str_write(file, "\t\t
\n\n"); + str_write(file, "\t\t
\n"); + str_write(file, "\t\t\t\n"); + + int i, j, k; + str_write(file, "\t\t\t\t\n"); + for(k = 0; k < month_cols_count; k++) { + str_write(file, "\t\t\t\t\t\n", (int)(100 / month_cols_count)); + } + str_write(file, "\t\t\t\t\n"); + + for(i = 0; i < month_rows_count; i++) { + str_write(file, "\t\t\t\t\n"); + for(j = 0; j < month_cols_count; j++) { + int month = i * month_cols_count + j; + int row, col; + + str_write(file, "\t\t\t\t\t\n"); + } + str_write(file, "\t\t\t\t\n"); + } + + str_write(file, "\t\t\t
\n\t\t\t\t\t\t\n"); + str_write(file, "\t\t\t\t\t\t\t\n"); + for(k = 0; k < 7; k++) { + str_write(file, "\t\t\t\t\t\t\t\t\n", (int)(100 / 7)); + } + str_write(file, "\t\t\t\t\t\t\t\n"); + + if ((month >= 0) && (month <= 11)) { + + if (month_block_orientation != 0) { + /* + * Horisontal block orientation + * Each table has: 1 row: month name, 1 row: day of week names, 6 rows: days of month + * 7 columns: days of month. + * Total we must create 8x7 table + */ + str_write(file, "\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n", month_names[month]); + str_write(file, "\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n", + days_names[0], days_names[1], days_names[2], days_names[3], days_names[4], days_names[5], days_names[6]); + for(row = 0; row < 6; row++) { + str_write(file, "\t\t\t\t\t\t\t\n", (row % 2 == 0) ? "odd" : "even"); + for(col = 0; col < 7; col++) { + int day = row * 7 + (col + 1) - getdayofweek(year, month + 1, 1); + if ((day >= 1) && (day <= DAYS_IN_MONTH(year, month))) { + egg_snprintf(filename, filenamelength, "%s%s%s%d%02d%02d_pg%d.html", ch->outputpath, SEP, ch->logspagename, year, month + 1, day, 1); + //Lets check if file exist and we can paste link to it. If not exist we try to make it. + if (!file_readable(filename)) { + convertfile(ch, year, month + 1, day); + } + if (file_readable(filename)) { + /* let write withount full path */ + egg_snprintf(filename, filenamelength, "%s%d%02d%02d_pg%d.html", ch->logspagename, year, month + 1, day, 1); + str_write(file, "\t\t\t\t\t\t\t\t\n", filename, day); + } else { + str_write(file, "\t\t\t\t\t\t\t\t\n", day); + } + } else { + str_write(file, "\t\t\t\t\t\t\t\t\n"); + } + } + str_write(file, "\t\t\t\t\t\t\t\n"); + } + } else { + /* + * Vertical block orientation + * Each table has: 1 row: month name, 7 rows: (day of week + days of month) names, + * 1 column: day of week names, 6 columns: days of month. + * Total we must create 8x7 table + */ + str_write(file, "\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n", month_names[month]); + for(row = 0; row < 7; row++) { + str_write(file, "\t\t\t\t\t\t\t\n", (row % 2 == 0) ? "odd" : "even"); + for(col = 0; col < 7; col++) { + /* First column - day names. */ + if (col == 0) { + if (row == 6) { + str_write(file, "\t\t\t\t\t\t\t\t\n", days_names[row]); + } else { + str_write(file, "\t\t\t\t\t\t\t\t\n", days_names[row]); + } + continue; + } + int day = (col - 1) * 7 + (row + 1) - getdayofweek(year, month + 1, 1); + if ((day >= 1) && (day <= DAYS_IN_MONTH(year, month))) { + egg_snprintf(filename, filenamelength, "%s%s%s%d%02d%02d_pg%d.html", ch->outputpath, SEP, ch->logspagename, year, month + 1, day, 1); + //Lets check if file exist and we can paste link to it. If not exist we try to make it. + if (!file_readable(filename)) { + convertfile(ch, year, month + 1, day); + } + if (file_readable(filename)) { + /* let write withount full path */ + egg_snprintf(filename, filenamelength, "%s%d%02d%02d_pg%d.html", ch->logspagename, year, month + 1, day, 1); + str_write(file, "\t\t\t\t\t\t\t\t\n", filename, day); + } else { + str_write(file, "\t\t\t\t\t\t\t\t\n", day); + } + } else { + str_write(file, "\t\t\t\t\t\t\t\t\n"); + } + } + str_write(file, "\t\t\t\t\t\t\t\n"); + } + } + } else { + /* No more months :) Write empty month block */ + for(row = 0; row < 8; row++) { + str_write(file, "\t\t\t\t\t\t\t\n"); + } + } + str_write(file, "\t\t\t\t\t\t
%s
%s%s%s%s%s%s%s
%d%d 
%s
%s%s%d%d 
       
\n\t\t\t\t\t
\n"); + str_write(file, "\t\t
\n\n"); + + str_write(file, "\t\t
\n"); + str_write(file, "\t\t
\n

Generated by logs2html module for eggdrop v.%d.%d.%d%s
", MODULE_MAJOR, MODULE_MINOR, MODULE_SUBMINOR, MODULE_BUILD); + str_write(file, "Find latest version at http://sourceforge.net/projects/logs2html or http://www.halftone.ru
"); + str_write(file, "Fork at https://github.com/ac100-ru/logs2html.mod

\n\t\t
\n"); + + if (strlen(mainpage_bottom_filename) > 0) { + str_write(file, "\t\t
\n"); + writefromexfile(file, mainpage_bottom_filename); + str_write(file, "\n\t\t
\n"); + } + + str_write(file, "\t
\n"); + str_write(file, "\n"); + str_write(file, "\n"); + + fclose(file); + nfree(filename); + + return; +} /* makeindexpage() */ +/****************************************************************************/ + + +/****************************************************************************/ +/* + * function void convertfile(l2hchan_t *ch, int year, int month, int day) + * + * Input: + * + * + * + * Output: + * + * + * Discription: + * переводит файлы из текстового вида в формат HTML + */ +static void convertfile(l2hchan_t *ch, int year, int month, int day) { + + FILE *file, *src_file; + char buffer[LOGLINELEN], data[LOGLINELEN], ct[81], stamp[33]; + char *buf_ptr; + + struct tm tblock; + tblock.tm_year = year - 1900; + tblock.tm_mon = month - 1; + tblock.tm_mday = day; + tblock.tm_wday = getdayofweek(year, month, day); + tblock.tm_hour = 0; + tblock.tm_min = 0; + tblock.tm_sec = 1; + if (!logfile_suffix[0]) + egg_strftime(ct, 12, ".%d%b%Y", &tblock); + else + egg_strftime(ct, 80, logfile_suffix, &tblock); + ct[80] = '\0'; + + // calculate maximum possible filenamelength + int filenamelength = MAX(strlen(ch->outputpath), strlen(ch->inputpath)) + MAX(strlen(SEP) + strlen(ch->logspagename) + strlen("0000") + strlen("00") + strlen("00") + strlen("_pg000000") + strlen(".html"), strlen(ct)) + 1; + char *filename = nmalloc(filenamelength); + egg_snprintf(filename, filenamelength, "%s%s", ch->inputpath, ct); + if ((src_file = openfile(filename, "r", true)) == NULL) { + nfree(filename); + return; + } + + if (lines_per_page < 0) lines_per_page = 0; + + int lines_count, tsl; + int pages_count = 0; + while(!feof(src_file)) { + lines_count = lines_per_page; + pages_count++; + + egg_snprintf(filename, filenamelength, "%s%s%s%d%02d%02d_pg%d.html", ch->outputpath, SEP, ch->logspagename, year, month, day, pages_count); + if ((file = openfile(filename, "wb", false)) == NULL) { + fclose(src_file); + putlog(LOG_MISC, "*", "logs2html: Error occured on converting %d page of file \"%s\"!", pages_count, filename); + nfree(filename); + return; + } + + str_write(file, "\n"); + str_write(file, "\n"); + str_write(file, "\n"); + if (strlen(encoding_string) > 0) {str_write(file, "\t\n", encoding_string); } + str_write(file, "\t\n", ch->logspagetitle); + str_write(file, "\t\n", ch->logspagetitle); + str_write(file, "\t\n", MODULE_MAJOR, MODULE_MINOR, MODULE_SUBMINOR, MODULE_BUILD); + str_write(file, "\t\n"); + str_write(file, "\t\n"); + str_write(file, "\t\n"); + str_write(file, "\t\n"); + if (strlen(userstyle_filename) > 0) str_write(file, "\t\n"); + str_write(file, "\t%s. %d/%d/%d.\n", ch->logspagetitle, day, month, year); + str_write(file, "\t\n"); + str_write(file, "\n\n"); + + str_write(file, "\n"); + str_write(file, "\t
\n"); + + if (strlen(logspage_top_filename) > 0) { + str_write(file, "\t\t
\n"); + writefromexfile(file, logspage_top_filename); + str_write(file, "\n\t\t
\n"); + } + + str_write(file, "\t\t
\n", ch->mainpagetitle, year, LOGS2HTML_YEAR); + str_write(file, "\t\t\t\n"); + + str_write(file, "\t\t
\n"); + str_write(file, "\t\t
\n"); + + time_t t = time(NULL); + tblock = *localtime(&t); + if (tblock.tm_year + 1900 == year) { + str_write(file, "\t\t\t\n", ch->mainpagename, LOGS2HTML_MAINPAGE); + } else { + str_write(file, "\t\t\t\n", ch->mainpagename, year, LOGS2HTML_MAINPAGE); + } + + while ((lines_count > 0) || (lines_per_page == 0)) { + + buf_ptr = fgets(buffer, sizeof buffer, src_file); + if (buf_ptr == NULL) break; + + remove_crlf(&buf_ptr); + if (!buf_ptr[0]) continue; + + /* if timestamp exist cut time from string */ + data[0] = '\0'; + strcat(data, "\t\t\t
 "); + if (shtime) { + egg_strftime(stamp, sizeof(stamp) - 1, LOG_TS, &tblock); /* Print dummy time */ + tsl = strlen(stamp); + if (dont_print_time == 0) { + strcat(data, ""); + strncat(data, buf_ptr, tsl); + strcat(data, " "); + } + buf_ptr += (++tsl); + } + if (strncmp(buf_ptr, "--- ", 4) == 0) { /* we don't really need this string I think */ + continue; + } + + bool IsElseClass = false; + if (strncmp(buf_ptr, "Action: ", 8) == 0) { /* command: /me */ + str_write(file, "%s", data); + buf_ptr += 7; + str_write(file, " ***"); + } else { /* nick */ + char *p = strstr(buf_ptr, "> "); + if ((p != NULL) && (strncmp(buf_ptr, "<", 1) == 0)) { + str_write(file, "%s", data); + buf_ptr++; + data[0] = '\0'; + strncat(data, buf_ptr, p - buf_ptr); + str_write(file, "<%s> ", data); + buf_ptr += (p - buf_ptr + 1); + } else { + IsElseClass = true; + if (strstr(buf_ptr, " joined ") != NULL) { + if (dont_print_join != 0) {continue; } + str_write(file, "%s", data); + str_write(file, " "); + } else if (strstr(buf_ptr, " left irc: ") != NULL) { + if (dont_print_left != 0) {continue; } + str_write(file, "%s", data); + str_write(file, " "); + } else if (strstr(buf_ptr, " left ") != NULL) { + if (dont_print_left != 0) {continue; } + str_write(file, "%s", data); + str_write(file, " "); + } else if (strstr(buf_ptr, "Nick change: ") != NULL) { + if (dont_print_nickchange != 0) {continue; } + str_write(file, "%s", data); + str_write(file, " "); + } else if (strstr(buf_ptr, ": mode change '") != NULL) { + if (dont_print_modechange != 0) {continue; } + str_write(file, "%s", data); + str_write(file, " "); + } else if (strstr(buf_ptr, " kicked from ") != NULL) { + if (dont_print_kick != 0) {continue; } + str_write(file, "%s", data); + str_write(file, " "); + } else { + if (dont_print_else != 0) {continue; } + str_write(file, "%s", data); + str_write(file, " "); + } + } + } + + lines_count--; + + char *realloc_buf = NULL; + replace_chars(buf_ptr, &realloc_buf); + // We have special chars that we replaced. Now point buf_ptr to the realloc_buf, + // strip_codes() will now work not with 'buffer' but with 'realloc_buf' + if (realloc_buf != NULL) { + buf_ptr = realloc_buf; + } + + l2hnode_t *tree = NULL; + strip_codes(buf_ptr, &tree); + l2hnode_t *ptree, *qtree; ptree = qtree = tree; + + data[0] = '\0'; + int last_tag = 0; + while (tree != NULL) { + if (tree->node_so != last_tag) { + data[0] = '\0'; + strncat(data, buf_ptr + last_tag, tree->node_so - last_tag); last_tag = tree->node_so; + str_write(file, "%s", data); + } + + switch (tree->node_type) { + case NODE_MIRCCOLOR: + { + if (tree->node_close) { + str_write(file, ""); + } + if (tree->node_data != NULL) { + str_write(file, "", tree->node_data); + } + } + break; + case NODE_FONTSTYLE: + { + if (tree->node_close) { + str_write(file, ""); + } else { + str_write(file, "", tree->node_data); + } + } + break; + case NODE_EMAIL: + { + if (!IsElseClass) { //Don't print emails on join/left, bans etc. Because client mask is look like email. + if (tree->node_close) { + str_write(file, ""); + } else { + str_write(file, "", tree->node_data); + } + } + } + break; + case NODE_URI: + { + if (tree->node_close) { + str_write(file, ""); + } else { + str_write(file, "", tree->node_data); + } + } + break; + case NODE_SPECIAL: + { + str_write(file, "%s", tree->node_data); + } + break; + } + + tree = tree->next; + } + str_write(file, "%s", buf_ptr + last_tag); + + str_write(file, "
\n"); + + // clear memory + while (qtree != NULL) { + qtree = ptree->next; + if (ptree->node_data != NULL) { nfree(ptree->node_data); } + nfree(ptree); + ptree = qtree; + } + if (realloc_buf != NULL) { + nfree(realloc_buf); + } + } + fclose(file); + } + fclose(src_file); + + /* + * Now, if log is splited to some number of lines (lines_per_page) we write links to other pages, and also final close tags for html files. + */ + int i, j; + for (i = 1; i <= pages_count; i++) { + egg_snprintf(filename, filenamelength, "%s%s%s%d%02d%02d_pg%d.html", ch->outputpath, SEP, ch->logspagename, year, month, day, i); + if ((file = openfile(filename, "ab", false)) == NULL) { + putlog(LOG_MISC, "*", "logs2html: Error occured on converting %d page of file \"%s\"!", i, filename); + nfree(filename); + return; + } + + str_write(file, "\t\t
\n"); + if (pages_count > 1) { + str_write(file, "\t\t
"); + if (i == 1) { + str_write(file, LOGS2HTML_BACK); + } else { + egg_snprintf(filename, filenamelength, "%s%d%02d%02d_pg%d.html", ch->logspagename, year, month, day, i-1); + str_write(file, " %s", filename, LOGS2HTML_BACK); + } + str_write(file, " "); + if (i == pages_count) { + str_write(file, LOGS2HTML_NEXT); + } else { + egg_snprintf(filename, filenamelength, "%s%d%02d%02d_pg%d.html", ch->logspagename, year, month, day, i+1); + str_write(file, "%s ", filename, LOGS2HTML_NEXT); + } + str_write(file, "
"); + for (j = 1; j <= pages_count; j++) { + egg_snprintf(filename, filenamelength, "%s%d%02d%02d_pg%d.html", ch->logspagename, year, month, day, j); + if (j != i) { + str_write(file, "%d", filename, j); + } else { + str_write(file, "%d", j); + } + } + str_write(file, "
\n"); + } + str_write(file, "\t\t\n", LOGS2HTML_UP); + + str_write(file, "\t\t
\n"); + str_write(file, "\t\t
\n

Generated by logs2html module for eggdrop v.%d.%d.%d%s
", MODULE_MAJOR, MODULE_MINOR, MODULE_SUBMINOR, MODULE_BUILD); + str_write(file, "Find latest version at http://sourceforge.net/projects/logs2html or http://www.halftone.ru
"); + str_write(file, "Fork at http://github.com/ac100-ru/logs2html.mod

\n\t\t
\n"); + + if (strlen(logspage_bottom_filename) > 0) { + str_write(file, "\t\t
\n"); + writefromexfile(file, logspage_bottom_filename); + str_write(file, "\n\t\t
\n"); + } + + str_write(file, "\t
\n"); + str_write(file, "\n"); + str_write(file, "\n"); + + fclose(file); + } + + nfree(filename); + + return; +} /* convertfile() */ +/****************************************************************************/ + + +/****************************************************************************/ +static void strip_codes(char *buf_ptr_copy, l2hnode_t **string_tree) { + /* + * void strip_mirc_codes(int flags, char *text) + * copied from src/dcc.c and modified + * + * Copyright (C) 1997 Robey Pointer + * Copyright (C) 1999 - 2006 Eggheads Development Team + */ + char *dd = buf_ptr_copy; + char *start = buf_ptr_copy; + bool t_0x02_opened, t_0x03_opened, t_0x07_opened, t_0x1f_opened; + t_0x02_opened = t_0x03_opened = t_0x07_opened = t_0x1f_opened = false; + + l2hnode_t *temp_tree = NULL; + l2hnode_t *newnode; + + char fg_color[3], bg_color[3]; + bg_color[0] = '\0'; + while (*buf_ptr_copy) { + switch (*buf_ptr_copy) { + case 0xf: /* close all open tags */ + { + buf_ptr_copy++; + if (t_0x02_opened) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = true; + newnode->node_data = NULL; + node_append(&temp_tree, newnode); + t_0x02_opened = false; + } + if (t_0x07_opened) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = true; + newnode->node_data = NULL; + node_append(&temp_tree, newnode); + t_0x07_opened = false; + } + if (t_0x1f_opened) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = true; + newnode->node_data = NULL; + node_append(&temp_tree, newnode); + t_0x1f_opened = false; + } + if (t_0x03_opened) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_MIRCCOLOR; + newnode->node_so = dd - start; + newnode->node_data = NULL; + newnode->node_close = true; + node_append(&temp_tree, newnode); + t_0x03_opened = false; + bg_color[0] = '\0'; + } + continue; + } + break; + case 3: /* mIRC colors? */ + { + buf_ptr_copy++; /* Skip over the ^C */ + fg_color[0] = '\0'; + if (egg_isdigit(*buf_ptr_copy)) { /* Is the first char a number? */ + fg_color[0] = *buf_ptr_copy; + fg_color[1] = '\0'; + buf_ptr_copy ++; /* Skip over the first digit */ + if (egg_isdigit(*buf_ptr_copy)) { /* Is this a double digit number? */ + fg_color[1] = *buf_ptr_copy; + fg_color[2] = '\0'; + buf_ptr_copy++; + } + // Even if we don't have background color in bg_color we have previous background, and we'll use it + if (*buf_ptr_copy == ',') { /* Do we have a background color next? */ + buf_ptr_copy++; /* Skip over the , */ + if (egg_isdigit(*buf_ptr_copy)) { + bg_color[0] = *buf_ptr_copy; + bg_color[1] = '\0'; + buf_ptr_copy ++; /* Skip over the first digit */ + } + if (egg_isdigit(*buf_ptr_copy)) { /* Is this a double digit number? */ + bg_color[1] = *buf_ptr_copy; + bg_color[2] = '\0'; + buf_ptr_copy++; /* Is it a double digit? */ + } + } + + if ((strlen(fg_color) > 0) && ((atoi(fg_color) < 0) || (atoi(fg_color) > 15))) { + fg_color[0] = '\0'; + } + if (((strlen(bg_color) > 0) && ((atoi(bg_color) < 0) || (atoi(bg_color) > 15))) || (strlen(fg_color) == 0)) { + bg_color[0] = '\0'; + } + + if (strlen(fg_color) > 0) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_MIRCCOLOR; + newnode->node_so = dd - start; + newnode->node_close = t_0x03_opened; + if (strlen(bg_color) > 0) { + newnode->node_data = nmalloc(6); + egg_snprintf(newnode->node_data, 6, "c%02.2d%02.2d", atoi(fg_color), atoi(bg_color)); + } else { + newnode->node_data = nmalloc(4); + egg_snprintf(newnode->node_data, 4, "f%02.2d", atoi(fg_color)); + } + node_append(&temp_tree, newnode); + t_0x03_opened = true; + } + } else { /* Single ^C char - it was a close tag */ + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_MIRCCOLOR; + newnode->node_so = dd - start; + newnode->node_data = NULL; + newnode->node_close = t_0x03_opened; + node_append(&temp_tree, newnode); + t_0x03_opened = false; + bg_color[0] = '\0'; + } + continue; + } + break; + case 2: /* Bold text */ + { + buf_ptr_copy++; + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = t_0x02_opened; + if (t_0x02_opened) { + newnode->node_data = NULL; + } else { + newnode->node_data = nmalloc(strlen("font-weight:bold") + 1); + strlcpy(newnode->node_data, "font-weight:bold", strlen("font-weight:bold") + 1); + } + t_0x02_opened = !t_0x02_opened; + node_append(&temp_tree, newnode); + continue; + } + break; + case 7: /* Italic text */ + { + buf_ptr_copy++; + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = t_0x07_opened; + if (t_0x07_opened) { + newnode->node_data = NULL; + } else { + newnode->node_data = nmalloc(strlen("font-style:italic") + 1); + strlcpy(newnode->node_data, "font-style:italic", strlen("font-style:italic") + 1); + } + t_0x07_opened = !t_0x07_opened; + node_append(&temp_tree, newnode); + continue; + } + break; + case 0x16: /* Reverse video */ + { + buf_ptr_copy++; + continue; + } + break; + case 0x1f: /* Underlined text */ + { + buf_ptr_copy++; + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = t_0x1f_opened; + if (t_0x1f_opened) { + newnode->node_data = NULL; + } else { + newnode->node_data = nmalloc(strlen("text-decoration:underline") + 1); + strlcpy(newnode->node_data, "text-decoration:underline", strlen("text-decoration:underline") + 1); + } + t_0x1f_opened = !t_0x1f_opened; + node_append(&temp_tree, newnode); + continue; + } + break; + case 033: + { + buf_ptr_copy++; + if (*buf_ptr_copy == '[') { + buf_ptr_copy++; + while ((*buf_ptr_copy == ';') || egg_isdigit(*buf_ptr_copy)) { + buf_ptr_copy++; + } + if (*buf_ptr_copy) { + buf_ptr_copy++; /* also kill the following char */ + } + } + continue; + } + break; + } + *dd++ = *buf_ptr_copy++; /* Move on to the next char */ + } + *dd = 0; + /* + * strip_mirc_codes() ends here. + */ + + //At that point we have temp_tree which points to the linked list of mirc codes and special chars (bold, italic) positions. + // Now close any unclose tag + + if (t_0x02_opened) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = true; + newnode->node_data = NULL; + node_append(&temp_tree, newnode); + t_0x02_opened = false; + } + if (t_0x07_opened) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = true; + newnode->node_data = NULL; + node_append(&temp_tree, newnode); + t_0x07_opened = false; + } + if (t_0x1f_opened) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_FONTSTYLE; + newnode->node_so = dd - start; + newnode->node_close = true; + newnode->node_data = NULL; + node_append(&temp_tree, newnode); + t_0x1f_opened = false; + } + if (t_0x03_opened) { + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_MIRCCOLOR; + newnode->node_so = dd - start; + newnode->node_data = NULL; + newnode->node_close = true; + node_append(&temp_tree, newnode); + t_0x03_opened = false; + bg_color[0] = '\0'; + } + + + // rewind to the start of the string + dd = start; + + int status_uri, status_email; + regmatch_t pmatch_uri, pmatch_email; + + do { + status_uri = regexec(&re_uri, dd, (size_t) 1, &pmatch_uri, 0); + status_email = regexec(&re_email, dd, (size_t) 1, &pmatch_email, 0); + + int method; + if ((status_email == 0) && (status_uri == 0)) { // We have uri & email in string + if (pmatch_uri.rm_so == pmatch_email.rm_so) { // I think that it never must be so, but if it is - better lets write it as simple text + method = 3; + } else if (pmatch_uri.rm_so > pmatch_email.rm_so) { + method = 1; + } else { + method = 2; + } + } else if ((status_email == 0) && (status_uri != 0)) { // We have only email in string + method = 1; + } else if ((status_email != 0) && (status_uri == 0)) { // We have only uri in string + method = 2; + } else { // No uri or email in string, simply assign temp_tree to result + method = 3; + } + + l2hnode_t *temp; + if (method == 1) { + while ((temp_tree != NULL) && (temp_tree->node_so < pmatch_email.rm_so + (dd - start))) { + temp = temp_tree; + temp_tree = temp_tree->next; + temp->next = NULL; + node_append(string_tree, temp); + } + + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_EMAIL; + newnode->node_so = pmatch_email.rm_so + (dd - start); + newnode->node_data = nmalloc(pmatch_email.rm_eo - pmatch_email.rm_so + 1); + newnode->node_data[0] = '\0'; + strncat(newnode->node_data, dd + pmatch_email.rm_so, pmatch_email.rm_eo - pmatch_email.rm_so); + newnode->node_close = false; + node_append(string_tree, newnode); + + while ((temp_tree != NULL) && ((temp_tree->node_so < pmatch_email.rm_eo + (dd - start)) || ((temp_tree->node_so == pmatch_email.rm_eo + (dd - start)) && (temp_tree->node_close == true)))) { + temp = temp_tree; + temp_tree = temp_tree->next; + temp->next = NULL; + node_append(string_tree, temp); + } + + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_EMAIL; + newnode->node_so = pmatch_email.rm_eo + (dd - start); + newnode->node_data = NULL; + newnode->node_close = true; + node_append(string_tree, newnode); + dd += pmatch_email.rm_eo; + continue; + } else if (method == 2) { + while ((temp_tree != NULL) && (temp_tree->node_so < pmatch_uri.rm_so + (dd - start))) { + temp = temp_tree; + temp_tree = temp_tree->next; + temp->next = NULL; + node_append(string_tree, temp); + } + + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_URI; + newnode->node_so = pmatch_uri.rm_so + (dd - start); + // if uri begins with protocol name - simply output our uri, else we must add protocol name to our uri + if (regexec(&re_uritrunc, dd + pmatch_uri.rm_so, (size_t) 0, NULL, 0) == 0) { + newnode->node_data = nmalloc(pmatch_uri.rm_eo - pmatch_uri.rm_so + 1); + newnode->node_data[0] = '\0'; + } else { + // if uri look like 'ftp.eggheads.org' we add 'ftp://' protocol, else let it be 'http://' + if (strncmp(dd + pmatch_uri.rm_so, "ftp.", 4) == 0) { + newnode->node_data = nmalloc(strlen("ftp://") + pmatch_uri.rm_eo - pmatch_uri.rm_so + 1); + newnode->node_data[0] = '\0'; + strncat(newnode->node_data, "ftp://", strlen("ftp://")); + } else { + newnode->node_data = nmalloc(strlen("http://") + pmatch_uri.rm_eo - pmatch_uri.rm_so + 1); + newnode->node_data[0] = '\0'; + strncat(newnode->node_data, "http://", strlen("http://")); + } + } + strncat(newnode->node_data, dd + pmatch_uri.rm_so, pmatch_uri.rm_eo - pmatch_uri.rm_so); + newnode->node_close = false; + node_append(string_tree, newnode); + + while ((temp_tree != NULL) && ((temp_tree->node_so < pmatch_uri.rm_eo + (dd - start)) || ((temp_tree->node_so == pmatch_uri.rm_eo + (dd - start)) && (temp_tree->node_close == true)))) { + temp = temp_tree; + temp_tree = temp_tree->next; + temp->next = NULL; + node_append(string_tree, temp); + } + + newnode = nmalloc(sizeof(struct l2hnode_struct)); + newnode->next = NULL; + newnode->node_type = NODE_URI; + newnode->node_so = pmatch_uri.rm_eo + (dd - start); + newnode->node_data = NULL; + newnode->node_close = true; + node_append(string_tree, newnode); + dd += pmatch_uri.rm_eo; + continue; + } else if (method == 3) { + while (temp_tree != NULL) { + temp = temp_tree; + temp_tree = temp_tree->next; + temp->next = NULL; + node_append(string_tree, temp); + } + break; + } + + } while ((status_email == 0) || (status_uri == 0)); + + + return; +} +/****************************************************************************/ + + +/* + * int list_append(struct list_type **h, struct list_type *i) + * copied from src/userent.c and modified + * + * Copyright (C) 1997 Robey Pointer + * Copyright (C) 1999 - 2006 Eggheads Development Team + */ +static void node_append(struct l2hnode_struct **h, struct l2hnode_struct *i) +{ + for (; *h; h = &((*h)->next)); + *h = i; + return; +} +/* + * list_append() ends here. + */ + + +/****************************************************************************/ +static void replace_chars(char *buf_ptr_copy, char **realloc_buf) +{ + // Loop through string if there are chars, which we can safely replace with their xhtml analog, + // if there are - count number of bytes we need our string to grow + int realloc_size = 0; + char *dd = buf_ptr_copy; + + while (*dd) { + switch (*dd) { + case 0x3c: /* < */ + { + realloc_size += strlen("<") - strlen("<"); + } + break; + case 0x3e: /* > */ + { + realloc_size += strlen(">") - strlen(">"); + } + break; + case 0x22: /* " */ + { + realloc_size += strlen(""") - strlen(""""); + } + break; + case 0x26: /* & */ + { + realloc_size += strlen("&") - strlen("&"); + } + break; + } + dd++; /* Move on to the next char */ + } + + if (realloc_size > 0) { + (*realloc_buf) = nmalloc(strlen(buf_ptr_copy) + realloc_size + 1); + dd = (*realloc_buf); *dd = '\0'; + + while (*buf_ptr_copy) { + switch (*buf_ptr_copy) { + case 0x3c: /* < */ + { + strncat(dd, "<", strlen("<")); + buf_ptr_copy++; dd += strlen("<"); + continue; + } + break; + case 0x3e: /* > */ + { + strncat(dd, ">", strlen(">")); + buf_ptr_copy++; dd += strlen(">"); + continue; + } + break; + case 0x22: /* " */ + { + strncat(dd, """, strlen(""")); + buf_ptr_copy++; dd += strlen("""); + continue; + } + break; + case 0x26: /* & */ + { + strncat(dd, "&", strlen("&")); + buf_ptr_copy++; dd += strlen("&"); + continue; + } + break; + } + *dd++ = *buf_ptr_copy++; /* Move on to the next char */ + *dd = '\0'; /* for strncat(), cause string must be null terminated or we'll get buffer overflow */ + } + *dd = 0; + } + + return; +} +/****************************************************************************/ + + +/****************************************************************************/ +/* + * function int cmd_makemainpage(struct userrec *u, int idx, char *par) + * + * Input: + * + * + * + * Output: + * + * + * Discription: + * + */ +static int cmd_makemainpage(struct userrec *u, int idx, char *par) { + + time_t start, finish; + time(&start); + putlog(LOG_CMDS, "*", "#%s# begin creation of index pages.", dcc[idx].nick); + + time_t t = time(NULL); + struct tm tblock = *localtime(&t); + + l2hchan_t *p = logs2htmlchanlist; + while (p != NULL) { + int i; + + start_year = MIN(MAX(start_year, 2000), tblock.tm_year + 1900); + + for (i = start_year; i <= tblock.tm_year + 1900; i++) { + dprintf(idx, " Creating index page for channel '%s' for %d year.\n", p->channame, i); + makeindexpage(p, i); + } + p = p->next; + } + + putlog(LOG_CMDS, "*", "#%s# creation of index pages finished.", dcc[idx].nick); + time(&finish); + double elapsed_time = difftime(finish, start); + if (elapsed_time == 0.0) { + putlog(LOG_CMDS, "*", "#%s# It takes < 1 second.", dcc[idx].nick); + } + else { + putlog(LOG_CMDS, "*", "#%s# It takes %f second%s.", dcc[idx].nick, elapsed_time, (elapsed_time != 1.0) ? "s" : ""); + } + + return 0; +} /* cmd_makemainpage() */ +/****************************************************************************/ + + +/****************************************************************************/ +/* + * function int convertalllogs(struct userrec *u, int idx, char *par) + * + * Input: + * + * + * + * Output: + * + * + * Discription: + * + */ +static int cmd_convertalllogs(struct userrec *u, int idx, char *par) { + + return cmd_convertlogs(u, idx, "all"); +} /* convertalllogs() */ +/****************************************************************************/ + + +/****************************************************************************/ +static int cmd_convertlogs(struct userrec *u, int idx, char *par) { + + time_t start, finish; + time(&start); + putlog(LOG_CMDS, "*", "#%s# begin creation of logfiles.", dcc[idx].nick); + + time_t t = time(NULL); + struct tm tblock = *localtime(&t); + + l2hchan_t *p = logs2htmlchanlist; + + if (!par[0]) { + + //no parameter. Convert log for all channels for current day. + while (p != NULL) { + dprintf(idx, " Converting log for channel '%s' for current day.\n", p->channame); + convertfile(p, tblock.tm_year + 1900, tblock.tm_mon + 1, tblock.tm_mday); + dprintf(idx, " Creating index page for channel '%s' for %d year.\n", p->channame, tblock.tm_year + 1900); + makeindexpage(p, tblock.tm_year + 1900); + p = p->next; + } + + } else { + + int i, j, k; + start_year = MIN(MAX(start_year, 2000), tblock.tm_year + 1900); + char *part; + + part = newsplit(&par); + if (!egg_strncasecmp(part, "all", 3)) { // "all". Convert logs for all channels for all years. + + while (p != NULL) { + for (i = start_year; i <= tblock.tm_year + 1900; i++) { + dprintf(idx, " Creating logs for channel '%s' for %d year.\n", p->channame, i); + for (j = 0; j < 12; j++) { + for (k = 1; k <= DAYS_IN_MONTH(i, j); k++) { + convertfile(p, i, j + 1, k); + } + } + dprintf(idx, " Creating index page for channel '%s' for %d year.\n", p->channame, i); + makeindexpage(p, i); + } + p = p->next; + } + } else { // Check for year, month, day + + int year, month, day; + year = atoi(part); + if ((year < start_year) || (year > tblock.tm_year + 1900)) { // Check if parameter is valid year + dprintf(idx, " Invalid parameter. 'year' must be between %d and %d.\n", start_year, tblock.tm_year + 1900); + return 1; + } + part = newsplit(&par); + if (!part[0]) { // Is there second parameter? + + while (p != NULL) { + dprintf(idx, " Creating logs for channel '%s' for %d year.\n", p->channame, year); + for (j = 0; j < 12; j++) { + for (k = 1; k <= DAYS_IN_MONTH(year, j); k++) { + convertfile(p, year, j + 1, k); + } + } + dprintf(idx, " Creating index page for channel '%s' for %d year.\n", p->channame, year); + makeindexpage(p, year); + p = p->next; + } + + } else { // No second parameter. We have only year + + month = atoi(part); + if ((month < 1) || (month > 12)) { // Check if parameter is valid month + dprintf(idx, " Invalid parameter. 'month' must be between %d and %d.\n", 1, 12); + return 1; + } + part = newsplit(&par); + if (!part[0]) { // Is there third parameter? + + while (p != NULL) { + dprintf(idx, " Creating logs for channel '%s' for %d year, for %d month.\n", p->channame, year, month); + for (k = 1; k <= DAYS_IN_MONTH(year, month - 1); k++) { + convertfile(p, year, month, k); + } + dprintf(idx, " Creating index page for channel '%s' for %d year.\n", p->channame, year); + makeindexpage(p, year); + p = p->next; + } + + } else { // No third parameter, we have year and month + + day = atoi(part); + if ((day < 1) || (day > DAYS_IN_MONTH(year, month - 1))) { // Check if parameter is valid day + dprintf(idx, " Invalid parameter. 'day' must be between %d and %d.\n", 1, DAYS_IN_MONTH(year, month - 1)); + return 1; + } + + while (p != NULL) { + dprintf(idx, " Creating log for channel '%s' for %d year, for %d month, for %d day.\n", p->channame, year, month, day); + convertfile(p, year, month, day); + dprintf(idx, " Creating index page for channel '%s' for %d year.\n", p->channame, year); + makeindexpage(p, year); + p = p->next; + } + + } + + } + } + + } + + putlog(LOG_CMDS, "*", "#%s# creation of logfiles finished.", dcc[idx].nick); + time(&finish); + double elapsed_time = difftime(finish, start); + if (elapsed_time == 0.0) { + putlog(LOG_CMDS, "*", "#%s# It takes < 1 second.", dcc[idx].nick); + } + else { + putlog(LOG_CMDS, "*", "#%s# It takes %f second%s.", dcc[idx].nick, elapsed_time, (elapsed_time != 1.0) ? "s" : ""); + } + return 0; +} /* convertlogs() */ +/****************************************************************************/ + + +/****************************************************************************/ +static void initialize(void) +{ + strlcpy(month_names[0], LOGS2HTML_JANUARY, MAX_MONTH_LENGTH); + strlcpy(month_names[1], LOGS2HTML_FEBRIARY, MAX_MONTH_LENGTH); + strlcpy(month_names[2], LOGS2HTML_MARCH, MAX_MONTH_LENGTH); + strlcpy(month_names[3], LOGS2HTML_APRIL, MAX_MONTH_LENGTH); + strlcpy(month_names[4], LOGS2HTML_MAY, MAX_MONTH_LENGTH); + strlcpy(month_names[5], LOGS2HTML_JUNE, MAX_MONTH_LENGTH); + strlcpy(month_names[6], LOGS2HTML_JULY, MAX_MONTH_LENGTH); + strlcpy(month_names[7], LOGS2HTML_AUGUST, MAX_MONTH_LENGTH); + strlcpy(month_names[8], LOGS2HTML_SEPTEMBER, MAX_MONTH_LENGTH); + strlcpy(month_names[9], LOGS2HTML_OCTOBER, MAX_MONTH_LENGTH); + strlcpy(month_names[10],LOGS2HTML_NOVEMBER, MAX_MONTH_LENGTH); + strlcpy(month_names[11],LOGS2HTML_DECEMBER, MAX_MONTH_LENGTH); + strlcpy(days_names[0], LOGS2HTML_MONDAY, MAX_DAY_LENGTH); + strlcpy(days_names[1], LOGS2HTML_TUESDAY, MAX_DAY_LENGTH); + strlcpy(days_names[2], LOGS2HTML_WEDNESDAY, MAX_DAY_LENGTH); + strlcpy(days_names[3], LOGS2HTML_THURSDAY, MAX_DAY_LENGTH); + strlcpy(days_names[4], LOGS2HTML_FRIDAY, MAX_DAY_LENGTH); + strlcpy(days_names[5], LOGS2HTML_SATURDAY, MAX_DAY_LENGTH); + strlcpy(days_names[6], LOGS2HTML_SUNDAY, MAX_DAY_LENGTH); + + // Precompile our regular expressions + if (regcomp(&re_uri, "((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://|www\\.|ftp\\.)+(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(/(([a-zA-Z0-9%_#:\\./=?-]|\\&)*([a-zA-Z0-9%_#:\\/=?-]|\\&))*)?", REG_EXTENDED|REG_ICASE) != 0) { + putlog(LOG_CMDS, "*", "logs2html: Error while making regular expression for uri."); + } + if (regcomp(&re_uritrunc, "^((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://){1}", REG_EXTENDED|REG_ICASE|REG_NOSUB) != 0) { + putlog(LOG_CMDS, "*", "logs2html: Error while making regular expression for truncate uri."); + } + if (regcomp(&re_email, "([a-zA-Z]([a-zA-Z0-9_\\-\\.]*[a-zA-Z0-9])*)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)", REG_EXTENDED|REG_ICASE) != 0) { + putlog(LOG_CMDS, "*", "logs2html: Error while making regular expression for email."); + } + + return; +} +/****************************************************************************/ + + +/****************************************************************************/ +static void finalize(void) +{ + l2hchan_t *p, *q; + + p = q = logs2htmlchanlist; + while (q != NULL) { + q = p->next; + if (p->channame != NULL) nfree(p->channame); + if (p->inputpath != NULL) nfree(p->inputpath); + if (p->outputpath != NULL) nfree(p->outputpath); + if (p->mainpagename != NULL) nfree(p->mainpagename); + if (p->mainpagetitle != NULL) nfree(p->mainpagetitle); + if (p->logspagename != NULL) nfree(p->logspagename); + if (p->logspagetitle != NULL) nfree(p->logspagetitle); + nfree(p); + p = q; + } + logs2htmlchanlist = p = q = NULL; + + regfree(&re_email); + regfree(&re_uritrunc); + regfree(&re_uri); + + return; +} +/****************************************************************************/ + + +/****************************************************************************/ +static void logs2html_hook_5minutely(void) +{ + time_t t = time(NULL); + struct tm tblock = *localtime(&t); + tblock.tm_hour = 0; + tblock.tm_min = 0; + tblock.tm_sec = 1; + + l2hchan_t *p = logs2htmlchanlist; + while (p != NULL) { + convertfile(p, tblock.tm_year + 1900, tblock.tm_mon + 1, tblock.tm_mday); + makeindexpage(p, tblock.tm_year + 1900); + p = p->next; + } + + return; +} +/****************************************************************************/ + + +/****************************************************************************/ +static void logs2html_hook_hourly(void) +{ + time_t t = time(NULL); + + struct tm tnow = *localtime(&t); + + t -= (time_t)(60); + + struct tm tblock = *localtime(&t); + tblock.tm_hour = 0; + tblock.tm_min = 0; + tblock.tm_sec = 1; + + //Let's convert log for previous day, because last 5 minutes of that log was not converted + //by logs2html_hook_5minutely(void) procedure. + if (tnow.tm_mday != tblock.tm_mday) { + l2hchan_t *p = logs2htmlchanlist; + while (p != NULL) { + convertfile(p, tblock.tm_year + 1900, tblock.tm_mon + 1, tblock.tm_mday); + makeindexpage(p, tblock.tm_year + 1900); + p = p->next; + } + } + + //Let's convert logs for previous year, because name of the index page change from prefix.html to prefixPASTYEAR.html + if (tnow.tm_year != tblock.tm_year) { + int j, k; + + l2hchan_t *p = logs2htmlchanlist; + while (p != NULL) { + for (j = 0; j < 12; j++) { + for (k = 1; k <= DAYS_IN_MONTH(tblock.tm_year + 1900, j); k++) { + convertfile(p, tblock.tm_year + 1900, j + 1, k); + } + } + makeindexpage(p, tblock.tm_year + 1900); + p = p->next; + } + } + + return; +} +/****************************************************************************/ + + +/****************************************************************************/ +static void logs2html_hook_pre_rehash(void) +{ + finalize(); + + return; +} +/****************************************************************************/ + + +/****************************************************************************/ +static void logs2html_hook_rehash(void) +{ + initialize(); + + return; +} +/****************************************************************************/ + + +static void event_addlogs2htmlchan(void) +{ + check_tcl_event("addlogs2htmlchan"); + + return; +} + + +/* + * Calculate the memory we keep allocated. + */ +static int logs2html_expmem() +{ + int size = 0; + l2hchan_t *p = logs2htmlchanlist; + while (p != NULL) { + size += sizeof(struct l2hchan_struct); + if (p->channame != NULL) size += strlen(p->channame) + 1; + if (p->inputpath != NULL) size += strlen(p->inputpath) + 1; + if (p->outputpath != NULL) size += strlen(p->outputpath) + 1; + if (p->mainpagename != NULL) size += strlen(p->mainpagename) + 1; + if (p->mainpagetitle != NULL) size += strlen(p->mainpagetitle) + 1; + if (p->logspagename != NULL) size += strlen(p->logspagename) + 1; + if (p->logspagetitle != NULL) size += strlen(p->logspagetitle) + 1; + p = p->next; + } + + size += MAX_MONTH_LENGTH * 12; + size += MAX_DAY_LENGTH * 7; + + return size; +} + +/* A report on the module status. + * + * details is either 0 or 1: + * 0 - `.status' + * 1 - `.status all' or `.module logs2html' + */ +static void logs2html_report(int idx, int details) +{ + if (logs2htmlchanlist != NULL) { + l2hchan_t *p = logs2htmlchanlist; + + dprintf(idx, " logs2html channels list:\n"); + while (p != NULL) { + dprintf(idx, " Channel: '%s'.\n", p->channame); + dprintf(idx, " path to logfiles: '%s'\n", p->inputpath); + dprintf(idx, " path to generated html pages: '%s'.\n", p->outputpath); + p = p->next; + } + } + + if (details) { + int size = logs2html_expmem(); + dprintf(idx, " Using %d byte%s of memory\n", size, (size != 1) ? "s" : ""); + } + + return; +} + +static cmd_t mydcc[] = { + {"convertalllogs", "n", cmd_convertalllogs, NULL}, + {"makemainpage", "n", cmd_makemainpage, NULL}, + {"makeindexpage", "n", cmd_makemainpage, NULL}, + {"convertlogs", "n", cmd_convertlogs, NULL}, + {NULL, NULL, NULL, NULL} /* Mark end. */ +}; + +static tcl_strings my_tcl_strings[] = { + {"logfile-suffix", logfile_suffix, 20, 0}, + {"mainpage-top", mainpage_top_filename, 256, 0}, + {"mainpage-bottom", mainpage_bottom_filename, 256, 0}, + {"logspage-top", logspage_top_filename, 256, 0}, + {"logspage-bottom", logspage_bottom_filename, 256, 0}, + {"user-style", userstyle_filename, 256, 0}, + {"insert-encoding-str", encoding_string, 30, 0}, + {NULL, NULL, 0, 0} /* Mark end. */ +}; + +static tcl_ints my_tcl_ints[] = { + {"col-count", &month_cols_count, 0}, + {"lines-per-page", &lines_per_page, 0}, + {"start-year", &start_year, 0}, + {"month-block-orientation", &month_block_orientation, 0}, + {"dont-print-time", &dont_print_time, 0}, + {"dont-print-join", &dont_print_join, 0}, + {"dont-print-left", &dont_print_left, 0}, + {"dont-print-modechange", &dont_print_modechange, 0}, + {"dont-print-nickchange", &dont_print_nickchange, 0}, + {"dont-print-kick", &dont_print_kick, 0}, + {"dont-print-else", &dont_print_else, 0}, + {"log-time", &shtime, 1}, + {"keep-all-logs", &keep_all_logs, 1}, + {NULL, NULL, 0} /* Mark end. */ +}; + + +static char *logs2html_close() +{ + + del_hook(HOOK_LOADED, (Function) event_addlogs2htmlchan); + del_hook(HOOK_REHASH, (Function) event_addlogs2htmlchan); + del_hook(HOOK_REHASH, (Function) logs2html_hook_rehash); + del_hook(HOOK_PRE_REHASH, (Function) logs2html_hook_pre_rehash); + del_hook(HOOK_HOURLY, (Function) logs2html_hook_hourly); + del_hook(HOOK_5MINUTELY, (Function) logs2html_hook_5minutely); + + finalize(); + + rem_help_reference(MODULE_NAME".help"); + del_lang_section(MODULE_NAME); + rem_builtins(H_dcc, mydcc); + rem_tcl_commands(my_tcl_cmds); + rem_tcl_strings(my_tcl_strings); + rem_tcl_ints(my_tcl_ints); + + module_undepend(MODULE_NAME); + + return NULL; +} + +EXPORT_SCOPE char *logs2html_start(); + +static Function logs2html_table[] = { + (Function) logs2html_start, + (Function) logs2html_close, + (Function) logs2html_expmem, + (Function) logs2html_report, +}; + +char *logs2html_start(Function *global_funcs) +{ + global = global_funcs; + + /* Register the module. */ + module_register(MODULE_NAME, logs2html_table, MODULE_MAJOR, MODULE_MINOR); + + if (!module_depend(MODULE_NAME, "eggdrop", 108, 0)) { + module_undepend(MODULE_NAME); + return "This module requires Eggdrop 1.6.18 or later."; + } + + add_tcl_ints(my_tcl_ints); + add_tcl_strings(my_tcl_strings); + add_tcl_commands(my_tcl_cmds); + add_builtins(H_dcc, mydcc); + add_lang_section(MODULE_NAME); + add_help_reference(MODULE_NAME".help"); + + initialize(); + + add_hook(HOOK_5MINUTELY, (Function) logs2html_hook_5minutely); + add_hook(HOOK_HOURLY, (Function) logs2html_hook_hourly); + add_hook(HOOK_PRE_REHASH, (Function) logs2html_hook_pre_rehash); + add_hook(HOOK_REHASH, (Function) logs2html_hook_rehash); + add_hook(HOOK_REHASH, (Function) event_addlogs2htmlchan); + add_hook(HOOK_LOADED, (Function) event_addlogs2htmlchan); + + return NULL; +} + diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/logs2html.conf src/eggdrop-1.8.4/src/mod/logs2html.mod/logs2html.conf --- ./src/mod/logs2html.mod/logs2html.conf 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/logs2html.conf 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,105 @@ +###### +##### +### General Settings +##### +###### + +# number of rows the month'll put out +set col-count 3 + + +# set how many lines there'll be on the one page of created html page. If it +# set to 0 then all lines will be in one html page +set lines-per-page 200 + + +# Uncomment line if you want specify file with your own css settings for +# generated pages +#set user-style user.css + + +# This setting allows you to insert meta tag +# in your +# html files. You can comment next line, that will mean that this tag'll not +# be insert in the resulting page. +set insert-encoding-str "windows-1251" + + +# The start year, from which logs will be converted. The minimum is 2000 year. +# (I think that should be enought) +set start-year 2003 + + +# set it to 1 not to print time in the html page, even if eggdrop's logfile has it +set dont-print-time 0 + + +# set it to 1 not to print join messages in the html page +set dont-print-join 0 + + +# set it to 1 not to print left messages in the html page +set dont-print-left 0 + + +# set it to 1 not to print mode changed messages in the html page +set dont-print-modechange 0 + + +# set it to 1 not to print nick change messages in the html page +set dont-print-nickchange 0 + + +# set it to 1 not to print kick messages in the html page +set dont-print-kick 0 + + +# set it to 1 not to print other irc messages in the html page +set dont-print-else 0 + + +# Orientation of the month blocks on index page. 0 - vertical, 1 - horizontal +# Chose one you like more. +set month-block-orientation 0 + + +# Here you can specify path to files which content will be put to converted +# logfile (or mainpage). For example you can add code for your counter +# or banner. Uncomment the line you need and put there filename with path, +# for example: set mainpage-top "mycounter.tpl" +# Note: the content of specified file puts to the resulting file "as is", +# without any transformation +#set mainpage-top "" +#set mainpage-bottom "" +#set logspage-top "" +#set logspage-bottom "" + + +# now load the module +loadmodule logs2html + + +# Add your channels here. The format is: +# addlogs2htmlchan channel output-path main-page-name main-page-title logs-page-prefix logs-page-title +# channel - your channel which logs you want to convert +# output-path - your ftp path, where converted files will be put +# (don't forget to check settings to be sure bot have +# permision write to the path you specify) +# main-page-name - name of your mainpage (i.e. page with calendar) for +# this channel. The "Main page" for current year name will be +# "main-page-name.html", for the past years it will look like +# "main-page-nameYY.html". For example if we set main-page-name +# to "index", then main page for current year'll be "index.html", +# and for 2008 year it will look like "index2008.html" +# main-page-title - your mainpage title for this channel (will be shown +# as the caption of the web page in your browser and as +# the title of calendar) +# logs-page-prefix - your logs page name (prefix) for this channel. +# Resulting name will be "logs-page-prefixYYmmdd_pgN.html". +# For example if we set "logs-page-prefix" to "mychan", then the +# first page of logfile for the 1st january 2009 will look +# like "mychan20090101_pg1.html" +# logs-page-title - your logs page title for this channel (will be shown +# as the caption of the web page in your browser) +# Example: +# addlogs2htmlchan #MyChannel "/home/www/logs" index "Logs of MyChannel" mychan "Log of MyChannel" diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/logs2html.h src/eggdrop-1.8.4/src/mod/logs2html.mod/logs2html.h --- ./src/mod/logs2html.mod/logs2html.h 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/logs2html.h 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,92 @@ +/* + * logs2html.h -- part of logs2html.mod + * + * Written by Fedotov Alexander aka Gray_Angel aka Shmupsik + * + * 2004-2009 year + */ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _EGG_MOD_LOGS2HTML_LOGS2HTML_H +#define _EGG_MOD_LOGS2HTML_LOGS2HTML_H + +#include "src/lang.h" + +#define SEP "/" + +#ifndef MAX +#define MAX(a,b) \ + ({ typeof (a) _a = (a); \ + typeof (b) _b = (b); \ + _a > _b ? _a : _b; }) +#endif + +#ifndef MIN +#define MIN(a,b) \ + ({ typeof (a) _a = (a); \ + typeof (b) _b = (b); \ + _a < _b ? _a : _b; }) +#endif + + +typedef struct l2hchan_struct { + struct l2hchan_struct *next; + char *channame; /* Имя канала для которого конвертировать логи */ + char *inputpath; /* Имя (префикс) данного канала (вычисляется из выражения logfile в конфиге бота) */ + char *outputpath; /* Куда выводить конвертированные логи */ + char *mainpagename; /* Имя главной страницы */ + char *mainpagetitle; /* Заголовок на главной странице */ + char *logspagename; /* Имя (префикс) страницы переконвертированного логфайла */ + char *logspagetitle; /* Заголовок страницы логфайла */ +} l2hchan_t; + +typedef enum {NODE_MIRCCOLOR, NODE_FONTSTYLE, NODE_EMAIL, NODE_URI, NODE_SPECIAL} l2h_node; + +typedef struct l2hnode_struct { + struct l2hnode_struct *next; + l2h_node node_type; + int node_so; // Start of special char + char *node_data; // Class fo mirc colors + bool node_close; +} l2hnode_t; + +/* + * For language files. Lets define max number of chars in month and days of week names + */ +#define MAX_MONTH_LENGTH 15 +#define MAX_DAY_LENGTH 6 + +static int days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + +#define DAYS_IN_MONTH(year, month) (days_in_month[month] + (((month == 1) && ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))) ? 1 : 0)) + + +static int cmd_convertalllogs(struct userrec *u, int idx, char *par); +static int cmd_makemainpage(struct userrec *u, int idx, char *par); +static int cmd_convertlogs(struct userrec *u, int idx, char *par); +static int getdayofweek(int year, int month, int day); +static FILE *openfile(char *newfilename, const char *mode, bool silent); +static void str_write(FILE *file, char *fstr, ... ); +static void writefromexfile(FILE *dst_file, char *exfilename); +static void makeindexpage(l2hchan_t *ch, int year); +static void convertfile(l2hchan_t *ch, int year, int month, int day); +static void strip_codes(char *buf_ptr_copy, l2hnode_t **tree); +static void node_append(struct l2hnode_struct **h, struct l2hnode_struct *i); +static void replace_chars(char *buf_ptr_copy, char **realloc_buf); + + +#endif /* _EGG_MOD_LOGS2HTML_LOGS2HTML_H */ diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/logs2html.mod.desc src/eggdrop-1.8.4/src/mod/logs2html.mod/logs2html.mod.desc --- ./src/mod/logs2html.mod/logs2html.mod.desc 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/logs2html.mod.desc 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1 @@ +This module converts the log files of your eggdrop to the html format. It also creates a page-calendar with links to that created files. diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/Makefile src/eggdrop-1.8.4/src/mod/logs2html.mod/Makefile --- ./src/mod/logs2html.mod/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/Makefile 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,44 @@ +# Makefile for src/mod/logs2html.mod/ + +srcdir = . + + +doofus: + @echo "" + @echo "Let's try this from the right directory..." + @echo "" + @cd ../../../ && make + +static: ../logs2html.o + +modules: ../../../logs2html.$(MOD_EXT) + +../logs2html.o: + $(CC) $(CFLAGS) $(CPPFLAGS) -DMAKING_MODS -c $(srcdir)/logs2html.c + @rm -f ../logs2html.o + mv logs2html.o ../ + +../../../logs2html.$(MOD_EXT): ../logs2html.o + $(LD) -o ../../../logs2html.$(MOD_EXT) ../logs2html.o $(XLIBS) $(MODULE_XLIBS) + $(STRIP) ../../../logs2html.$(MOD_EXT) + +depend: + $(CC) $(CFLAGS) -MM $(srcdir)/logs2html.c -MT ../logs2html.o > .depend + +clean: + @rm -f .depend *.o *.$(MOD_EXT) *~ +distclean: clean + +#safety hash +../logs2html.o: .././logs2html.mod/logs2html.c \ + ../../../src/mod/module.h ../../../src/main.h ../../../src/lang.h \ + ../../../src/eggdrop.h ../../../src/flags.h ../../../src/proto.h \ + ../../../lush.h ../../../src/misc_file.h ../../../src/cmdt.h \ + ../../../src/tclegg.h ../../../src/tclhash.h ../../../src/chan.h \ + ../../../src/users.h ../../../src/compat/compat.h \ + ../../../src/compat/inet_aton.h \ + ../../../src/compat/snprintf.h \ + ../../../src/compat/strcasecmp.h \ + ../../../src/compat/strftime.h ../../../src/mod/modvals.h \ + .././logs2html.mod/language.h .././logs2html.mod/tcllogs2html.c \ + .././logs2html.mod/htmloperations.c .././logs2html.mod/fileoperations.c diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/modinfo src/eggdrop-1.8.4/src/mod/logs2html.mod/modinfo --- ./src/mod/logs2html.mod/modinfo 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/modinfo 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,3 @@ +DESC:This module converts the log files of your eggdrop +DESC:to the html format. It also creates a page-calendar +DESC:with links to that created files. diff -urpN "src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.18/Contents" "src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.18/Contents" --- "src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.18/Contents" 1970-01-01 01:00:00.000000000 +0100 +++ "src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.18/Contents" 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1 @@ +Precompiled on CYGWIN_NT-5.1 1.5.25(0.156/4/2) for eggdrop 1.6.18 Binary files src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.18/logs2html.dll and src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.18/logs2html.dll differ diff -urpN "src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19/Contents" "src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19/Contents" --- "src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19/Contents" 1970-01-01 01:00:00.000000000 +0100 +++ "src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19/Contents" 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1 @@ +Precompiled on CYGWIN_NT-5.1 1.5.25(0.156/4/2) for eggdrop 1.6.19 Binary files src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19/logs2html.dll and src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19/logs2html.dll differ diff -urpN "src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19 Suzi/Contents" "src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19 Suzi/Contents" --- "src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19 Suzi/Contents" 1970-01-01 01:00:00.000000000 +0100 +++ "src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19 Suzi/Contents" 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1 @@ +Precompiled on CYGWIN_NT-5.1 1.5.25(0.156/4/2) for eggdrop 1.6.19 with Suzi patch sp.0009 Binary files src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19 Suzi/logs2html.dll and src/eggdrop-1.8.4/src/mod/logs2html.mod/precompiled/windrop 1.6.19 Suzi/logs2html.dll differ diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/readme.txt src/eggdrop-1.8.4/src/mod/logs2html.mod/readme.txt --- ./src/mod/logs2html.mod/readme.txt 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/readme.txt 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,105 @@ +logs2html.mod v.2.4.3 by Alexander Fedotov aka Shmupsik aka shurikvz +e-mail: shurikvz@mail.ru + +This module converts the log files of your eggdrop to the html format. It also creates a page-calendar with links to that created files. + +******************************************************************************* +To install this module: + - edit and copy logs2html.conf file to your eggdrop directory + - for (*nix) copy logs2html.mod to the source directory of your eggdrop (src/mod), then as usual: make iconfig && make && make install) + - for windows: + - copy the contents of "language" directory to your windrop "language" directory + - copy the contents of "help" directory to your windrop "help" directory + - copy *.dll (/precompiled) to windrop "modules" directory + - if you decide to use your own style for pages edit and copy user.css file to your logs output directory + - put string "source logs2html.conf" into your eggdrop config file and restart your bot + +Module has 4 commands, which you can use from dcc chat: + - convertalllogs - reconverts all your logs + - convertlogs [year [month [day]]] - reconverts your logs + - makemainpage - redraws mainpages + - makeindexpage - same as ".makemainpage" +******************************************************************************* + + + +******************************************************************************* +You can try to find latest version on http://sourceforge.net/projects/logs2html or http://www.halftone.ru/projects +******************************************************************************* + + + +******************************************************************************* +Version history: +28.05.09 - version 2.4.3 + - now correctly output '"' and '&' char to html + - improved search of uri and email + - added css classes for join/left, mode change, nick change and kick events + - added an option to not display these events in the resulting html file + + +12.05.09 - version 2.4.2 + - fixed error with compilation on eggdrop 1.6.19 with Suzi-patch sp.0009 + - now automaticly reconvert logs for previous year, when the year changed (i.e. on december, 31) + + +08.05.09 - version 2.4.1 + - fixed display bug with firefox browser + + +24.04.09 - version 2.4.0 + - now module can convert and show logs for several years (new command added, see '.help logs2html module') + - the output pages is now in xhtml format (see "known problems" for details) + - added dont-print-time parameter + - added month-block-orientation parameter + - some color-names fixed in default css file + + +15.10.05 - version 2.3.4 + - added setting in config file, which allow to change value of meta tag in generated HTML files. + + +04.10.05 - version 2.3.3 + - fixed bug with broken e-mail (strings with broken e-mails were truncated) + + + 24.09.05 - version 2.3.2 + - added support for and tags + - fixed bug with [%H:%M:%S] timestamp (I hope.. :-)) + + + 26.07.05 - version 2.3.1 + - bug fixed + + + 24.07.05 - version 2.3.0 + - page style discriptions moved to CSS file + - no need for tcl now + - small bugs fixed + + + 25.04.05 - version 2.1.0 + - added support for http links and e-mail. + + + 27.02.05 - version 2.0 + - converting logs for multiply channels + - possibility to change colors of HTML pages + - now you can aim number of lines on the one generated HTML page + + + 16.12.04 - version 1.0 + - initial realise +******************************************************************************* + + + +******************************************************************************* +KNOWN PROBLEMS + + +******************************************************************************* + + + +P.S. Sorry for my bad english diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/strlcpy.c src/eggdrop-1.8.4/src/mod/logs2html.mod/strlcpy.c --- ./src/mod/logs2html.mod/strlcpy.c 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/strlcpy.c 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,51 @@ +/* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ +size_t +strlcpy(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0) { + while (--n != 0) { + if ((*d++ = *s++) == '\0') + break; + } + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/tcllogs2html.c src/eggdrop-1.8.4/src/mod/logs2html.mod/tcllogs2html.c --- ./src/mod/logs2html.mod/tcllogs2html.c 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/tcllogs2html.c 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,130 @@ +/* + * tcllogs2html.c -- part of logs2html.mod + * + * Written by Fedotov Alexander aka Shmupsik aka shurikvz + * + * 2004-2009 year + */ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +static void get_log_path(char *channel, char **inputpath) { + if (Tcl_VarEval(interp, "logfile", (char *)NULL) != TCL_OK || !Tcl_GetStringResult(interp)[0]) { + putlog(LOG_MISC, "*", "Error finding logfiles! Please check settings in your config file to be sure statement \"logfile\" present."); + return; + } + + int len = strlen(Tcl_GetStringResult(interp)) + 1; + char *logslist = nmalloc(len); + strlcpy(logslist, Tcl_GetStringResult(interp), len); + + char *p = logslist, *q, *r; + while ((q = strchr(p, '{')) != NULL) { + p = strchr(++q, '}'); + (*p) = '\0'; + p++; // now points to next chan in list + r = newsplit(&q); + // r = channel modes, check if it has +p flag + if (logmodes(r) & LOG_PUBLIC) { + r = newsplit(&q); + // r = channel name, is it our channel? + if ((*r == '*') || (!rfc_casecmp(channel, r))) { + r = newsplit(&q); + // r = log file name + int len = strlen(r) + 1; + (*inputpath) = nmalloc(len); + strlcpy((*inputpath), r, len); + break; + } + } + } + + nfree(logslist); + return; +} + + +static int tcl_addlogs2htmlchan STDVAR +{ + BADARGS(7, 7, " channel output-path main-page-name main-page-title logs-page-prefix logs-page-title"); + + l2hchan_t *newchan = nmalloc(sizeof(struct l2hchan_struct)); + if (newchan == NULL) { + putlog(LOG_MISC, "*", "Can't allocate enough space to add new channel!"); + Tcl_AppendResult(irp, "Can't allocate enough space to add new channel!", NULL); + return TCL_ERROR; + } + + int len; + newchan->next = NULL; + + newchan->inputpath = NULL; + get_log_path(argv[1], &(newchan->inputpath)); + if (newchan->inputpath == NULL) { + putlog(LOG_MISC, "*", "Can't find expression \"logfile\" for channel \'%s\' with mode \'+p\'.", argv[1]); + Tcl_AppendResult(irp, "Can't find expression \"logfile\" for channel \'", argv[1], "\' with mode \'+p\'.", NULL); + nfree(newchan); + return TCL_OK; //Silently ignore this + } + + len = strlen(argv[1]) + 1; + newchan->channame = nmalloc(len); + strlcpy(newchan->channame, argv[1], len); + + len = strlen(argv[2]) + 1; + newchan->outputpath = nmalloc(len); + strlcpy(newchan->outputpath, argv[2], len); + + len = strlen(argv[3]) + 1; + newchan->mainpagename = nmalloc(len); + strlcpy(newchan->mainpagename, argv[3], len); + + len = strlen(argv[4]) + 1; + newchan->mainpagetitle = nmalloc(len); + strlcpy(newchan->mainpagetitle, argv[4], len); + + len = strlen(argv[5]) + 1; + newchan->logspagename = nmalloc(len); + strlcpy(newchan->logspagename, argv[5], len); + + len = strlen(argv[6]) + 1; + newchan->logspagetitle = nmalloc(len); + strlcpy(newchan->logspagetitle, argv[6], len); + + int count = 0; + l2hchan_t *chan = logs2htmlchanlist; + if (chan == NULL) { + logs2htmlchanlist = newchan; + } else { + count++; + while (chan->next != NULL) { + chan = chan->next; + count++; + } + chan->next = newchan; + } + count++; + + putlog(LOG_MISC, "*", " logs2html module: added channel '%s'. Total channels added: %d.", newchan->channame, count); + Tcl_AppendResult(irp, "Channel added: ", argv[1], ".", NULL); + + return TCL_OK; +} + +static tcl_cmds my_tcl_cmds[] = { + {"addlogs2htmlchan", tcl_addlogs2htmlchan}, + {NULL, NULL} /* Mark end. */ +}; diff -urpN src-orig/eggdrop-1.8.4/src/mod/logs2html.mod/user.css src/eggdrop-1.8.4/src/mod/logs2html.mod/user.css --- ./src/mod/logs2html.mod/user.css 1970-01-01 01:00:00.000000000 +0100 +++ ./src/mod/logs2html.mod/user.css 2018-07-29 03:18:35.000000000 +0200 @@ -0,0 +1,306 @@ +@charset "utf-8"; +/* CSS Document */ + + +