proboard/WRITEMSG.CPP

385 lines
8.3 KiB
C++
Raw Normal View History

#define Use_MsgBase
#include <io.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "proboard.hpp"
void
writemsg(char *data)
{
Message msg;
MsgArea ma;
String param[5];
bool goodbye = FALSE;
int cost=0;
bool to_specified = FALSE;
bool subj_specified = FALSE;
char netmail_address[30];
netmail_address[0] = '\0';
parse_data(data,param);
if(param[0][0]=='*') msg.setArea(user.msgArea);
else msg.setArea(atoi(param[0]));
if(!ma.read(msg.areaNum())) return;
io << "\f\n" << S_WRITE_MESSAGE_TITLE(ma.name) << '\n';
msg.to[0]=0;
for(int i=0;i<5;i++)
if(param[i][0]=='/')
switch(toupper(param[i][1]))
{
case 'T': strcpy(msg.to,(char *)(param[i])+3);
to_specified = TRUE;
break;
case 'S': strcpy(msg.subj,(char *)(param[i])+3);
if(msg.subj[0])
subj_specified = TRUE;
break;
case 'L': goodbye = TRUE;
break;
case 'N': strncpy(netmail_address,(char *)(param[i])+3,29);
netmail_address[29] = '\0';
break;
}
if(!check_access(ma.writeLevel,ma.writeFlags,ma.writeFlagsNot) && !ma.sysopAccess())
{
io << '\n' << S_NOT_ALLOWED_TO_WRITE_IN_AREA << "\n\n" << S_PRESS_ENTER_TO_CONTINUE;
return;
}
strcpy(msg.from,user.name);
if(ma.flags == 3)
strcpy(msg.from,user.alias);
else
if(ma.flags && (ma.flags!=2 || user.alias[0]))
{
io << '\n';
if(ma.flags > 1)
io << S_ASK_WRITE_MSG_USING_YOUR_ALIAS;
else
io << S_ASK_WRITE_MSG_USING_AN_ALIAS;
if(io.ask(0))
{
if(ma.flags==2)
{
if(user.alias[0] == '\0') strcpy(user.alias,user.name);
strcpy(msg.from,user.alias);
}
else
for(;;)
{
User tmpuser;
io << "\n\n" << S_ENTER_ALIAS_TO_USE;
io.read(msg.from,35,READMODE_UPFIRST);
if(!msg.from[0]) return;
if(tmpuser.search(msg.from,TRUE,FALSE,TRUE)) continue;
if(!tmpuser.search(msg.from)) break;
}
}
io << '\n';
}
if(!msg.to[0])
for(;;)
{
User tuser;
if(ma.msgType != MSG_PVT && ma.msgKind != MSG_NET)
io << '\n' << S_ENTER_ALL_IF_TO_EVERYONE << '\n';
io << '\n' << S_WRITE_MSG_TO;
io.read(msg.to,35,READMODE_UPFIRST);
if(!msg.to[0]) return;
if(!strcmp(msg.to,"All") && ma.msgKind!=MSG_NET && ma.msgType != MSG_PVT) break;
if(!strcmp(msg.to,"Sysop") && ma.msgKind==MSG_LOCAL) break;
if(ma.msgKind!=MSG_LOCAL) break;
if(ma.flags==1) break;
io << "\n\n\7" << S_SCANNING_USER_FILE << '\xFF';
if(tuser.search(msg.to)) break;
if(ma.flags==2)
if(tuser.search(msg.to,TRUE,FALSE,TRUE)) break;
bool found = tuser.search(msg.to,FALSE,TRUE,FALSE);
for(int count = 0;found && count<2;count++)
found = tuser.searchNext();
if(count==1)
{
tuser.search(msg.to,FALSE,TRUE,FALSE);
io << "\n\n" << S_CONFIRM_WRITE_MESSAGE_TO(tuser.name);
if(io.ask(TRUE))
{
strcpy(msg.to,tuser.name);
break;
}
else
{
io << '\n';
continue;
}
}
if(count>1)
{
io.enablestop();
io << "\n\n" << S_FUZZY_SEARCH_LIST_HEADER << '\n';
linecounter(2);
found = tuser.search(msg.to,FALSE,TRUE,FALSE);
while(found)
{
if(!(tuser.uFlags & UFLAG_HIDDEN))
io << form("\6 %-32.32s \5%-22.22s \2%-22.22s\n",tuser.name,tuser.city,tuser.country);
if(stopped || linecounter()) break;
found = tuser.searchNext();
}
io.disablestop();
if(!found)
io << S_FUZZY_SEARCH_LIST_FOOTER << '\n';
continue;
}
io << S_USER_NOT_LOCATED << '\n';
}
if(!strcmpl(msg.to,"Sysop")) strcpy(msg.to,ma.sysop);
if(to_specified)
io << '\n' << S_WRITE_MSG_TO << msg.to;
if(ma.msgKind==MSG_NET)
{
aka a;
a.read(ma.aka);
char tmp[30];
if(netmail_address[0])
{
int point;
node_entry ne;
ne.zone=a.zone;
ne.net=a.net;
ne.node=a.node;
if((point=ne.read(netmail_address))<0)
{
LOG("Unknown netmail address: %s",netmail_address);
return;
}
msg.destZone = ne.zone;
msg.destNet = ne.net;
msg.destNode = ne.node;
msg.destPoint= point;
msg.cost = cost;
}
else
{
io << "\n\n" << S_ENTER_NETMAIL_ADDRESS_HEADER;
for(;;)
{
int point;
io << "\n\n" << S_ENTER_NETMAIL_ADDRESS;
io.read(tmp,25);
if(!tmp[0]) return;
io << "\n\n";
node_entry ne;
ne.zone=a.zone;
ne.net=a.net;
ne.node=a.node;
if((point=ne.read(tmp))<0) continue;
cost=ne.cost;
io << S_CONFIRM_NETMAIL_ADDRESS(form("%d:%d/%d.%d",ne.zone,ne.net,ne.node,point),ne.name,form("%d",ne.cost));
if(io.ask(1))
{
if(user.credit<cost)
{
io << "\n\n" << S_NOT_ENOUGH_NETMAIL_CREDIT(form("%d",user.credit))
<< "\n\n" << S_PRESS_ENTER_TO_CONTINUE;
return;
}
msg.destZone = ne.zone;
msg.destNet = ne.net;
msg.destNode = ne.node;
msg.destPoint= point;
msg.cost = cost;
break;
}
}
}
if(check_access(cfg.crashlevel,cfg.crashflags))
{
io << "\n\n" << S_ASK_SEND_CRASH;
if(io.ask(0)) msg.attr |= MSGATTR_CRASH;
}
if(check_access(cfg.attachlevel,cfg.attachflags))
{
io << "\n\n" << S_ASK_ATTACH_FILE;
if(io.ask(0))
{
msg.attr |= MSGATTR_FILE;
io << "\n\n" << S_FILE_TO_ATTACH;
io.read(msg.subj,60);
if(!msg.subj[0]) return;
}
}
if(cfg.killsent) msg.attr |= MSGATTR_KILL;
}
if(subj_specified)
{
io << "\n\n" << S_SHOW_MESSAGE_SUBJECT(msg.subj);
}
else
if(!(msg.attr & MSGATTR_FILE))
{
io << "\n\n" << S_ENTER_MESSAGE_SUBJECT;
io.read(msg.subj,65);
if(!msg.subj[0]) return;
}
switch(ma.msgType)
{
case MSG_BOTH: {
if(strcmp(msg.to,"All"))
{
io << "\n\n" << S_ASK_PRIVATE_MESSAGE;
if(io.ask(0)) msg.attr |= MSGATTR_PRIVATE;
}
} break;
case MSG_PVT: msg.attr |= MSGATTR_PRIVATE; break;
}
io << '\n';
unlink("MSGTMP");
write_msginf( msg.from , msg.to , msg.subj , ma.highMsg()+1 , ma.name , (msg.attr & MSGATTR_PRIVATE) ? "YES":"NO");
edit_message();
unlink("MSGINF");
if(!access("MSGTMP",0))
{
io << "\n\n" << S_SAVING_MESSAGE;
msg.postDate.today();
msg.postTime.now();
long nr = msg.add();
if(nr >= 1)
{
nr = msg.msgBase()->msgNum(*msg.msgArea,nr);
}
if(nr<1) io << S_SAVING_MESSAGE_ERROR << '\n';
else
{
io << form("\3#%d\n",nr);
user.msgsPosted++;
LOG(1,"Msg #%ld entered (Area %d)",nr,msg.areaNum());
if(ma.msgKind == MSG_NET) user.pending += cost;
}
}
else
LOG(1,"Msg aborted (Area %d)",msg.areaNum());
if(goodbye) logoff(NULL);
else io << '\n' << S_PRESS_ENTER_TO_CONTINUE;
}
void
edit_message()
{
if(fsed_mode && (ansi_mode || avatar))
{
if(run_sdkfile("/I FSED") < 0)
{
if(!cfg.editorname[0] && !cfg.internalfsed)
{
msged();
return;
}
String editorcommand(cfg.editorname);
if(cfg.internalfsed)
editorcommand = "@_FSED";
if(editorcommand[0] == '@')
{
editorcommand.del(0,1);
run_sdkfile(replace_stringvars(editorcommand));
}
else
{
editorcommand << "*N*Q *P *B *T *I";
shell(replace_stringvars(editorcommand));
}
switch(returnvalue)
{
case 1: io << "\n\n" << S_MESSAGE_ABORTED << '\n';
unlink("MSGTMP");
break;
case 2: LOG("Carrier lost while editing.");
exit_proboard();
}
}
}
else msged();
}
void
write_msginf( char *from , char *to , char *subj , long num , char *area , char *pvt)
{
File f;
if(f.open("MSGINF",fmode_create | fmode_text))
{
f << from << '\n';
f << to << '\n';
f << subj << '\n';
f << form("%ld\n",num);
f << area << '\n';
f << pvt << '\n';
}
}