/**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * * Copyright Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2 * * of the License, or (at your option) any later version. * * See the GNU General Public License for more details: gpl.txt or * * http://www.fsf.org/copyleft/gpl.html * * * * For Synchronet coding style and modification guidelines, see * * http://www.synchro.net/source.html * * * * Note: If this box doesn't appear square, then you need to fix your tabs. * ****************************************************************************/ #include "scfg.h" void page_cfg() { static int dflt,bar; char str[81],done=0; int j,k; uint i; uint u; static page_t savpage; while(1) { for(i=0;icmd,cfg.page[i]->arstr); opt[i][0]=0; j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT; if(cfg.total_pages) j|=WIN_DEL|WIN_COPY|WIN_CUT; if(cfg.total_pagesi;u--) cfg.page[u]=cfg.page[u-1]; if((cfg.page[i]=(page_t *)malloc(sizeof(page_t)))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(page_t)); continue; } memset((page_t *)cfg.page[i],0,sizeof(page_t)); SAFECOPY(cfg.page[i]->cmd,str); cfg.total_pages++; uifc.changes=1; continue; } if (msk == MSK_DEL || msk == MSK_CUT) { if(msk == MSK_CUT) savpage = *cfg.page[i]; free(cfg.page[i]); cfg.total_pages--; for(j=i;jcmd); sprintf(opt[k++],"%-27.27s%s","Access Requirements",cfg.page[i]->arstr); sprintf(opt[k++],"%-27.27s%s","I/O Method", io_method(cfg.page[i]->misc)); sprintf(opt[k++],"%-27.27s%s","Native Executable" ,cfg.page[i]->misc&XTRN_NATIVE ? "Yes" : "No"); sprintf(opt[k++],"%-27.27s%s","Use Shell to Execute" ,cfg.page[i]->misc&XTRN_SH ? "Yes" : "No"); opt[k][0]=0; sprintf(str,"Sysop Chat Pager #%d",i+1); switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0,str,opt)) { case -1: done=1; break; case 0: uifc.helpbuf= "`External Chat Pager Command Line:`\n" "\n" "This is the command line to execute for this external chat pager.\n" SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_SPEC_HELP ; SAFECOPY(str,cfg.page[i]->cmd); if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Command Line" ,cfg.page[i]->cmd,sizeof(cfg.page[i]->cmd)-1,K_EDIT)) SAFECOPY(cfg.page[i]->cmd,str); break; case 1: getar(str,cfg.page[i]->arstr); break; case 2: choose_io_method(&cfg.page[i]->misc); break; case 3: k=(cfg.page[i]->misc&XTRN_NATIVE) ? 0:1; uifc.helpbuf= "`Native Executable:`\n" "\n" "If this online program is a native (e.g. non-DOS) executable,\n" "set this option to `Yes`.\n" ; k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0 ,"Native",uifcYesNoOpts); if(!k && !(cfg.page[i]->misc&XTRN_NATIVE)) { cfg.page[i]->misc|=XTRN_NATIVE; uifc.changes=TRUE; } else if(k==1 && (cfg.page[i]->misc&XTRN_NATIVE)) { cfg.page[i]->misc&=~XTRN_NATIVE; uifc.changes=TRUE; } break; case 4: k=(cfg.page[i]->misc&XTRN_SH) ? 0:1; uifc.helpbuf= "`Use Shell to Execute Command:`\n" "\n" "If this command-line requires the system command shell to execute, (Unix\n" "shell script or DOS batch file), set this option to ~Yes~.\n" ; k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0 ,"Use Shell",uifcYesNoOpts); if(!k && !(cfg.page[i]->misc&XTRN_SH)) { cfg.page[i]->misc|=XTRN_SH; uifc.changes=TRUE; } else if(k==1 && (cfg.page[i]->misc&XTRN_SH)) { cfg.page[i]->misc&=~XTRN_SH; uifc.changes=TRUE; } break; } } } } void chan_cfg() { static int chan_dflt,chan_bar,opt_dflt; char str[128],code[128],done=0; int j,k; uint i,u; static chan_t savchan; while(1) { for(i=0;iname); opt[i][0]=0; j=WIN_ACT|WIN_SAV|WIN_BOT|WIN_RHT; if(cfg.total_chans) j|=WIN_DEL|WIN_COPY|WIN_CUT; if(cfg.total_chansi;u--) cfg.chan[u]=cfg.chan[u-1]; if((cfg.chan[i]=(chan_t *)malloc(sizeof(chan_t)))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chan_t)); continue; } memset((chan_t *)cfg.chan[i],0,sizeof(chan_t)); SAFECOPY(cfg.chan[i]->name,str); SAFECOPY(cfg.chan[i]->code,code); cfg.total_chans++; uifc.changes=1; continue; } if (msk == MSK_DEL || msk == MSK_CUT) { if(msk == MSK_CUT) savchan = *cfg.chan[i]; free(cfg.chan[i]); cfg.total_chans--; for(j=i;jname); sprintf(opt[k++],"%-27.27s%s","Internal Code",cfg.chan[i]->code); sprintf(opt[k++],"%-27.27s%"PRIu32,"Cost in Credits",cfg.chan[i]->cost); sprintf(opt[k++],"%-27.27s%.40s","Access Requirements" ,cfg.chan[i]->arstr); sprintf(opt[k++],"%-27.27s%s","Password Protection" ,cfg.chan[i]->misc&CHAN_PW ? "Yes" : "No"); sprintf(opt[k++],"%-27.27s%s","Guru Joins When Empty" ,cfg.chan[i]->misc&CHAN_GURU ? "Yes" : "No"); sprintf(opt[k++],"%-27.27s%s","Channel Guru" ,cfg.chan[i]->guruguru]->name : ""); sprintf(opt[k++],"%-27.27s%s","Channel Action Set" ,cfg.actset[cfg.chan[i]->actset]->name); opt[k][0]=0; uifc.helpbuf= "`Chat Channel Configuration:`\n" "\n" "This menu is for configuring the selected chat channel.\n" ; sprintf(str,"%s Chat Channel",cfg.chan[i]->name); switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str,opt)) { case -1: done=1; break; case 0: uifc.helpbuf= "`Chat Channel Name:`\n" "\n" "This is the name or description of the chat channel.\n" ; SAFECOPY(str,cfg.chan[i]->name); if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Channel Name" ,cfg.chan[i]->name,sizeof(cfg.chan[i]->name)-1,K_EDIT)) SAFECOPY(cfg.chan[i]->name,str); break; case 1: uifc.helpbuf= "`Chat Channel Internal Code:`\n" "\n" "Every chat channel must have its own unique code for Synchronet to refer\n" "to it internally. This code is usually an abbreviation of the chat\n" "channel name.\n" ; SAFECOPY(str,cfg.chan[i]->code); if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Internal Code" ,str,LEN_CODE,K_UPPER|K_EDIT)) break; if(code_ok(str)) SAFECOPY(cfg.chan[i]->code,str); else { uifc.helpbuf=invalid_code; uifc.msg(strInvalidCode); uifc.helpbuf=0; } break; case 2: ultoa(cfg.chan[i]->cost,str,10); uifc.helpbuf= "`Chat Channel Cost to Join:`\n" "\n" "If you want users to be charged credits to join this chat channel, set\n" "this value to the number of credits to charge. If you want this channel\n" "to be free, set this value to `0`.\n" ; uifc.input(WIN_MID|WIN_SAV,0,0,"Cost to Join (in Credits)" ,str,10,K_EDIT|K_NUMBER); cfg.chan[i]->cost=atol(str); break; case 3: sprintf(str,"%s Chat Channel",cfg.chan[i]->name); getar(str,cfg.chan[i]->arstr); break; case 4: k=1; uifc.helpbuf= "`Allow Channel to be Password Protected:`\n" "\n" "If you want to allow the first user to join this channel to password\n" "protect it, set this option to `Yes`.\n" ; k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0 ,"Allow Channel to be Password Protected" ,uifcYesNoOpts); if(!k && !(cfg.chan[i]->misc&CHAN_PW)) { cfg.chan[i]->misc|=CHAN_PW; uifc.changes=1; } else if(k==1 && cfg.chan[i]->misc&CHAN_PW) { cfg.chan[i]->misc&=~CHAN_PW; uifc.changes=1; } break; case 5: k=1; uifc.helpbuf= "`Guru Joins This Channel When Empty:`\n" "\n" "If you want the system guru to join this chat channel when there is\n" "only one user, set this option to `Yes`.\n" ; k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0 ,"Guru Joins This Channel When Empty" ,uifcYesNoOpts); if(!k && !(cfg.chan[i]->misc&CHAN_GURU)) { cfg.chan[i]->misc|=CHAN_GURU; uifc.changes=1; } else if(k==1 && cfg.chan[i]->misc&CHAN_GURU) { cfg.chan[i]->misc&=~CHAN_GURU; uifc.changes=1; } break; case 6: uifc.helpbuf= "`Channel Guru:`\n" "\n" "This is a list of available chat Gurus. Select the one that you wish\n" "to have available in this channel.\n" ; k=0; for(j=0;jname); opt[j][0]=0; k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0 ,"Available Chat Gurus",opt); if(k==-1) break; cfg.chan[i]->guru=k; break; case 7: uifc.helpbuf= "`Channel Action Set:`\n" "\n" "This is a list of available chat action sets. Select the one that you\n" "wish to have available in this channel.\n" ; k=0; for(j=0;jname); opt[j][0]=0; k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0 ,"Available Chat Action Sets",opt); if(k==-1) break; uifc.changes=1; cfg.chan[i]->actset=k; break; } } } } void chatact_cfg(uint setnum) { static int chatact_dflt,chatact_bar; char str[128],cmd[128],out[128]; int j; uint i,n,chatnum[MAX_OPTS+1]; static chatact_t savchatact; while(1) { for(i=0,j=0;iactset==setnum) { sprintf(opt[j],"%-*.*s %s",LEN_CHATACTCMD,LEN_CHATACTCMD ,cfg.chatact[i]->cmd,cfg.chatact[i]->out); chatnum[j++]=i; } chatnum[j]=cfg.total_chatacts; opt[j][0]=0; i=WIN_ACT|WIN_SAV; if(j) i|=WIN_DEL|WIN_COPY|WIN_CUT; if(jname); i=uifc.list(i,0,0,70,&chatact_dflt,&chatact_bar,str,opt); if((signed)i==-1) return; int msk = i & MSK_ON; i &= MSK_OFF; if (msk == MSK_INS) { uifc.helpbuf= "`Chat Action Command:`\n" "\n" "This is the command word (normally a verb) to trigger the action output.\n" ; if(uifc.input(WIN_MID|WIN_SAV,0,0,"Action Command",cmd,LEN_CHATACTCMD ,K_UPPER)<1) continue; uifc.helpbuf= "`Chat Action Output String:`\n" "\n" "This is the output string displayed with this action output.\n" ; if(uifc.input(WIN_MID|WIN_SAV,0,0,"",out,LEN_CHATACTOUT ,K_MSG)<1) continue; if((cfg.chatact=(chatact_t **)realloc(cfg.chatact ,sizeof(chatact_t *)*(cfg.total_chatacts+1)))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chatacts+1); cfg.total_chatacts=0; bail(1); continue; } if(j) for(n=cfg.total_chatacts;n>chatnum[i];n--) cfg.chatact[n]=cfg.chatact[n-1]; if((cfg.chatact[chatnum[i]]=(chatact_t *)malloc(sizeof(chatact_t)))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chatact_t)); continue; } memset((chatact_t *)cfg.chatact[chatnum[i]],0,sizeof(chatact_t)); SAFECOPY(cfg.chatact[chatnum[i]]->cmd,cmd); SAFECOPY(cfg.chatact[chatnum[i]]->out,out); cfg.chatact[chatnum[i]]->actset=setnum; cfg.total_chatacts++; uifc.changes=1; continue; } if (msk == MSK_DEL || msk == MSK_CUT) { if(msk == MSK_CUT) savchatact = *cfg.chatact[chatnum[i]]; free(cfg.chatact[chatnum[i]]); cfg.total_chatacts--; for(j=chatnum[i];jactset=setnum; uifc.changes=1; continue; } if (msk != 0) continue; uifc.helpbuf= "`Chat Action Command:`\n" "\n" "This is the command that triggers this chat action.\n" ; SAFECOPY(str,cfg.chatact[chatnum[i]]->cmd); if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Action Command" ,cfg.chatact[chatnum[i]]->cmd,LEN_CHATACTCMD,K_EDIT|K_UPPER)) { SAFECOPY(cfg.chatact[chatnum[i]]->cmd,str); continue; } uifc.helpbuf= "`Chat Action Output String:`\n" "\n" "This is the output string that results from this chat action.\n" ; SAFECOPY(str,cfg.chatact[chatnum[i]]->out); if(!uifc.input(WIN_MID|WIN_SAV,0,10,"" ,cfg.chatact[chatnum[i]]->out,LEN_CHATACTOUT,K_EDIT|K_MSG)) SAFECOPY(cfg.chatact[chatnum[i]]->out,str); } } void guru_cfg() { static int guru_dflt,guru_bar,opt_dflt; char str[128],code[128],done=0; int j,k; uint i,u; static guru_t savguru; while(1) { for(i=0;iname); opt[i][0]=0; j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT; if(cfg.total_gurus) j|=WIN_DEL|WIN_COPY|WIN_CUT; if(cfg.total_gurusi;u--) cfg.guru[u]=cfg.guru[u-1]; if((cfg.guru[i]=(guru_t *)malloc(sizeof(guru_t)))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(guru_t)); continue; } memset((guru_t *)cfg.guru[i],0,sizeof(guru_t)); SAFECOPY(cfg.guru[i]->name,str); SAFECOPY(cfg.guru[i]->code,code); cfg.total_gurus++; uifc.changes=1; continue; } if (msk == MSK_DEL || msk == MSK_CUT) { if(msk == MSK_CUT) savguru = *cfg.guru[i]; free(cfg.guru[i]); cfg.total_gurus--; for(j=i;jname); sprintf(opt[k++],"%-27.27s%s","Guru Internal Code",cfg.guru[i]->code); sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.guru[i]->arstr); opt[k][0]=0; uifc.helpbuf= "`Guru Configuration:`\n" "\n" "This menu is for configuring the selected Guru.\n" ; switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,cfg.guru[i]->name ,opt)) { case -1: done=1; break; case 0: uifc.helpbuf= "`Guru Name:`\n" "\n" "This is the name of the selected Guru.\n" ; SAFECOPY(str,cfg.guru[i]->name); if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Guru Name" ,cfg.guru[i]->name,sizeof(cfg.guru[i]->name)-1,K_EDIT)) SAFECOPY(cfg.guru[i]->name,str); break; case 1: uifc.helpbuf= "`Guru Internal Code:`\n" "\n" "Every Guru must have its own unique code for Synchronet to refer to\n" "it internally. This code is usually an abbreviation of the Guru name.\n" ; SAFECOPY(str,cfg.guru[i]->code); if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Internal Code" ,str,LEN_CODE,K_EDIT|K_UPPER)) break; if(code_ok(str)) SAFECOPY(cfg.guru[i]->code,str); else { uifc.helpbuf=invalid_code; uifc.msg(strInvalidCode); uifc.helpbuf=0; } break; case 2: getar(cfg.guru[i]->name,cfg.guru[i]->arstr); break; } } } } void actsets_cfg() { static int actset_dflt,actset_bar,opt_dflt; char str[81]; int j,k,done; uint i,u; static actset_t savactset; while(1) { for(i=0;iname); opt[i][0]=0; j=WIN_ACT|WIN_RHT|WIN_BOT|WIN_SAV; if(cfg.total_actsets) j|=WIN_DEL|WIN_COPY|WIN_CUT; if(cfg.total_actsetsi;u--) cfg.actset[u]=cfg.actset[u-1]; if((cfg.actset[i]=(actset_t *)malloc(sizeof(actset_t)))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(actset_t)); continue; } memset((actset_t *)cfg.actset[i],0,sizeof(actset_t)); SAFECOPY(cfg.actset[i]->name,str); cfg.total_actsets++; uifc.changes=1; continue; } if (msk == MSK_DEL || msk == MSK_CUT) { if(msk == MSK_CUT) savactset = *cfg.actset[i]; free(cfg.actset[i]); cfg.total_actsets--; for(j=i;jname); sprintf(opt[k++],"%-27.27s","Configure Chat Actions..."); opt[k][0]=0; uifc.helpbuf= "`Chat Action Set Configuration:`\n" "\n" "This menu is for configuring the selected chat action set.\n" ; sprintf(str,"%s Chat Action Set",cfg.actset[i]->name); switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str ,opt)) { case -1: done=1; break; case 0: uifc.helpbuf= "`Chat Action Set Name:`\n" "\n" "This is the name of the selected action set.\n" ; SAFECOPY(str,cfg.actset[i]->name); if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Action Set Name" ,cfg.actset[i]->name,sizeof(cfg.actset[i]->name)-1,K_EDIT)) SAFECOPY(cfg.actset[i]->name,str); break; case 1: chatact_cfg(i); break; } } } }