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

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

unix.superglobalmegacorp.com

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