Annotation of sbbs/src/sbbs3/scfg/scfgchat.c, revision 1.1.1.1

1.1       root        1: /* scfgchat.c */
                      2: 
                      3: /* $Id: scfgchat.c,v 1.9 2005/11/27 23:34:28 deuce Exp $ */
                      4: 
                      5: /****************************************************************************
                      6:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      7:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                      8:  *                                                                                                                                                     *
                      9:  * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html         *
                     10:  *                                                                                                                                                     *
                     11:  * This program is free software; you can redistribute it and/or                       *
                     12:  * modify it under the terms of the GNU General Public License                         *
                     13:  * as published by the Free Software Foundation; either version 2                      *
                     14:  * of the License, or (at your option) any later version.                                      *
                     15:  * See the GNU General Public License for more details: gpl.txt or                     *
                     16:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     17:  *                                                                                                                                                     *
                     18:  * Anonymous FTP access to the most recent released source is available at     *
                     19:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     20:  *                                                                                                                                                     *
                     21:  * Anonymous CVS access to the development source and modification history     *
                     22:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     23:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     24:  *     (just hit return, no password is necessary)                                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     26:  *                                                                                                                                                     *
                     27:  * For Synchronet coding style and modification guidelines, see                                *
                     28:  * http://www.synchro.net/source.html                                                                          *
                     29:  *                                                                                                                                                     *
                     30:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     31:  * format) via e-mail to [email protected]                                                                      *
                     32:  *                                                                                                                                                     *
                     33:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     34:  ****************************************************************************/
                     35: 
                     36: #include "scfg.h"
                     37: 
                     38: void page_cfg()
                     39: {
                     40:        static int dflt,bar;
                     41:        char str[81],done=0;
                     42:        int j,k;
                     43:        uint i;
                     44:        static page_t savpage;
                     45: 
                     46: while(1) {
                     47:        for(i=0;i<cfg.total_pages && i<MAX_OPTS;i++)
                     48:                sprintf(opt[i],"%-40.40s %-.20s",cfg.page[i]->cmd,cfg.page[i]->arstr);
                     49:        opt[i][0]=0;
                     50:        j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT;
                     51:        if(cfg.total_pages)
                     52:                j|=WIN_DEL|WIN_GET;
                     53:        if(cfg.total_pages<MAX_OPTS)
                     54:                j|=WIN_INS|WIN_INSACT|WIN_XTR;
                     55:        if(savpage.cmd[0])
                     56:                j|=WIN_PUT;
                     57:        SETHELP(WHERE);
                     58: /*
                     59: &External Sysop Chat Pagers:&
                     60: 
                     61: This is a list of the configured external sysop chat pagers.
                     62: 
                     63: To add a pager, select the desired location and hit  INS .
                     64: 
                     65: To delete a pager, select it and hit  DEL .
                     66: 
                     67: To configure a pager, select it and hit  ENTER .
                     68: */
                     69:        i=uifc.list(j,0,0,45,&dflt,&bar,"External Sysop Chat Pagers",opt);
                     70:        if((signed)i==-1)
                     71:                return;
                     72:        if((i&MSK_ON)==MSK_INS) {
                     73:                i&=MSK_OFF;
                     74:                sprintf(str,"%%!tone +chatpage.ton");
                     75:                SETHELP(WHERE);
                     76: /*
                     77: &External Chat Pager Command Line:&
                     78: 
                     79: This is the command line to execute for this external chat pager.
                     80: */
                     81:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Command Line",str,50
                     82:                        ,K_EDIT)<1)
                     83:             continue;
                     84:                if((cfg.page=(page_t **)realloc(cfg.page,sizeof(page_t *)*(cfg.total_pages+1)))
                     85:             ==NULL) {
                     86:             errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_pages+1);
                     87:                        cfg.total_pages=0;
                     88:                        bail(1);
                     89:             continue; }
                     90:                if(cfg.total_pages)
                     91:                        for(j=cfg.total_pages;j>i;j--)
                     92:                                cfg.page[j]=cfg.page[j-1];
                     93:                if((cfg.page[i]=(page_t *)malloc(sizeof(page_t)))==NULL) {
                     94:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(page_t));
                     95:                        continue; }
                     96:                memset((page_t *)cfg.page[i],0,sizeof(page_t));
                     97:                strcpy(cfg.page[i]->cmd,str);
                     98:                cfg.total_pages++;
                     99:                uifc.changes=1;
                    100:                continue; }
                    101:        if((i&MSK_ON)==MSK_DEL) {
                    102:                i&=MSK_OFF;
                    103:                free(cfg.page[i]);
                    104:                cfg.total_pages--;
                    105:                for(j=i;j<cfg.total_pages;j++)
                    106:                        cfg.page[j]=cfg.page[j+1];
                    107:                uifc.changes=1;
                    108:                continue; }
                    109:        if((i&MSK_ON)==MSK_GET) {
                    110:                i&=MSK_OFF;
                    111:                savpage=*cfg.page[i];
                    112:                continue; }
                    113:        if((i&MSK_ON)==MSK_PUT) {
                    114:                i&=MSK_OFF;
                    115:                *cfg.page[i]=savpage;
                    116:                uifc.changes=1;
                    117:         continue; }
                    118:        j=0;
                    119:        done=0;
                    120:        while(!done) {
                    121:                k=0;
                    122:                sprintf(opt[k++],"%-27.27s%.40s","Command Line",cfg.page[i]->cmd);
                    123:                sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.page[i]->arstr);
                    124:                sprintf(opt[k++],"%-27.27s%s","Intercept I/O Interrupts"
                    125:                        ,cfg.page[i]->misc&IO_INTS ? "Yes":"No");
                    126:                opt[k][0]=0;
                    127:                sprintf(str,"Sysop Chat Pager #%d",i+1);
                    128:                switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0,str,opt)) {
                    129:                        case -1:
                    130:                                done=1;
                    131:                                break;
                    132:                        case 0:
                    133:                                SETHELP(WHERE);
                    134: /*
                    135: &External Chat Pager Command Line:&
                    136: 
                    137: This is the command line to execute for this external chat pager.
                    138: */
                    139:                                strcpy(str,cfg.page[i]->cmd);
                    140:                                if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Command Line"
                    141:                                        ,cfg.page[i]->cmd,sizeof(cfg.page[i]->cmd)-1,K_EDIT))
                    142:                                        strcpy(cfg.page[i]->cmd,str);
                    143:                                break;
                    144:                        case 1:
                    145:                                getar(str,cfg.page[i]->arstr);
                    146:                                break;
                    147:                        case 2:
                    148:                                k=1;
                    149:                                strcpy(opt[0],"Yes");
                    150:                                strcpy(opt[1],"No");
                    151:                                opt[2][0]=0;
                    152:                                SETHELP(WHERE);
                    153: /*
                    154: &Intercept I/O Interrupts:&
                    155: 
                    156: If you wish the DOS screen output and keyboard input to be intercepted
                    157: when running this chat pager, set this option to &Yes&.
                    158: */
                    159:                                k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O Interrupts"
                    160:                                        ,opt);
                    161:                                if(!k && !(cfg.page[i]->misc&IO_INTS)) {
                    162:                                        cfg.page[i]->misc|=IO_INTS;
                    163:                                        uifc.changes=1; }
                    164:                                else if(k==1 && cfg.page[i]->misc&IO_INTS) {
                    165:                                        cfg.page[i]->misc&=~IO_INTS;
                    166:                                        uifc.changes=1; }
                    167:                 break;
                    168: 
                    169:                                } } }
                    170: }
                    171: 
                    172: void chan_cfg()
                    173: {
                    174:        static int chan_dflt,chan_bar,opt_dflt;
                    175:        char str[81],code[9],done=0,*p;
                    176:        int j,k;
                    177:        uint i;
                    178:        static chan_t savchan;
                    179: 
                    180: while(1) {
                    181:        for(i=0;i<cfg.total_chans && i<MAX_OPTS;i++)
                    182:                sprintf(opt[i],"%-25s",cfg.chan[i]->name);
                    183:        opt[i][0]=0;
                    184:        j=WIN_ACT|WIN_SAV|WIN_BOT|WIN_RHT;
                    185:        if(cfg.total_chans)
                    186:                j|=WIN_DEL|WIN_GET;
                    187:        if(cfg.total_chans<MAX_OPTS)
                    188:                j|=WIN_INS|WIN_INSACT|WIN_XTR;
                    189:        if(savchan.name[0])
                    190:                j|=WIN_PUT;
                    191:        SETHELP(WHERE);
                    192: /*
                    193: &Multinode Chat Channels:&
                    194: 
                    195: This is a list of the configured multinode chat channels.
                    196: 
                    197: To add a channel, select the desired location with the arrow keys and
                    198: hit  INS .
                    199: 
                    200: To delete a channel, select it with the arrow keys and hit  DEL .
                    201: 
                    202: To configure a channel, select it with the arrow keys and hit  ENTER .
                    203: */
                    204:        i=uifc.list(j,0,0,45,&chan_dflt,&chan_bar,"Multinode Chat Channels",opt);
                    205:        if((signed)i==-1)
                    206:                return;
                    207:        if((i&MSK_ON)==MSK_INS) {
                    208:                i&=MSK_OFF;
                    209:                strcpy(str,"Open");
                    210:                SETHELP(WHERE);
                    211: /*
                    212: &Channel Name:&
                    213: 
                    214: This is the name or description of the chat channel.
                    215: */
                    216:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Channel Name",str,25
                    217:                        ,K_EDIT)<1)
                    218:             continue;
                    219:                sprintf(code,"%.8s",str);
                    220:                p=strchr(code,' ');
                    221:                if(p) *p=0;
                    222:         strupr(code);
                    223:                SETHELP(WHERE);
                    224: /*
                    225: &Chat Channel Internal Code:&
                    226: 
                    227: Every chat channel must have its own unique code for Synchronet to refer
                    228: to it internally. This code is usually an abreviation of the chat
                    229: channel name.
                    230: */
                    231:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code"
                    232:                        ,code,LEN_CODE,K_EDIT|K_UPPER)<1)
                    233:                        continue;
                    234:                if(!code_ok(code)) {
                    235:                        uifc.helpbuf=invalid_code;
                    236:                        uifc.msg("Invalid Code");
                    237:                        uifc.helpbuf=0;
                    238:             continue; }
                    239:                if((cfg.chan=(chan_t **)realloc(cfg.chan,sizeof(chan_t *)*(cfg.total_chans+1)))
                    240:             ==NULL) {
                    241:             errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chans+1);
                    242:                        cfg.total_chans=0;
                    243:                        bail(1);
                    244:             continue; }
                    245:                if(cfg.total_chans)
                    246:                        for(j=cfg.total_chans;j>i;j--)
                    247:                                cfg.chan[j]=cfg.chan[j-1];
                    248:                if((cfg.chan[i]=(chan_t *)malloc(sizeof(chan_t)))==NULL) {
                    249:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chan_t));
                    250:                        continue; }
                    251:                memset((chan_t *)cfg.chan[i],0,sizeof(chan_t));
                    252:                strcpy(cfg.chan[i]->name,str);
                    253:                strcpy(cfg.chan[i]->code,code);
                    254:                cfg.total_chans++;
                    255:                uifc.changes=1;
                    256:                continue; }
                    257:        if((i&MSK_ON)==MSK_DEL) {
                    258:                i&=MSK_OFF;
                    259:                free(cfg.chan[i]);
                    260:                cfg.total_chans--;
                    261:                for(j=i;j<cfg.total_chans;j++)
                    262:                        cfg.chan[j]=cfg.chan[j+1];
                    263:                uifc.changes=1;
                    264:                continue; }
                    265:        if((i&MSK_ON)==MSK_GET) {
                    266:                i&=MSK_OFF;
                    267:                savchan=*cfg.chan[i];
                    268:                continue; }
                    269:        if((i&MSK_ON)==MSK_PUT) {
                    270:                i&=MSK_OFF;
                    271:                *cfg.chan[i]=savchan;
                    272:                uifc.changes=1;
                    273:         continue; }
                    274:     j=0;
                    275:        done=0;
                    276:        while(!done) {
                    277:                k=0;
                    278:                sprintf(opt[k++],"%-27.27s%s","Name",cfg.chan[i]->name);
                    279:                sprintf(opt[k++],"%-27.27s%s","Internal Code",cfg.chan[i]->code);
                    280:                sprintf(opt[k++],"%-27.27s%lu","Cost in Credits",cfg.chan[i]->cost);
                    281:                sprintf(opt[k++],"%-27.27s%.40s","Access Requirements"
                    282:                        ,cfg.chan[i]->arstr);
                    283:                sprintf(opt[k++],"%-27.27s%s","Password Protection"
                    284:                        ,cfg.chan[i]->misc&CHAN_PW ? "Yes" : "No");
                    285:                sprintf(opt[k++],"%-27.27s%s","Guru Joins When Empty"
                    286:                        ,cfg.chan[i]->misc&CHAN_GURU ? "Yes" : "No");
                    287:                sprintf(opt[k++],"%-27.27s%s","Channel Guru"
                    288:                        ,cfg.chan[i]->guru<cfg.total_gurus ? cfg.guru[cfg.chan[i]->guru]->name : "");
                    289:         sprintf(opt[k++],"%-27.27s%s","Channel Action Set"
                    290:             ,cfg.actset[cfg.chan[i]->actset]->name);
                    291:                opt[k][0]=0;
                    292:                SETHELP(WHERE);
                    293: /*
                    294: &Chat Channel Configuration:&
                    295: 
                    296: This menu is for configuring the selected chat channel.
                    297: */
                    298:                sprintf(str,"%s Chat Channel",cfg.chan[i]->name);
                    299:                switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str,opt)) {
                    300:                        case -1:
                    301:                                done=1;
                    302:                                break;
                    303:                        case 0:
                    304:                                SETHELP(WHERE);
                    305: /*
                    306: &Chat Channel Name:&
                    307: 
                    308: This is the name or description of the chat channel.
                    309: */
                    310:                                strcpy(str,cfg.chan[i]->name);
                    311:                                if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Channel Name"
                    312:                                        ,cfg.chan[i]->name,sizeof(cfg.chan[i]->name)-1,K_EDIT))
                    313:                                        strcpy(cfg.chan[i]->name,str);
                    314:                                break;
                    315:                        case 1:
                    316:                                SETHELP(WHERE);
                    317: /*
                    318: &Chat Channel Internal Code:&
                    319: 
                    320: Every chat channel must have its own unique code for Synchronet to refer
                    321: to it internally. This code is usually an abreviation of the chat
                    322: channel name.
                    323: */
                    324:                                strcpy(str,cfg.chan[i]->code);
                    325:                                if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Internal Code"
                    326:                                        ,str,LEN_CODE,K_UPPER|K_EDIT))
                    327:                                        break;
                    328:                                if(code_ok(str))
                    329:                                        strcpy(cfg.chan[i]->code,str);
                    330:                                else {
                    331:                                        uifc.helpbuf=invalid_code;
                    332:                                        uifc.msg("Invalid Code");
                    333:                     uifc.helpbuf=0; }
                    334:                 break;
                    335:                        case 2:
                    336:                                ultoa(cfg.chan[i]->cost,str,10);
                    337:                 SETHELP(WHERE);
                    338: /*
                    339: &Chat Channel Cost to Join:&
                    340: 
                    341: If you want users to be charged credits to join this chat channel, set
                    342: this value to the number of credits to charge. If you want this channel
                    343: to be free, set this value to &0&.
                    344: */
                    345:                                uifc.input(WIN_MID|WIN_SAV,0,0,"Cost to Join (in Credits)"
                    346:                     ,str,10,K_EDIT|K_NUMBER);
                    347:                                cfg.chan[i]->cost=atol(str);
                    348:                 break;
                    349:                        case 3:
                    350:                                sprintf(str,"%s Chat Channel",cfg.chan[i]->name);
                    351:                                getar(str,cfg.chan[i]->arstr);
                    352:                                break;
                    353:                        case 4:
                    354:                                k=1;
                    355:                                strcpy(opt[0],"Yes");
                    356:                                strcpy(opt[1],"No");
                    357:                                opt[2][0]=0;
                    358:                                SETHELP(WHERE);
                    359: /*
                    360: &Allow Channel to be Password Protected:&
                    361: 
                    362: If you want to allow the first user to join this channel to password
                    363: protect it, set this option to &Yes&.
                    364: */
                    365:                                k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
                    366:                                        ,"Allow Channel to be Password Protected"
                    367:                                        ,opt);
                    368:                                if(!k && !(cfg.chan[i]->misc&CHAN_PW)) {
                    369:                                        cfg.chan[i]->misc|=CHAN_PW;
                    370:                                        uifc.changes=1; }
                    371:                                else if(k==1 && cfg.chan[i]->misc&CHAN_PW) {
                    372:                                        cfg.chan[i]->misc&=~CHAN_PW;
                    373:                                        uifc.changes=1; }
                    374:                                break;
                    375:                        case 5:
                    376:                                k=1;
                    377:                                strcpy(opt[0],"Yes");
                    378:                                strcpy(opt[1],"No");
                    379:                                opt[2][0]=0;
                    380:                                SETHELP(WHERE);
                    381: /*
                    382: &Guru Joins This Channel When Empty:&
                    383: 
                    384: If you want the system guru to join this chat channel when there is
                    385: only one user, set this option to &Yes&.
                    386: */
                    387:                                k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
                    388:                                        ,"Guru Joins This Channel When Empty"
                    389:                                        ,opt);
                    390:                                if(!k && !(cfg.chan[i]->misc&CHAN_GURU)) {
                    391:                                        cfg.chan[i]->misc|=CHAN_GURU;
                    392:                                        uifc.changes=1; }
                    393:                                else if(k==1 && cfg.chan[i]->misc&CHAN_GURU) {
                    394:                                        cfg.chan[i]->misc&=~CHAN_GURU;
                    395:                                        uifc.changes=1; }
                    396:                                break;
                    397:                        case 6:
                    398: SETHELP(WHERE);
                    399: /*
                    400: &Channel Guru:&
                    401: 
                    402: This is a list of available chat Gurus.  Select the one that you wish
                    403: to have available in this channel.
                    404: */
                    405:                                k=0;
                    406:                                for(j=0;j<cfg.total_gurus && j<MAX_OPTS;j++)
                    407:                                        sprintf(opt[j],"%-25s",cfg.guru[j]->name);
                    408:                                opt[j][0]=0;
                    409:                                k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0
                    410:                                        ,"Available Chat Gurus",opt);
                    411:                                if(k==-1)
                    412:                                        break;
                    413:                                cfg.chan[i]->guru=k;
                    414:                                break;
                    415:                        case 7:
                    416: SETHELP(WHERE);
                    417: /*
                    418: &Channel Action Set:&
                    419: 
                    420: This is a list of available chat action sets.  Select the one that you
                    421: wish to have available in this channel.
                    422: */
                    423:                                k=0;
                    424:                                for(j=0;j<cfg.total_actsets && j<MAX_OPTS;j++)
                    425:                                        sprintf(opt[j],"%-25s",cfg.actset[j]->name);
                    426:                                opt[j][0]=0;
                    427:                                k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0
                    428:                                        ,"Available Chat Action Sets",opt);
                    429:                                if(k==-1)
                    430:                                        break;
                    431:                                uifc.changes=1;
                    432:                                cfg.chan[i]->actset=k;
                    433:                                break; } } }
                    434: }
                    435: 
                    436: void chatact_cfg(uint setnum)
                    437: {
                    438:        static int chatact_dflt,chatact_bar;
                    439:        char str[128],cmd[128],out[128];
                    440:        int j;
                    441:        uint i,n,chatnum[MAX_OPTS+1];
                    442:        static chatact_t savchatact;
                    443: 
                    444: while(1) {
                    445:        for(i=0,j=0;i<cfg.total_chatacts && j<MAX_OPTS;i++)
                    446:                if(cfg.chatact[i]->actset==setnum) {
                    447:                        sprintf(opt[j],"%-*.*s %s",LEN_CHATACTCMD,LEN_CHATACTCMD
                    448:                                ,cfg.chatact[i]->cmd,cfg.chatact[i]->out);
                    449:                        chatnum[j++]=i; }
                    450:        chatnum[j]=cfg.total_chatacts;
                    451:        opt[j][0]=0;
                    452:        i=WIN_ACT|WIN_SAV;
                    453:        if(j)
                    454:                i|=WIN_DEL|WIN_GET;
                    455:        if(j<MAX_OPTS)
                    456:                i|=WIN_INS|WIN_INSACT|WIN_XTR;
                    457:        if(savchatact.cmd[0])
                    458:                i|=WIN_PUT;
                    459:        SETHELP(WHERE);
                    460: /*
                    461: &Multinode Chat Actions:&
                    462: 
                    463: This is a list of the configured multinode chat actions.  The users can
                    464: use these actions in multinode chat by turning on action commands with
                    465: the &/A& command in multinode chat.  Then if a line is typed which
                    466: begins with a valid &action command& and has a user name, chat handle,
                    467: or node number following, the output string will be displayed replacing
                    468: the &%s& symbols with the sending user's name and the receiving user's
                    469: name (in that order).
                    470: 
                    471: To add an action, select the desired location with the arrow keys and
                    472: hit  INS .
                    473: 
                    474: To delete an action, select it with the arrow keys and hit  DEL .
                    475: 
                    476: To configure an action, select it with the arrow keys and hit  ENTER .
                    477: */
                    478:        sprintf(str,"%s Chat Actions",cfg.actset[setnum]->name);
                    479:        i=uifc.list(i,0,0,70,&chatact_dflt,&chatact_bar,str,opt);
                    480:        if((signed)i==-1)
                    481:                return;
                    482:        if((i&MSK_ON)==MSK_INS) {
                    483:                i&=MSK_OFF;
                    484:                SETHELP(WHERE);
                    485: /*
                    486: &Chat Action Command:&
                    487: 
                    488: This is the command word (normally a verb) to trigger the action output.
                    489: */
                    490:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Action Command",cmd,LEN_CHATACTCMD
                    491:                        ,K_UPPER)<1)
                    492:             continue;
                    493:                SETHELP(WHERE);
                    494: /*
                    495: &Chat Action Output String:&
                    496: 
                    497: This is the output string displayed with this action output.
                    498: */
                    499:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"",out,LEN_CHATACTOUT
                    500:                        ,K_MSG)<1)
                    501:             continue;
                    502:                if((cfg.chatact=(chatact_t **)realloc(cfg.chatact
                    503:             ,sizeof(chatact_t *)*(cfg.total_chatacts+1)))==NULL) {
                    504:             errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chatacts+1);
                    505:                        cfg.total_chatacts=0;
                    506:                        bail(1);
                    507:             continue; }
                    508:                if(j)
                    509:                        for(n=cfg.total_chatacts;n>chatnum[i];n--)
                    510:                                cfg.chatact[n]=cfg.chatact[n-1];
                    511:                if((cfg.chatact[chatnum[i]]=(chatact_t *)malloc(sizeof(chatact_t)))==NULL) {
                    512:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chatact_t));
                    513:                        continue; }
                    514:                memset((chatact_t *)cfg.chatact[chatnum[i]],0,sizeof(chatact_t));
                    515:                strcpy(cfg.chatact[chatnum[i]]->cmd,cmd);
                    516:                strcpy(cfg.chatact[chatnum[i]]->out,out);
                    517:                cfg.chatact[chatnum[i]]->actset=setnum;
                    518:                cfg.total_chatacts++;
                    519:                uifc.changes=1;
                    520:                continue; }
                    521:        if((i&MSK_ON)==MSK_DEL) {
                    522:                i&=MSK_OFF;
                    523:                free(cfg.chatact[chatnum[i]]);
                    524:                cfg.total_chatacts--;
                    525:                for(j=chatnum[i];j<cfg.total_chatacts && j<MAX_OPTS;j++)
                    526:                        cfg.chatact[j]=cfg.chatact[j+1];
                    527:                uifc.changes=1;
                    528:                continue; }
                    529:        if((i&MSK_ON)==MSK_GET) {
                    530:                i&=MSK_OFF;
                    531:                savchatact=*cfg.chatact[chatnum[i]];
                    532:                continue; }
                    533:        if((i&MSK_ON)==MSK_PUT) {
                    534:                i&=MSK_OFF;
                    535:                *cfg.chatact[chatnum[i]]=savchatact;
                    536:                cfg.chatact[chatnum[i]]->actset=setnum;
                    537:                uifc.changes=1;
                    538:         continue; }
                    539:        SETHELP(WHERE);
                    540: /*
                    541: &Chat Action Command:&
                    542: 
                    543: This is the command that triggers this chat action.
                    544: */
                    545:        strcpy(str,cfg.chatact[chatnum[i]]->cmd);
                    546:        if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Action Command"
                    547:                ,cfg.chatact[chatnum[i]]->cmd,LEN_CHATACTCMD,K_EDIT|K_UPPER)) {
                    548:                strcpy(cfg.chatact[chatnum[i]]->cmd,str);
                    549:                continue; }
                    550:        SETHELP(WHERE);
                    551: /*
                    552: &Chat Action Output String:&
                    553: 
                    554: This is the output string that results from this chat action.
                    555: */
                    556:        strcpy(str,cfg.chatact[chatnum[i]]->out);
                    557:        if(!uifc.input(WIN_MID|WIN_SAV,0,10,""
                    558:                ,cfg.chatact[chatnum[i]]->out,LEN_CHATACTOUT,K_EDIT|K_MSG))
                    559:                strcpy(cfg.chatact[chatnum[i]]->out,str); }
                    560: }
                    561: 
                    562: void guru_cfg()
                    563: {
                    564:        static int guru_dflt,guru_bar,opt_dflt;
                    565:        char str[81],code[9],done=0,*p;
                    566:        int j,k;
                    567:        uint i;
                    568:        static guru_t savguru;
                    569: 
                    570: while(1) {
                    571:        for(i=0;i<cfg.total_gurus && i<MAX_OPTS;i++)
                    572:                sprintf(opt[i],"%-25s",cfg.guru[i]->name);
                    573:        opt[i][0]=0;
                    574:        j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT;
                    575:        if(cfg.total_gurus)
                    576:                j|=WIN_DEL|WIN_GET;
                    577:        if(cfg.total_gurus<MAX_OPTS)
                    578:                j|=WIN_INS|WIN_INSACT|WIN_XTR;
                    579:        if(savguru.name[0])
                    580:                j|=WIN_PUT;
                    581:        SETHELP(WHERE);
                    582: /*
                    583: &Gurus:&
                    584: 
                    585: This is a list of the configured Gurus.
                    586: 
                    587: To add a Guru, select the desired location with the arrow keys and
                    588: hit  INS .
                    589: 
                    590: To delete a Guru, select it with the arrow keys and hit  DEL .
                    591: 
                    592: To configure a Guru, select it with the arrow keys and hit  ENTER .
                    593: */
                    594:        i=uifc.list(j,0,0,45,&guru_dflt,&guru_bar,"Artificial Gurus",opt);
                    595:        if((signed)i==-1)
                    596:                return;
                    597:        if((i&MSK_ON)==MSK_INS) {
                    598:                i&=MSK_OFF;
                    599:                SETHELP(WHERE);
                    600: /*
                    601: &Guru Name:&
                    602: 
                    603: This is the name of the selected Guru.
                    604: */
                    605:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Name",str,25
                    606:                        ,0)<1)
                    607:             continue;
                    608:                sprintf(code,"%.8s",str);
                    609:                p=strchr(code,' ');
                    610:                if(p) *p=0;
                    611:         strupr(code);
                    612:                SETHELP(WHERE);
                    613: /*
                    614: &Guru Internal Code:&
                    615: 
                    616: Every Guru must have its own unique code for Synchronet to refer to
                    617: it internally. This code is usually an abreviation of the Guru name.
                    618: */
                    619:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code"
                    620:                        ,code,LEN_CODE,K_EDIT|K_UPPER)<1)
                    621:                        continue;
                    622:                if(!code_ok(code)) {
                    623:                        uifc.helpbuf=invalid_code;
                    624:                        uifc.msg("Invalid Code");
                    625:                        uifc.helpbuf=0;
                    626:             continue; }
                    627:                if((cfg.guru=(guru_t **)realloc(cfg.guru,sizeof(guru_t *)*(cfg.total_gurus+1)))
                    628:             ==NULL) {
                    629:                        errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_gurus+1);
                    630:                        cfg.total_gurus=0;
                    631:                        bail(1);
                    632:             continue; }
                    633:                if(cfg.total_gurus)
                    634:                        for(j=cfg.total_gurus;j>i;j--)
                    635:                                cfg.guru[j]=cfg.guru[j-1];
                    636:                if((cfg.guru[i]=(guru_t *)malloc(sizeof(guru_t)))==NULL) {
                    637:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(guru_t));
                    638:                        continue; }
                    639:                memset((guru_t *)cfg.guru[i],0,sizeof(guru_t));
                    640:                strcpy(cfg.guru[i]->name,str);
                    641:                strcpy(cfg.guru[i]->code,code);
                    642:                cfg.total_gurus++;
                    643:                uifc.changes=1;
                    644:                continue; }
                    645:        if((i&MSK_ON)==MSK_DEL) {
                    646:                i&=MSK_OFF;
                    647:                free(cfg.guru[i]);
                    648:                cfg.total_gurus--;
                    649:                for(j=i;j<cfg.total_gurus;j++)
                    650:                        cfg.guru[j]=cfg.guru[j+1];
                    651:                uifc.changes=1;
                    652:                continue; }
                    653:        if((i&MSK_ON)==MSK_GET) {
                    654:                i&=MSK_OFF;
                    655:                savguru=*cfg.guru[i];
                    656:                continue; }
                    657:        if((i&MSK_ON)==MSK_PUT) {
                    658:                i&=MSK_OFF;
                    659:                *cfg.guru[i]=savguru;
                    660:                uifc.changes=1;
                    661:         continue; }
                    662:     j=0;
                    663:        done=0;
                    664:        while(!done) {
                    665:                k=0;
                    666:                sprintf(opt[k++],"%-27.27s%s","Guru Name",cfg.guru[i]->name);
                    667:                sprintf(opt[k++],"%-27.27s%s","Guru Internal Code",cfg.guru[i]->code);
                    668:                sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.guru[i]->arstr);
                    669:                opt[k][0]=0;
                    670:                SETHELP(WHERE);
                    671: /*
                    672: &Guru Configuration:&
                    673: 
                    674: This menu is for configuring the selected Guru.
                    675: */
                    676:                switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,cfg.guru[i]->name
                    677:                        ,opt)) {
                    678:                        case -1:
                    679:                                done=1;
                    680:                                break;
                    681:                        case 0:
                    682:                                SETHELP(WHERE);
                    683: /*
                    684: &Guru Name:&
                    685: 
                    686: This is the name of the selected Guru.
                    687: */
                    688:                                strcpy(str,cfg.guru[i]->name);
                    689:                                if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Guru Name"
                    690:                                        ,cfg.guru[i]->name,sizeof(cfg.guru[i]->name)-1,K_EDIT))
                    691:                                        strcpy(cfg.guru[i]->name,str);
                    692:                                break;
                    693:                        case 1:
                    694: SETHELP(WHERE);
                    695: /*
                    696: &Guru Internal Code:&
                    697: 
                    698: Every Guru must have its own unique code for Synchronet to refer to
                    699: it internally. This code is usually an abreviation of the Guru name.
                    700: */
                    701:                                strcpy(str,cfg.guru[i]->code);
                    702:                                if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Internal Code"
                    703:                                        ,str,LEN_CODE,K_EDIT|K_UPPER))
                    704:                                        break;
                    705:                                if(code_ok(str))
                    706:                                        strcpy(cfg.guru[i]->code,str);
                    707:                                else {
                    708:                                        uifc.helpbuf=invalid_code;
                    709:                                        uifc.msg("Invalid Code");
                    710:                     uifc.helpbuf=0; }
                    711:                                break;
                    712:                        case 2:
                    713:                                getar(cfg.guru[i]->name,cfg.guru[i]->arstr);
                    714:                                break; } } }
                    715: }
                    716: 
                    717: void actsets_cfg()
                    718: {
                    719:     static int actset_dflt,actset_bar,opt_dflt;
                    720:     char str[81];
                    721:     int j,k,done;
                    722:     uint i;
                    723:     static actset_t savactset;
                    724: 
                    725: while(1) {
                    726:        for(i=0;i<cfg.total_actsets && i<MAX_OPTS;i++)
                    727:                sprintf(opt[i],"%-25s",cfg.actset[i]->name);
                    728:        opt[i][0]=0;
                    729:        j=WIN_ACT|WIN_RHT|WIN_BOT|WIN_SAV;
                    730:     if(cfg.total_actsets)
                    731:         j|=WIN_DEL|WIN_GET;
                    732:        if(cfg.total_actsets<MAX_OPTS)
                    733:         j|=WIN_INS|WIN_INSACT|WIN_XTR;
                    734:     if(savactset.name[0])
                    735:         j|=WIN_PUT;
                    736:     SETHELP(WHERE);
                    737: /*
                    738: &Chat Action Sets:&
                    739: 
                    740: This is a list of the configured action sets.
                    741: 
                    742: To add an action set, select the desired location with the arrow keys and
                    743: hit  INS .
                    744: 
                    745: To delete an action set, select it with the arrow keys and hit  DEL .
                    746: 
                    747: To configure an action set, select it with the arrow keys and hit
                    748:  ENTER .
                    749: */
                    750:        i=uifc.list(j,0,0,45,&actset_dflt,&actset_bar,"Chat Action Sets",opt);
                    751:        if((signed)i==-1)
                    752:                return;
                    753:        if((i&MSK_ON)==MSK_INS) {
                    754:                i&=MSK_OFF;
                    755:         SETHELP(WHERE);
                    756: /*
                    757: &Chat Action Set Name:&
                    758: 
                    759: This is the name of the selected chat action set.
                    760: */
                    761:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Action Set Name",str,25
                    762:                        ,0)<1)
                    763:             continue;
                    764:         if((cfg.actset=(actset_t **)realloc(cfg.actset,sizeof(actset_t *)*(cfg.total_actsets+1)))
                    765:             ==NULL) {
                    766:             errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_actsets+1);
                    767:                        cfg.total_actsets=0;
                    768:                        bail(1);
                    769:             continue; }
                    770:         if(cfg.total_actsets)
                    771:             for(j=cfg.total_actsets;j>i;j--)
                    772:                 cfg.actset[j]=cfg.actset[j-1];
                    773:         if((cfg.actset[i]=(actset_t *)malloc(sizeof(actset_t)))==NULL) {
                    774:             errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(actset_t));
                    775:             continue; }
                    776:                memset((actset_t *)cfg.actset[i],0,sizeof(actset_t));
                    777:         strcpy(cfg.actset[i]->name,str);
                    778:         cfg.total_actsets++;
                    779:         uifc.changes=1;
                    780:         continue; }
                    781:        if((i&MSK_ON)==MSK_DEL) {
                    782:                i&=MSK_OFF;
                    783:         free(cfg.actset[i]);
                    784:         cfg.total_actsets--;
                    785:         for(j=i;j<cfg.total_actsets;j++)
                    786:             cfg.actset[j]=cfg.actset[j+1];
                    787:         uifc.changes=1;
                    788:         continue; }
                    789:        if((i&MSK_ON)==MSK_GET) {
                    790:                i&=MSK_OFF;
                    791:         savactset=*cfg.actset[i];
                    792:         continue; }
                    793:        if((i&MSK_ON)==MSK_PUT) {
                    794:                i&=MSK_OFF;
                    795:         *cfg.actset[i]=savactset;
                    796:         uifc.changes=1;
                    797:         continue; }
                    798:     j=0;
                    799:     done=0;
                    800:     while(!done) {
                    801:         k=0;
                    802:         sprintf(opt[k++],"%-27.27s%s","Action Set Name",cfg.actset[i]->name);
                    803:         sprintf(opt[k++],"%-27.27s","Configure Chat Actions...");
                    804:                opt[k][0]=0;
                    805:         SETHELP(WHERE);
                    806: /*
                    807: &Chat Action Set Configuration:&
                    808: 
                    809: This menu is for configuring the selected chat action set.
                    810: */
                    811:                sprintf(str,"%s Chat Action Set",cfg.actset[i]->name);
                    812:                switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str
                    813:             ,opt)) {
                    814:             case -1:
                    815:                 done=1;
                    816:                 break;
                    817:             case 0:
                    818:                 SETHELP(WHERE);
                    819: /*
                    820: &Chat Action Set Name:&
                    821: 
                    822: This is the name of the selected action set.
                    823: */
                    824:                 strcpy(str,cfg.actset[i]->name);
                    825:                                if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Action Set Name"
                    826:                     ,cfg.actset[i]->name,sizeof(cfg.actset[i]->name)-1,K_EDIT))
                    827:                     strcpy(cfg.actset[i]->name,str);
                    828:                 break;
                    829:             case 1:
                    830:                 chatact_cfg(i);
                    831:                 break; } } }
                    832: }
                    833: 

unix.superglobalmegacorp.com

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