/* * staff.cpp * Functions dealing with staff. * ____ _ * | _ \ ___ __ _| |_ __ ___ ___ * | |_) / _ \/ _` | | '_ ` _ \/ __| * | _ < __/ (_| | | | | | | \__ \ * |_| \_\___|\__,_|_|_| |_| |_|___/ * * Permission to use, modify and distribute is granted via the * Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License * http://creativecommons.org/licenses/by-nc-sa/3.0/ * * Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell * Contributions by Tim Callahan, Jonathan Hseu * Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman * */ #include "mud.h" // ********************************************************* // log_immort // ********************************************************* // Parameters: <broad> Broadcast or not? // <player> Who are we logging? // Log something done by an immortal, and optionally broadcast it int log_immort(int broad, Player* player, const char *fmt,...) { // broad==0 - no broadcast // broad==1 - broadcast // broad==2 - more needs to be done char *str, name[42]; va_list ap; bstring txt = ""; if(player->isMonster() || !player->isStaff()) return(0); va_start(ap, fmt); if(vasprintf(&str, fmt, ap) == -1) { printf("Error in log_immort\n"); return(0); } va_end(ap); txt = str; // broad is 2 when we need to remove the last ^g in the string. // this is the case when we broadcast an object name and manually // return the string to the proper color if(broad == 2) { bstring::size_type idx = txt.ReverseFind('^'); if(idx != bstring::npos && (txt.getAt(idx+1) == 'g' || txt.getAt(idx+1) == 'G')) txt.erase(idx, 2); } // trick logn to use Path::StaffLog sprintf(name, "staff/%s", player->getCName()); // Path::StaffLog logn(name, "%s\n", txt.c_str()); if(broad) { if(player->isDm()) broadcast(isDm, watchingLog, "^g*** %s", stripLineFeeds(str)); else if(player->isCt()) broadcast(isCt, watchingLog, "^g*** %s", stripLineFeeds(str)); else broadcast(isStaff, watchingLog, "^g*** %s", stripLineFeeds(str)); } free(str); return(1); } // ********************************************************* // CheckStaff // ********************************************************* // Parameters: <failStr> String to output on failure // If player isn't staff print fail str and return false // If player is staff print fail str but return true bool Creature::checkStaff(const char *failStr,...) const { bool ret=false; va_list ap; va_start(ap, failStr); if(!isStaff()) { vprint(failStr, ap); ret = false; } else { print("*STAFF* "); vprint(failStr, ap); ret = true; } va_end(ap); return(ret); } bool isPtester(const Creature* player) { if(player->isMonster()) return(false); return(player->isCt() || player->flagIsSet(P_PTESTER)); } bool isPtester(Socket* sock) { if(sock->getPlayer()) return(isPtester(sock->getPlayer())); return(false); } bool isWatcher(const Creature* player) { if(player->isMonster()) return(false); return(player->isCt() || player->isWatcher()); } bool isWatcher(Socket* sock) { if(sock->getPlayer()) return(isWatcher(sock->getPlayer())); return(false); } bool isStaff(const Creature* player) { if(player->isMonster()) return(false); return(player->getClass() >= BUILDER); } bool isStaff(Socket* sock) { if(sock->getPlayer()) return(sock->getPlayer()->isStaff()); return(false); } bool isCt(const Creature* player) { if(player->isMonster()) return(false); return(player->getClass() >= CARETAKER); } bool isCt(Socket* sock) { if(sock->getPlayer()) return(sock->getPlayer()->isCt()); return(false); } bool isDm(const Creature* player) { if(player->isMonster()) return(false); return(player->getClass() == DUNGEONMASTER); } bool isDm(Socket* sock) { if(sock->getPlayer()) return(sock->getPlayer()->isDm()); return(false); } bool isAdm(const Creature* player) { if(player->isMonster()) return(false); return(player->getName() == "Bane" || player->getName() == "Dominus" || player->getName() == "Ocelot"); } bool isAdm(Socket* sock) { if(sock->getPlayer()) return(isAdm(sock->getPlayer())); return(false); } bool watchingLog(Socket* sock) { if(sock->getPlayer()) if(sock->getPlayer()->flagIsSet(P_LOG_WATCH)) return(true); return(false); } bool watchingEaves(Socket* sock) { if(sock->getPlayer()) if(isCt(sock) && sock->getPlayer()->flagIsSet(P_EAVESDROPPER)) return(true); return(false); } bool watchingSuperEaves(Socket* sock) { if(sock->getPlayer()) if(isCt(sock) && sock->getPlayer()->flagIsSet(P_SUPER_EAVESDROPPER)) return(true); return(false); }