summaryrefslogblamecommitdiffstats
path: root/util/chkhbf.c
blob: 3203a3d0adff6783a7f81c600cdb0a7b2855469a (plain) (tree)
1
2
3
4
5
6
7
          





                              



























                                                              
                                             















































                                                                             

                   








                                                                         
                                                                         

































































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

struct {
    char    userid[IDLEN + 1];
    time_t  lastlogin, expire;
} explist[MAX_FRIEND];

void usage(void)
{
    fprintf(stderr, "通知隱板板主是否有板友過期/已經過期\n"
        "usage: chkhbf [-a] [board name [board name]]\n");
}

int mailalertuid(int tuid)
{
    userinfo_t *uentp=NULL;
    if(tuid>0 && (uentp = (userinfo_t *)search_ulist(tuid)) )
         uentp->mailalert=1;
    return 0;
}      

char *CTIMEx(char *buf, time_t t)
{
    strcpy(buf, ctime(&t));
    buf[strlen(buf) - 1] = 0;
    return buf;
}

void informBM(char *userid, boardheader_t *bptr, int nEXP)
{
    int     uid, i;
    char    filename[256], buf[64];
    fileheader_t mymail;
    FILE    *fp;
    if( !(uid = searchuser(userid, userid)) )
    return;
    sprintf(filename, BBSHOME "/home/%c/%s", userid[0], userid);
    stampfile(filename, &mymail);
    if( (fp = fopen(filename, "w")) == NULL )
    return;

    printf("brdname: %s, BM: %s\n", bptr->brdname, userid);
    fprintf(fp,
        "作者: 系統通知.\n"
        "標題: 警告: 貴板板友即將過期/已經過期\n"
        "時間: %s\n"
        " %s 的板主您好: \n"
        "    下列貴板板友即將過期或已經過期:\n"
        "------------------------------------------------------------\n",
        CTIMEx(buf, now), bptr->brdname);
    for( i = 0 ; i < nEXP ; ++i )
    if( explist[i].expire == -1 )
        fprintf(fp, "%-15s  已經過期\n", explist[i].userid);
    else
        fprintf(fp, "%-15s  即將在 %s 過期\n",
            explist[i].userid, CTIMEx(buf, explist[i].expire));
    fprintf(fp,
        "------------------------------------------------------------\n"
        "說明:\n"
        "    為了節省系統資源, 系統將自動清除掉超過四個月未上站\n"
        "的使用者. 此時若有某位您不認識的使用者恰好註冊了該帳號,\n"
        "將會視為貴板板友而放行進入.\n"
        "    建議您暫時將這些使用者自貴板的板友名單中移除.\n"
        "\n"
        "    這封信件是由程式自動發出, 請不要直接回覆這封信. 若\n"
        "您有相關問題請麻煩至看板 SYSOP, 或是直接與看板總管聯繫. :)\n"
        "\n"
        BBSNAME "站長群敬上"
        );
    fclose(fp);

    strcpy(mymail.title, "警告: 貴板板友即將過期/已經過期");
    strcpy(mymail.owner, "系統通知.");
    sprintf(filename, BBSHOME "/home/%c/%s/.DIR", userid[0], userid);
    mailalertuid(uid);
    append_record(filename, &mymail, sizeof(mymail));
}

void chkhbf(boardheader_t *bptr)
{
    char    fn[256], chkuser[256];
    int     i, nEXP = 0;
    FILE    *fp;
    userec_t xuser;

    sprintf(fn, "boards/%c/%s/visable", bptr->brdname[0], bptr->brdname);
    if( (fp = fopen(fn, "rt")) == NULL )
    return;
    while( fgets(chkuser, sizeof(chkuser), fp) != NULL ){
    for( i = 0 ; chkuser[i] != 0 && i < sizeof(chkuser) ; ++i )
        if( !isalnum(chkuser[i]) ){
        chkuser[i] = 0;
        break;
        }
    if( !getuser(chkuser, &xuser) || strcmp(chkuser, "guest") == 0 ){
        strcpy(explist[nEXP].userid, chkuser);
        explist[nEXP].expire = -1;
        ++nEXP;
    }
    else if( (xuser.lastlogin < now - 86400 * 90) &&
         !(xuser.userlevel & PERM_XEMPT) ){
        strcpy(explist[nEXP].userid, chkuser);
        explist[nEXP].lastlogin = xuser.lastlogin;
        explist[nEXP].expire = xuser.lastlogin + 86400 * 120;
        ++nEXP;
    }
    }
    fclose(fp);
    if( nEXP ){
    char    BM[IDLEN * 3 + 3], *p;
    strlcpy(BM, bptr->BM, sizeof(BM));
    for( p = BM ; *p != 0 ; ++p )
        if( !isalpha(*p) && !isdigit(*p) )
        *p = ' ';
    for( i = 0, p = strtok(BM, " ") ; p != NULL ;
         ++i, p = strtok(NULL, " ") )
        informBM(p, bptr, nEXP);
    }
}

int main(int argc, char **argv)
{
    int     ch, allboards = 0, i;
    boardheader_t  *bptr;
    while( (ch = getopt(argc, argv, "ah")) != -1 )
    switch( ch ){
    case 'a':
        allboards = 1;
        break;
    case 'h':
        usage();
        return 0;
    }

    chdir(BBSHOME);
    attach_SHM();
    argc -= optind;
    argv += optind;
    now = time(NULL);
    if( allboards ){
    for( i = 0 ; i < MAX_BOARD ; ++i ){
        bptr = &bcache[i];
        if( bptr->brdname[0] &&
        !(bptr->brdattr & (BRD_TOP | BRD_GROUPBOARD)) &&
        bptr->brdattr & BRD_HIDE )
        chkhbf(bptr);
    }
    }
    else if( argc > 0 ){
    int     bid;
    for( i = 0 ; i < argc ; ++i )
        if( (bid = getbnum(argv[i])) != 0 ) // XXX: bid start 1
        chkhbf(getbcache(bid));
        else
        fprintf(stderr, "%s not found\n", argv[i]);
    }
    else
    usage();

    return 0;
}