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