void gfileedit() { int i; char s[81]; if (!ValidateSysopPassword()) { return; } showsec(); bool done = false; do { bout.nl(); bout << "|#2G-files: D:elete, I:nsert, M:odify, Q:uit, ? : "; char ch = onek("QDIM?"); switch (ch) { case '?': showsec(); break; case 'Q': done = true; break; case 'M': bout.nl(); bout << "|#2Section number? "; input(s, 2); i = atoi(s); if ((s[0] != 0) && (i >= 0) && (i < session()->num_sec)) { modify_sec(i); } break; case 'I': if (session()->num_sec < session()->max_gfilesec) { bout.nl(); bout << "|#2Insert before which section? "; input(s, 2); i = atoi(s); if ((s[0] != 0) && (i >= 0) && (i <= session()->num_sec)) { insert_sec(i); } } break; case 'D': bout.nl(); bout << "|#2Delete which section? "; input(s, 2); i = atoi(s); if ((s[0] != 0) && (i >= 0) && (i < session()->num_sec)) { bout.nl(); bout << "|#5Delete " << gfilesec[i].name << "?"; if (yesno()) { delete_sec(i); } } break; } } while (!done && !hangup); File gfileDat(syscfg.datadir, GFILE_DAT); gfileDat.Open(File::modeReadWrite | File::modeBinary | File::modeCreateFile | File::modeTruncate); gfileDat.Write(&gfilesec[0], session()->num_sec * sizeof(gfiledirrec)); gfileDat.Close(); }
/** * Finds GetSession()->usernum and system number from emailAddress, sets network number as * appropriate. * @param emailAddress The text of the email address. * @param pUserNumber OUT The User Number * @param pSystemmNumber OUT The System Number */ void parse_email_info(const std::string emailAddress, int *pUserNumber, int *pSystemNumber) { char *ss1, onx[20], ch, *mmk; unsigned nUserNumber, nSystemNumber; int i, nv, on, xx, onxi, odci; net_system_list_rec *csne; char szEmailAddress[ 255 ]; strcpy(szEmailAddress, emailAddress.c_str()); *pUserNumber = 0; *pSystemNumber = 0; net_email_name[0] = '\0'; char *ss = strrchr(szEmailAddress, '@'); if (ss == NULL) { nUserNumber = finduser1(szEmailAddress); if (nUserNumber > 0) { *pUserNumber = static_cast< unsigned short >(nUserNumber); } else if (wwiv::strings::IsEquals(szEmailAddress, "SYSOP")) { // Add 4.31 Build3 *pUserNumber = 1; } else { GetSession()->bout << "Unknown user.\r\n"; } } else if (atoi(ss + 1) == 0) { for (i = 0; i < GetSession()->GetMaxNetworkNumber(); i++) { set_net_num(i); if ((WWIV_STRNICMP("internet", GetSession()->GetNetworkName(), 8) == 0) || ((WWIV_STRNICMP("filenet", GetSession()->GetNetworkName(), 7) == 0) && (*pSystemNumber == 32767))) { strcpy(net_email_name, szEmailAddress); for (ss1 = net_email_name; *ss1; ss1++) { if ((*ss1 >= 'A') && (*ss1 <= 'Z')) { *ss1 += 'a' - 'A'; } } *pSystemNumber = 1; break; } } if (i >= GetSession()->GetMaxNetworkNumber()) { GetSession()->bout << "Unknown user.\r\n"; } } else { ss[0] = '\0'; ss = &(ss[1]); i = strlen(szEmailAddress); while (i > 0 && szEmailAddress[i - 1] == ' ') { --i; } szEmailAddress[i] = 0; nUserNumber = atoi(szEmailAddress); if (nUserNumber == 0 && szEmailAddress[0] == '#') { nUserNumber = atoi(szEmailAddress + 1); } if (strchr(szEmailAddress, '@')) { nUserNumber = 0; } nSystemNumber = atoi(ss); ss1 = strchr(ss, '.'); if (ss1) { ss1++; } if (nUserNumber == 0) { strcpy(net_email_name, szEmailAddress); i = strlen(net_email_name); while (i > 0 && net_email_name[i - 1] == ' ') { --i; } net_email_name[i] = '\0'; if (net_email_name[0]) { *pSystemNumber = static_cast< unsigned short >(nSystemNumber); } else { GetSession()->bout << "Unknown user.\r\n"; } } else { *pUserNumber = static_cast< unsigned short >(nUserNumber); *pSystemNumber = static_cast< unsigned short >(nSystemNumber); } if (*pSystemNumber && ss1) { for (i = 0; i < GetSession()->GetMaxNetworkNumber(); i++) { set_net_num(i); if (wwiv::strings::IsEqualsIgnoreCase(ss1, GetSession()->GetNetworkName())) { if (!valid_system(*pSystemNumber)) { GetSession()->bout.NewLine(); GetSession()->bout << "There is no " << ss1 << " @" << *pSystemNumber << ".\r\n\n"; *pSystemNumber = *pUserNumber = 0; } else { if (*pSystemNumber == net_sysnum) { *pSystemNumber = 0; if (*pUserNumber == 0) { *pUserNumber = static_cast< unsigned short >(finduser(net_email_name)); } if (*pUserNumber == 0 || *pUserNumber > 32767) { *pUserNumber = 0; GetSession()->bout << "Unknown user.\r\n"; } } } break; } } if (i >= GetSession()->GetMaxNetworkNumber()) { GetSession()->bout.NewLine(); GetSession()->bout << "This system isn't connected to " << ss1 << "\r\n"; *pSystemNumber = *pUserNumber = 0; } } else if (*pSystemNumber && GetSession()->GetMaxNetworkNumber() > 1) { odc[0] = '\0'; odci = 0; onx[0] = 'Q'; onx[1] = '\0'; onxi = 1; nv = 0; on = GetSession()->GetNetworkNumber(); ss = static_cast<char *>(BbsAllocA(GetSession()->GetMaxNetworkNumber())); WWIV_ASSERT(ss != NULL); xx = -1; for (i = 0; i < GetSession()->GetMaxNetworkNumber(); i++) { set_net_num(i); if (net_sysnum == *pSystemNumber) { xx = i; } else if (valid_system(*pSystemNumber)) { ss[nv++] = static_cast< char >(i); } } set_net_num(on); if (nv == 0) { if (xx != -1) { set_net_num(xx); *pSystemNumber = 0; if (*pUserNumber == 0) { *pUserNumber = static_cast< unsigned short >(finduser(net_email_name)); if (*pUserNumber == 0 || *pUserNumber > 32767) { *pUserNumber = 0; GetSession()->bout << "Unknown user.\r\n"; } } } else { GetSession()->bout.NewLine(); GetSession()->bout << "Unknown system\r\n"; *pSystemNumber = *pUserNumber = 0; } } else if (nv == 1) { set_net_num(ss[0]); } else { GetSession()->bout.NewLine(); for (i = 0; i < nv; i++) { set_net_num(ss[i]); csne = next_system(*pSystemNumber); if (csne) { if (i < 9) { onx[onxi++] = static_cast< char >(i + '1'); onx[onxi] = 0; } else { odci = static_cast< char >((i + 1) / 10); odc[odci - 1] = static_cast< char >(odci + '0'); odc[odci] = 0; } GetSession()->bout << i + 1 << ". " << GetSession()->GetNetworkName() << " (" << csne->name << ")\r\n"; } } GetSession()->bout << "Q. Quit\r\n\n"; GetSession()->bout << "|#2Which network (number): "; if (nv < 9) { ch = onek(onx); if (ch == 'Q') { i = -1; } else { i = ch - '1'; } } else { mmk = mmkey(2); if (*mmk == 'Q') { i = -1; } else { i = atoi(mmk) - 1; } } if (i >= 0 && i < nv) { set_net_num(ss[i]); } else { GetSession()->bout << "\r\n|#6Aborted.\r\n\n"; *pUserNumber = *pSystemNumber = 0; } } free(ss); } else { if (*pSystemNumber == net_sysnum) { *pSystemNumber = 0; if (*pUserNumber == 0) { *pUserNumber = static_cast< unsigned short >(finduser(net_email_name)); } if (*pUserNumber == 0 || *pUserNumber > 32767) { *pUserNumber = 0; GetSession()->bout << "Unknown user.\r\n"; } } else if (!valid_system(*pSystemNumber)) { GetSession()->bout << "\r\nUnknown user.\r\n"; *pSystemNumber = *pUserNumber = 0; } } } }
void edit_languages() { char s1[81]; int i, i1, i2; bool done = false; do { out->Cls(); nlx(); for (i = 0; i < initinfo.num_languages; i++) { if (i && ((i % 23) == 0)) { pausescr(); } Printf("%-2d. %-20s %-50s\n", i + 1, languages[i].name, languages[i].dir); } nlx(); out->SetColor(Scheme::PROMPT); Puts("Languages: M:odify, D:elete, I:nsert, Q:uit : "); out->SetColor(Scheme::NORMAL); char ch = onek("Q\033MID"); switch (ch) { case 'Q': case '\033': done = true; break; case 'M': nlx(); out->SetColor(Scheme::PROMPT); sprintf(s1, "Edit which (1-%d) ? ", initinfo.num_languages); Puts(s1); out->SetColor(Scheme::NORMAL); i = input_number(2); if ((i > 0) && (i <= initinfo.num_languages)) { edit_lang(i - 1); } break; case 'D': if (initinfo.num_languages > 1) { nlx(); sprintf(s1, "Delete which (1-%d) ? ", initinfo.num_languages); out->SetColor(Scheme::PROMPT); Puts(s1); out->SetColor(Scheme::NORMAL); i = input_number(2); if ((i > 0) && (i <= initinfo.num_languages)) { nlx(); out->SetColor(Scheme::ERROR_TEXT); Puts("Are you sure? "); out->SetColor(Scheme::NORMAL); ch = onek("YN\r"); if (ch == 'Y') { initinfo.num_languages--; for (i1 = i - 1; i1 < initinfo.num_languages; i1++) { languages[i1] = languages[i1 + 1]; } if (initinfo.num_languages == 1) { languages[0].num = 0; } } } } else { nlx(); out->SetColor(Scheme::ERROR_TEXT); Printf("You must leave at least one language.\n"); out->SetColor(Scheme::NORMAL); nlx(); out->GetChar(); } break; case 'I': if (initinfo.num_languages >= MAX_LANGUAGES) { out->SetColor(Scheme::ERROR_TEXT); Printf("Too many languages.\n"); out->SetColor(Scheme::NORMAL); nlx(); out->GetChar(); break; } nlx(); out->SetColor(Scheme::PROMPT); sprintf(s1, "Insert before which (1-%d) ? ", initinfo.num_languages + 1); Puts(s1); out->SetColor(Scheme::NORMAL); i = input_number(2); if ((i > 0) && (i <= initinfo.num_languages + 1)) { out->SetColor(Scheme::ERROR_TEXT); Puts("Are you sure? "); out->SetColor(Scheme::NORMAL); ch = onek("YN\r"); if (ch == 'Y') { --i; for (i1 = initinfo.num_languages; i1 > i; i1--) { languages[i1] = languages[i1 - 1]; } initinfo.num_languages++; strcpy(languages[i].name, "English"); strncpy(languages[i].dir, syscfg.gfilesdir, sizeof(languages[i1].dir) - 1); strncpy(languages[i].mdir, syscfg.gfilesdir, sizeof(languages[i1].mdir) - 1); i2 = 0; for (i1 = 0; i1 < initinfo.num_languages; i1++) { if ((i != i1) && (languages[i1].num >= i2)) { i2 = languages[i1].num + 1; } } if (i2 >= 250) { for (i2 = 0; i2 < 255; i2++) { for (i1 = 0; i1 < initinfo.num_languages; i1++) { if ((i != i1) && (languages[i1].num == i2)) { break; } } if (i1 >= initinfo.num_languages) { break; } } } languages[i].num = i2; edit_lang(i); } } break; } } while (!done); char szFileName[ MAX_PATH ]; sprintf(szFileName, "%slanguage.dat", syscfg.datadir); unlink(szFileName); int hFile = open(szFileName, O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); write(hFile, (void *)languages, initinfo.num_languages * sizeof(languagerec)); close(hFile); }
void modify_sec(int n) { char s[81]; gfiledirrec r = gfilesec[n]; bool done = false; do { bout.cls(); bout.litebar("Editing G-File Area # %d", n); bout << "|#9A) Name : |#2" << r.name << wwiv::endl; bout << "|#9B) Filename : |#2" << r.filename << wwiv::endl; bout << "|#9C) SL : |#2" << static_cast<int>(r.sl) << wwiv::endl; bout << "|#9D) Min. Age : |#2" << static_cast<int>(r.age) << wwiv::endl; bout << "|#9E) Max Files : |#2" << r.maxfiles << wwiv::endl; bout << "|#9F) AR : |#2" << GetArString(r, s) << wwiv::endl; bout.nl(); bout << "|#7(|#2Q|#7=|#1Quit|#7) Which (|#1A|#7-|#1F,|#1[|#7,|#1]|#7) : "; char ch = onek("QABCDEF[]", true); switch (ch) { case 'Q': done = true; break; case '[': gfilesec[n] = r; if (--n < 0) { n = session()->num_sec - 1; } r = gfilesec[n]; break; case ']': gfilesec[n] = r; if (++n >= session()->num_sec) { n = 0; } r = gfilesec[n]; break; case 'A': bout.nl(); bout << "|#2New name? "; inputl(s, 40); if (s[0]) { strcpy(r.name, s); } break; case 'B': { bout.nl(); File dir(syscfg.gfilesdir, r.filename); if (dir.Exists()) { bout << "\r\nThere is currently a directory for this g-file section.\r\n"; bout << "If you change the filename, the directory will still be there.\r\n\n"; } bout.nl(); bout << "|#2New filename? "; input(s, 8); if ((s[0] != 0) && (strchr(s, '.') == 0)) { strcpy(r.filename, s); File dir(syscfg.gfilesdir, r.filename); if (!dir.Exists()) { bout.nl(); bout << "|#5Create directory for this section? "; if (yesno()) { File dir(syscfg.gfilesdir, r.filename); File::mkdirs(dir); } else { bout << "\r\nYou will have to create the directory manually, then.\r\n\n"; } } else { bout << "\r\nA directory already exists under this filename.\r\n\n"; } pausescr(); } } break; case 'C': { bout.nl(); bout << "|#2New SL? "; input(s, 3); int i = atoi(s); if (i >= 0 && i < 256 && s[0]) { r.sl = static_cast<unsigned char>(i); } } break; case 'D': { bout.nl(); bout << "|#2New Min Age? "; input(s, 3); int i = atoi(s); if ((i >= 0) && (i < 128) && (s[0])) { r.age = static_cast<unsigned char>(i); } } break; case 'E': { bout.nl(); bout << "|#1Max 99 files/section.\r\n|#2New max files? "; input(s, 3); int i = atoi(s); if ((i >= 0) && (i < 99) && (s[0])) { r.maxfiles = static_cast<unsigned short>(i); } } break; case 'F': bout.nl(); bout << "|#2New AR (<SPC>=None) ? "; char ch2 = onek("ABCDEFGHIJKLMNOP "); if (ch2 == SPACE) { r.ar = 0; } else { r.ar = 1 << (ch2 - 'A'); } break; } } while (!done && !hangup); gfilesec[n] = r; }
void valscan() { // Must be local cosysop or better if (!lcs()) { return; } int ac = 0; int os = GetSession()->GetCurrentMessageArea(); if (uconfsub[1].confnum != -1 && okconf(GetSession()->GetCurrentUser())) { ac = 1; tmp_disable_conf(true); } bool done = false; for (int sn = 0; sn < GetSession()->num_subs && !hangup && !done; sn++) { if (!iscan(sn)) { continue; } if (GetSession()->GetCurrentReadMessageArea() < 0) { return; } uint32_t sq = qsc_p[sn]; // Must be sub with validation "on" if (!(xsubs[GetSession()->GetCurrentReadMessageArea()].num_nets) || !(subboards[GetSession()->GetCurrentReadMessageArea()].anony & anony_val_net)) { continue; } GetSession()->bout.NewLine(); GetSession()->bout.Color(2); GetSession()->bout.ClearEOL(); GetSession()->bout << "{{ ValScanning " << subboards[GetSession()->GetCurrentReadMessageArea()].name << " }}\r\n"; lines_listed = 0; GetSession()->bout.ClearEOL(); if (okansi() && !newline) { GetSession()->bout << "\r\x1b[2A"; } for (int i = 1; i <= GetSession()->GetNumMessagesInCurrentMessageArea() && !hangup && !done; i++) { // was i = 0 if (get_post(i)->status & status_pending_net) { CheckForHangup(); GetSession()->localIO()->tleft(true); if (i > 0 && i <= GetSession()->GetNumMessagesInCurrentMessageArea()) { bool next; int val; read_message(i, &next, &val); GetSession()->bout << "|#4[|#4Subboard: " << subboards[GetSession()->GetCurrentReadMessageArea()].name << "|#1]\r\n"; GetSession()->bout << "|#1D|#9)elete, |#1R|#9)eread |#1V|#9)alidate, |#1M|#9)ark Validated, |#1Q|#9)uit: |#2"; char ch = onek("QDVMR"); switch (ch) { case 'Q': done = true; break; case 'R': i--; continue; case 'V': { open_sub(true); resynch(&i, nullptr); postrec *p1 = get_post(i); p1->status &= ~status_pending_net; write_post(i, p1); close_sub(); send_net_post(p1, subboards[GetSession()->GetCurrentReadMessageArea()].filename, GetSession()->GetCurrentReadMessageArea()); GetSession()->bout.NewLine(); GetSession()->bout << "|#7Message sent.\r\n\n"; } break; case 'M': if (lcs() && i > 0 && i <= GetSession()->GetNumMessagesInCurrentMessageArea() && subboards[GetSession()->GetCurrentReadMessageArea()].anony & anony_val_net && xsubs[GetSession()->GetCurrentReadMessageArea()].num_nets) { open_sub(true); resynch(&i, nullptr); postrec *p1 = get_post(i); p1->status &= ~status_pending_net; write_post(i, p1); close_sub(); GetSession()->bout.NewLine(); GetSession()->bout << "|#9Not set for net pending now.\r\n\n"; } break; case 'D': if (lcs()) { if (i > 0) { open_sub(true); resynch(&i, nullptr); postrec p2 = *get_post(i); delete_message(i); close_sub(); if (p2.ownersys == 0) { WUser tu; GetApplication()->GetUserManager()->ReadUser(&tu, p2.owneruser); if (!tu.IsUserDeleted()) { if (static_cast<unsigned long>(date_to_daten(tu.GetFirstOn())) < p2.daten) { GetSession()->bout.NewLine(); GetSession()->bout << "|#2Remove how many posts credit? "; char szNumCredits[ 11 ]; input(szNumCredits, 3, true); int nNumPostCredits = 1; if (szNumCredits[0]) { nNumPostCredits = atoi(szNumCredits); } nNumPostCredits = std::min<int>(tu.GetNumMessagesPosted(), nNumPostCredits); if (nNumPostCredits) { tu.SetNumMessagesPosted(tu.GetNumMessagesPosted() - static_cast<unsigned short>(nNumPostCredits)); } GetSession()->bout.NewLine(); GetSession()->bout << "|#3Post credit removed = " << nNumPostCredits << wwiv::endl; tu.SetNumDeletedPosts(tu.GetNumDeletedPosts() + 1); GetApplication()->GetUserManager()->WriteUser(&tu, p2.owneruser); GetApplication()->UpdateTopScreen(); } } } resynch(&i, &p2); } } break; } } } } qsc_p[sn] = sq; } if (ac) { tmp_disable_conf(false); } GetSession()->SetCurrentMessageArea(os); GetSession()->bout.NewLine(2); }
void ConfigUserMenuSet() { if (session()->usernum != nSecondUserRecLoaded) { if (!LoadMenuSetup(session()->usernum)) { LoadMenuSetup(1); } } nSecondUserRecLoaded = session()->usernum; bout.cls(); bout.litebar("Configure Menus"); printfile(MENUWEL_NOEXT); bool bDone = false; while (!bDone && !hangup) { bout.nl(); bout << "|#11|#9) Menuset :|#2 " << pSecondUserRec->szMenuSet << wwiv::endl; bout << "|#12|#9) Use hot keys :|#2 " << (pSecondUserRec->cHotKeys == HOTKEYS_ON ? "Yes" : "No ") << wwiv::endl; bout.nl(); bout << "|#9(|#2Q|#9=|#1Quit|#9) : "; char chKey = onek("Q12?"); switch (chKey) { case 'Q': bDone = true; break; case '1': { ListMenuDirs(); bout.nl(2); bout << "|#9Enter the menu set to use : "; string menuSetName; inputl(&menuSetName, 8); if (ValidateMenuSet(menuSetName.c_str())) { wwiv::menus::MenuDescriptions descriptions(GetMenuDirectory()); bout.nl(); bout << "|#9Menu Set : |#2" << menuSetName.c_str() << " : |#1" << descriptions.description(menuSetName) << wwiv::endl; bout << "|#5Use this menu set? "; if (noyes()) { strcpy(pSecondUserRec->szMenuSet, menuSetName.c_str()); break; } } bout.nl(); bout << "|#6That menu set does not exists, resetting to the default menu set" << wwiv::endl; pausescr(); if (pSecondUserRec->szMenuSet[0] == '\0') { strcpy(pSecondUserRec->szMenuSet, "wwiv"); } } break; case '2': pSecondUserRec->cHotKeys = !pSecondUserRec->cHotKeys; break; case '3': pSecondUserRec->cMenuType = !pSecondUserRec->cMenuType; break; case '?': printfile(MENUWEL_NOEXT); continue; // bypass the below cls() } bout.cls(); } // If menu is invalid, it picks the first one it finds if (!ValidateMenuSet(pSecondUserRec->szMenuSet)) { if (session()->num_languages > 1 && session()->user()->GetLanguage() != 0) { bout << "|#6No menus for " << languages[session()->user()->GetLanguage()].name << " language."; input_language(); } } WriteMenuSetup(session()->usernum); MenuSysopLog(StringPrintf("Menu in use : %s - %s - %s", pSecondUserRec->szMenuSet, pSecondUserRec->cHotKeys == HOTKEYS_ON ? "Hot" : "Off", pSecondUserRec->cMenuType == MENUTYPE_REGULAR ? "REG" : "PD")); bout.nl(2); }
/** * Writes the auto message */ void write_automessage() { std::vector<std::string> lines; std::string rollOver; GetSession()->bout << "\r\n|#9Enter auto-message. Max 5 lines. Colors allowed:|#0\r\n\n"; for (int i = 0; i < 5; i++) { GetSession()->bout << "|#7" << i + 1 << ":|#0"; std::string line; inli(line, rollOver, 70); StringTrimEnd(line); lines.push_back(line); } GetSession()->bout.NewLine(); bool bAnonStatus = false; if (getslrec(GetSession()->GetEffectiveSl()).ability & ability_post_anony) { GetSession()->bout << "|#9Anonymous? "; bAnonStatus = yesno(); } GetSession()->bout << "|#9Is this OK? "; if (yesno()) { WStatus *pStatus = GetApplication()->GetStatusManager()->BeginTransaction(); pStatus->SetAutoMessageAnonymous(bAnonStatus); pStatus->SetAutoMessageAuthorUserNumber(GetSession()->usernum); GetApplication()->GetStatusManager()->CommitTransaction(pStatus); WTextFile file(syscfg.gfilesdir, AUTO_MSG, "wt"); std::string authorName = GetSession()->GetCurrentUser()->GetUserNameAndNumber(GetSession()->usernum); file.WriteFormatted("%s\r\n", authorName.c_str()); sysoplog("Changed Auto-message"); #if defined(_MSC_VER) && (_MSC_VER < 1800) for (std::vector<std::string>::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) { std::string line = (*iter); StringTrimEnd(line); #else for (const auto& line : lines) { #endif file.Write(line); file.Write("\r\n"); sysoplog(line, true); } GetSession()->bout << "\r\n|#5Auto-message saved.\r\n\n"; file.Close(); } } char ShowAMsgMenuAndGetInput(const std::string& autoMessageLockFileName) { bool bCanWrite = false; if (!GetSession()->GetCurrentUser()->IsRestrictionAutomessage() && !WFile::Exists(autoMessageLockFileName)) { bCanWrite = (getslrec(GetSession()->GetEffectiveSl()).posts) ? true : false; } char cmdKey = 0; if (cs()) { GetSession()->bout << "|#9(|#2Q|#9)uit, (|#2R|#9)ead, (|#2A|#9)uto-reply, (|#2W|#9)rite, (|#2L|#9)ock, (|#2D|#9)el, (|#2U|#9)nlock : "; cmdKey = onek("QRWALDU", true); } else if (bCanWrite) { GetSession()->bout << "|#9(|#2Q|#9)uit, (|#2R|#9)ead, (|#2A|#9)uto-reply, (|#2W|#9)rite : "; cmdKey = onek("QRWA", true); } else { GetSession()->bout << "|#9(|#2Q|#9)uit, (|#2R|#9)ead, (|#2A|#9)uto-reply : "; cmdKey = onek("QRA", true); } return cmdKey; }