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