function ekd_dohook($hookname, $args)
{
    global $session;
    switch ($hookname) {
        case "biostat":
            $acctid = $args['acctid'];
            $sql = "SELECT dragonkills FROM " . db_prefix("accounts") . " WHERE acctid = {$acctid}";
            $result = db_fetch_assoc(db_query($sql));
            $tdk = $result['dragonkills'];
            $edk = get_module_pref("edks", "edk", $acctid);
            $cdk = $tdk - $edk;
            if ($edk > 1 && $tdk > 1) {
                output("Out of %s total Drive Kills, %s were Economic Drive Kills.`n", $tdk, $edk);
            } else {
                if ($edk == 1) {
                    output("This player has completed an Economic Drive Kill.`n");
                }
            }
            break;
        case "counciloffices":
            addnav("Ask about the Gun", "runmodule.php?module=edk&op=start");
            break;
    }
    return $args;
}
function dag_uninstall()
{
    output("Dropping bounty table");
    $sql = "DROP TABLE IF EXISTS " . db_prefix("bounty");
    db_query($sql);
    return true;
}
function friendlist_unignore()
{
    global $session;
    $ac = httpget('ac');
    $ignored = rexplode(get_module_pref('ignored', 'friendlist', $ac));
    $iveignored = rexplode(get_module_pref('iveignored'));
    if (in_array($ac, $iveignored)) {
        $sql = "SELECT name FROM " . db_prefix("accounts") . " WHERE acctid={$ac} AND locked=0";
        $result = db_query($sql);
        if (db_num_rows($result) > 0) {
            $row = db_fetch_assoc($result);
            $info = sprintf_translate("%s`Q has been removed from your list.", $row['name']);
            require_once "lib/systemmail.php";
            $t = array("`\$Ignore List Removal");
            $mailmessage = array("%s`0`@ has removed you from %s ignore list.", $session['user']['name'], $session['user']['sex'] ? translate_inline("her") : translate_inline("his"));
            systemmail($ac, $t, $mailmessage);
        } else {
            $info = translate_inline("That user no longer exists...");
        }
    }
    $ignored = array_diff($ignored, array($session['user']['acctid']));
    $ignored = rimplode($ignored);
    set_module_pref('ignored', $ignored, 'friendlist', $ac);
    if (in_array($ac, $iveignored)) {
        $iveignored = array_diff($iveignored, array($ac));
        $iveignored = rimplode($iveignored);
        set_module_pref('iveignored', $iveignored);
    }
    output_notl($info);
}
function viewcommentaryargs_dohook($hook, $args)
{
    global $currentCommentaryArea;
    switch ($hook) {
        case 'blockcommentarea':
            $currentCommentaryArea = $args['section'];
            break;
        case 'viewcommentary':
            $accounts = db_prefix('accounts');
            $commentary = db_prefix('commentary');
            preg_match("/bio.php\\?char=(.*)&ret/", $args['commentline'], $matches);
            $acctid = filter_var($matches[1], FILTER_SANITIZE_NUMBER_INT);
            $sql = db_query_cached("SELECT login, name FROM {$accounts} WHERE acctid = {$acctid}", "commentary-author_name-{$acctid}", 86400);
            $row = db_fetch_assoc($sql);
            $name = $row['name'];
            $login = $row['login'];
            $temp = explode($row['name'], $args['commentline']);
            $temp = str_replace('`3 says, "`#', '', $temp[1]);
            $temp = str_replace('`3"', '', $temp);
            $temp = str_replace('/me', '', $temp);
            $temp = str_replace(':', '', $temp);
            $temp = str_replace('</a>', '', $temp);
            $temp = full_sanitize($temp);
            $temp = addslashes(implode('%', str_split(trim($temp))));
            $sql = db_query("SELECT commentid, comment, postdate FROM {$commentary}\n                WHERE comment LIKE '%{$temp}%'\n                AND section = '{$currentCommentaryArea}'");
            $row = db_fetch_assoc($sql);
            $args = ['commentline' => $args['commentline'], 'section' => $currentCommentaryArea, 'commentid' => $row['commentid'], 'comment' => $row['comment'], 'author_acctid' => $acctid, 'author_login' => $login, 'author_name' => $name, 'date' => $row['postdate']];
            unset($row);
            unset($temp);
            break;
    }
    return $args;
}
function bugtracker_install()
{
    $bugs = array('id' => array('name' => 'creatureid', 'type' => 'int(11) unsigned', 'extra' => 'auto_increment'), 'status' => array('name' => 'status', 'type' => 'text'), 'public' => array('name' => 'public', 'type' => 'bool'), 'info' => array('name' => 'info', 'type' => 'text'), 'key-PRIMARY' => array('name' => 'PRIMARY', 'type' => 'primary key', 'unique' => '1', 'columns' => 'id'));
    require_once "lib/tabledescriptor.php";
    synctable(db_prefix('bugs'), $bugs, true);
    return true;
}
function friendlist_search()
{
    global $session;
    $n = httppost("n");
    rawoutput("<form action='runmodule.php?module=friendlist&op=search' method='POST'>");
    addnav("", "runmodule.php?module=friendlist&op=search");
    if ($n != "") {
        $string = "%";
        for ($x = 0; $x < strlen($n); $x++) {
            $string .= substr($n, $x, 1) . "%";
        }
        $sql = "SELECT name,dragonkills,acctid FROM " . db_prefix("accounts") . " WHERE name LIKE '%{$string}%' AND acctid<>" . $session['user']['acctid'] . " AND locked=0 ORDER BY level,dragonkills";
        $result = db_query($sql);
        if (db_num_rows($result) > 0) {
            $ignored = rexplode(get_module_pref('ignored'));
            $friends = rexplode(get_module_pref('friends'));
            $request = rexplode(get_module_pref('request'));
            $iveignored = rexplode(get_module_pref('iveignored'));
            output("`@These users were found:`n");
            rawoutput("<table style='width:60%;text-align:center;' cellpadding='3' cellspacing='0' border='0'>");
            rawoutput("<tr class='trhead'><td>" . translate_inline("Name") . "</td><td>" . translate_inline("Operations") . "</td></tr>");
            for ($i = 0; $i < db_num_rows($result); $i++) {
                $row = db_fetch_assoc($result);
                rawoutput("<tr class='" . ($i % 2 ? "trlight" : "trdark") . "'><td>");
                output_notl($row['name']);
                rawoutput("</td><td>");
                if (in_array($row['acctid'], $ignored)) {
                    $info = translate_inline("This user has ignored you.");
                    $info .= " [<a href='runmodule.php?module=friendlist&op=ignore&ac=" . $row['acctid'] . "' class='colDkGreen'>" . translate_inline("Ignore") . "</a>]";
                    addnav("", "runmodule.php?module=friendlist&op=ignore&ac=" . $row['acctid']);
                } elseif (in_array($row['acctid'], $friends)) {
                    $info = translate_inline("This user is already in your list.");
                } elseif (in_array($row['acctid'], $request)) {
                    $info = translate_inline("This user has already requested to you.");
                } else {
                    if (in_array($row['acctid'], $iveignored)) {
                        $info = "[<a href='runmodule.php?module=friendlist&op=unignore&ac=" . $row['acctid'] . "' class='colLtRed'>" . translate_inline("Unignore") . "</a>]";
                        addnav("", "runmodule.php?module=friendlist&op=unignore&ac=" . $row['acctid']);
                    } else {
                        $info = "[<a href='runmodule.php?module=friendlist&op=ignore&ac=" . $row['acctid'] . "' class='colDkGreen'>" . translate_inline("Ignore") . "</a>]";
                        addnav("", "runmodule.php?module=friendlist&op=ignore&ac=" . $row['acctid']);
                        $info .= " - [<a href='runmodule.php?module=friendlist&op=request&ac=" . $row['acctid'] . "' class='colDkGreen'>" . translate_inline("Request") . "</a>]";
                        addnav("", "runmodule.php?module=friendlist&op=request&ac=" . $row['acctid']);
                    }
                }
                rawoutput("{$info}</td></tr>");
            }
            rawoutput("</table>");
        } else {
            output("`c`@`bA user was not found with that name.`b`c");
        }
        output_notl("`n");
    }
    output("`^`b`cFriend Search...`c`b");
    output("`n`nWho do you want to search for?");
    output("`n`nName of user: "******"<input name='n' maxlength='50' value=\"" . htmlentities(stripslashes(httppost('n'))) . "\">");
    $apply = translate_inline("Search");
    rawoutput("<input type='submit' class='button' value='{$apply}'></form>");
}
function changelog_run()
{
    $op = httpget('op');
    $ret = httpget('ret');
    $offset = httpget('offset') ?: 1;
    $offset = ($offset - 1) * 25;
    $offset = filter_var($offset, FILTER_SANITIZE_NUMBER_INT);
    $gamelog = db_prefix('gamelog');
    $accounts = db_prefix('accounts');
    $category = addslashes(get_module_setting('category'));
    page_header('Server Changelog');
    $sql = db_query("SELECT count(logid) AS n FROM {$gamelog} WHERE category = '{$category}'");
    $row = db_fetch_assoc($sql);
    addnav('Go back', "{$ret}.php");
    addnav('Changes');
    for ($i = 1; $i < $row['n'] / 25 + 1; $i++) {
        addnav(sprintf("%sPage %s (%s-%s)", $offset / 25 + 1 == $i ? '`^' : '', $i, ($i - 1) * 25 + 1, $i * 25 < $row['n'] ? $i * 25 : $row['n']), "runmodule.php?module=changelog&offset={$i}&ret={$ret}");
    }
    $sql = db_query("SELECT g.*, a.name FROM {$gamelog} AS g\n        LEFT JOIN {$accounts} AS a ON g.who = a.acctid\n        WHERE category = '{$category}' ORDER BY logid+0 DESC LIMIT {$offset}, 25");
    output("`c`@`bChangelog`b`c`n");
    while ($row = db_fetch_assoc($sql)) {
        output(get_module_setting('format'), $row['name'], $row['message']);
    }
    page_footer();
}
function monsterkills_run()
{
    page_header("Most Monster Kills");
    $acc = db_prefix("accounts");
    $mp = db_prefix("module_userprefs");
    $sql = "SELECT {$acc}.name AS name,\r\n\t\t{$acc}.acctid AS acctid,\r\n\t\t{$mp}.value AS kills,\r\n\t\t{$mp}.userid FROM {$mp} INNER JOIN {$acc}\r\n\t\tON {$acc}.acctid = {$mp}.userid \r\n\t\tWHERE {$mp}.modulename = 'monsterkills' \r\n\t\tAND {$mp}.setting = 'kills' \r\n\t\tAND {$mp}.value > 0 ORDER BY ({$mp}.value+0)\t\r\n\t\tDESC limit " . get_module_setting("list") . "";
    $result = db_query($sql);
    $rank = translate_inline("Kills");
    $name = translate_inline("Name");
    output("`n`b`c`@Most`\$ Monster `@Kills`n`n`c`b");
    rawoutput("<table border='0' cellpadding='2' cellspacing='1' align='center'>");
    rawoutput("<tr class='trhead'><td align=center>{$name}</td><td align=center>{$rank}</td></tr>");
    for ($i = 0; $i < db_num_rows($result); $i++) {
        $row = db_fetch_assoc($result);
        if ($row['name'] == $session['user']['name']) {
            rawoutput("<tr class='trhilight'><td>");
        } else {
            rawoutput("<tr class='" . ($i % 2 ? "trdark" : "trlight") . "'><td align=left>");
        }
        output_notl("%s", $row['name']);
        rawoutput("</td><td align=right>");
        output_notl("%s", $row['kills']);
        rawoutput("</td></tr>");
    }
    rawoutput("</table>");
    addnav("Back to HoF", "hof.php");
    villagenav();
    page_footer();
}
function get_partner($player = false)
{
    global $session;
    if ($player === false) {
        $partner = getsetting("barmaid", "`%Violet");
        if ($session['user']['sex'] != SEX_MALE) {
            $partner = getsetting("bard", "`^Seth");
        }
    } else {
        if ($session['user']['marriedto'] == INT_MAX) {
            $partner = getsetting("barmaid", "`%Violet");
            if ($session['user']['sex'] != SEX_MALE) {
                $partner = getsetting("bard", "`^Seth");
            }
        } else {
            $sql = "SELECT name FROM " . db_prefix("accounts") . " WHERE acctid = {$session['user']['marriedto']}";
            $result = db_query($sql);
            if ($row = db_fetch_assoc($result)) {
                $partner = $row['name'];
            } else {
                $session['user']['marriedto'] = 0;
                $partner = getsetting("barmaid", "`%Violet");
                if ($session['user']['sex'] != SEX_MALE) {
                    $partner = getsetting("bard", "`^Seth");
                }
            }
        }
    }
    //	No need to translate names...
    //	tlschema("partner");
    //	$partner = translate_inline($partner);
    //	tlschema();
    return $partner;
}
function get_typeid($modulename)
{
    $sql = "SELECT typeid FROM " . db_prefix("dwellingtypes") . " WHERE module='{$modulename}'";
    $res = db_query($sql);
    $row = db_fetch_assoc($res);
    return $row['typeid'];
}
function scrapbots_get_armies($defenderid, $attackerid)
{
    global $session;
    //get attackers
    $sql = "SELECT id,owner,name,activated,hitpoints,brains,brawn,briskness,junglefighter,retreathp FROM " . db_prefix("scrapbots") . " WHERE owner = {$attackerid}";
    $result = db_query($sql);
    $attacker = array();
    for ($i = 0; $i < db_num_rows($result); $i++) {
        $attacker[$i] = db_fetch_assoc($result);
    }
    $sql = "SELECT id,owner,name,activated,hitpoints,brains,brawn,briskness,junglefighter,retreathp FROM " . db_prefix("scrapbots") . " WHERE owner = {$defenderid}";
    $result = db_query($sql);
    $defender = array();
    for ($i = 0; $i < db_num_rows($result); $i++) {
        $defender[$i] = db_fetch_assoc($result);
    }
    debug("Debugging Attacker");
    debug($attacker);
    debug("Debugging Defender");
    debug($defender);
    $armies = array("attacker" => $attacker, "defender" => $defender);
    //Set starting vals
    $armies['attacker']['retreatpct'] = get_module_pref("retreatpct", "scrapbots", $attackerid);
    $armies['defender']['retreat'] = get_module_pref("retreatpct", "scrapbots", $defenderid);
    debug("Debugging Armies");
    debug($armies);
    return $armies;
}
function bioextension_dohook($hookname, $args)
{
    global $session;
    if ($hookname == "bioinfo") {
        $sql = "SELECT donation FROM " . db_prefix("accounts") . " WHERE acctid = '" . $args['acctid'] . "'";
        $result = db_query($sql);
        $row = db_fetch_assoc($result);
        if ($row['donation'] >= get_module_setting("threshhold")) {
            $bio = get_module_pref("user_extendedbio", "bioextension", $args['acctid']);
            $link = get_module_pref("user_extlink", "bioextension", $args['acctid']);
            $bio = str_replace(chr(13), "`n", $bio);
            $bio = stripslashes($bio);
            output("`0%s`n`n", $bio);
            if (substr($link, 0, 5) == "http:") {
                rawoutput("<a href=\"" . $link . "\">Player's webpage</a><br /><br />");
            }
        }
    } else {
        if ($hookname == "footer-prefs") {
            $bio = get_module_pref("user_extendedbio");
            $limit = get_module_setting("charlimit");
            if (strlen($bio) > $limit) {
                output("`c`4`bWARNING`b`0`c`nYour Extended Bio is oversized by %s characters.  If you navigate away from this page, your Extended Bio will have %s characters indiscriminately cut from the end.  Please edit and re-save your Extended Bio to avoid cuts.", strlen($bio) - $limit, strlen($bio) - $limit);
                $bio = substr($bio, 0, $limit);
                set_module_pref("user_extendedbio", $bio);
            }
        }
    }
    return $args;
}
function tents_dohook($hookname, $args)
{
    global $session;
    switch ($hookname) {
        case "worldnav":
            $ploc = get_module_pref("worldXYZ", "worldmapen");
            $sql = "SELECT owner,type,data FROM " . db_prefix("structures") . " WHERE location = {$ploc}";
            $result = db_query($sql);
            for ($i = 0; $i < db_num_rows($result); $i++) {
                //send structure through module hooks
            }
            // $chats = unserialize(get_module_setting("placedchats"));
            // $ploc = get_module_pref("worldXYZ","worldmapen");
            // $chatarea = 0;
            // if (!is_array($chats)) {
            // $chats = array();
            // }
            // foreach($chats AS $key => $vals){
            // if ($ploc == $vals['loc']['x'].",".$vals['loc']['y'].",1"){
            // output("`0There's a little tent here.`n");
            // addnav("Investigate Tent","runmodule.php?module=tents&xyz=".$ploc);
            // $chatarea = 1;
            // break;
            // }
            // }
            // if (!$chatarea){
            // }
            break;
    }
    return $args;
}
function lovers_install()
{
    module_addhook("newday");
    module_addhook("inn");
    $sql = "DESCRIBE " . db_prefix("accounts");
    $result = db_query($sql);
    while ($row = db_fetch_assoc($result)) {
        if ($row['Field'] == "seenlover") {
            $sql = "SELECT seenlover,acctid FROM " . db_prefix("accounts") . " WHERE seenlover>0";
            $result1 = db_query($sql);
            debug("Migrating seenlover.`n");
            while ($row1 = db_fetch_assoc($result1)) {
                $sql = "INSERT INTO " . db_prefix("module_userprefs") . " (modulename,setting,userid,value) VALUES ('lovers','seenlover',{$row1['acctid']},{$row1['seenlover']})";
                db_query($sql);
            }
            //end while
            debug("Dropping seenlover column from the user table.`n");
            $sql = "ALTER TABLE " . db_prefix("accounts") . " DROP seenlover";
            db_query($sql);
            //drop it from the user's session too.
            unset($session['user']['seenlover']);
        }
        //end if
    }
    //end while
    return true;
}
Example #15
0
 /**
  * Provides all members of this group.
  * 
  * @return UserGroupMember[]
  */
 public function getMembers()
 {
     // First get all userIDs that are members.
     $qAllMembers = db_query(sprintf("SELECT `userID`,`access` FROM `%s_group_members` WHERE `groupID`=%d", db_prefix(), $this->getGroupID()));
     $nAllMembers = db_num($qAllMembers);
     // Verify that we got any users.
     if ($qAllMembers === false || $nAllMembers < 1) {
         return array();
     }
     $members = array();
     $userIDs = array();
     $rowsIndexedByUID = array();
     // Fetch each as User
     while ($row = db_fetch_assoc($qAllMembers)) {
         $userIDs[] = $row["userID"];
         $rowsIndexedByUID[$row["userID"]] = $row;
     }
     // Fetch the users.
     $users = UserManager::getInstance()->getUsersByID($userIDs);
     if (count($users) < 1) {
         return array();
     }
     // Create as UserGroupMember
     foreach ($users as $user) {
         $memberRow = $rowsIndexedByUID[$user->getUserID()];
         $member = new UserGroupMember($user->getUserID());
         $member->fillInfo($user->getInfo());
         // fill extra variables
         $member->setAccess($memberRow["access"]);
         $member->setGroup($this);
         $members[] = $member;
         unset($memberRow, $user, $member);
     }
     return $members;
 }
 /**
  * Create Authentication object
  * This function is overwritable from the custom helpers/auth_helper.php
  *
  * @param  string $id PK value
  * @param  object $data    The user data object (optional). If it is not given, auth_create will load it from db
  *
  * @return object The authenticated user object or FALSE on failure
  */
 function auth_create($id, $data = null)
 {
     $lc_auth = auth_prerequisite();
     $auth = auth_get();
     if (!$auth) {
         $table = db_prefix() . str_replace(db_prefix(), '', $lc_auth['table']);
         $fieldId = $lc_auth['fields']['id'];
         $fieldRole = $lc_auth['fields']['role'];
         if (is_object($data)) {
             $session = $data;
         } else {
             $sql = 'SELECT * FROM ' . $table . ' WHERE ' . $fieldId . ' = :id LIMIT 1';
             if ($result = db_query($sql, array(':id' => $id))) {
                 $session = db_fetchObject($result);
             }
         }
         if (isset($session)) {
             $session->sessId = session_id();
             $session->timestamp = md5(time());
             $session->permissions = auth_permissions($session->{$fieldRole});
             $session->blocks = auth_blocks($session->{$fieldRole});
             auth_set($session);
             return $session;
         }
     } else {
         return $auth;
     }
     return false;
 }
function serverloadperpage_run()
{
    global $session;
    page_header("Server Load by Page Execution Times");
    //Show player number table
    $sql = "SELECT * FROM " . db_prefix("performancepage") . " ORDER BY totalpages DESC";
    $result = db_query($sql);
    output("`bAverage Page Generation Times by script request`b`n");
    rawoutput("<table border='0' cellpadding='2' cellspacing='1' align='center' width='100%'>");
    rawoutput("<tr class='trhead'><td>URL</td><td>Total Count</td><td>Total Time</td><td>Average Time / Page</td></tr>");
    for ($i = 0; $i < db_num_rows($result); $i++) {
        $row = db_fetch_assoc($result);
        if ($row['totalpages'] >= 1) {
            $avg = $row['totaltime'] / $row['totalpages'];
            $max = 100;
            $bwidth = round($avg * 100);
            $bnonwidth = $max - $bwidth;
            if ($bnonwidth > 0) {
                $bar = "<table style='border: solid 1px #000000' width='{$max}' height='7' bgcolor='#333333' cellpadding=0 cellspacing=0><tr><td width='{$bwidth}' bgcolor='#00ff00'></td><td width='{$bnonwidth}'></td></tr></table>";
            } else {
                $over = $bwidth - $max;
                $total = $max + $over;
                $bar = "<table style='border: solid 1px #000000' height='7' width='{$total}' cellpadding=0 cellspacing=0><tr><td width='{$max}' bgcolor='#990000'></td><td width='{$over}' bgcolor='#ff0000'></td></tr></table>";
            }
            rawoutput("<tr class='" . ($i % 2 ? "trdark" : "trlight") . "'>");
            rawoutput("<td>" . $row['page'] . "</td><td>" . number_format($row['totalpages']) . "</td><td>" . $row['totaltime'] . "</td><td>" . $bar . round($row['totaltime'] / $row['totalpages'], 4) . "</td></tr>");
        }
    }
    rawoutput("</table>");
    page_footer();
}
function translationconvert_run()
{
    global $session;
    page_header("Translations Convertor Thing");
    output("Outputting all known translations, so that you can do a find-and-replace in the files themselves and we can stop doing this silly translate thing.`n`n");
    if (httpget('delete')) {
        $del = httpget('delete');
        $sql = "UPDATE " . db_prefix("translations") . " SET version='updated' WHERE tid={$del}";
        db_query($sql);
    }
    $sql = "SELECT * FROM " . db_prefix("translations") . " WHERE version='dragonbones' ORDER BY uri";
    $result = db_query($sql);
    $total = 0;
    while ($row = db_fetch_assoc($result)) {
        if ($row['intext'] != $row['outtext']) {
            $total++;
            rawoutput("<a href=\"runmodule.php?module=translationconvert&delete=" . $row['tid'] . "\">MARK</a>");
            addnav("", "runmodule.php?module=translationconvert&delete=" . $row['tid']);
            output_notl("`n`0`b%s`b:", $row['uri']);
            rawoutput("<table width=100%><tr><td width=50% border=1px solid #cccccc>" . $row['intext'] . "</td><td width=50%>" . $row['outtext'] . "</td></tr></table>");
            output_notl("`n`n");
        }
    }
    debug($total);
    addnav("Back to the Grotto", "superuser.php");
    page_footer();
}
function checkban(string $login, bool $connect = false) : bool
{
    global $session;
    $accounts = db_prefix('accounts');
    $bans = db_prefix('accounts');
    $today = date('Y-m-d');
    $sql = db_query("SELECT lastip, uniquid, banoverride, superuser FROM {$accounts}\n        WHERE login = '******'");
    $row = db_fetch_assoc($sql);
    if ($row['banoverride'] || $row['superuser'] & ~SU_DOESNT_GIVE_GROTTO) {
        return false;
    }
    db_free_result($sql);
    $sql = db_query("SELECT * FROM {$bans}\n        WHERE (\n            (ipfilter = '{$row['lastip']}' OR ipfilter = '{$_SERVER['REMOTE_ADDR']}')\n            OR (uniqueid = '{$row['uniqueid']}' OR uniqueid = '{$_COOKIE['lgi']}')\n        )\n        AND (banexpire = '000-00-00' OR banexpire >= '{$today}')");
    if (db_num_rows($sql) > 0) {
        if ($connect) {
            $session = [];
            tlschema('ban');
            $session['message'] .= translate_inline('`n`4You fall under a ban currently in place on this website:');
            while ($row = db_fetch_assoc($sql)) {
                $session['message'] .= "`n{$row['banreason']}`n";
                if ($row['banexpire'] == '0000-00-00') {
                    $session['message'] .= translate_inline("`\$This ban is permanent!`0");
                } else {
                    $session['message'] .= sprintf_translate("`^This ban will be removed `\$after`^ %s.`0", date("M d, Y", strtotime($row['banexpire'])));
                }
                db_query("UPDATE {$bans}\n                    SET lasthit = '{$today} 00:00:00'\n                    WHERE ipfilter = '{$row['ipfilter']}'\n                    AND uniqueid = '{$row['uniqueid']}'\n                    ");
            }
            $session['message'] .= translate_inline("`n`4If you wish, you may appeal your ban with the petition link.");
            tlschema();
            header('Location: home.php');
        }
        return true;
    }
    return false;
}
function dwellings_run()
{
    checkday();
    page_header("Dwellings");
    global $session;
    $op = httpget("op");
    $dwid = httpget('dwid');
    $type = httpget('type');
    debug(get_module_pref("location_saver"));
    if ($type == "" && $dwid > 0) {
        $sql = "SELECT type FROM " . db_prefix("dwellings") . " WHERE dwid={$dwid}";
        $result = db_query($sql);
        $row = db_fetch_assoc($result);
        $type = $row['type'];
    }
    $cityid = httpget('cityid');
    require_once "modules/dwellings/run/case_{$op}.php";
    if ($op != "list" && $op != "") {
        addnav("Leave");
        addnav("Return to Hamlet", "runmodule.php?module=dwellings");
    } else {
        addnav("Navigation");
        villagenav();
    }
    page_footer();
}
function translationwizard_uninstall()
{
    output_notl("Performing Uninstall on Translation Wizard. Thank you for using!`n`n");
    if (db_table_exists(db_prefix("temp_translations"))) {
        db_query("DROP TABLE " . db_prefix("temp_translations"));
    }
    return true;
}
function implantservoarms_uninstall()
{
    // Reset the specialty of anyone who had this specialty so they get to
    // rechoose at new day
    $sql = "UPDATE " . db_prefix("accounts") . " SET specialty='' WHERE specialty='SR'";
    db_query($sql);
    return true;
}
function goldmine_install()
{
    module_addeventhook("forest", "return 100;");
    $sql = "DESCRIBE " . db_prefix("mounts");
    $result = db_query($sql);
    while ($row = db_fetch_assoc($result)) {
        if ($row['Field'] == "mine_canenter") {
            debug("Migrating mine_canenter for all mounts");
            $sql = "INSERT INTO " . db_prefix("module_objprefs") . " (modulename,objtype,setting,objid,value) SELECT 'goldmine','mounts','entermine',mountid,mine_canenter FROM " . db_prefix("mounts") . " WHERE mine_canenter>0";
            db_query($sql);
            debug("Dropping mine_canenter field from mounts table");
            $sql = "ALTER TABLE " . db_prefix("mounts") . " DROP mine_canenter";
            db_query($sql);
        }
        if ($row['Field'] == "mine_candie") {
            debug("Migrating mine_candie for all mounts");
            $sql = "INSERT INTO " . db_prefix("module_objprefs") . " (modulename,objtype,setting,objid,value) SELECT 'goldmine','mounts','dieinmine',mountid,mine_candie FROM " . db_prefix("mounts") . " WHERE mine_candie>0";
            db_query($sql);
            debug("Dropping mine_candie field from mounts table");
            $sql = "ALTER TABLE " . db_prefix("mounts") . " DROP mine_candie";
            db_query($sql);
        }
        if ($row['Field'] == "mine_cansave") {
            debug("Migrating mine_cansave for all mounts");
            $sql = "INSERT INTO " . db_prefix("module_objprefs") . " (modulename,objtype,setting,objid,value) SELECT 'goldmine','mounts','saveplayer',mountid,mine_cansave FROM " . db_prefix("mounts") . " WHERE mine_cansave>0";
            db_query($sql);
            debug("Dropping mine_cansave field from mounts table");
            $sql = "ALTER TABLE " . db_prefix("mounts") . " DROP mine_cansave";
            db_query($sql);
        }
        if ($row['Field'] == "mine_tethermsg") {
            debug("Migrating mine_tethermsg for all mounts");
            $sql = "INSERT INTO " . db_prefix("module_objprefs") . " (modulename,objtype,setting,objid,value) SELECT 'goldmine','mounts','tethermsg',mountid,mine_tethermsg FROM " . db_prefix("mounts") . " WHERE mine_tethermsg!=''";
            db_query($sql);
            debug("Dropping mine_tethermsg field from mounts table");
            $sql = "ALTER TABLE " . db_prefix("mounts") . " DROP mine_tethermsg";
            db_query($sql);
        }
        if ($row['Field'] == "mine_deathmsg") {
            debug("Migrating mine_deathmsg for all mounts");
            $sql = "INSERT INTO " . db_prefix("module_objprefs") . " (modulename,objtype,setting,objid,value) SELECT 'goldmine','mounts','deathmsg',mountid,mine_deathmsg FROM " . db_prefix("mounts") . " WHERE mine_deathmsg!=''";
            db_query($sql);
            debug("Dropping mine_deathmsg field from mounts table");
            $sql = "ALTER TABLE " . db_prefix("mounts") . " DROP mine_deathmsg";
            db_query($sql);
        }
        if ($row['Field'] == "mine_savemsg") {
            debug("Migrating mine_savemsg for all mounts");
            $sql = "INSERT INTO " . db_prefix("module_objprefs") . " (modulename,objtype,setting,objid,value) SELECT 'goldmine','mounts','savemsg',mountid,mine_savemsg FROM " . db_prefix("mounts") . " WHERE mine_savemsg!=''";
            db_query($sql);
            debug("Dropping mine_savemsg field from mounts table");
            $sql = "ALTER TABLE " . db_prefix("mounts") . " DROP mine_savemsg";
            db_query($sql);
        }
    }
    return true;
}
function titans_install()
{
    module_addhook("newday-runonce");
    module_addhook("worldnav");
    $titans = array('id' => array('name' => 'id', 'type' => 'int(11) unsigned', 'extra' => 'auto_increment'), 'creature' => array('name' => 'creature', 'type' => 'text'), 'battlelog' => array('name' => 'battlelog', 'type' => 'text'), 'key-PRIMARY' => array('name' => 'PRIMARY', 'type' => 'primary key', 'unique' => '1', 'columns' => 'id'));
    require_once "lib/tabledescriptor.php";
    synctable(db_prefix('titans'), $titans, true);
    return true;
}
function lottery_dohook($hookname, $args)
{
    global $session;
    switch ($hookname) {
        case "newday":
            $numbers = get_module_setting("todaysnumbers");
            $n = $numbers;
            output("`n`@Today's lottery numbers are `^%s-%s-%s-%s`0`n", $n[0], $n[1], $n[2], $n[3]);
            $roundnum = get_module_setting("roundnum");
            $pround = get_module_pref("roundnum");
            if ($roundnum > $pround) {
                if (get_module_pref("pick") === $numbers) {
                    $prize = get_module_setting("prize");
                    if ($prize > "" && $pround < $roundnum) {
                        rawoutput("<font size='+1'>");
                        output("`\$You won today's lottery!`0`n");
                        rawoutput("</font>");
                        output("`\$The jackpot is `^^%s`\$ gold, money that has been deposited in to your bank account!`n", $prize);
                        $session['user']['goldinbank'] += $prize;
                        debuglog("won {$prize} gold on lottery");
                        addnews("`@%s`@ won `^%s`@ gold in the lottery!`0", $session['user']['name'], $prize);
                    }
                }
                set_module_pref("pick", "");
            }
            break;
        case "newday-runonce":
            $numbers = array();
            for ($i = 0; $i < 4; $i++) {
                $numbers[$i] = e_rand(0, 9);
            }
            sort($numbers);
            set_module_setting("todaysnumbers", join("", $numbers));
            $sql = "SELECT count(*) AS c FROM " . db_prefix("module_userprefs") . " WHERE modulename='lottery' AND setting='pick' AND value='" . join("", $numbers) . "'";
            $result = db_query($sql);
            $row = db_fetch_assoc($result);
            if ($row['c'] > 0) {
                //split the jackpot among winners.
                $prize = round(get_module_setting("currentjackpot") / $row['c'], 0);
                set_module_setting("prize", $prize);
                set_module_setting("currentjackpot", get_module_setting("basepot"));
                set_module_setting("howmany", $row['c']);
            } else {
                //the jackpot rolls over.
                set_module_setting("prize", 0);
                set_module_setting("howmany", 0);
            }
            set_module_setting("roundnum", get_module_setting("roundnum") + 1);
            break;
        case "inn":
            addnav("Things to do");
            addnav(array("%s`0's Lottery", getsetting('barkeep', '`tCedrik')), "runmodule.php?module=lottery&op=store");
            break;
    }
    return $args;
}
function drinks_uninstall()
{
    debug("Dropping table drinks");
    $sql = "DROP TABLE IF EXISTS " . db_prefix("drinks");
    db_query($sql);
    debug("Dropping objprefs related to drinks");
    $sql = "DELETE FROM " . db_prefix("module_objprefs") . " WHERE objtype='drinks'";
    db_query($sql);
    return true;
}
function getmount($horse = 0)
{
    $sql = "SELECT * FROM " . db_prefix("mounts") . " WHERE mountid='{$horse}'";
    $result = db_query_cached($sql, "mountdata-{$horse}", 3600);
    if (db_num_rows($result) > 0) {
        return db_fetch_assoc($result);
    } else {
        return array();
    }
}
function dwellingseditor_run()
{
    global $session;
    tlschema("dwellingseditor");
    $op = httpget('op');
    if ($op != "lookup") {
        page_header("Dwellings Editor");
    }
    addnav("Navigation");
    addnav("Back to the Grotto", "superuser.php");
    if ($op != "") {
        addnav("Dwelling List", "runmodule.php?module=dwellingseditor");
    }
    addnav("Find Dwellings by User", "runmodule.php?module=dwellingseditor&op=usersearch");
    addnav("Operations");
    if ($op != "typsu") {
        addnav("Type Pref Editor", "runmodule.php?module=dwellingseditor&op=typesu");
    }
    modulehook("dwellingseditor-main");
    $typeid = httpget("typeid");
    $dwid = httpget('dwid');
    $type = httpget("type");
    if ($type == "" && $dwid > 0) {
        $sql = "SELECT type FROM " . db_prefix("dwellings") . " WHERE dwid={$dwid}";
        $result = db_query($sql);
        $row = db_fetch_assoc($result);
        $type = $row['type'];
    }
    if ($dwid > 0) {
        addnav("Operations");
        if ($op != "edit") {
            addnav("Edit Dwelling Details", "runmodule.php?module=dwellingseditor&op=edit&dwid={$dwid}");
        }
        if ($op != "keys") {
            addnav("Manage Keys", "runmodule.php?module=dwellingseditor&op=keys&dwid={$dwid}");
        }
        if ($session['user']['superuser'] & SU_EDIT_COMMENTS) {
            addnav("Moderate Commentary", "moderate.php?area=dwellings-{$dwid}&dwid={$dwid}");
        }
        if ($op != "delete") {
            addnav("Delete this Dwelling", "runmodule.php?module=dwellingseditor&op=delete&dwid={$dwid}");
        }
        modulehook("dwellingseditor", array("dwid" => $dwid));
        addnav("Navigation");
        if ($op != "coffers") {
            addnav("Coffer Log", "runmodule.php?module=dwellingseditor&op=coffers&dwid={$dwid}");
        }
        if ($op != "dwsu") {
            addnav("Dwelling  Viewer", "runmodule.php?module=dwellingseditor&op=dwsu&dwid={$dwid}");
        }
    }
    require_once "modules/dwellingseditor/case_{$op}.php";
    page_footer();
}
function iitems_eboy_gypsy_run()
{
    global $session;
    page_header("eBoy's Price Chart");
    require_once "modules/iitems/lib/lib.php";
    $cost = get_module_setting("cost", "iitems_eboy_gypsy");
    if ($cost == 1) {
        $p = "Cigarette";
    } else {
        $p = "Cigarettes";
    }
    if ($session['user']['gems'] >= $cost) {
        $session['user']['gems'] -= $cost;
        output("`5You hand over the %s and the old man chuckles.  \"`!Aaah, thank ye kindly.  Now, here we are!  I'd recommend you write these down.  Now mark my words - these prices fluctuate by the `iminute`i!  That eBoy, he's a crafty bastard, y'see.  He sells things for whatever people are willing to buy them for, and not one penny less!  Even if that means putting his prices up the `isecond`i someone buys something!`5\"`n`nHe reaches under his desk and brings up a clattering rectangular machine made out of wood and brass, about the size of a fat telephone directory.  A radio antenna protrudes from one corner.`n`nTrue to his word, the spinning reels show the prices of every commodity in every outpost.  You spend a few minutes studying the readout.`n`n", $p);
        $sql = "select * from " . db_prefix("cityprefs");
        $result = db_query($sql);
        for ($i = 0; $i < db_num_rows($result); $i++) {
            $row = db_fetch_assoc($result);
            $cid = $row['cityid'];
            $name = $row['cityname'];
            $eboy = unserialize(get_module_objpref("city", $cid, "eboytrades-intelligent", "iitems_eboy_intelligent"));
            output("`b`0%s`b`n", $name);
            rawoutput("<table border=0 cellpadding=3 cellspacing=2><tr class=\"trdark\"><td>Item</td><td>Buying at</td><td>Selling at</td><td>Stock</td></tr>");
            $classcount = 1;
            foreach ($eboy as $key => $details) {
                $itemdetails = iitems_get_item_details($key);
                if ($details['price'] < 10) {
                    $details['price'] = 10;
                }
                $eboy[$key]['price'] = $details['price'];
                if ($details['stock'] < 3) {
                    $buy = round($details['price'] * 0.5);
                } else {
                    $buy = round($details['price'] * 0.7);
                }
                $classcount++;
                $class = $classcount % 2 ? "trdark" : "trlight";
                $dname = $itemdetails['verbosename'];
                $dsell = number_format($details['price']);
                $dbuy = number_format($buy);
                $dstock = number_format($details['stock']);
                rawoutput("<tr class='{$class}'><td>{$dname}</td><td align=\"center\">{$dbuy}</td><td align=\"center\">{$dsell}</td><td align=\"center\">{$dstock}</td></tr>");
            }
            rawoutput("</table>");
            output("`n`n");
        }
    } else {
        output("`5You enthusiastically agree to the price, before realising that you don't actually have that many cigarettes.  Whoops.");
    }
    addnav("Leave");
    addnav("Return to the Outpost", "village.php");
    page_footer();
    return true;
}
function racegobot_uninstall()
{
    global $session;
    // Force anyone who was a Gobot to rechoose race
    $sql = "UPDATE  " . db_prefix("accounts") . " SET race='" . RACE_UNKNOWN . "' WHERE race='Gobot'";
    db_query($sql);
    if ($session['user']['race'] == 'Gobot') {
        $session['user']['race'] = RACE_UNKNOWN;
    }
    return true;
}