summaryrefslogblamecommitdiffstats
path: root/util/angel.c
blob: 8ffcb994796ed2ed139d73ccf7ffc89623c6ed01 (plain) (tree)
1
2
3
4
5
6
7
8
9
10







                       

                                
                 





                       




                                            





                                                                            
 
                                 



                                











                  

                 






                                             









                                                      
                                                          
                                                           
                                           
                               



                                    



               





                                              



                                                      

                                                       




                                      

                                  


                                                





























                                                                     
 




                                                           
     
 



                                      
                                        

                                                
                                
                                                                              



                                                    

                                                             
                                                          








                                                               
 
                                                       
               





                                                                     


                               
/* $Id$ */
#include "bbs.h"

#ifndef PLAY_ANGEL
int main(){ return 0; }
#else

int total[MAX_USERS];
unsigned char reject[MAX_USERS];
int nReject[4];
int rej_question;
int double_rej;
int (*list)[2];
int *rej_list;
int nReport = 50;
int count;
char* mailto = "SYSOP";

int ListCmp(const void * a, const void * b){
    return *(int*)b - *(int*)a;
}

int RejCmp(const void * a, const void * b){
    return strcasecmp(SHM->userid[*(int*)a - 1], SHM->userid[*(int*)b - 1]);
}

void readData();
void sendResult();

int main(int argc, char* argv[]){
    if(argc > 1)
    mailto = argv[1];
    if(argc > 2)
    nReport = atoi(argv[2]);

    readData();
    sendResult();
    return 0;
}

void readData(){
    int i, j;
    int k;
    userec_t user;
    FILE* fp;

    attach_SHM();

    fp = fopen(BBSHOME "/.Angel", "rb");
    if(fp != 0){
    fread(reject, 1, sizeof(reject), fp);
    fclose(fp);
    }

    fp = fopen(BBSHOME "/.PASSWDS", "rb");
    j = count = 0;
    while(fread(&user, sizeof(userec_t), 1, fp) == 1){
    ++j; /* j == uid */
    if(user.myangel[0]){
        i = searchuser(user.myangel);
        if(i)
        ++total[i];
    }
    if(user.userlevel & PERM_ANGEL){
        ++count;
        ++nReject[((user.uflag2 & ANGEL_MASK) >> 12)];
        ++total[j]; /* make all angel have total > 0 */
        if(user.uflag2 & REJ_QUESTION){
        ++rej_question;
        if(++reject[j] >= 2)
            ++double_rej;
        }else
        reject[j] = 0;
    }
    }
    fclose(fp);

    fp = fopen(BBSHOME "/.Angel", "wb");
    if(fp != NULL){
    fwrite(reject, sizeof(reject), 1, fp);
    fclose(fp);
    }

    if(nReport > count)
    nReport = count;

    list = (int(*)[2]) malloc(count * sizeof(int[2]));
    rej_list = (int*) malloc(double_rej * sizeof(int));
    k = j = 0;
    for(i = 0; i < MAX_USERS; ++i)
    if(total[i]){
        list[j][0] = total[i] - 1;
        list[j][1] = i;
        ++j;
        if(reject[i])
        rej_list[k++] = i;
    }

    qsort(list, count, sizeof(int[2]), ListCmp);
    qsort(rej_list, double_rej, sizeof(int), RejCmp);
}

int mailalertuser(char* userid)
{
    userinfo_t *uentp=NULL;
    if(userid[0] && (uentp = search_ulist_userid(userid)) )
         uentp->mailalert=1;
    return 0;
}      

void sendResult(){
    int i;
    FILE* fp;
    time_t t;
    fileheader_t header;
    struct stat st;
    char filename[512];

    sprintf(filename, BBSHOME "/home/%c/%s", mailto[0], mailto);
    if( stat(filename, &st) == -1 ){
    if( mkdir(filename, 0755) == -1 ){
        fprintf(stderr, "mail box create error %s \n", filename);
        return;
    }
    }
    else if( !(st.st_mode & S_IFDIR) ){
    fprintf(stderr, "mail box error\n");
    return;
    }

    stampfile(filename, &header);
    fp = fopen(filename, "w");
    if(fp == NULL){
    fprintf(stderr, "Cannot open file %s\n", filename);
    return;
    }

    time(&t);
    fprintf(fp, "作者: Ptt 站方統計\n"
        "標題: 小天使統計資料\n"
        "時間: %s\n"
        "\n現在全站小天使有 %d 位\n"
        "\n小主人人數最多的 %d 位小天使:\n",
        ctime(&t), count, nReport);
    for(i = 0; i < nReport; ++i)
    fprintf(fp, "%15s %5d 人\n", SHM->userid[list[i][1] - 1], list[i][0]);
    fprintf(fp, "\n現在男女皆收的小天使有 %d 位\n"
        "只收女生的有 %d 位  (共 %d 位收女生)\n"
        "只收男生的有 %d 位  (共 %d 位收男生)\n"
        "不接受新小天使的有 %d 位\n",
        nReject[0], nReject[1], nReject[1] + nReject[0],
        nReject[2], nReject[2] + nReject[0], nReject[3]);
    fprintf(fp, "\n現在開放小主人問問題的小天使有 %d 位\n"
        "不開放的有 %d 位\n"
        "連續兩次統計都不開放的有 %d 位:\n",
        count - rej_question, rej_question, double_rej);
    for(i = 0; i < double_rej; ++i){
    fprintf(fp, "%13s %d 次", SHM->userid[rej_list[i] - 1],
        reject[rej_list[i]]);
    if(i % 4 == 3) fputc('\n', fp);
    }
    if(i % 4 != 0) fputc('\n', fp);

    fputs("\n--\n\n  本資料由 angel 程式產生\n\n", fp);
    fclose(fp);

    strcpy(header.title, "小天使統計資料");
    strcpy(header.owner, "站方統計");
    sprintf(filename, BBSHOME "/home/%c/%s/.DIR", mailto[0], mailto);
    append_record(filename, &header, sizeof(header));
    mailalertuser(mailto);
}

#endif /* defined PLAY_ANGEL */