From 8d70a2e0456b158f3ca70636b4920e9aff08830a Mon Sep 17 00:00:00 2001 From: Antoine Jacquet Date: Wed, 29 May 2002 00:00:00 +0200 Subject: [PATCH 1/1] version 0.3 * top users by time of day * some big numbers * some new themes * increased number of users * better HTML output --- README | 2 +- irssistats.c | 319 ++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 250 insertions(+), 71 deletions(-) diff --git a/README b/README index da6ed11..001b147 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -irssistats 0.2 +irssistats 0.3 site: http://royale.zerezo.com/programmation/irssistats/ mail: royale@zerezo.com diff --git a/irssistats.c b/irssistats.c index 62d1194..c528da3 100644 --- a/irssistats.c +++ b/irssistats.c @@ -6,74 +6,124 @@ #include /* Config */ -#define MAXUSERS 2000 +#define MAXUSERS 5000 #define MAXNICKLENGTH 50 #define MAXLINELENGTH 2000 #define MAXQUOTELENGTH 100 #define NBUSERS 50 +#define NBUSERSTIME 10 #define NBURLS 5 #define NBTOPICS 5 #define NBWORDS 20 #define MINWORDLENGTH 5 /* irssistats */ -#define VERSION "0.2" +#define VERSION "0.3" #define URL "http://royale.zerezo.com/programmation/irssistats/" +/* Counters */ +#define D_SMILE 0 +#define D_FROWN 1 +#define D_EXCLAM 2 +#define D_QUESTION 3 +#define D_ME 4 +#define D_TOPIC 5 +#define D_MODE 6 +#define D_KICK 7 +#define D_KICKED 8 +#define D_URL 9 +#define D_JOIN 10 +#define D_NICK 11 +#define D_MONOLOGUE 12 +#define NBCOUNTERS 13 +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 2 -#define NBKEYS 22 +#define NBKEYS 38 char *keys[NBLANGUAGES][NBKEYS+1][2]= /* first key used for language name and abbreviation */ { { /* English language */ - { "English", "en" }, - { "HEADER", "Statistics for #%s by %s" }, - { "LEGEND", "Legend" }, - { "LASTDAYS", "Lastdays statistics" }, - { "TOPHOURS", "Hourly statistics" }, - { "TOPUSERS", "Most active people" }, - { "OTHERS", "There are %d left not ranked..." }, - { "NBLINES", "lines" }, - { "NICK", "nick" }, - { "AVGLETTERS", "letters/lines" }, - { "HOURS", "hours" }, - { "QUOTE", "random message" }, - { "RANDTOPICS", "Some topics" }, - { "CHANGEDBY", "changed by" }, - { "NEWTOPIC", "new topic" }, - { "RANDURLS", "Some URLs" }, - { "POSTEDBY", "posted by" }, - { "POSTEDURL", "URL" }, - { "TOPWORDS", "Most used words" }, - { "WORD", "word" }, - { "OCCURRENCES", "occurrences" }, - { "TIME", "%d lines parsed in %d seconds" }, - { "FOOTER", "Statistics generated by" } + { "English", "en" }, + { "HEADER", "Statistics for #%s by %s" }, + { "LEGEND", "Legend" }, + { "LASTDAYS", "Lastdays statistics" }, + { "TOPHOURS", "Hourly statistics" }, + { "TOPUSERS", "Most active people" }, + { "OTHERS", "There are %d left not ranked..." }, + { "NBLINES", "lines" }, + { "NICK", "nick" }, + { "AVGLETTERS", "letters/lines" }, + { "HOURS", "hours" }, + { "QUOTE", "random message" }, + { "TOPUSERSTIME", "Most active people by time of day" }, + { "RANDTOPICS", "Some topics" }, + { "CHANGEDBY", "changed by" }, + { "NEWTOPIC", "new topic" }, + { "RANDURLS", "Some URLs" }, + { "POSTEDBY", "posted by" }, + { "POSTEDURL", "URL" }, + { "TOPWORDS", "Most used words" }, + { "WORD", "word" }, + { "OCCURRENCES", "occurrences" }, + { "BIGNUMBERS", "Some big numbers..." }, + { "NUMBERS", "numbers" }, + { "TIME", "%d lines parsed in %d seconds" }, + { "FOOTER", "Statistics generated by" }, + { "C_SMILE", "is often happy :)" }, + { "C_FROWN", "is often sad :(" }, + { "C_EXCLAM", "yells a lot !" }, + { "C_QUESTION", "asks a lot of questions ?" }, + { "C_ME", "likes /me command" }, + { "C_TOPIC", "often changes the topic" }, + { "C_MODE", "often changes the modes" }, + { "C_KICK", "likes to /kick" }, + { "C_KICKED", "is often kicked" }, + { "C_URL", "posts many URLs" }, + { "C_JOIN", "doesn't know wether to stay or quit" }, + { "C_NICK", "often changes his nick" }, + { "C_MONOLOGUE", "speaks a lot of monologues" } }, { /* French language */ - { "Français", "fr" }, - { "HEADER", "Statistiques de #%s par %s" }, - { "LEGEND", "Légende" }, - { "LASTDAYS", "Statistiques des derniers jours" }, - { "TOPHOURS", "Statistiques horaires" }, - { "TOPUSERS", "Personnes les plus actives" }, - { "OTHERS", "Il reste %d personnes non classées..." }, - { "NBLINES", "lignes" }, - { "NICK", "nick" }, - { "AVGLETTERS", "lettres/lignes" }, - { "HOURS", "heures" }, - { "QUOTE", "message aléatoire" }, - { "RANDTOPICS", "Quelques topics" }, - { "CHANGEDBY", "changé par" }, - { "NEWTOPIC", "nouveau topic" }, - { "RANDURLS", "Quelques URLs" }, - { "POSTEDBY", "postée par" }, - { "POSTEDURL", "URL" }, - { "TOPWORDS", "Mots les plus utilisés" }, - { "WORD", "mot" }, - { "OCCURRENCES", "occurrences" }, - { "TIME", "%d lignes traitées en %d secondes" }, - { "FOOTER", "Statistiques générées par" } + { "Français", "fr" }, + { "HEADER", "Statistiques de #%s par %s" }, + { "LEGEND", "Légende" }, + { "LASTDAYS", "Statistiques des derniers jours" }, + { "TOPHOURS", "Statistiques horaires" }, + { "TOPUSERS", "Personnes les plus actives" }, + { "OTHERS", "Il reste %d personnes non classées..." }, + { "NBLINES", "lignes" }, + { "NICK", "nick" }, + { "AVGLETTERS", "lettres/lignes" }, + { "HOURS", "heures" }, + { "QUOTE", "message aléatoire" }, + { "TOPUSERSTIME", "Personnes les plus actives par période de la journée" }, + { "RANDTOPICS", "Quelques topics" }, + { "CHANGEDBY", "changé par" }, + { "NEWTOPIC", "nouveau topic" }, + { "RANDURLS", "Quelques URLs" }, + { "POSTEDBY", "postée par" }, + { "POSTEDURL", "URL" }, + { "TOPWORDS", "Mots les plus utilisés" }, + { "WORD", "mot" }, + { "OCCURRENCES", "occurrences" }, + { "BIGNUMBERS", "Quelques grands nombres..." }, + { "NUMBERS", "nombres" }, + { "TIME", "%d lignes traitées en %d secondes" }, + { "FOOTER", "Statistiques générées par" }, + { "C_SMILE", "est souvent heureux :)" }, + { "C_FROWN", "est souvent triste :(" }, + { "C_EXCLAM", "hurle beaucoup !" }, + { "C_QUESTION", "pose beaucoup de questions ?" }, + { "C_ME", "aime la commande /me" }, + { "C_TOPIC", "change souvent le topic" }, + { "C_MODE", "change souvent les modes" }, + { "C_KICK", "aime la commande /kick" }, + { "C_KICKED", "est souvent kické" }, + { "C_URL", "poste beaucoup d'URLs" }, + { "C_JOIN", "ne sait pas s'il doit rester ou partir" }, + { "C_NICK", "change souvent de nick" }, + { "C_MONOLOGUE", "parle beaucoup de monologues" } } }; @@ -88,7 +138,7 @@ char *L(char *key) } /* Themes */ -#define NBTHEMES 3 +#define NBTHEMES 5 #define NBCOLORS 9 char *colors[NBTHEMES][NBCOLORS+1][2]= /* first key used for theme name/description and abbreviation */ { @@ -127,6 +177,30 @@ char *colors[NBTHEMES][NBCOLORS+1][2]= /* first key used for theme name/descript { "TITLE2", "#84DB8C" }, { "BGTABLE", "#085D10" }, { "BGTITLE", "#0B810B" } + }, + { /* tit-namour theme */ + { "Purple and Pink", "namour" }, + { "BGCOLOR", "#9933CC" }, + { "TEXT", "#DDAAFF" }, + { "LINK", "#CC99FF" }, + { "VLINK", "#999999" }, + { "ALINK", "#FFC8C8" }, + { "TITLE1", "#FFC8C8" }, + { "TITLE2", "#FFC8C8" }, + { "BGTABLE", "#7711AA" }, + { "BGTITLE", "#550088" } + }, + { /* zeDuel theme */ + { "Orange theme...", "zeduel" }, + { "BGCOLOR", "#FFFFFF" }, + { "TEXT", "#000000" }, + { "LINK", "#FF7700" }, + { "VLINK", "#C05A00" }, + { "ALINK", "#FF9A41" }, + { "TITLE1", "#C05A00" }, + { "TITLE2", "#FF7700" }, + { "BGTABLE", "#FFEEEE" }, + { "BGTITLE", "#FF7700" } } }; @@ -151,7 +225,8 @@ struct int lines; int letters; int hours[4]; - char quote[MAXLINELENGTH]; + char quote[MAXQUOTELENGTH+1]; + int counters[NBCOUNTERS]; } users[MAXUSERS]; int nbusers=0; @@ -159,13 +234,14 @@ struct { char nick[MAXNICKLENGTH]; char url[MAXLINELENGTH]; + char shorturl[MAXQUOTELENGTH+1]; } urls[5]; int nburls=0; struct { char nick[MAXNICKLENGTH]; - char topic[MAXLINELENGTH]; + char topic[MAXQUOTELENGTH+1]; } topics[5]; int nbtopics=0; @@ -242,12 +318,17 @@ void bestwords(struct letter pos,int cur) tempword[cur]='\0'; } -void unhtml(char *string) /* replace < and > by { and } */ +void printhtml(char *string) /* replace < and > by < and > */ { while (*string!='\0') { - if (*string=='<') *string='{'; - if (*string=='>') *string='}'; + switch (*string) + { + case '<':printf("<"); break; + case '>':printf(">"); break; + case '&':printf("&"); break; + default:printf("%c",*string); break; + } string++; } return; @@ -272,20 +353,23 @@ int dichotomic(char *nick) users[i].letters=users[i-1].letters; for (j=0;j<4;j++) users[i].hours[j]=users[i-1].hours[j]; strcpy(users[i].quote,users[i-1].quote); + for (j=0;j /path/to/file.html\n\n"); + fprintf(stderr,"Version :\nirssistats %s\n\n",VERSION); fprintf(stderr,"Supported languages :\n"); for (i=0;i=MAXLINELENGTH) { fprintf(stderr,"line too long\n"); exit(1); } if (c=='\n') { + line[pos-1]='\0'; totallines++; if (totallines%10000==0) { fprintf(stderr,"."); fflush(stdout); } if (strncmp("--- Day changed",line,15)==0) /* --- Day changed Wed May 01 2002 */ @@ -342,19 +429,25 @@ int main(int argc,char *argv[]) for (j=0;j<4;j++) lastdays[0].hours[j]=0; days++; } - else if (strncmp("-!-",&line[6],3)==0) /* 00:00 -!- Nick changed the topic of #channel to: new topic */ + 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'; + users[dichotomic(nick)].counters[D_MODE]++; + } + else if (strncmp("-!-",&line[6],3)==0) /* 00:00 -!- Nick something... */ { for (i=10;line[i]!=' ';i++); line[i]='\0'; nick=&line[10]; - unhtml(nick); message=&line[i+1]; - unhtml(message); - if (strncmp("changed the topic of",message,20)==0) + if (strncmp("changed the topic of",message,20)==0) /* 00:00 -!- Nick changed the topic of #channel to: new topic */ { + users[dichotomic(nick)].counters[D_TOPIC]++; for (i=21;message[i]!=':';i++); message=&message[i+2]; - line[pos-1]='\0'; nbtopics++; if ((nbtopics<=5) || (rand()%nbtopics==0)) { @@ -364,9 +457,30 @@ int main(int argc,char *argv[]) strcpy(topics[i].topic,topics[i-1].topic); } strcpy(topics[0].nick,nick); - strcpy(topics[0].topic,message); + strncpy(topics[0].topic,message,MAXQUOTELENGTH); } } + else if (strncmp("was kicked from",message,15)==0) /* 00:00 -!- Nick was kicked from #channel by Nick [Reason] */ + { + users[dichotomic(nick)].counters[D_KICKED]++; + for (i=16;message[i]!=' ';i++); + message=&message[i+4]; + for (i=0;message[i]!=' ';i++); + message[i]='\0'; + users[dichotomic(message)].counters[D_KICK]++; + } + else if (strncmp("is now known as",message,15)==0) /* 00:00 -!- Nick is now known as Nick */ + users[dichotomic(nick)].counters[D_NICK]++; + else if (message[0]=='[') /* 00:00 -!- Nick [user@host] something... */ + { + for (i=0;message[i]!=']';i++); + message=&message[i+2]; + if (strncmp("has joined",message,10)==0) /* 00:00 -!- Nick [user@host] has joined #channel */ + users[dichotomic(nick)].counters[D_JOIN]++; + else if (strncmp("has quit",message,8)==0); /* 00:00 -!- Nick [user@host] has quit [Reason] */ + else if (strncmp("has left",message,8)==0); /* 00:00 -!- Nick [user@host] has left #channel [Reason] */ + else; + } } else if ((line[6]=='<') || (line[7]=='*')) { @@ -391,20 +505,37 @@ int main(int argc,char *argv[]) message=&line[i+2]; } line[i]='\0'; - line[pos-1]='\0'; - unhtml(nick); - unhtml(message); i=dichotomic(nick); + if (line[7]=='*') users[i].counters[D_ME]++; + if (i==mononick) + { + monolines++; + if (monolines==5) users[i].counters[D_MONOLOGUE]++; + } + else + { + mononick=i; + monolines=1; + } + j=strlen(message); users[i].lines++; - users[i].letters+=strlen(message); + users[i].letters+=j; users[i].hours[hour/6]++; lastdays[0].lines++; lastdays[0].hours[hour/6]++; lines++; hours[hour]++; + if (message[j-1]=='?') users[i].counters[D_QUESTION]++; + else if (message[j-1]=='!') users[i].counters[D_EXCLAM]++; + else if ((message[j-3]==' ')&&(message[j-2]==':')) + { + if (message[j-1]==')') users[i].counters[D_SMILE]++; + else if (message[j-1]=='(') users[i].counters[D_FROWN]++; + } if (rand()%users[i].lines==0) strncpy(users[i].quote,message,MAXQUOTELENGTH); if (strncmp("http://",message,7)==0) { + users[i].counters[D_URL]++; for (i=0;(message[i]!=' ') && (i

%s

\n\n\n",T("TITLE2"),L("LEGEND"),T("BGTABLE")); - for (i=0;i<4;i++) printf("\n",i+1,L("HOURS"),i*6,i*6+5); + for (i=0;i<4;i++) printf("\n",i+1,L("HOURS"),i*6,i*6+5); printf("\n
: %s %d-%d  : %s %d-%d
\n

\n\n"); /* last days */ @@ -486,7 +619,9 @@ int main(int argc,char *argv[]) { printf("%d%s%d",T("BGTABLE"),i,T("BGTABLE"),users[user].nick,T("BGTABLE"),users[user].lines,T("BGTABLE")); for (j=0;j<4;j++) if (users[user].hours[j]!=0) printf("",j+1,100*users[user].hours[j]/users[user].lines); - printf("%d\"%s\"\n",T("BGTABLE"),users[user].letters/users[user].lines,T("BGTABLE"),users[user].letters/users[user].lines,T("BGTABLE"),users[user].quote); + printf("%d\"",T("BGTABLE"),users[user].letters/users[user].lines,T("BGTABLE"),users[user].letters/users[user].lines,T("BGTABLE")); + printhtml(users[user].quote); + printf("\"\n"); users[user].lines=-1; } } @@ -498,19 +633,51 @@ int main(int argc,char *argv[]) printf("
\n"); } printf("

\n\n"); + + /* top users by time */ + printf("

%s

\n",T("TITLE2"),L("TOPUSERSTIME")); + printf("\n"); + for (i=0;i<4;i++) printf("",T("BGTITLE"),L("HOURS"),i*6,i*6+5); + printf("\n"); + for (i=1;i<=NBUSERSTIME;i++) + { + printf("",T("BGTABLE"),i); + for (j=0;j<4;j++) + { + user=-1; + max=-1; + for (k=0;kmax) max=users[user=k].hours[j]; + if (user!=-1) + { + printf("",T("BGTABLE"),users[user].nick,T("BGTABLE"),users[user].hours[j]); + users[user].hours[j]=-1; + } + else printf(""); + } + printf("\n"); + } + printf("
%s %d-%d
%d%s%d
\n

\n\n"); /* random topics */ printf("

%s

\n",T("TITLE2"),L("RANDTOPICS")); printf("\n\n",T("BGTITLE"),L("CHANGEDBY"),T("BGTITLE"),L("NEWTOPIC")); for (i=nbtopics=0;i--) - printf("\n",T("BGTABLE"),topics[i].nick,T("BGTABLE"),topics[i].topic); + { + printf("\n"); + } printf("
%s%s
%s\"%s\"
%s\"",T("BGTABLE"),topics[i].nick,T("BGTABLE")); + printhtml(topics[i].topic); + printf("\"
\n

\n\n"); /* random urls */ printf("

%s

\n",T("TITLE2"),L("RANDURLS")); printf("\n\n",T("BGTITLE"),L("POSTEDBY"),T("BGTITLE"),L("POSTEDURL")); for (i=nburls=0;i--) - printf("\n",T("BGTABLE"),urls[i].nick,T("BGTABLE"),urls[i].url,urls[i].url); + { + printf("\n"); + } printf("
%s%s
%s\"%s\"
%s\"",T("BGTABLE"),urls[i].nick,T("BGTABLE"),urls[i].url); + printhtml(urls[i].shorturl); + printf("\"
\n

\n\n"); /* top words */ @@ -519,6 +686,18 @@ int main(int argc,char *argv[]) for (i=0;i%d\"%s\"%d\n",T("BGTABLE"),i+1,T("BGTABLE"),topwords[i].word,T("BGTABLE"),topwords[i].nb); printf("\n

\n\n"); + + /* big numbers */ + printf("

%s

\n",T("TITLE2"),L("BIGNUMBERS")); + printf("\n\n",T("BGTITLE"),L("NICK"),T("BGTITLE"),L("NUMBERS"),T("BGTITLE"),L("NBLINES")); + for (i=0;imax) max=users[user=j].counters[i]; + if (user!=-1) printf("",T("BGTABLE"),users[user].nick,T("BGTABLE"),L(counters[i]),T("BGTABLE"),users[user].counters[i]); + } + printf("
%s%s%s
%s%s%d
\n

\n\n"); /* footer */ printf(L("TIME"),totallines,(int)(time(NULL)-debut)); -- 2.20.1