/* $Id$ */
/*-------------------------------------------------------*/
/* copied from util/cchess.c ( NTU FPG BBS Ver 1.00 ) */
/*-------------------------------------------------------*/
/* target : 棋國設定檔自動更新程式 */
/*-------------------------------------------------------*/
#define CHESSCOUNTRY /* This tool is built with CHESSCOUNTRY defined */
#include "bbs.h"
/* Number of minutes of files' mtime before now will be rescanned. */
// #define UPDATE_FREQUENCY (30)
void
f_suck6(FILE* fp, char* fname)
{
FILE *sfp;
int count = 0;
if ((sfp = fopen(fname, "r")))
{
char inbuf[256];
while (fgets(inbuf, sizeof(inbuf), sfp) && count < 6)
{
fputs(inbuf, fp);
count++;
}
fclose(sfp);
}
while (count++ < 6)
fputc('\n', fp);
}
int
main(void)
{
FILE *fp, *ftmp;
int i = 0, num;
// char *currboard[3] = {"CCK-CHUHEN", "CCK-GENERAL", "CCK-FREE"};
// char *kingdom[3] = {"楚漢皇朝", "將帥帝聯", "逍遙王朝"};
char file1[80], file2[80], line[256], str[256];
time_t dtime;
boardheader_t brd;
int brdfd;
setgid(BBSGID);
setuid(BBSUID);
chdir(BBSHOME);
attach_SHM();
time(&dtime);
if ((brdfd = open(BBSHOME "/" FN_BOARD, O_RDONLY)) == -1){
perror("open " BBSHOME "/" FN_BOARD);
return 0;
}
while(read(brdfd, &brd, sizeof(brd)) == sizeof(brd))
{
const char* photo_fname = 0;
const char* chess_name = 0;
char kingdom_name[256];
int bid;
// struct stat st;
switch(brd.chesscountry){
case CHESSCODE_FIVE:
photo_fname = "photo_fivechess";
chess_name = "五子棋";
break;
case CHESSCODE_CCHESS:
photo_fname = "photo_cchess";
chess_name = "象棋";
break;
case CHESSCODE_GO:
photo_fname = "photo_go";
chess_name = "圍棋";
break;
default:
continue;
}
bid = getbnum(brd.brdname);
setapath(str, brd.brdname);
sprintf(file1, "%s/chess_list", str);
printf("apath = %s\n", str);
/*
if (stat(file1, &st) == 0 && st.st_mtime > (dtime - UPDATE_FREQUENCY * 60))
continue;
*/
sprintf(file2, "%s/chess_list.tmp", str);
if ((ftmp = fopen(file2, "w")) == NULL)
continue;
if ((fp = fopen(file1, "r")))
{
char *p;
char userid[IDLEN + 1], buf[256], name[11];
char date[11], other[IDLEN + 1];
int namelen;
fgets(kingdom_name, 256, fp);
fputs(kingdom_name, ftmp);
chomp(kingdom_name);
while (fgets(buf, sizeof(buf), fp))
{
i = 0;
strcpy(line, buf);
p = strtok(buf, " ");
name[0] = '\0';
if (p && *p != '#' && searchuser(p, userid))
{
i = 1;
if ((p = strtok(NULL, " ")))
strlcpy(name, p, sizeof(name));
else
i = 0;
if ((p = strtok(NULL, " ")))
strlcpy(date, p, sizeof(date));
else
i = 0;
if ((p = strtok(NULL, " ")))
strlcpy(other, p, sizeof(other));
else
i = 0;
}
if (!strcmp("除名", name))
{
sethomefile(buf, userid, photo_fname);
unlink(buf);
continue;
}
if (i == 0)
{
fprintf(ftmp, "%s", line);
continue;
}
namelen = strlen(name);
setapath(str, brd.brdname);
sprintf(buf, "%s/chess_photo/.DIR", str);
num = get_num_records(buf, sizeof(fileheader_t));
for (i = 1; i <= num; i++)
{
fileheader_t item;
if (get_record(buf, &item, sizeof item, i) != -1)
{
FILE *fp1;
if (!strncmp(item.title + 3, name, namelen) &&
(item.title[namelen + 3] == '\0' ||
item.title[namelen + 3] == ' ')
)
{
sethomefile(buf, userid, photo_fname);
if ((fp1 = fopen(buf, "w")))
{
sprintf(buf, "%s/chess_photo/%s", str, item.filename);
f_suck6(fp1, buf);
fprintf(fp1, "%d\n", bid);
if (strcmp("俘虜", name))
fprintf(fp1, "<所屬王國> %s (%s)\n", kingdom_name, chess_name);
else
fprintf(fp1, "<俘虜王國> %s\n", kingdom_name);
fprintf(fp1, "<現在階級> %s\n", name);
fprintf(fp1, "<加入日期> %s\n", date);
if (strcmp("俘虜", name))
{
int level;
fprintf(fp1, "<王國等級> ");
level = atoi(other);
for (i = 0; i < level; i++)
fprintf(fp1, "%s", "★");
}
else
{
chomp(other);
fprintf(fp1, "<被誰俘虜> %s", other);
}
fprintf(fp1, "\n<自我說明> \n");
fclose(fp1);
}
break;
}
}
}
if (i > num) // level photo not found
fprintf(ftmp, "%s", line);
else
fprintf(ftmp, "#%s", line);
}
fclose(fp);
fclose(ftmp);
rename(file2, file1);
} else {
fclose(ftmp);
}
}
return 0;
}