|
|
1.1 root 1: /* execmsg.cpp */
2:
3: /* Synchronet message-related command shell/module routines */
4:
1.1.1.2 ! root 5: /* $Id: execmsg.cpp,v 1.8 2009/03/20 09:36:20 rswindell Exp $ */
1.1 root 6:
7: /****************************************************************************
8: * @format.tab-size 4 (Plain Text/Source Code File Header) *
9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
10: * *
1.1.1.2 ! root 11: * Copyright 2009 Rob Swindell - http://www.synchro.net/copyright.html *
1.1 root 12: * *
13: * This program is free software; you can redistribute it and/or *
14: * modify it under the terms of the GNU General Public License *
15: * as published by the Free Software Foundation; either version 2 *
16: * of the License, or (at your option) any later version. *
17: * See the GNU General Public License for more details: gpl.txt or *
18: * http://www.fsf.org/copyleft/gpl.html *
19: * *
20: * Anonymous FTP access to the most recent released source is available at *
21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
22: * *
23: * Anonymous CVS access to the development source and modification history *
24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
26: * (just hit return, no password is necessary) *
27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
28: * *
29: * For Synchronet coding style and modification guidelines, see *
30: * http://www.synchro.net/source.html *
31: * *
32: * You are encouraged to submit any modifications (preferably in Unix diff *
33: * format) via e-mail to [email protected] *
34: * *
35: * Note: If this box doesn't appear square, then you need to fix your tabs. *
36: ****************************************************************************/
37:
38: #include "sbbs.h"
39: #include "cmdshell.h"
40:
41: int sbbs_t::exec_msg(csi_t *csi)
42: {
43: char str[256],ch;
44: ulong i,j;
45:
46: switch(*(csi->ip++)) {
47:
48: case CS_MSG_SELECT_AREA:
49: csi->logic=LOGIC_FALSE;
50: if(!usrgrps) return(0);
51: while(online) {
52: j=0;
53: if(usrgrps>1) {
54: sprintf(str,"%smenu/grps.*", cfg.text_dir);
55: if(fexist(str))
56: menu("grps");
57: else {
58: bputs(text[CfgGrpLstHdr]);
59: for(i=0;i<usrgrps && !msgabort();i++) {
60: if(i==curgrp)
61: outchar('*');
62: else outchar(' ');
63: if(i<9) outchar(' ');
64: if(i<99) outchar(' ');
65: bprintf(text[CfgGrpLstFmt]
1.1.1.2 ! root 66: ,i+1, cfg.grp[usrgrp[i]]->lname); }
! 67: }
1.1 root 68: sprintf(str,text[JoinWhichGrp],curgrp+1);
69: mnemonics(str);
70: j=getnum(usrgrps);
71: if((int)j==-1)
72: return(0);
73: if(!j)
74: j=curgrp;
75: else
1.1.1.2 ! root 76: j--;
! 77: }
1.1 root 78: sprintf(str,"%smenu/subs%u.*", cfg.text_dir, usrgrp[j]+1);
79: if(fexist(str)) {
80: sprintf(str,"subs%u",usrgrp[j]+1);
1.1.1.2 ! root 81: menu(str);
! 82: }
1.1 root 83: else {
84: CLS;
85: bprintf(text[SubLstHdr], cfg.grp[usrgrp[j]]->lname);
86: for(i=0;i<usrsubs[j] && !msgabort();i++) {
87: if(i==cursub[j]) outchar('*');
88: else outchar(' ');
89: sprintf(str,text[SubLstFmt],i+1
90: ,cfg.sub[usrsub[j][i]]->lname,nulstr
91: ,getposts(&cfg,usrsub[j][i]));
92: if(i<9) outchar(' ');
93: if(i<99) outchar(' ');
1.1.1.2 ! root 94: bputs(str); }
! 95: }
1.1 root 96: sprintf(str,text[JoinWhichSub],cursub[j]+1);
97: mnemonics(str);
98: i=getnum(usrsubs[j]);
99: if((int)i==-1) {
100: if(usrgrps==1)
101: return(0);
1.1.1.2 ! root 102: continue;
! 103: }
1.1 root 104: if(!i)
105: i=cursub[j];
106: else
107: i--;
108: curgrp=j;
109: cursub[curgrp]=i;
110: csi->logic=LOGIC_TRUE;
1.1.1.2 ! root 111: return(0);
! 112: }
1.1 root 113: return(0);
114:
115: case CS_MSG_GET_SUB_NUM:
116:
117: if(useron.misc&COLDKEYS) {
118: i=atoi(csi->str);
119: if(i && usrgrps && i<=usrsubs[curgrp])
120: cursub[curgrp]=i-1;
1.1.1.2 ! root 121: return(0);
! 122: }
1.1 root 123:
124: ch=getkey(K_UPPER);
125: outchar(ch);
126: if(usrgrps && (ch&0xf)*10U<=usrsubs[curgrp] && (ch&0xf)) {
127: i=(ch&0xf)*10;
128: ch=getkey(K_UPPER);
129: if(!isdigit(ch) && ch!=CR) {
130: ungetkey(ch);
131: cursub[curgrp]=(i/10)-1;
1.1.1.2 ! root 132: return(0);
! 133: }
1.1 root 134: outchar(ch);
135: if(ch==CR) {
136: cursub[curgrp]=(i/10)-1;
1.1.1.2 ! root 137: return(0);
! 138: }
1.1 root 139: logch(ch,0);
140: i+=ch&0xf;
141: if(i*10<=usrsubs[curgrp]) { /* 100+ subs */
142: i*=10;
143: ch=getkey(K_UPPER);
144: if(!isdigit(ch) && ch!=CR) {
145: ungetkey(ch);
146: cursub[curgrp]=(i/10)-1;
1.1.1.2 ! root 147: return(0);
! 148: }
1.1 root 149: outchar(ch);
150: if(ch==CR) {
151: cursub[curgrp]=(i/10)-1;
1.1.1.2 ! root 152: return(0);
! 153: }
1.1 root 154: logch(ch,0);
1.1.1.2 ! root 155: i+=ch&0xf;
! 156: }
1.1 root 157: if(i<=usrsubs[curgrp])
158: cursub[curgrp]=i-1;
1.1.1.2 ! root 159: return(0);
! 160: }
1.1 root 161: if((uint)(ch&0xf)<=usrsubs[curgrp] && (ch&0xf) && usrgrps)
162: cursub[curgrp]=(ch&0xf)-1;
163: return(0);
164:
165: case CS_MSG_GET_GRP_NUM:
166:
167: if(useron.misc&COLDKEYS) {
168: i=atoi(csi->str);
169: if(i && i<=usrgrps)
170: curgrp=i-1;
1.1.1.2 ! root 171: return(0);
! 172: }
1.1 root 173:
174: ch=getkey(K_UPPER);
175: outchar(ch);
176: if((ch&0xf)*10U<=usrgrps && (ch&0xf)) {
177: i=(ch&0xf)*10;
178: ch=getkey(K_UPPER);
179: if(!isdigit(ch) && ch!=CR) {
180: ungetkey(ch);
181: curgrp=(i/10)-1;
1.1.1.2 ! root 182: return(0);
! 183: }
1.1 root 184: outchar(ch);
185: if(ch==CR) {
186: curgrp=(i/10)-1;
1.1.1.2 ! root 187: return(0);
! 188: }
1.1 root 189: logch(ch,0);
190: i+=ch&0xf;
191: if(i<=usrgrps)
192: curgrp=i-1;
1.1.1.2 ! root 193: return(0);
! 194: }
1.1 root 195: if((uint)(ch&0xf)<=usrgrps && (ch&0xf))
196: curgrp=(ch&0xf)-1;
197: return(0);
198:
199: case CS_MSG_SET_GROUP:
200: csi->logic=LOGIC_TRUE;
201: for(i=0;i<usrgrps;i++)
202: if(!stricmp(cfg.grp[usrgrp[i]]->sname,csi->str))
203: break;
204: if(i<usrgrps)
205: curgrp=i;
206: else
207: csi->logic=LOGIC_FALSE;
208: return(0);
209:
210: case CS_MSG_SHOW_GROUPS:
211: if(!usrgrps) return(0);
212: sprintf(str,"%smenu/grps.*", cfg.text_dir);
213: if(fexist(str)) {
214: menu("grps");
1.1.1.2 ! root 215: return(0);
! 216: }
1.1 root 217: bputs(text[GrpLstHdr]);
218: for(i=0;i<usrgrps && !msgabort();i++) {
219: if(i==curgrp)
220: outchar('*');
221: else outchar(' ');
222: if(i<9) outchar(' ');
223: bprintf(text[GrpLstFmt],i+1
1.1.1.2 ! root 224: ,cfg.grp[usrgrp[i]]->lname,nulstr,usrsubs[i]);
! 225: }
1.1 root 226: return(0);
227:
228: case CS_MSG_SHOW_SUBBOARDS:
229: if(!usrgrps) return(0);
230: sprintf(str,"%smenu/subs%u.*", cfg.text_dir, usrgrp[curgrp]+1);
231: if(fexist(str)) {
232: sprintf(str,"subs%u",usrgrp[curgrp]+1);
233: menu(str);
1.1.1.2 ! root 234: return(0);
! 235: }
1.1 root 236: CRLF;
237: bprintf(text[SubLstHdr],cfg.grp[usrgrp[curgrp]]->lname);
238: for(i=0;i<usrsubs[curgrp] && !msgabort();i++) {
239: if(i==cursub[curgrp]) outchar('*');
240: else outchar(' ');
241: sprintf(str,text[SubLstFmt],i+1
242: ,cfg.sub[usrsub[curgrp][i]]->lname,nulstr
243: ,getposts(&cfg,usrsub[curgrp][i]));
244: if(i<9) outchar(' ');
245: if(i<99) outchar(' ');
1.1.1.2 ! root 246: bputs(str);
! 247: }
1.1 root 248: return(0);
249:
250: case CS_MSG_GROUP_UP:
251: curgrp++;
252: if(curgrp>=usrgrps)
253: curgrp=0;
254: return(0);
255: case CS_MSG_GROUP_DOWN:
256: if(!curgrp)
257: curgrp=usrgrps-1;
258: else curgrp--;
259: return(0);
260: case CS_MSG_SUBBOARD_UP:
261: if(!usrgrps) return(0);
262: cursub[curgrp]++;
263: if(cursub[curgrp]>=usrsubs[curgrp])
264: cursub[curgrp]=0;
265: return(0);
266: case CS_MSG_SUBBOARD_DOWN:
267: if(!usrgrps) return(0);
268: if(!cursub[curgrp])
269: cursub[curgrp]=usrsubs[curgrp]-1;
270: else cursub[curgrp]--;
271: return(0);
272: case CS_MSG_SET_AREA:
273: csi->logic=LOGIC_TRUE;
274: for(i=0;i<usrgrps;i++)
275: for(j=0;j<usrsubs[i];j++)
276: if(!stricmp(csi->str,cfg.sub[usrsub[i][j]]->code)) {
277: curgrp=i;
278: cursub[i]=j;
1.1.1.2 ! root 279: return(0);
! 280: }
1.1 root 281: csi->logic=LOGIC_FALSE;
282: return(0);
283: case CS_MSG_READ:
284: if(!usrgrps) return(0);
285: csi->logic=scanposts(usrsub[curgrp][cursub[curgrp]],0,nulstr);
286: return(0);
287: case CS_MSG_POST:
288: if(!usrgrps) return(0);
289: csi->logic=!postmsg(usrsub[curgrp][cursub[curgrp]],0,0);
290: return(0);
291: case CS_MSG_QWK:
292: qwk_sec();
293: return(0);
294: case CS_MSG_PTRS_CFG:
295: new_scan_ptr_cfg();
296: return(0);
297: case CS_MSG_PTRS_REINIT:
298: for(i=0;i<cfg.total_subs;i++) {
299: subscan[i].ptr=subscan[i].sav_ptr;
300: subscan[i].last=subscan[i].sav_last;
301: }
302: bputs(text[MsgPtrsInitialized]);
303: return(0);
304: case CS_MSG_NEW_SCAN_CFG:
305: new_scan_cfg(SUB_CFG_NSCAN);
306: return(0);
307: case CS_MSG_NEW_SCAN:
308: scansubs(SCAN_NEW);
309: return(0);
310: case CS_MSG_NEW_SCAN_SUB:
311: csi->logic=scanposts(usrsub[curgrp][cursub[curgrp]],SCAN_NEW,nulstr);
312: return(0);
313: case CS_MSG_NEW_SCAN_ALL:
314: scanallsubs(SCAN_NEW);
315: return(0);
316: case CS_MSG_CONT_SCAN:
317: scansubs(SCAN_NEW|SCAN_CONST);
318: return(0);
319: case CS_MSG_CONT_SCAN_ALL:
320: scanallsubs(SCAN_NEW|SCAN_CONST);
321: return(0);
322: case CS_MSG_BROWSE_SCAN:
323: scansubs(SCAN_NEW|SCAN_BACK);
324: return(0);
325: case CS_MSG_BROWSE_SCAN_ALL:
326: scanallsubs(SCAN_BACK|SCAN_NEW);
327: return(0);
328: case CS_MSG_FIND_TEXT:
329: scansubs(SCAN_FIND);
330: return(0);
331: case CS_MSG_FIND_TEXT_ALL:
332: scanallsubs(SCAN_FIND);
333: return(0);
334: case CS_MSG_YOUR_SCAN_CFG:
335: new_scan_cfg(SUB_CFG_SSCAN);
336: return(0);
337: case CS_MSG_YOUR_SCAN:
338: scansubs(SCAN_TOYOU);
339: return(0);
340: case CS_MSG_YOUR_SCAN_ALL:
341: scanallsubs(SCAN_TOYOU);
1.1.1.2 ! root 342: return(0);
! 343: }
1.1 root 344: errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1));
345: return(0);
346: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.