390 lines
12 KiB
C++
390 lines
12 KiB
C++
#define Use_MsgBase
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "proboard.hpp"
|
|
|
|
static
|
|
char *varnames[] = { /* 0 */ "NAME",
|
|
/* 1 */ "CITY",
|
|
/* 2 */ "NODE",
|
|
/* 3 */ "SYSDIR",
|
|
/* 4 */ "STARTDIR",
|
|
/* 5 */ "UPDIR",
|
|
/* 6 */ "PVTDIR",
|
|
/* 7 */ "BAUD",
|
|
/* 8 */ "PORT",
|
|
/* 9 */ "FIRSTNAME",
|
|
/* 10 */ "LASTNAME",
|
|
/* 11 */ "TMLEFT",
|
|
/* 12 */ "TMONLINE",
|
|
/* 13 */ "LEVEL",
|
|
/* 14 */ "DATE",
|
|
/* 15 */ "TIME",
|
|
/* 16 */ "HANDLE",
|
|
/* 17 */ "MNUDIR",
|
|
/* 18 */ "TXTDIR",
|
|
/* 19 */ "MSGDIR",
|
|
/* 20 */ "SYSOPNAME",
|
|
/* 21 */ "PASSWORD",
|
|
/* 22 */ "NLDIR",
|
|
/* 23 */ "PEXDIR",
|
|
/* 24 */ "CURFILEAREA#",
|
|
/* 25 */ "CURMSGAREA#",
|
|
/* 26 */ "CURFILEAREA",
|
|
/* 27 */ "CURMSGAREA",
|
|
/* 28 */ "CURMENU",
|
|
/* 29 */ "NUMUSERS",
|
|
/* 30 */ "ID",
|
|
/* 31 */ "USERREC",
|
|
/* 32 */ "#1",
|
|
/* 33 */ "#2",
|
|
/* 34 */ "#3",
|
|
/* 35 */ "#4",
|
|
/* 36 */ "#5",
|
|
/* 37 */ "#6",
|
|
/* 38 */ "#7",
|
|
/* 39 */ "#B1",
|
|
/* 40 */ "#B2",
|
|
/* 41 */ "#B3",
|
|
/* 42 */ "#B4",
|
|
/* 43 */ "#B5",
|
|
/* 44 */ "#B6",
|
|
/* 45 */ "#B7",
|
|
/* 46 */ "NUMMSG",
|
|
/* 47 */ "LOWMSG",
|
|
/* 48 */ "HIGHMSG",
|
|
/* 49 */ "TOTALMSG",
|
|
/* 50 */ "LASTDATE",
|
|
/* 51 */ "LASTTIME",
|
|
/* 52 */ "TOTALCALLS",
|
|
/* 53 */ "VERSION",
|
|
/* 54 */ "VOICEPHONE",
|
|
/* 55 */ "DATAPHONE",
|
|
/* 56 */ "COUNTRY",
|
|
/* 57 */ "NUMYELLS",
|
|
/* 58 */ "CURFILEAREADIR",
|
|
/* 59 */ "CURFILEGROUP#",
|
|
/* 60 */ "CURMSGGROUP#",
|
|
/* 61 */ "CURFILEGROUP",
|
|
/* 62 */ "CURMSGGROUP",
|
|
/* 63 */ "LANGUAGE",
|
|
NULL };
|
|
|
|
|
|
static String
|
|
varvalue(char *s,int len)
|
|
{
|
|
String tmp;
|
|
|
|
len = -len;
|
|
|
|
if(s[0]=='%')
|
|
{
|
|
if(getenv(&s[1])) tmp = getenv(&s[1]);
|
|
|
|
return tmp;
|
|
}
|
|
|
|
for(int i=0;varnames[i];i++)
|
|
{
|
|
char ts[80];
|
|
|
|
if(strcmpl(varnames[i],s)) continue;
|
|
|
|
switch(i)
|
|
{
|
|
case 0: sprintf(ts,"%*s",len,user.name);
|
|
tmp = ts;
|
|
break;
|
|
case 1: sprintf(ts,"%*s",len,user.city);
|
|
tmp = ts;
|
|
break;
|
|
case 2: sprintf(ts,"%*d",len,node_number);
|
|
tmp = ts;
|
|
break;
|
|
case 3: sprintf(ts,"%*s",len,syspath);
|
|
tmp = ts;
|
|
break;
|
|
case 4: sprintf(ts,"%*s",len,mypath);
|
|
tmp = ts;
|
|
break;
|
|
case 5: sprintf(ts,"%*s",len,cfg.uploadpath);
|
|
tmp = ts;
|
|
break;
|
|
case 6: sprintf(ts,"%*s",len,cfg.pvtuploadpath);
|
|
tmp = ts;
|
|
break;
|
|
case 7: sprintf(ts,"%*ld",len,io.baud);
|
|
tmp = ts;
|
|
break;
|
|
case 8: sprintf(ts,"%*d",len,io.port+1);
|
|
tmp = ts;
|
|
break;
|
|
case 9: sprintf(ts,"%*s",len,user_firstname);
|
|
tmp = ts;
|
|
break;
|
|
case 10: {
|
|
for(int i=0;i<strlen(user.name);i++) if(user.name[i]==' ') break;
|
|
sprintf(ts,"%*s",len,&user.name[i+1]);
|
|
tmp = ts;
|
|
}
|
|
break;
|
|
case 11: sprintf(ts,"%*d",len,timer.left());
|
|
tmp = ts;
|
|
break;
|
|
case 12: sprintf(ts,"%*d",len,timer.online());
|
|
tmp = ts;
|
|
break;
|
|
case 13: sprintf(ts,"%*u",len,user.level);
|
|
tmp = ts;
|
|
break;
|
|
case 14: {
|
|
Date d(TODAY);
|
|
|
|
tmp = d.format(date_formats[user.dateFormat]);
|
|
} break;
|
|
case 15: {
|
|
Time t(NOW);
|
|
sprintf(ts,"%02d:%02d",t[0],t[1]);
|
|
tmp = ts;
|
|
} break;
|
|
case 16: sprintf(ts,"%*s",len,user.alias);
|
|
tmp = ts;
|
|
break;
|
|
case 17: sprintf(ts,"%*s",len,cfg.mnupath);
|
|
tmp = ts;
|
|
break;
|
|
case 18: sprintf(ts,"%*s",len,cfg.txtpath);
|
|
tmp = ts;
|
|
break;
|
|
case 19: sprintf(ts,"%*s",len,cfg.msgpath);
|
|
tmp = ts;
|
|
break;
|
|
case 20: sprintf(ts,"%*s",len,cfg.sysopname);
|
|
tmp = ts;
|
|
break;
|
|
case 21: sprintf(ts,"%*s",len,user.passWord);
|
|
tmp = ts;
|
|
break;
|
|
case 22: sprintf(ts,"%*s",len,cfg.nodelistdir);
|
|
tmp = ts;
|
|
break;
|
|
case 23: sprintf(ts,"%*s",len,cfg.pexpath);
|
|
tmp = ts;
|
|
break;
|
|
case 24: sprintf(ts,"%*u",len,user.fileArea);
|
|
tmp = ts;
|
|
break;
|
|
case 25: sprintf(ts,"%*u",len,user.msgArea);
|
|
tmp = ts;
|
|
break;
|
|
case 26: {
|
|
FileArea fa;
|
|
if(fa.read(user.fileArea))
|
|
sprintf(ts,"%*s",len,fa.name);
|
|
else
|
|
sprintf(ts,"%*s",len,"* None *");
|
|
|
|
tmp = ts;
|
|
} break;
|
|
case 27: {
|
|
MsgArea ma;
|
|
if(ma.read(user.msgArea))
|
|
sprintf(ts,"%*s",len,ma.name);
|
|
else
|
|
sprintf(ts,"%*s",len,"* None *");
|
|
|
|
tmp = ts;
|
|
} break;
|
|
case 28: sprintf(ts,"%*s",len,curmenu);
|
|
tmp = ts;
|
|
break;
|
|
case 29: sprintf(ts,"%*d",len,num_users);
|
|
tmp = ts;
|
|
break;
|
|
case 30: {
|
|
for(int i=0;i<num_limits;i++)
|
|
if(limit[i].level==user.level)
|
|
{
|
|
sprintf(ts,"%*s",len,limit[i].id);
|
|
tmp = ts;
|
|
}
|
|
}
|
|
break;
|
|
case 31: sprintf(ts,"%*d",len,user_recnr);
|
|
tmp = ts;
|
|
break;
|
|
case 32: tmp = "\1";
|
|
break;
|
|
case 33: tmp = "\2";
|
|
break;
|
|
case 34: tmp = "\3";
|
|
break;
|
|
case 35: tmp = "\4";
|
|
break;
|
|
case 36: tmp = "\5";
|
|
break;
|
|
case 37: tmp = "\6";
|
|
break;
|
|
case 38: tmp = "\7";
|
|
break;
|
|
case 39: tmp = "\x11";
|
|
break;
|
|
case 40: tmp = "\x12";
|
|
break;
|
|
case 41: tmp = "\x13";
|
|
break;
|
|
case 42: tmp = "\x14";
|
|
break;
|
|
case 43: tmp = "\x15";
|
|
break;
|
|
case 44: tmp = "\x16";
|
|
break;
|
|
case 45: tmp = "\x17";
|
|
break;
|
|
case 46: {
|
|
MsgArea ma;
|
|
ma.read(user.msgArea);
|
|
sprintf(ts,"%*ld",len,ma.numMsgs());
|
|
tmp = ts;
|
|
}
|
|
break;
|
|
case 47: sprintf(ts,"%*d",len,0);
|
|
tmp = ts;
|
|
break;
|
|
case 48: sprintf(ts,"%*d",len,0);
|
|
tmp = ts;
|
|
break;
|
|
case 49: sprintf(ts,"%*ld",len,msgbase.totalMsgs());
|
|
tmp = ts;
|
|
break;
|
|
case 50: tmp = user.lastDate.format("DD MMM CCYY");
|
|
break;
|
|
case 51: tmp = user.lastTime.format("HH:MM");
|
|
break;
|
|
case 52: sprintf(ts,"%*ld",len,totalcalls);
|
|
tmp = ts;
|
|
break;
|
|
case 53: sprintf(ts,"%*s",len,VERSION);
|
|
tmp = ts;
|
|
break;
|
|
case 54: sprintf(ts,"%*s",len,user.voicePhone);
|
|
tmp = ts;
|
|
break;
|
|
case 55: sprintf(ts,"%*s",len,user.dataPhone);
|
|
tmp = ts;
|
|
break;
|
|
case 56: sprintf(ts,"%*s",len,user.country);
|
|
tmp = ts;
|
|
break;
|
|
case 57: sprintf(ts,"%*d",len,num_yells);
|
|
tmp = ts;
|
|
break;
|
|
case 58: {
|
|
FileArea fa;
|
|
if(fa.read(user.fileArea))
|
|
sprintf(ts,"%*s",len,fa.filepath);
|
|
else
|
|
sprintf(ts,"%*s",len,"* None *");
|
|
|
|
tmp = ts;
|
|
} break;
|
|
case 59: tmp = form("%d",user.fileGroup); break;
|
|
case 60: tmp = form("%d",user.msgGroup); break;
|
|
case 61: {
|
|
AreaGroup group;
|
|
File f(FileName(syspath,"FGROUPS.PB"));
|
|
f.seek(long(user.fileGroup-1) * sizeof(AreaGroup));
|
|
if(f.read(&group,sizeof(AreaGroup)) != sizeof(AreaGroup))
|
|
tmp = "";
|
|
else
|
|
tmp = group.name;
|
|
}
|
|
break;
|
|
case 62: {
|
|
AreaGroup group;
|
|
File f(FileName(syspath,"MGROUPS.PB"));
|
|
f.seek(long(user.msgGroup-1) * sizeof(AreaGroup));
|
|
if(f.read(&group,sizeof(AreaGroup)) != sizeof(AreaGroup))
|
|
tmp = "";
|
|
else
|
|
tmp = group.name;
|
|
}
|
|
break;
|
|
|
|
case 63: sprintf(ts,"%*s",len,user.language);
|
|
tmp = ts;
|
|
break;
|
|
}
|
|
|
|
return tmp;
|
|
}
|
|
|
|
tmp = "[UNKNOWN:";
|
|
tmp << s;
|
|
tmp << ']';
|
|
|
|
return tmp;
|
|
}
|
|
|
|
String
|
|
replace_stringvars(char *s)
|
|
{
|
|
String tmp;
|
|
String varname;
|
|
String lenstr;
|
|
bool invar = FALSE;
|
|
bool inlen = FALSE;
|
|
|
|
for(;*s;s++)
|
|
switch(*s)
|
|
{
|
|
case '@': if(!invar)
|
|
{
|
|
if(*(s+1) == '<')
|
|
{
|
|
invar = TRUE;
|
|
inlen = FALSE;
|
|
s++;
|
|
varname.clear();
|
|
lenstr.clear();
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
tmp << '@';
|
|
}
|
|
}
|
|
break;
|
|
case '>': if(invar)
|
|
{
|
|
if(*(s+1) == '@')
|
|
{
|
|
s++;
|
|
tmp << varvalue(varname,inlen ? atoi(lenstr) : 0);
|
|
invar = FALSE;
|
|
inlen = FALSE;
|
|
}
|
|
continue; // We don't want '>' chars in varnames
|
|
}
|
|
case ':': if(invar)
|
|
{
|
|
inlen = TRUE;
|
|
continue;
|
|
}
|
|
default : if(invar)
|
|
{
|
|
if(inlen) lenstr << (*s);
|
|
else varname << (*s);
|
|
}
|
|
else
|
|
{
|
|
tmp << char((*s == '|') ? '\n' : (*s));
|
|
}
|
|
}
|
|
|
|
return tmp;
|
|
}
|