/* $Id: xyz.c,v 1.3 2002/04/30 13:20:56 lwms Exp $ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include "config.h"
#include "pttstruct.h"
#include "common.h"
#include "modes.h"
#include "proto.h"

extern char *fn_note_ans;
extern int b_lines;             /* Screen bottom line number: t_lines-1 */
extern char *BBSName;
extern char fromhost[];
extern userinfo_t *currutmp;
extern int curr_idle_timeout;
extern userec_t cuser;

/* �U�زέp�ά�����T�C�� */
/* Ptt90�~�פj���p�۬d�]�t��  */
int x_90() {
    extern char dict[21], database[41];
    strcpy(dict, "(90)����Ҹ�/�m�W/�Ǯ�/��t/����");
    strcpy(database, "etc/90");
    use_dict();
    return 0;
}

/* Ptt89�~�פj���p�۬d�]�t��  */
int x_89() {
    extern char dict[21], database[41];
    strcpy(dict, "(89)����Ҹ�/�m�W/�Ǯ�/��t/����");
    strcpy(database, "etc/89");
    use_dict();
    return 0;
}
/* Ptt88�~�פj���p�۬d�]�t��  */
int x_88() {
    extern char dict[21], database[41];

    strcpy(dict, "(88)����Ҹ�/�m�W/�Ǯ�/��t/����");
    strcpy(database, "etc/88");
    use_dict();
    return 0;
}    
/* Ptt87�~�פj���p�۬d�]�t��  */
int x_87() {
    extern char dict[21], database[41];

    strcpy(dict, "(87)����Ҹ�/�m�W/�Ǯ�/��t");
    strcpy(database, "etc/87");
    use_dict();
    return 0;
}    

/* Ptt86�~�פj���p�۬d�]�t��  */
int x_86() {
    extern char dict[21], database[41];

    strcpy(dict, "(86)����Ҹ�/�m�W/�Ǯ�/��t");
    strcpy(database, "etc/86");
    use_dict();
    return 0;
}

int x_boardman() {
    more("etc/topboardman", YEA);
    return 0;
}

int x_user100() {
    more("etc/topusr100", YEA);
    return 0;
}

int x_history() {
    more("etc/history", YEA);
    return 0;
}

#ifdef HAVE_X_BOARDS
static int x_boards() {
    more("etc/topboard.tmp", YEA);
    return 0;
}
#endif

int x_birth() {
    more("etc/birth.today", YEA);
    return 0;
}

int x_weather() {
    more("etc/weather.tmp", YEA);
    return 0;
}

int x_stock() {
    more("etc/stock.tmp", YEA);
    return 0;
}

int x_note() {
    more(fn_note_ans, YEA);
    return 0;
}

int x_issue() {
    more("etc/day", YEA);
    return 0;
}

int x_week() {
    more("etc/week", YEA);
    return 0;
}

int x_today() {
    more("etc/today", YEA);
    return 0;
}

int x_yesterday() {
    more("etc/yesterday", YEA);
    return 0;
}

int x_login() {
    more("etc/Welcome_login.0", YEA);
    return 0;
}

#ifdef HAVE_INFO
static int x_program() {
    more("etc/version", YEA);
    return 0;
}
#endif

#ifdef HAVE_LICENSE
static int x_gpl() {
    more("etc/GPL", YEA);
    return 0;
}
#endif

/* ���} BBS �� */
int note() {
    static char *fn_note_tmp = "note.tmp";
    static char *fn_note_dat = "note.dat";
    int total = 0, i, collect, len;
    struct stat st;
    char buf[256], buf2[80];
    int fd, fx;
    FILE *fp, *foo;

    typedef struct notedata_t {
	time_t date;
	char userid[IDLEN + 1];
	char username[19];
	char buf[3][80];
    } notedata_t;
    notedata_t myitem;

    if(cuser.money < 5) {
	outmsg("\033[1;41m �u�r! �n�뤭�Ȥ~��d��...�S���C..\033[m");
	clrtoeol();
	refresh();
	return 0;
    }

    setutmpmode(EDNOTE);
    do {
	myitem.buf[0][0] = myitem.buf[1][0] = myitem.buf[2][0] = '\0';
	move(12, 0);
	clrtobot();
	outs("\n�뤭��... ��... �Яd�� (�ܦh�T��)�A��[Enter]����");
	for(i = 0; (i < 3) && getdata(16 + i, 0, "�G", myitem.buf[i],
				      sizeof(myitem.buf[i]), DOECHO)
		&& *myitem.buf[i]; i++);
	getdata(b_lines - 1, 0, "(S)�x�s (E)���s�ӹL (Q)�����H[S] ",
		buf, 3, LCECHO);

	if(buf[0] == 'q' || (i == 0 && *buf != 'e'))
	    return 0;
    } while(buf[0] == 'e');
    demoney(-5);
    strcpy(myitem.userid, cuser.userid);
    strncpy(myitem.username, cuser.username, 18);
    myitem.username[18] = '\0';
    time(&(myitem.date));

    /* begin load file */
    if((foo = fopen(".note", "a")) == NULL)
	return 0;

    if((fp = fopen(fn_note_ans, "w")) == NULL)
	return 0;

    if((fx = open(fn_note_tmp, O_WRONLY | O_CREAT, 0644)) <= 0)
	return 0;

    if((fd = open(fn_note_dat, O_RDONLY)) == -1)
	total = 1;
    else if(fstat(fd, &st) != -1) {
	total = st.st_size / sizeof(notedata_t) + 1;
	if (total > MAX_NOTE)
	    total = MAX_NOTE;
    }

    fputs("\033[1;31;44m��s�w�w�w�w�w�w�w�w�w�w�w�w�w�w�t"
	  "\033[37m�IJ��W���O\033[31m�u�w�w�w�w�w�w�w�w�w�w�w�w�w�w�s��"
	  "\033[m\n", fp);
    collect = 1;

    while(total) {
	sprintf(buf, "\033[1;31m�~�t\033[32m %s \033[37m(%s)",
		myitem.userid, myitem.username);
	len = strlen(buf);

	for(i = len ; i < 73; i++)
	    strcat(buf, " ");
	sprintf(buf2, " \033[1;36m%.14s\033[31m   �u��\033[m\n",
		Cdate(&(myitem.date)));
	strcat(buf, buf2);
	fputs(buf, fp);
	if(collect)
	    fputs(buf, foo);
	for(i = 0 ; i < 3 && *myitem.buf[i]; i++) {
            fprintf(fp, "\033[1;31m�x\033[m%-74.74s\033[1;31m�x\033[m\n",
		    myitem.buf[i]);
            if(collect)
		fprintf(foo, "\033[1;31m�x\033[m%-74.74s\033[1;31m�x\033[m\n",
			myitem.buf[i]);
        }
	fputs("\033[1;31m���s�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w"
	      "�w�w�w�w�w�w�w�w�w�w�w�w�s��\033[m\n",fp);

	if(collect) {
	    fputs("\033[1;31m���s�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w"
		  "�w�w�w�w�w�w�w�w�w�w�w�w�w�w�s��\033[m\n", foo);
	    fclose(foo);
	    collect = 0;
	}
	
	write(fx, &myitem, sizeof(myitem));
	
	if(--total)
	    read(fd, (char *) &myitem, sizeof(myitem));
    }
    fputs("\033[1;31;44m��r�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w"
	  "�w�w�w�w�w�w�w�w�w�w�w�w�r��\033[m\n",fp);
    fclose(fp);
    close(fd);
    close(fx);
    Rename(fn_note_tmp, fn_note_dat);
    more(fn_note_ans, YEA);
    return 0;
}

static void mail_sysop() {
    FILE *fp;
    char genbuf[200];
    
    if((fp = fopen("etc/sysop", "r"))) {
	int i, j;
	char *ptr;
	
	typedef struct sysoplist_t {
	    char userid[IDLEN + 1];
	    char duty[40];
	} sysoplist_t;
	sysoplist_t sysoplist[9];
	
	j = 0;
	while(fgets(genbuf, 128, fp)) {
	    if((ptr = strchr(genbuf, '\n'))) {
		*ptr = '\0';
		if((ptr = strchr(genbuf, ':'))) {
		    *ptr = '\0';
		    do {
			i = *++ptr;
		    } while(i == ' ' || i == '\t');
		    if(i) {
			strcpy(sysoplist[j].userid, genbuf);
			strcpy(sysoplist[j++].duty, ptr);
		    }
		}
	    }
	}
	
	move(12, 0);
	clrtobot();
	prints("%16s   %-18s�v�d����\n\n", "�s��", "���� ID");

	for(i = 0; i < j; i++)
	    prints("%15d.   \033[1;%dm%-16s%s\033[0m\n",
		   i + 1, 31 + i % 7, sysoplist[i].userid, sysoplist[i].duty);
	prints("%-14s0.   \033[1;%dm���}\033[0m", "", 31 + j % 7);
	getdata(b_lines - 1, 0, "                   �п�J�N�X[0]�G",
		genbuf, 4, DOECHO);
	i = genbuf[0] - '0' - 1;
	if(i >= 0 && i < j) {
	    clear();
	    do_send(sysoplist[i].userid, NULL);
	}
    }
}

int m_sysop() {
    setutmpmode(MSYSOP);
    mail_sysop();
    return 0;
}

int Goodbye() {
    extern void movie();
    char genbuf[100];

    getdata(b_lines - 1, 0, "�z�T�w�n���}�i " BBSNAME " �j��(Y/N)�H[N] ",
	    genbuf, 3, LCECHO);

    if(*genbuf != 'y')
	return 0;

    movie(999);
    if(cuser.userlevel) {
	getdata(b_lines - 1, 0,
		"(G)�H���ӳu (M)���گ��� (N)�IJ��W���y�����H[G] ",
		genbuf, 3, LCECHO);
	if(genbuf[0] == 'm')
	    mail_sysop();
	else if(genbuf[0] == 'n')
	    note();
    }
    
    clear();
    prints("\033[1;36m�˷R�� \033[33m%s(%s)\033[36m�A�O�ѤF�A�ץ��{\033[45;33m"
	   " %s \033[40;36m�I\n�H�U�O�z�b���������U���:\033[0m\n",
	   cuser.userid, cuser.username, BBSName);
    user_display(&cuser, 0);
    pressanykey();
    
    more("etc/Logout",NA);
    pressanykey();
    u_exit("EXIT ");
    return QUIT; 
}

/* �䴩�~���{�� : tin�Bgopher�Bwww�Bbbsnet�Bgame�Bcsh */
#define LOOKFIRST       (0)
#define LOOKLAST        (1)
#define QUOTEMODE       (2)
#define MAXCOMSZ        (1024)
#define MAXARGS         (40)
#define MAXENVS         (20)
#define BINDIR          BBSHOME"/bin/"

#define MAXPATHLEN 256

#ifdef HAVE_TIN
static int x_tin() {
    clear();
    return exec_cmd(NEWS, YEA, "bin/tin.sh", "TIN");
}
#endif

#ifdef HAVE_GOPHER
static int x_gopher() {
    clear();
    return exec_cmd(GOPHER, YEA, "bin/gopher.sh", "GOPHER");
}
#endif

#ifdef HAVE_WWW
static int x_www() {
    return exec_cmd(WWW, NA, "bin/www.sh", "WWW");
}
#endif

#ifdef HAVE_IRC
static int x_irc() {
    return exec_cmd(XMODE, NA, "bin/irc.sh", "IRC");
}
#endif

#ifdef HAVE_ARCHIE
static int x_archie() {
    char buf[STRLEN], ans[4];
    char genbuf1[100], genbuf2[200];
    char *s;

    setutmpmode(ARCHIE);
    clear();
    outs("\n�w����{�i\033[1;33;44m" BBSNAME "\033[m�j�ϥ� "
	 "\033[32mARCHIE\033[m �\\��\n");
    outs("\n���\\��N���z�C�X�b���� FTP ���s���z���M�䪺�ɮ�.\n");
    outs("\n�п�J���j�M���r��, �Ϊ����� <ENTER> �����C\n");
    outs("\n                            coder by Harimau\n");
    outs("                              modified by Leeym\n");
    getdata(13,0,"�j�M�r��G",buf,20,DOECHO,0);
    if(buf[0]=='\0') {
	prints("\n�����j�M.....\n");
	pressanykey();
	return;
    }

    for(s = buf; *s != '\0'; s++) {
        if(isspace(*s)) {
            prints("\n�@���u��j�M�@�Ӧr���, ����ӳg�߳�!!");
            pressanykey();
            return;
	}
    }
    bbssetenv("ARCHIESTRING", buf);
    exec_cmd(ARCHIE, YEA, "bin/archie.sh", ARCHIE);
    log_usies("ARCHIE", "");
    strcpy(genbuf1, buf);
    sprintf(buf, BBSHOME "/tmp/archie.%s", cuser.userid);
    if(dashf(buf)) {
	getdata(0, 0, "�n�N���G�H�^�H�c��(Y/N)�H[N]",
		ans, sizeof(ans), DOECHO, 0);
	if(*ans == 'y') {
	    fileheader_t mhdr;
	    char title[128], buf1[80];
	    FILE* fp;
	    
	    sethomepath(buf1, cuser.userid);
	    stampfile(buf1, &mhdr);
	    strcpy(mhdr.owner, cuser.userid);
	    sprintf(genbuf2, "Archie �j�M�ɮ�: %s ���G", genbuf1);
	    strcpy(mhdr.title, genbuf2);
	    mhdr.savemode = 0;
	    mhdr.filemode = 0;
	    sethomedir(title, cuser.userid);
	    append_record(title, &mhdr, sizeof(mhdr));
	    Link(buf, buf1);
	}
	more( buf, YEA);
	unlink (buf);
    }
}
#endif                          /* HAVE_ARCHIE */