-/* Usage: cat /path/to/file.log | ./irssistats channel maintainer language theme > /path/to/file.html */
+/* Usage: cat /path/to/file.log | ./irssistats channel maintainer language theme [nickfile] > /path/to/file.html */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
+#include <regex.h>
/* Config */
#define MAXUSERS 5000
#define MINWORDLENGTH 5
/* irssistats */
-#define VERSION "0.31"
+#define VERSION "0.4"
#define URL "http://royale.zerezo.com/programmation/irssistats/"
/* Counters */
char *counters[NBCOUNTERS]={"C_SMILE","C_FROWN","C_EXCLAM","C_QUESTION","C_ME","C_TOPIC","C_MODE","C_KICK","C_KICKED","C_URL","C_JOIN","C_NICK","C_MONOLOGUE"};
/* Languages */
-#define NBLANGUAGES 3
+#define NBLANGUAGES 4
#define NBKEYS 38
char *keys[NBLANGUAGES][NBKEYS+1][2]= /* first key used for language name and abbreviation */
{
{ "C_NICK", "change souvent de nick" },
{ "C_MONOLOGUE", "parle beaucoup de monologues" }
},
+ { /* German language */
+ /* contributed by Valentin Gelhorn <valentin.gelhorn@web.de> */
+ { "German", "de" },
+ { "HEADER", "Statistiken für #%s von %s" },
+ { "LEGEND", "Legende" },
+ { "LASTDAYS", "Statistik der letzten Tage" },
+ { "TOPHOURS", "Stündliche Statistik" },
+ { "TOPUSERS", "Die aktivsten Personen" },
+ { "OTHERS", "Es bleiben noch %d uneingetragene" },
+ { "NBLINES", "Zeilen" },
+ { "NICK", "Nick" },
+ { "AVGLETTERS", "Buchstaben/Zeile" },
+ { "HOURS", "Stunden" },
+ { "QUOTE", "Zufällig ausgewaehlte Zitate" },
+ { "TOPUSERSTIME", "Die aktivsten Personen zur bestimmten Tageszeit" },
+ { "RANDTOPICS", "Ein paar Topics" },
+ { "CHANGEDBY", "Gesetzt von" },
+ { "NEWTOPIC", "Neues topic" },
+ { "RANDURLS", "Ein paar URLs" },
+ { "POSTEDBY", "Geschrieben von" },
+ { "POSTEDURL", "URL" },
+ { "TOPWORDS", "Am häufigsten benutze Wörter" },
+ { "WORD", "Wort" },
+ { "OCCURRENCES", "Vorkommen" },
+ { "BIGNUMBERS", "Ein paar grosse Zahlen" },
+ { "NUMBERS", "Zahlen" },
+ { "TIME", "%d Zeilen analysiert in %d Sekunden" },
+ { "FOOTER", "Statistiken wurden erstellt von" },
+ { "C_SMILE", "ist oft glüklich :)" },
+ { "C_FROWN", "ist oft traurig :(" },
+ { "C_EXCLAM", "schreit oft !" },
+ { "C_QUESTION", "stellt viele Fragen ?" },
+ { "C_ME", "mag /me'en" },
+ { "C_TOPIC", "aendert oft das Topico" },
+ { "C_MODE", "aendert oft die Modes" },
+ { "C_KICK", "mag /kick'en" },
+ { "C_KICKED", "wird oft gekickt"},
+ { "C_URL", "schreibt viele URLs"},
+ { "C_JOIN", "kann sich nicht entscheiden ob er bleiben oder gehen soll" },
+ { "C_NICK", "ändert oft seinen Nick" },
+ { "C_MONOLOGUE", "spricht oft Monologe" }
+ },
{ /* Spanish language */
- /* Submitted by Alex <ainaker@gmx.net> */
+ /* contributed by Alex <ainaker@gmx.net> */
{ "Spanish", "es" },
{ "HEADER", "Estadísticas de #%s por %s" },
{ "LEGEND", "Leyenda" },
char c;
char *nick,*message;
char line[MAXLINELENGTH];
+ FILE *fic;
+ regex_t preg;
/*** INIT ***/
- if (argc!=5)
+ if ((argc<5) || (argc>6))
{
- fprintf(stderr,"Usage: cat /path/to/file.log | ./irssistats channel maintainer language theme > /path/to/file.html\n\n");
+ fprintf(stderr,"Usage: cat /path/to/file.log | ./irssistats channel maintainer language theme [nickfile] > /path/to/file.html\n\n");
fprintf(stderr,"Version :\nirssistats %s\n\n",VERSION);
fprintf(stderr,"Supported languages :\n");
for (i=0;i<NBLANGUAGES;i++) fprintf(stderr,"%s = %s\n",keys[i][0][1],keys[i][0][0]);
for (j=0;j<4;j++) lastdays[0].hours[j]=0;
days++;
}
- else if (strncmp("-!- mode/",&line[6],9)==0) /* 00:00 -!- mode/#channel [...] by Nick(, Nick2, Nick3...) */
+ else if (strncmp("-!- mode/",&line[6],9)==0) /* 00:00 -!- mode/#channel [...] by (Nick, Nick2, )Nick3 */
{
- for (i=15;(line[i]!=']')||(line[i+1]!=' ');i++);
- nick=&line[i+5];
- for (i=0;(nick[i]!='\0')&&(nick[i]!=',');i++);
- nick[i]='\0';
+ for (i=strlen(line);line[i]!=' ';i--);
+ nick=&line[i+1];
users[dichotomic(nick)].counters[D_MODE]++;
}
else if (strncmp("-!-",&line[6],3)==0) /* 00:00 -!- Nick something... */
message=&line[i+1];
}
else if (line[7]=='>') /* 00:00 <>>>?Nick<<<> the personal message */
+ /* 00:00 <>>?Nick<<> the personal message */
{
- for (i=11;line[i]!='<';i++);
- nick=&line[11];
+ for (i=10;line[i]!='<';i++);
+ nick=&line[10];
+ if (line[9]=='>') nick++;
message=&line[i+5];
}
else /* 00:00 <?Nick> the message */
bestwords(words,0);
+ /*** ALIAS ***/
+
+ if (argc==6)
+ {
+ if ((fic=fopen(argv[5],"rt"))==NULL) { fprintf(stderr,"can't open nick file\n"); exit(1); }
+ while (fscanf(fic,"%s",line)==1)
+ {
+ user=dichotomic(line);
+ fscanf(fic,"%s",line);
+ if (regcomp(&preg,line,0)!=0) { fprintf(stderr,"error in nick file"); exit(1); }
+ temp=users[user].lines;
+ for (i=0;i<nbusers;i++) if ((i!=user) && (regexec(&preg,users[i].nick,0,0,0)==0) && (users[i].lines>=0))
+ {
+ if (users[i].lines>temp) /* for nick alias, keep the random quote of the most used nick */
+ {
+ strcpy(users[user].quote,users[i].quote);
+ temp=users[i].lines;
+ }
+ users[user].lines+=users[i].lines;
+ users[user].letters+=users[i].letters;
+ for (j=0;j<4;j++) users[user].hours[j]+=users[i].hours[j];
+ for (j=0;j<NBCOUNTERS;j++) users[user].counters[j]+=users[i].counters[j];
+ /* "remove" old user */
+ users[i].lines=-1;
+ users[i].letters=-1;
+ for (j=0;j<4;j++) users[i].hours[j]=-1;
+ for (j=0;j<NBCOUNTERS;j++) users[i].counters[j]=-1;
+ }
+ regfree(&preg);
+ }
+ fclose(fic);
+ }
+
/*** HTML ***/
/* header */
for (i=1;i<=NBUSERS;i++)
{
user=-1;
- max=-1;
+ max=0;
for (j=0;j<nbusers;j++) if (users[j].lines>max) max=users[user=j].lines;
if (user!=-1)
{
}
}
printf("</table>\n");
- if (nbusers>NBUSERS)
+ temp=0;
+ for (i=0;i<=nbusers;i++) if (users[i].lines>=0) temp++;
+ if (temp>0)
{
printf("<br>");
- printf(L("OTHERS"),nbusers-50);
+ printf(L("OTHERS"),temp);
printf("<br>\n");
}
printf("<br><br>\n\n");
for (j=0;j<4;j++)
{
user=-1;
- max=-1;
+ max=0;
for (k=0;k<nbusers;k++) if (users[k].hours[j]>max) max=users[user=k].hours[j];
if (user!=-1)
{