Annotation of sbbs/src/sbbs3/umonitor/chat.c, revision 1.1.1.1

1.1       root        1: /* chat.c */
                      2: 
                      3: /* Synchronet for *nix sysop chat routines */
                      4: 
                      5: /* $Id: chat.c,v 1.14 2006/05/08 18:58:21 deuce Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include <sys/types.h>
                     39: #include <utime.h>
                     40: 
                     41: #include "ciolib.h"
                     42: #define __COLORS
                     43: #include "sbbs.h"
                     44: #include "chat.h"
                     45: 
                     46: #define PCHAT_LEN 1000         /* Size of Private chat file */
                     47: 
                     48: typedef struct {
                     49:        int     left;
                     50:        int     top;
                     51:        int     right;
                     52:        int     bottom;
                     53:        int     x;
                     54:        int     y;
                     55:        int colour;
                     56: } WINDOW;
                     57: 
                     58: WINDOW uwin;
                     59: WINDOW swin;
                     60: 
                     61: int togglechat(scfg_t *cfg, int node_num, node_t *node, int on)
                     62: {
                     63:     static int  org_act;
                     64: 
                     65:        int nodefile;
                     66:        if(getnodedat(cfg,node_num,node,&nodefile)) {
                     67:                return(FALSE);
                     68:        }
                     69:     if(on) {
                     70:         org_act=node->action;
                     71:         if(org_act==NODE_PCHT)
                     72:             org_act=NODE_MAIN;
                     73:         node->misc|=NODE_LCHAT;
                     74:     } else {
                     75:         node->action=org_act;
                     76:         node->misc&=~NODE_LCHAT;
                     77:     }
                     78:        putnodedat(cfg,node_num,node,nodefile);
                     79:     return(TRUE);
                     80: }
                     81: 
                     82: void drawchatwin(box_t *boxch, char* topname, char* botname) {
                     83:        struct text_info ti;
                     84:        int     i;
                     85: 
                     86:        _wscroll=0;
                     87:        gettextinfo(&ti);
                     88:        textcolor(WHITE);
                     89:        textbackground(BLACK);
                     90:        clrscr();
                     91:        uwin.top=1;
                     92:        uwin.left=1;
                     93:        uwin.right=ti.screenwidth;
                     94:        uwin.bottom=ti.screenheight/2-1;
                     95:        uwin.colour=GREEN;
                     96:        swin.top=ti.screenheight/2+1;
                     97:        swin.left=1;
                     98:        swin.right=ti.screenwidth;
                     99:        swin.bottom=ti.screenheight;
                    100:        swin.colour=LIGHTGREEN;
                    101: 
                    102:        gotoxy(1,ti.screenheight/2);
                    103:        putch(196);
                    104:        putch(196);
                    105:        putch(196);
                    106:        putch(196);
                    107:        putch(180);
                    108:        cputs(topname);
                    109:        putch(195);
                    110:        for(i=wherex();i<=ti.screenwidth;i++)
                    111:                putch(196);
                    112: 
                    113:        _wscroll=1;
                    114: }
                    115: 
                    116: int chatchar(WINDOW *win, int ch) {
                    117:        window(win->left,win->top,win->right,win->bottom);
                    118:        gotoxy(win->x,win->y);
                    119:        textcolor(win->colour);
                    120:        putch(ch);
                    121:        if(ch=='\r')
                    122:                putch('\n');
                    123:        win->x=wherex();
                    124:        win->y=wherey();
                    125:        return(0);
                    126: }
                    127: 
                    128: int chat(scfg_t *cfg, int nodenum, node_t *node, box_t *boxch, void(*timecallback)(void)) {
                    129:        int             in,out;
                    130:        char    inpath[MAX_PATH];
                    131:        char    outpath[MAX_PATH];
                    132:        char    usrname[128];
                    133:        char    *p;
                    134:        char    ch;
                    135:        time_t  now;
                    136:        time_t  last_nodechk=0;
                    137:        struct text_info ti;
                    138:        char    *buf;
                    139: 
                    140:        gettextinfo(&ti);
                    141:        if((buf=(char *)alloca(ti.screenwidth*ti.screenheight*2))==NULL) {
                    142:                return(-1);
                    143:        }
                    144: 
                    145:        if(getnodedat(cfg,nodenum,node,NULL))
                    146:                return(-1);
                    147: 
                    148:        username(cfg,node->useron,usrname);
                    149: 
                    150:        gettext(1,1,ti.screenwidth,ti.screenheight,buf);
                    151:        drawchatwin(boxch,usrname,cfg->sys_op);
                    152: 
                    153:        sprintf(outpath,"%slchat.dab",cfg->node_path[nodenum-1]);
                    154:        if((out=sopen(outpath,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE
                    155:                ,S_IREAD|S_IWRITE))==-1)
                    156:                return(-1);
                    157: 
                    158:        sprintf(inpath,"%schat.dab",cfg->node_path[nodenum-1]);
                    159:        if((in=sopen(inpath,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE
                    160:                ,S_IREAD|S_IWRITE))==-1) {
                    161:                close(out);
                    162:                return(-1);
                    163:     }
                    164: 
                    165:        if((p=(char *)alloca(PCHAT_LEN))==NULL) {
                    166:                close(in);
                    167:                close(out);
                    168:                return(-1);
                    169:     }
                    170:        memset(p,0,PCHAT_LEN);
                    171:        write(in,p,PCHAT_LEN);
                    172:        write(out,p,PCHAT_LEN);
                    173:        lseek(in,0,SEEK_SET);
                    174:        lseek(out,0,SEEK_SET);
                    175: 
                    176:        togglechat(cfg,nodenum,node,TRUE);
                    177: 
                    178:        while(in != -1) {
                    179:                
                    180:                now=time(NULL);
                    181:                if(now!=last_nodechk) {
                    182: 
                    183:                        if(timecallback != NULL)
                    184:                                timecallback();
                    185: 
                    186:                        if(getnodedat(cfg,nodenum,node,NULL)!=0)
                    187:                                break;
                    188:                        last_nodechk=now;
                    189:                }
                    190:                if(node->misc&NODE_LCHAT) {
                    191:                        if(kbhit()) {
                    192:                                ch=getch();
                    193:                                if(ch==ESC || ch==3) {
                    194:                                        close(in);
                    195:                                        in=-1;
                    196:                                }
                    197:                                if(ch==0 || ch==-1) {           /* Special keys... eat 'em. */
                    198:                                        getch();
                    199:                                }
                    200:                        }
                    201:                        YIELD();
                    202:                        continue;
                    203:                }
                    204: 
                    205:                if(node->status==NODE_WFC || node->status>NODE_QUIET || node->action!=NODE_PCHT) {
                    206:                        close(in);
                    207:                        in=-1;
                    208:                }
                    209: 
                    210:                utime(inpath,NULL);
                    211:                _setcursortype(_NORMALCURSOR);
                    212:                while(1) {
                    213:                        switch(read(in,&ch,1)) {
                    214:                                case -1:
                    215:                                        close(in);
                    216:                                        in=-1;
                    217:                                        break;
                    218: 
                    219:                                case 0:
                    220:                                        lseek(in,0,SEEK_SET);   /* Wrapped */
                    221:                                        continue;
                    222: 
                    223:                                case 1:
                    224:                                        lseek(in,-1L,SEEK_CUR);
                    225:                                        if(ch) {
                    226:                                                chatchar(&uwin,ch);
                    227:                                                ch=0;
                    228:                                                write(in,&ch,1);
                    229:                                                continue;
                    230:                                        }
                    231:                                        break;
                    232:                        }
                    233:                        break;
                    234:                }
                    235: 
                    236:                if(kbhit()) {
                    237:                        ch=getch();
                    238:                        switch(ch)  {
                    239:                                case 0:                 /* Special Chars */
                    240:                                case -1:
                    241:                                        ch=0;
                    242:                                        getch();
                    243:                                        break;
                    244: 
                    245:                                case ESC:
                    246:                                case 3:
                    247:                                        close(in);
                    248:                                        in=-1;
                    249:                                        continue;
                    250: 
                    251:                                default:
                    252:                                        if(lseek(out,0,SEEK_CUR)>=PCHAT_LEN)
                    253:                                                lseek(out,0,SEEK_SET);
                    254:                                        chatchar(&swin,ch);
                    255:                                        switch(write(out,&ch,1)) {
                    256:                                                case -1:
                    257:                                                        close(in);
                    258:                                                        in=-1;
                    259:                                                        break;
                    260:                                        }
                    261:                                        break;
                    262:                        }
                    263:                        utime(outpath,NULL);
                    264:                }
                    265:        }
                    266:        if(in != -1)
                    267:                close(in);
                    268:        if(out != -1)
                    269:                close(out);
                    270:        togglechat(cfg,nodenum,node,FALSE);
                    271:        puttext(1,1,ti.screenwidth,ti.screenheight,buf);
                    272:        window(ti.winleft,ti.wintop,ti.winright,ti.wintop);
                    273:        gotoxy(ti.curx,ti.cury);
                    274:        textattr(ti.attribute);
                    275:        return(0);
                    276: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.