|
|
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.