summaryrefslogblamecommitdiffstats
path: root/upgrade/r3968_chicken.c
blob: 137629e44f09a06a12aa9b401d8e49d7933c6d39 (plain) (tree)










































































                                                                                    

                  




                                                      
                     
 
                    

                                           






                                                             

                         





                                                              





                                                      












                                                                       











                                                                         
         
                                                                      

                


                                
                                             

             
#include "bbs.h"

// warning: if you changed userec_t, you must use the old version.

typedef struct {
    unsigned int    version;    /* version number of this sturcture, we
                     * use revision number of project to denote.*/

    char    userid[IDLEN + 1];  /* ID */
    char    realname[20];   /* 真實姓名 */
    char    nickname[24];   /* 暱稱 */
    char    passwd[PASSLEN];    /* 密碼 */
    char    padx;
    unsigned int    uflag;  /* 習慣1 , see uflags.h */
    unsigned int    uflag2; /* 習慣2 , see uflags.h */
    unsigned int    userlevel;  /* 權限 */
    unsigned int    numlogins;  /* 上站次數 */
    unsigned int    numposts;   /* 文章篇數 */
    time4_t firstlogin;     /* 註冊時間 */
    time4_t lastlogin;      /* 最近上站時間 */
    char    lasthost[16];   /* 上次上站來源 */
    int     money;      /* Ptt幣 */
    char    remoteuser[3];  /* 保留 目前沒用到的 */
    char    proverb;        /* 座右銘 (unused) */
    char    email[50];      /* Email */
    char    address[50];    /* 住址 */
    char    justify[REGLEN + 1];    /* 審核資料 */
    unsigned char   month;  /* 生日 月 */
    unsigned char   day;    /* 生日 日 */
    unsigned char   year;   /* 生日 年 */
    unsigned char   sex;    /* 性別 */
    unsigned char   state;  /* TODO unknown (unused ?) */
    unsigned char   pager;  /* 呼叫器狀態 */
    unsigned char   invisible;  /* 隱形狀態 */
    char    padxx[2];
    unsigned int    exmailbox;  /* 購買信箱數 TODO short 就夠了 */
    chicken_t       mychicken;  /* 寵物 */
    time4_t lastsong;       /* 上次點歌時間 */
    unsigned int    loginview;  /* 進站畫面 */
    unsigned char   channel;    /* TODO unused */
    char    padxxx;
    unsigned short  vl_count;   /* 違法記錄 ViolateLaw counter */
    unsigned short  five_win;   /* 五子棋戰績 勝 */
    unsigned short  five_lose;  /* 五子棋戰績 敗 */
    unsigned short  five_tie;   /* 五子棋戰績 和 */
    unsigned short  chc_win;    /* 象棋戰績 勝 */
    unsigned short  chc_lose;   /* 象棋戰績 敗 */
    unsigned short  chc_tie;    /* 象棋戰績 和 */
    int     mobile;     /* 手機號碼 */
    char    mind[4];        /* 心情 not a null-terminate string */
    unsigned short  go_win; /* 圍棋戰績 勝 */
    unsigned short  go_lose;    /* 圍棋戰績 敗 */
    unsigned short  go_tie; /* 圍棋戰績 和 */
    char    pad0[5];        /* 從前放 ident 身份證字號,現在可以拿來做別的事了,
                   不過最好記得要先清成 0 */
    unsigned char   signature;  /* 慣用簽名檔 */

    unsigned char   goodpost;   /* 評價為好文章數 */
    unsigned char   badpost;    /* 評價為壞文章數 */
    unsigned char   goodsale;   /* 競標 好的評價  */
    unsigned char   badsale;    /* 競標 壞的評價  */
    char    myangel[IDLEN+1];   /* 我的小天使 */
    char    pad2;
    unsigned short  chess_elo_rating;   /* 象棋等級分 */
    unsigned int    withme; /* 我想找人下棋,聊天.... */
    time4_t timeremovebadpost;  /* 上次刪除劣文時間 */
    time4_t timeviolatelaw; /* 被開罰單時間 */
    char    pad[28];
} old_userec_t;

int main()
{
    FILE *fp = fopen(FN_PASSWD, "rb"), *fp2 = NULL;
    char fn[PATHLEN];
    old_userec_t u;
    time4_t now=0;
    int i, cusr;

    if (!fp) {
    printf("cannot load password file. abort.\n");
    return -1;
    }
    now = time(NULL);

    i = 0; cusr = 0;
    while (fread(&u, sizeof(u), 1, fp) > 0)
    {
    /*
    cusr ++;
    if (cusr % (MAX_USERS / 100) == 0)
    {
        fprintf(stderr, "%3d%%\r", cusr/(MAX_USERS/100));
    }
    */
    if (!u.userid[0])
        continue;

    // if dead and no records, // not possible to revive, 
    // then abort.
    if (!u.mychicken.name[0] &&
         u.mychicken.cbirth == 0)
         // u.lastvisit + 86400*7 < now
        continue;

    // now, write this data to user home.
    // sethomefile(fn, u.userid, FN_CHICKEN);
    sprintf(fn, BBSHOME "/home/%c/%s/" FN_CHICKEN,
        u.userid[0], u.userid);

    // ignore created entries (if you are running live upgrade)
    if (access(fn, R_OK) == 0)//dashf(fn))
    {
        // printf("\nfound created entry, ignore: %s\n", u.userid);
        continue;
    }

    /*
    i++;
    continue;
    */

    fp2 = fopen(fn, "wb");
    if (!fp2)
    {
        printf("ERROR: cannot create chicken data: %s.\n", u.userid);
        continue;
    }
    if (fwrite(&u.mychicken, sizeof(u.mychicken), 1, fp2) < 1)
    {
        printf("ERROR: cannot write chicken data: %s.\n", u.userid);
        unlink(fn);
    }
    else
    {
        // printf("Transferred chicken data OK: %s.\n", u.userid);
        i++;
    }
    fclose(fp2); fp2 = NULL;
    }
    fclose(fp);
    printf("\ntotal %d users updated.\n", i);
    return 0;
}