// quota.cpp -- Quota Management Commands. // // $Id: quota.cpp,v 1.6 2004/06/19 21:49:14 sdennis Exp $ // #include "copyright.h" #include "autoconf.h" #include "config.h" #include "externs.h" #include "attrs.h" #include "functions.h" #include "powers.h" // --------------------------------------------------------------------------- // count_quota, mung_quota, show_quota, do_quota: Manage quotas. // static int count_quota(dbref player) { if (Owner(player) != player) { return 0; } int q = 0 - mudconf.player_quota; dbref i; DO_WHOLE_DB(i) { if (Owner(i) != player) { continue; } if (Going(i) && (!isRoom(i))) { continue; } switch (Typeof(i)) { case TYPE_EXIT: q += mudconf.exit_quota; break; case TYPE_ROOM: q += mudconf.room_quota; break; case TYPE_THING: q += mudconf.thing_quota; break; case TYPE_PLAYER: q += mudconf.player_quota; break; } } return q; } static void mung_quotas(dbref player, int key, int value) { dbref aowner; int aq, rq, xq, aflags; char *buff; if (key & QUOTA_FIX) { // Get value of stuff owned and good value, set other value from that. // xq = count_quota(player); if (key & QUOTA_TOT) { buff = atr_get(player, A_RQUOTA, &aowner, &aflags); aq = mux_atol(buff) + xq; atr_add_raw(player, A_QUOTA, mux_ltoa_t(aq)); free_lbuf(buff); } else { buff = atr_get(player, A_QUOTA, &aowner, &aflags); rq = mux_atol(buff) - xq; atr_add_raw(player, A_RQUOTA, mux_ltoa_t(rq)); free_lbuf(buff); } } else { // Obtain (or calculate) current relative and absolute quota. // buff = atr_get(player, A_QUOTA, &aowner, &aflags); if (!*buff) { free_lbuf(buff); buff = atr_get(player, A_RQUOTA, &aowner, &aflags); rq = mux_atol(buff); free_lbuf(buff); aq = rq + count_quota(player); } else { aq = mux_atol(buff); free_lbuf(buff); buff = atr_get(player, A_RQUOTA, &aowner, &aflags); rq = mux_atol(buff); free_lbuf(buff); } // Adjust values. // if (key & QUOTA_REM) { aq += (value - rq); rq = value; } else { rq += (value - aq); aq = value; } // Set both abs and relative quota. // atr_add_raw(player, A_QUOTA, mux_ltoa_t(aq)); atr_add_raw(player, A_RQUOTA, mux_ltoa_t(rq)); } } static void show_quota(dbref player, dbref victim) { dbref aowner; int aq, rq, aflags; char *buff; buff = atr_get(victim, A_QUOTA, &aowner, &aflags); aq = mux_atol(buff); free_lbuf(buff); buff = atr_get(victim, A_RQUOTA, &aowner, &aflags); rq = aq - mux_atol(buff); free_lbuf(buff); if (!Free_Quota(victim)) { buff = tprintf("%-16s Quota: %9d Used: %9d", Name(victim), aq, rq); } else { buff = tprintf("%-16s Quota: UNLIMITED Used: %9d", Name(victim), rq); } notify_quiet(player, buff); } void do_quota ( dbref executor, dbref caller, dbref enactor, int key, int nargs, char *arg1, char *arg2 ) { if (!(mudconf.quotas || Quota(executor))) { notify_quiet(executor, "Quotas are not enabled."); return; } if ((key & QUOTA_TOT) && (key & QUOTA_REM)) { notify_quiet(executor, "Illegal combination of switches."); return; } dbref who; int value = 0, i; bool set = false; // Show or set all quotas if requested. // if (key & QUOTA_ALL) { if (arg1 && *arg1) { value = mux_atol(arg1); set = true; } else if (key & (QUOTA_SET | QUOTA_FIX)) { value = 0; set = true; } if (set) { STARTLOG(LOG_WIZARD, "WIZ", "QUOTA"); log_name(executor); log_text(" changed everyone's quota"); ENDLOG; } DO_WHOLE_DB(i) { if (isPlayer(i)) { if (set) { mung_quotas(i, key, value); } show_quota(executor, i); } } return; } // Find out whose quota to show or set. // if (!arg1 || *arg1 == '\0') { who = Owner(executor); } else { who = lookup_player(executor, arg1, true); if (!Good_obj(who)) { notify_quiet(executor, "Not found."); return; } } // Make sure we have permission to do it. // if (!Quota(executor)) { if (arg2 && *arg2) { notify_quiet(executor, NOPERM_MESSAGE); return; } if (Owner(executor) != who) { notify_quiet(executor, NOPERM_MESSAGE); return; } } if (arg2 && *arg2) { set = true; value = mux_atol(arg2); } else if (key & QUOTA_FIX) { set = true; value = 0; } if (set) { STARTLOG(LOG_WIZARD, "WIZ", "QUOTA"); log_name(executor); log_text(" changed the quota of "); log_name(who); ENDLOG; mung_quotas(who, key, value); } show_quota(executor, who); } FUNCTION(fun_hasquota) { if (!mudconf.quotas) { safe_str("#-1 Quotas are not enabled.", buff, bufc); return; } // Find out whose quota to show. // dbref who = lookup_player(executor, fargs[0], true); if (!Good_obj(who)) { safe_str("#-1 NOT FOUND", buff, bufc); return; } // Make sure we have permission to do it. // if ( Owner(executor) != who && !Quota(executor)) { safe_str(NOPERM_MESSAGE, buff, bufc); return; } bool bResult = true; if (!Free_Quota(who)) { int aflags; dbref aowner; int rq = mux_atol(atr_get(who, A_RQUOTA, &aowner, &aflags)); bResult = (rq >= mux_atol(fargs[1])); } safe_bool(bResult, buff, bufc); }