summaryrefslogtreecommitdiffstats
path: root/mbbsd/xyz.c
diff options
context:
space:
mode:
authorin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2002-03-07 23:13:44 +0800
committerin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2002-03-07 23:13:44 +0800
commitae31e19f92e717919ac8e3db9039eb38d2b89aae (patch)
treec70164d6a1852344f44b04a653ae2815043512af /mbbsd/xyz.c
downloadpttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.gz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.bz2
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.lz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.xz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.zst
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.zip
Initial revision
git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk/pttbbs@1 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/xyz.c')
-rw-r--r--mbbsd/xyz.c448
1 files changed, 448 insertions, 0 deletions
diff --git a/mbbsd/xyz.c b/mbbsd/xyz.c
new file mode 100644
index 00000000..786add30
--- /dev/null
+++ b/mbbsd/xyz.c
@@ -0,0 +1,448 @@
+/* $Id: xyz.c,v 1.1 2002/03/07 15:13:48 in2 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;
+
+/* 各種統計及相關資訊列表 */
+/* Ptt90年度大學聯招查榜系統 */
+int x_90() {
+ extern char dict[21], database[41];
+ strcpy(dict, "(90)准考證號/姓名/學校/科系/類組");
+ strcpy(database, "etc/90");
+ use_dict();
+ return 0;
+}
+
+/* Ptt89年度大學聯招查榜系統 */
+int x_89() {
+ extern char dict[21], database[41];
+ strcpy(dict, "(89)准考證號/姓名/學校/科系/類組");
+ strcpy(database, "etc/89");
+ use_dict();
+ return 0;
+}
+/* Ptt88年度大學聯招查榜系統 */
+int x_88() {
+ extern char dict[21], database[41];
+
+ strcpy(dict, "(88)准考證號/姓名/學校/科系/類組");
+ strcpy(database, "etc/88");
+ use_dict();
+ return 0;
+}
+/* Ptt87年度大學聯招查榜系統 */
+int x_87() {
+ extern char dict[21], database[41];
+
+ strcpy(dict, "(87)准考證號/姓名/學校/科系");
+ strcpy(database, "etc/87");
+ use_dict();
+ return 0;
+}
+
+/* Ptt86年度大學聯招查榜系統 */
+int x_86() {
+ extern char dict[21], database[41];
+
+ strcpy(dict, "(86)准考證號/姓名/學校/科系");
+ 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", 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 哎呀! 要投五銀才能留言...沒錢耶..\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投五銀... 嗶... 請留言 (至多三行),按[Enter]結束");
+ for(i = 0; (i < 3) && getdata(16 + i, 0, ":", myitem.buf[i], 78,
+ DOECHO) && *myitem.buf[i]; i++);
+ getdata(b_lines - 1, 0, "(S)儲存 (E)重新來過 (Q)取消?[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☉┬──────────────┤"
+ "\033[37m酸甜苦辣板\033[31m├──────────────┬☉"
+ "\033[m\n", fp);
+ collect = 1;
+
+ while(total) {
+ sprintf(buf, "\033[1;31m╭┤\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 ├╮\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│\033[m%-74.74s\033[1;31m│\033[m\n",
+ myitem.buf[i]);
+ if(collect)
+ fprintf(foo, "\033[1;31m│\033[m%-74.74s\033[1;31m│\033[m\n",
+ myitem.buf[i]);
+ }
+ fputs("\033[1;31m╰┬───────────────────────"
+ "────────────┬╯\033[m\n",fp);
+
+ if(collect) {
+ fputs("\033[1;31m╰┬─────────────────────"
+ "──────────────┬╯\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☉┴───────────────────────"
+ "────────────┴☉\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權責劃分\n\n", "編號", "站長 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, " 請輸入代碼[0]:",
+ 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, "您確定要離開【 " BBSNAME " 】嗎(Y/N)?[N] ",
+ genbuf, 3, LCECHO);
+
+ if(*genbuf != 'y')
+ return 0;
+
+ movie(999);
+ if(cuser.userlevel) {
+ getdata(b_lines - 1, 0,
+ "(G)隨風而逝 (M)托夢站長 (N)酸甜苦辣流言版?[G] ",
+ genbuf, 3, LCECHO);
+ if(genbuf[0] == 'm')
+ mail_sysop();
+ else if(genbuf[0] == 'n')
+ note();
+ }
+
+ clear();
+ prints("\033[1;36m親愛的 \033[33m%s(%s)\033[36m,別忘了再度光臨\033[45;33m"
+ " %s \033[40;36m!\n以下是您在站內的註冊資料:\033[0m\n",
+ cuser.userid, cuser.username, BBSName);
+ user_display(&cuser, 0);
+ pressanykey();
+
+ more("etc/Logout",NA);
+ pressanykey();
+ u_exit("EXIT ");
+ return QUIT;
+}
+
+/* 支援外掛程式 : tin、gopher、www、bbsnet、game、csh */
+#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歡迎光臨【\033[1;33;44m" BBSNAME "\033[m】使用 "
+ "\033[32mARCHIE\033[m 功\能\n");
+ outs("\n本功\能將為您列出在哪個 FTP 站存有您欲尋找的檔案.\n");
+ outs("\n請輸入欲搜尋的字串, 或直接按 <ENTER> 取消。\n");
+ outs("\n coder by Harimau\n");
+ outs(" modified by Leeym\n");
+ getdata(13,0,"搜尋字串:",buf,20,DOECHO,0);
+ if(buf[0]=='\0') {
+ prints("\n取消搜尋.....\n");
+ pressanykey();
+ return;
+ }
+
+ for(s = buf; *s != '\0'; s++) {
+ if(isspace(*s)) {
+ prints("\n一次只能搜尋一個字串啦, 不能太貪心喔!!");
+ 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, "要將結果寄回信箱嗎(Y/N)?[N]", ans, 3, 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 搜尋檔案: %s 結果", 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 */