Annotation of sbbs/src/sbbs3/scfg/scfgchat.c, revision 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.