#define Use_MsgBase #include #include #include #include #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= 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'; } }