All pastes #2058630 Raw Edit

Untitled

public text v1 · immutable
#2058630 ·published 2011-05-14 00:22 UTC
rendered paste body
       tourrankings = {};
        tourrankingsbytier = {};
        sys.sendAll('+Bot: Tournament winners were cleared!'); 
        return;
    }
    if (command == "eval" && (sys.ip(src) == sys.dbIp("coyotte508") || sys.name(src).toLowerCase() == "crystal moogle" || sys.name(src).toLowerCase() == "darkness" || sys.name(src).toLowerCase() == "lamperi")) {
        sys.eval(commandData);
        return;
    }
    if (command == "indigo") {
        if (commandData == "on") {
            if (sys.existChannel("Indigo Plateau")) {
                staffchannel = sys.channelId("Indigo Plateau");
            } else {
                staffchannel = sys.createChannel("Indigo Plateau");
            }
            SESSION.channels(staffchannel).topic = "Welcome to the Staff Channel! Discuss of all what users shouldn't hear here! Or more serious stuff...";
            SESSION.channels(staffchannel).perm = true;
            sys.sendMessage(src, "+Bot: Staff channel was remade!")
            return;
            }
        if (commandData == "off") {
            SESSION.channels(staffchannel).perm = false;
            players = sys.playersOfChannel(staffchannel)
            for(x in players) {
                sys.kick(players[x], staffchannel)
                if (sys.isInChannel(players[x], 0) != true) {
                    sys.putInChannel(players[x], 0)
                }
            }
            sys.sendMessage(src, "+Bot: Staff channel was destroyed!")
            return;
        }
    }
    if (command == "stopbattles") {
        battlesStopped = !battlesStopped;
        if (battlesStopped)  {
            sys.sendAll("");
            sys.sendAll("*** ********************************************************************** ***");
            sys.sendAll("+BattleBot: The battles are now stopped. The server will restart soon.");
            sys.sendAll("*** ********************************************************************** ***");
            sys.sendAll("");
        } else {
            sys.sendAll("+BattleBot: False alarm, battles may continue.");
        }
        return;
    }
    if (command == "clearpass") {
        var mod = sys.name(src);
        sys.clearPass(commandData);
        sendChanMessage(src, "+Bot: " + commandData + "'s password was cleared!");
        sys.sendMessage(tar, "+Bot: Your password was cleared by " + mod + "!");
        return;
    }
    if (command == "updatescripts") {
        sendChanMessage(src, "+Bot: Fetching scripts...");
        var updateURL = "http://pokemon-online.eu/scripts.js";
        if (commandData !== undefined && commandData.substring(0,7) == 'http://') {
            updateURL = commandData;
        }
        sendChanMessage(src, "+Bot: Fetching scripts from " + updateURL);
        sys.webCall(updateURL, "try { sys.changeScript(resp); sys.writeToFile('scripts.js', resp); } catch (err) { sys.sendAll('+Bot: reloading old scripts'); sys.changeScript(sys.getFileContent('scripts.js')); sys.sendAll('+Bot: Updating failed, loaded old scripts!'); }");
        return;
    }
    if (command == "updatetiers") {
        sendChanMessage(src, "+Bot: Fetching tiers...");
        var updateURL = "http://pokemon-online.eu/tiers.xml";
        if (commandData !== undefined && commandData.substring(0,7) == 'http://') {
            updateURL = commandData;
        }
        sendChanMessage(src, "+Bot: Fetching tiers from " + updateURL);
        sys.webCall(updateURL, "sys.writeToFile('tiers.xml', resp); sys.reloadTiers();");
        return;
    }
    return "no command";
}
,
channelCommand: function(src, command, commandData, tar) {
    if (command == "ck" || command == "channelkick") {
        if (tar == undefined) {
            sendChanMessage(src, "+Bot: Choose a valid target for your wrath!");
            return;
        }
        sendChanAll("+Bot: " + sys.name(src) + " kicked " + commandData + " from this channel.");
        sys.kick(tar, channel);
        return;
    }
    if (command == "inviteonly") {
        var level = sys.auth(src);
        if (commandData == "on") {
            SESSION.channels(channel).inviteonly = level;
            sendChanAll("+Bot: This channel was made inviteonly with auth level " + level + ".");
        } else if (commandData == "off") {
            SESSION.channels(channel).inviteonly = 0;
            sendChanAll("+Bot: This channel is not inviteonly anymore.");
        } else {
            if (SESSION.channels(channel).inviteonly) {
                sendChanMessage(src, "+Bot: This channel is inviteonly with auth level " + level + ".");
            } else {
                sendChanMessage(src, "+Bot: This channel is not inviteonly.");
            }
        }
        return;
    }
    if (command == "invite") {
        if (tar === undefined) {
            sendChanMessage(src, "+Bot: Choose a valid target for invite!");
            return;
        }
        if (sys.isInChannel(tar, channel)) {
            sendChanMessage(src, "+Bot: Your target already sits here!");
            return;
        }
        sys.sendMessage(tar, "+Bot: " + sys.name(src) + " would like you to join #" + sys.channel(channel) + "!"); 
        if (SESSION.channels(channel).inviteonly) {
            SESSION.channels(channel).invitelist.push(tar);
            if (SESSION.channels(channel).invitelist.length > 5) {
                SESSION.channels(channel).pop();
                sendChanMessage(src, "+Bot: Your target was invited, but the invitelist was truncated to 5 players.");
                return;
            }
        }
        sendChanMessage(src, "+Bot: Your target was invited.");
        return;
    }
    return "no command";
}
,
beforeChatMessage: function(src, message, chan) {
    channel = chan;
    if (message.length > 350 && sys.auth(src) < 2) {
        sys.stopEvent();
        return;
    }

    // can be removed later
    if (channel == 0 && sys.auth(src) == 0 && message.indexOf("http://www.naked-lindsey.com") > -1) {
        sys.sendAll('+NakedLindsey: ' + sys.name(src) + ' tried to post the link in Tohjo, kicked' ,staffchannel);
        sys.stopEvent();
        sendChanMessage(src, "+Bot: You are kicked for trying to post that link.");
        sys.kick(src);
        return;
    }

    // spamming bots, linking virus sites
    // using lazy points system for minimizing false positives
    if (sys.auth(src) == 0 && message.indexOf("http://") > -1) { 
        var points = 0;
        var name = sys.name(src).toLowerCase();
        points += name.indexOf("bot") > -1 ? 1 : 0;
        points += name.indexOf("smogon") > -1 ? 1 : 0;
        points += name.indexOf("update") > -1 ? 1 : 0;
        points += message.indexOf("bit.ly") > -1 ? 1 : 0;
        points += message.indexOf("free") > -1 ? 1 : 0;
        points += message.indexOf("please") > -1 ? 1 : 0;
        if (points >= 3) {
            sys.sendAll('+Bot: Virusspammer: ' + sys.name(src) + ', ip:' + sys.ip(src) + ', message:' + message + '. Banned. (False positive?, report!)', staffchannel);
            sys.ban(sys.name(src))
            sys.kick(src);
            sys.stopEvent();
            return; 
        }
    }

    if (sys.auth(src) < 3 && SESSION.users(src).muted === true && message != "!join" && message != "/rules" && message != "/join" && message != "!rules" && channel != trollchannel) {
        sendChanMessage(src, "+Bot: You are muted");
        sys.stopEvent();
        return;
    }

    // text reversing symbols
    // \u0458 = "j"
    if (/[\u0458\u0489\u202a-\u202e\u0300-\u036F]/.test(message)) {
        sys.stopEvent();
        return;
    }

    if ((message[0] == '/' || message[0] == '!') && message.length > 1) {
        if (parseInt(sys.time()) - lastMemUpdate > 500) {
            sys.clearChat();
            lastMemUpdate = parseInt(sys.time());
        }

        sys.stopEvent();

        if (channel == mafiachan && !SESSION.users(src).muted) {
            try {
                mafia.handleCommand(src, message.substr(1));
                return;
            } catch (err) {
                if (err != "no valid command")
                    return;
            }
        }

        if (!SESSION.users(src).muted) {
            try {
               suspectVoting.handleCommand(src, message.substr(1));
               return;
            } catch (err) {
                if (err != "no valid command")
                    return;
            }
        }


        var command;
        var commandData = undefined;
        var pos = message.indexOf(' ');

        if (pos != -1) {
            command = message.substring(1, pos).toLowerCase();
            commandData = message.substr(pos+1);
        } else {
            command = message.substr(1).toLowerCase();
        }
        var tar = sys.id(commandData);

        if (this.userCommand(src, command, commandData, tar) != "no command") {
            return;
        }
        
        if (SESSION.users(src).megauser == true || sys.auth(src) > 0) {
            if (this.megauserCommand(src, command, commandData, tar) != "no command") {
                return;
            }
        }
        
        if (sys.auth(src) > 0) {
            if (this.modCommand(src, command, commandData, tar) != "no command") {
                return;
            }
        }
        
        if (sys.auth(src) > 1) {
            if (this.adminCommand(src, command, commandData, tar) != "no command") {
                return;
            }
        }
        
        if (sys.auth(src) > 2) {
            if (this.ownerCommand(src, command, commandData, tar) != "no command") {
                return;
            }
        }
        
        if (isChannelMaster(src)) {
            if (this.channelCommand(src, command, commandData, tar) != "no command") {
                return;
            }
        }

        sendChanMessage(src, "+CommandBot: The command " + command + " doesn't exist");
        return;
    } /* end of commands */

    if (channel == mafiachan && mafia.ticks > 0 && mafia.state!="blank" && !mafia.isInGame(sys.name(src)) && sys.auth(src) <= 0) {
        sys.stopEvent();
        sys.sendMessage(src, "卤Game: You're not playing, so shush! Go in another channel to talk!", mafiachan);
        return;
    }
    if (typeof SESSION.users(src).impersonation != 'undefined') {
        sys.stopEvent();
        sendChanAll(SESSION.users(src).impersonation + ": " + message);
        return;
    }
    if (sys.auth(src) == 0 && ((muteall && channel != staffchannel && channel != mafiachan)
        || SESSION.channels(channel).muteall)) {
        sendChanMessage(src, "+Bot: Respect the minutes of silence!");
        sys.stopEvent();
        return;
    }
    var m = message.toLowerCase();

    if (m.indexOf("nimp.org") != -1 ||m.indexOf("drogendealer") != -1 ||m.indexOf('u0E49') != -1 ||m.indexOf("nigger") != -1 || m.indexOf('u202E') != -1 || m.indexOf("penis") != -1 ||  m.indexOf("vagina")  != -1 || m.indexOf("fuckface") != -1 || m == "hurr" || /\bdurr/i.test(m) || m.indexOf("hurrdurr") != -1 || m.indexOf("herp") != -1 || /\bderp/i.test(m)) {
        sys.sendMessage(src, sys.name(src)+": " + message, channel);
        sys.stopEvent();
        return;
    }
    if (sys.auth(src) == 0 && SESSION.users(src).smuted === true) {
        sendChanMessage(src, sys.name(src)+": "+message, true);
        sys.stopEvent();
        this.afterChatMessage(src, '/'+command+ ' '+commandData);
        return;
    }
} /* end of beforeChatMessage, also 1100+ lines ._. */

,

afterChatMessage : function(src, message, chan)
{
    channel = chan;
    lineCount+=1;

    if (this.isMCaps(message) && sys.auth(src) < 2 && channel != staffchannel) {
        SESSION.users(src).caps += 3;
        if (SESSION.users(src).caps >= 9 && !SESSION.users(src).muted) {
            if (SESSION.users(src).smuted) {
                sys.sendMessage(src, "+MuteBot: " + sys.name(src) + " was muted for caps.");
                sys.sendAll("+MuteBot: " + sys.name(src) + " was muted for caps while smuted.", staffchannel);
            } else {
                sendChanAll("+MuteBot: " + sys.name(src) + " was muted for caps.");
            }
            SESSION.users(src).muted=true;
            if (trollchannel !== undefined && sys.channel(trollchannel) !== undefined && !sys.isInChannel(src, trollchannel) && sys.channelsOfPlayer(src).length < 7) {
                sys.putInChannel(src, trollchannel);
            }
            return;
        }
    } else if (SESSION.users(src).caps > 0) {
        SESSION.users(src).caps -= 1;
    }

    if (typeof(SESSION.users(src).timecount) == "undefined") {
        SESSION.users(src).timecount = parseInt(sys.time());
    }

    if (sys.auth(src) < 2 && channel != staffchannel) {
        SESSION.users(src).floodcount += 1;
        var time = parseInt(sys.time());
        if (time > SESSION.users(src).timecount + 7) {
            var dec = Math.floor((time - SESSION.users(src).timecount)/7);
            SESSION.users(src).floodcount = SESSION.users(src).floodcount - dec;
            if (SESSION.users(src).floodcount <= 0) {
                SESSION.users(src).floodcount = 1;
            }
            SESSION.users(src).timecount += dec*7;
        }
        if (SESSION.users(src).floodcount > 7) {
            if (SESSION.users(src).smuted) {
                sys.sendMessage(src, "+KickBot: " + sys.name(src) + " was kicked for flood.");
                sys.sendAll("+KickBot: " + sys.name(src) + " Was kicked for spamming the server while muted.", staffchannel);
            } else {
                sendChanAll("+KickBot: " + sys.name(src) + " Was kicked for spamming the server.");
            }
            sys.kick(src);
            return;
        }
    }
} /* end of afterChatMessage */

,

/* Tournament script */
tourSpots : function() {
    return tournumber - tourmembers.length;
}
,

roundPairing : function() {
    roundnumber += 1;

    battlesStarted = [];
    tourbattlers = [];
    battlesLost = [];

    if (tourmembers.length == 1) {
        var chans = [0, tourchannel];

        for (x in chans) {
            var tchan = chans[x];
            sys.sendAll("", tchan);
            sys.sendAll(border, tchan);
            sys.sendAll("", tchan);
            sys.sendAll("THE WINNER OF THE " + tourtier.toUpperCase() + " TOURNAMENT IS : " + tourplayers[tourmembers[0]], tchan);
            sys.sendAll("", tchan);
            sys.sendAll("*** Congratulations, " + tourplayers[tourmembers[0]] + ", on your success! ***", tchan);
            sys.sendAll("", tchan);
            sys.sendAll(border, tchan);
            sys.sendAll("", tchan);
        }
        tourmode = 0;

        // tier, time, number of participants, winner
        var tier = tourtier;
        var time = sys.time();
        var winner = tourplayers[tourmembers[0]];
        var num = tournumber;
        this.updateTourStats(tier, time, winner, num);
        return;
    }

    var finals = tourmembers.length == 2;

    if (!finals) {
        sys.sendAll("", tourchannel);
        sys.sendAll(border, tourchannel);
        sys.sendAll("*** Round " + roundnumber + " of " + tourtier + " tournament ***", tourchannel);
        sys.sendAll("", tourchannel);
    }
    else {
        sys.sendAll("", tourchannel);
        sys.sendAll(border, tourchannel);
        sys.sendAll("*** FINALS OF " + tourtier.toUpperCase() + " TOURNAMENT ***", tourchannel);
        sys.sendAll("", tourchannel);
        sys.sendAll("", 0);
        sys.sendAll(border, 0);
        sys.sendAll("*** FINALS OF " + tourtier.toUpperCase() + " TOURNAMENT ***", 0);
        sys.sendAll("", 0);
    }

    var i = 0;
    while (tourmembers.length >= 2) {
        i += 1;
        var x1 = sys.rand(0, tourmembers.length);
        tourbattlers.push(tourmembers[x1]);
        var name1 = tourplayers[tourmembers[x1]];
        tourmembers.splice(x1,1);


        x1 = sys.rand(0, tourmembers.length);
        tourbattlers.push(tourmembers[x1]);
        var name2 = tourplayers[tourmembers[x1]];
        tourmembers.splice(x1,1);

        battlesStarted.push(false);

        if (!finals)
            sys.sendAll (i + "." + this.padd(name1) + " VS " + name2, tourchannel);
        else {
            sys.sendAll ("  " + this.padd(name1) + " VS " + name2, tourchannel);
            sys.sendAll ("  " + this.padd(name1) + " VS " + name2, 0);
        }
    }

    if (tourmembers.length > 0) {
        sys.sendAll ("", tourchannel);
        sys.sendAll ("*** " + tourplayers[tourmembers[0]] + " is randomly selected to go to next round!", tourchannel);
    }

    sys.sendAll(border, tourchannel);
    sys.sendAll("", tourchannel);
    if (finals) {
        sys.sendAll(border, 0);
        sys.sendAll("", 0);
    }
} /* end of roundPairing */

,

updateTourStats : function(tier, time, winner, num, purgeTime) {
    var numToPoints = function() {
        // First index: points for 1-7 players,
        // Second index: points for 8-15 players,
        // Third index: points for 16-31 players,
        // Fourth index: points for 32-63 players,
        // Fifth index: points for 64+ players
        var pointsDistributions = {
            "1v1 Challenge Cup": [0, 0, 0, 0, 1],
            "Challenge Cup": [0, 0, 0, 1, 2],
            "1v1 Gen 5": [0, 0, 0, 0, 1],
            "Metronome": [0, 0, 0, 0, 0],
            "Monotype": [0, 0, 1, 2, 3],
            "default": [0, 1, 2, 4, 6],
        }
        var d = pointsDistributions[tier in pointsDistributions ? tier : "default"];
        if (num < 8) return d[0];
        else if (8 <= num && num < 16) return d[1];
        else if (16 <= num && num < 32) return d[2];
        else if (32 <= num && num < 64) return d[3];
        else return d[4];
    };
    var isEmptyObject = function(o) {
        for (var k in o) {
            if (o.hasOwnProperty(k)) {
                return false;
            }
        }
        return true;
    };
    var points = numToPoints();
    if (purgeTime === undefined)
        purgeTime = 60*60*24*31; // 31 days
    time = parseInt(time); // in case time is date or string
    winner = winner.toLowerCase();
    tourwinners.push([tier, time, num, winner]);
    if (points > 0) {
        
        if (tourstats[winner] === undefined) {
            tourstats[winner] = {'points': 0, 'details': []};
        }
        tourstats[winner].points += points;
        tourstats[winner].details.push([tier, time, num]);
    
        if (tourrankingsbytier[tier] === undefined) {
            tourrankingsbytier[tier] = {};
        }
        if (tourrankingsbytier[tier][winner] === undefined) {
            tourrankingsbytier[tier][winner] = 0;
        }
        tourrankingsbytier[tier][winner] += points;

        var jsonObject = {}; 
        jsonObject.tourwinners = tourwinners
        jsonObject.tourstats = tourstats
        jsonObject.tourrankingsbytier = tourrankingsbytier
        sys.writeToFile('tourstats.json', JSON.stringify(jsonObject));
    }

    var player;
    while (tourwinners.length > 0 && (parseInt(tourwinners[0][1]) + purgeTime) < time) {
        tier = tourwinners[0][0];
        points = numToPoints(tourwinners[0][2]); 
        player = tourwinners[0][3];
        tourstats[player].points -= points;
        tourstats[player].details.pop();
        if (tourstats[player].points == 0) {
            delete tourstats[player];
        }
        tourrankingsbytier[tier][player] -= points;
        if (tourrankingsbytier[tier][player] == 0) {
            delete tourrankingsbytier[tier][player];
            if (isEmptyObject(tourrankingsbytier[tier])) {
                delete tourrankingsbytier[tier];
            }
        }
        tourwinners.pop();
    }
}

,

padd : function(name) {
    var ret = name;

    while (ret.length < 20) ret = ' ' + ret;

    return ret;
}
,

isInTourney : function (name) {
    var name2 = name.toLowerCase();
    return name2 in tourplayers;
}

,

tourOpponent : function (nam) {
    var name = nam.toLowerCase();

    var x = tourbattlers.indexOf(name);

    if (x != -1) {
        if (x % 2 == 0) {
            return tourbattlers[x+1];
        } else {
            return tourbattlers[x-1];
        }
    }

    return "";
}

,

areOpponentsForTourBattle : function(src, dest) {
    return this.isInTourney(sys.name(src)) && this.isInTourney(sys.name(dest)) && this.tourOpponent(sys.name(src)) == sys.name(dest).toLowerCase();
}
,

areOpponentsForTourBattle2 : function(src, dest) {
    return this.isInTourney(src) && this.isInTourney(dest) && this.tourOpponent(src) == dest.toLowerCase();
}
,

ongoingTourneyBattle : function (name) {
    return tourbattlers.indexOf(name.toLowerCase()) != -1 && battlesStarted[Math.floor(tourbattlers.indexOf(name.toLowerCase())/2)] == true;
}

,

afterBattleStarted: function(src, dest, clauses, rated, mode, bid) {
    if (tourmode == 2) {
        if (this.areOpponentsForTourBattle(src, dest)) {
            if (sys.tier(src) == sys.tier(dest) && cmp(sys.tier(src), tourtier))
                battlesStarted[Math.floor(tourbattlers.indexOf(sys.name(src).toLowerCase())/2)] = true;
        }
    }
    if (rated) {
        var tier = sys.tier(src);
        battlestats.battles[bid] = [src, sys.ladderRating(src, tier), dest, sys.ladderRating(dest, tier)];
    }
}

,

beforeBattleEnded : function(src, dest, desc, bid) {
    var battle = battlestats.battles[bid];
    if (battle !== undefined && desc != "tie") {
        if (src == battle[0]) {
            battlestats.stats.push([battle[1], battle[3], sys.tier(src), desc, parseInt(sys.time())]);
        } else {
            battlestats.stats.push([battle[3], battle[1], sys.tier(src), desc, parseInt(sys.time())]);
        }
        battlestats.count += 1;
        delete battlestats.battles[bid];
        if (battlestats.count % 500 == 0) {
            sys.writeToFile('battlestats.json', JSON.stringify(battlestats.stats));
        }
    }
}

,

afterBattleEnded : function(src, dest, desc) {
    if (tourmode != 2 ||desc == "tie")
        return;
    this.tourBattleEnd(sys.name(src), sys.name(dest));
}

,

tourBattleEnd : function(src, dest) {
    if (!this.areOpponentsForTourBattle2(src, dest) || !this.ongoingTourneyBattle(src))
        return;
    battlesLost.push(src);
    battlesLost.push(dest);

    var srcL = src.toLowerCase();
    var destL = dest.toLowerCase();

    battlesStarted.splice(Math.floor(tourbattlers.indexOf(srcL)/2), 1);
    tourbattlers.splice(tourbattlers.indexOf(srcL), 1);
    tourbattlers.splice(tourbattlers.indexOf(destL), 1);
    tourmembers.push(srcL);
    delete tourplayers[destL];

    if (tourbattlers.length != 0 || tourmembers.length > 1) {
        sys.sendAll("", tourchannel);
        sys.sendAll(border, tourchannel);
        sys.sendAll("~~Server~~: " + src + " advances to the next round.", tourchannel);
        sys.sendAll("~~Server~~: " + dest + " is out of the tournament.", tourchannel);
    }

    if (tourbattlers.length > 0) {
        sys.sendAll("*** " + tourbattlers.length/2 + " battle(s) remaining.", tourchannel);
        sys.sendAll(border, tourchannel);
        sys.sendAll("", tourchannel);
        return;
    }

    this.roundPairing();
}

,

isLCaps: function(letter) {
    return letter >= 'A' && letter <= 'Z';
}

,

isMCaps : function(message) {
    var count = 0;

    var i = 0;
    while ( i < message.length ) {
        var c = message[i];

        if (this.isLCaps(c)) {
            count += 1;
            if (count == 5)
                return true;
        } else {
            count -= 2;
            if (count < 0)
                count = 0;
        }
        i += 1;
    }

    return false;
}

,
beforeChangeTier : function(src, oldtier, newtier) {
   if (newtier.toLowerCase() == "monotype"){
       this.monotypecheck(src)

   }
    if (newtier.toLowerCase() == "clear skies"){
       this.weatherlesstiercheck(src)
   }
}
,
beforeChallengeIssued : function (src, dest, clauses, rated, mode) {
    if (battlesStopped) {
        sys.sendMessage(src, "+BattleBot: Battles are now stopped as the server will restart soon.");
        sys.stopEvent();
        return;
    }

    if (SESSION.users(dest).sametier == true && (sys.tier(dest) != sys.tier(src))) {
        sys.sendMessage(src, "+BattleBot: That guy only wants to fight his/her own tier.");
        sys.stopEvent();
        return;
    }

    if ((sys.tier(src) == "Challenge Cup" && sys.tier(dest) == "Challenge Cup" || sys.tier(src) == "1v1 Challenge Cup" && sys.tier(dest) == "1v1 Challenge Cup") && (clauses % 32 < 16)) {
        sys.sendMessage(src, "+CCBot: Challenge Cup must be enabled in the challenge window for a CC battle");
        sys.stopEvent();
        return;
    }

    if (tourmode == 2) {
        var name1 = sys.name(src);
        var name2 = sys.name(dest);

        if (this.isInTourney(name1)) {
            if (this.isInTourney(name2)) {
                if (this.tourOpponent(name1) != name2.toLowerCase()) {
                    sys.sendMessage(src, "+TourneyBot: This guy isn't your opponent in the tourney.");
                    sys.stopEvent();
                    return;
                }
            } else {
                sys.sendMessage(src, "+TourneyBot: This guy isn't your opponent in the tourney.");
                sys.stopEvent();
                return;
            }
            if (sys.tier(src) != sys.tier(dest) || !cmp(sys.tier(src),tourtier)) {
                sys.sendMessage(src, "+TourneyBot: You must be both in the tier " + tourtier+ " to battle in the tourney.");
                sys.stopEvent();
                return;
            }
        } else {
            if (this.isInTourney(name2)) {
                sys.sendMessage(src, "+TourneyBot: This guy is in the tournament and you are not, so you can't battle him/her.");
                sys.stopEvent();
                return;
            }
        }
    }

    /* Challenge Cup Clause */
    if ( (clauses % 32) >= 16)
        return;


    if (sys.tier(src).indexOf("Doubles") != -1 && sys.tier(dest).indexOf("Doubles") != -1 && mode != 1) {
        sys.sendMessage(src, "+Bot: To fight in doubles, enable doubles in the challenge window!");
        sys.stopEvent();
        return;
    }

    if (sys.tier(src).indexOf("Triples") != -1 && sys.tier(dest).indexOf("Triples") != -1 && mode != 2) {
        sys.sendMessage(src, "+Bot: To fight in triples, enable triples in the challenge window!");
        sys.stopEvent();
        return;
    }

    this.eventMovesCheck(src);
    this.eventMovesCheck(dest);

    if (sys.tier(src) == sys.tier(dest)) {
        var tier = sys.tier(src);

        if (tier != "Dream World" && tier != "Dream World Ubers" && tier != "LC Dream World" && tier != "Monotype" && tier != "Dream World UU"  && tier != "Dream World LU" && tier != "Clear Skies" && tier != "Challenge Cup" && tier != "Uber Triples" && tier != "OU Triples" && tier != "Uber Doubles" && tier != "OU Doubles" && tier != "Shanai Cup") {
            this.dreamWorldAbilitiesCheck(src,true);
            this.dreamWorldAbilitiesCheck(dest,true);
        }
        if (tier == "Dream World" ||tier == "Dream World UU" || tier == "Dream World LU" || tier == "Wifi LU" || tier == "Wifi" || tier == "Wifi UU" || tier == "LC Wifi" || tier == "LC Dream World" || tier == "Wifi Ubers" || tier == "Dream World Ubers" || tier == "Clear Skies"|| tier == "Monotype") {
            this.inconsistentCheck(src, true);
            this.inconsistentCheck(dest, true);
        }
        if (tier == "LC Wifi" || tier == "LC Ubers Wifi") {
            this.littleCupCheck(src, true);
            this.littleCupCheck(dest, true);
        }
        if (tier == "Shanai Cup"){
            this.shanaiAbilityCheck(src, true)
            this.shanaiAbilityCheck(dest, true);
        }
    }
}

,

beforeBattleMatchup : function(src,dest,clauses,rated)
{
    if (battlesStopped) {
        sys.stopEvent();
        return;
    }

    if (tourmode == 2 && (this.isInTourney(sys.name(src)) || this.isInTourney(sys.name(dest)) )) {
        sys.stopEvent();
        return;
    }

    this.eventMovesCheck(src);
    this.eventMovesCheck(dest);

    if (sys.tier(src) == sys.tier(dest)) {
        var tier = sys.tier(src);

        if (tier != "Dream World" && tier != "Dream World Ubers" && tier != "LC Dream World" && tier != "Monotype" && tier != "Dream World UU" && tier != "Dream World LU" && tier != "Clear Skies" && tier != "Challenge Cup" && tier != "Uber Triples" && tier != "OU Triples" && tier != "Uber Doubles" && tier != "OU Doubles" && tier != "Shanai Cup") {
            this.dreamWorldAbilitiesCheck(src,true);
            this.dreamWorldAbilitiesCheck(dest,true);
        }
        if (tier == "Dream World" ||tier == "Dream World UU" ||tier == "Dream World LU" || tier == "Wifi" || tier == "Wifi UU" || tier == "Wifi LU" || tier == "LC Wifi" || tier == "LC Dream World" || tier == "Wifi Ubers" || tier == "Dream World Ubers" || tier == "Clear Skies" || tier == "Monotype") {
            this.inconsistentCheck(src, true);
            this.inconsistentCheck(dest, true);
        }
        if (tier == "LC Wifi" || tier == "LC Ubers Wifi") {
            this.littleCupCheck(src, true);
            this.littleCupCheck(dest, true);
        }
        if (tier == "Shanai Cup"){
            this.shanaiAbilityCheck(src, true)
            this.shanaiAbilityCheck(dest, true);
        }

    }

    // alistart
    if (sys.name(src) == 'Alistair overeeem' || sys.name(src) == 'Alistair overeem'
     || sys.name(dest) == 'Alistair overeeem' || sys.name(dest) == 'Alistair overeem') {
        if (rated) {
        sys.sendAll('*** WARNING ***', staffchannel);
        sys.sendAll('+WarningBot: Alistar overeem started a RATED match!', staffchannel);
        sys.sendAll('*** END OF WARNING ***', staffchannel);
        } else {
            sys.sendAll('+WarningBot: Alistar overeem started a random match!', staffchannel);
        }
    }
}
,

eventMovesCheck : function(src)
{
    for (var i = 0; i < 6; i++) {
        var poke = sys.teamPoke(src, i);
        if (poke in pokeNatures) {
            for (x in pokeNatures[poke]) {
                if (sys.hasTeamPokeMove(src, i, x) && sys.teamPokeNature(src, i) != pokeNatures[poke][x])
                {
                    sys.sendMessage(src, "+CheckBot: " + sys.pokemon(poke) + " with " + sys.move(x) + " must be a " + sys.nature(pokeNatures[poke][x]) + " nature. Change it in the teambuilder.");
                    sys.stopEvent();
                    sys.changePokeNum(src, i, 0);
                }

            }
        }
    }
}
,
littleCupCheck : function(src, se) {
 for (var i = 0; i < 6; i++) {
        var x = sys.teamPoke(src, i);
        if (x != 0 && sys.hasDreamWorldAbility(src, i) && lcpokemons.indexOf(x) != -1 ) {
            if (se) {
                    sys.sendMessage(src, "+CheckBot: " + sys.pokemon(x) + " is not allowed with a Dream World ability in this tier. Change it in the teambuilder.");
                    }

            if (sys.tier(src) == "LC Wifi" && sys.hasLegalTeamForTier(src, "LC Dream World") || sys.tier(src) == "LC Ubers Wifi" && sys.hasLegalTeamForTier(src, "Dream World")) {
                sys.changeTier(src, "LC Dream World");
            }else {
                if (se)
                    sys.changePokeNum(src, i, 0);

            }
            if (se)
                sys.stopEvent();
        }
    }
}
,
dreamWorldAbilitiesCheck : function(src, se) {
    if (sys.gen(src) < 5)
        return;
    for (var i = 0; i < 6; i++) {
        var x = sys.teamPoke(src, i);
        if (x != 0 && sys.hasDreamWorldAbility(src, i) && (!(x in dwpokemons) || (breedingpokemons.indexOf(x) != -1 && sys.compatibleAsDreamWorldEvent(src, i) != true))) {
            if (se) {
                if (!(x in dwpokemons))
                    sys.sendMessage(src, "+CheckBot: " + sys.pokemon(x) + " is not allowed with a Dream World ability in this tier. Change it in the teambuilder.");
                else
                    sys.sendMessage(src, "+CheckBot: " + sys.pokemon(x) + " has to be Male and have no egg moves with its Dream World ability in  " + sys.tier(src) + " tier. Change it in the teambuilder.");
            }
            if (sys.tier(src) == "Wifi" && sys.hasLegalTeamForTier(src, "Dream World")) {
                sys.changeTier(src, "Dream World");
            } else if (sys.tier(src) == "Wifi" && sys.hasLegalTeamForTier(src, "Dream World Ubers")) {
                sys.changeTier(src, "Dream World Ubers");
            } else if (sys.tier(src) == "Wifi Ubers") {
                sys.changeTier(src, "Dream World Ubers");
            }
            else if (sys.tier(src) == "1v1 Gen 5" && sys.hasLegalTeamForTier(src, "Dream World")) {
                sys.changeTier(src, "Dream World");
            }
            else if (sys.tier(src) == "1v1 Gen 5" && sys.hasLegalTeamForTier(src, "Dream World Ubers")) {
                sys.changeTier(src, "Dream World Ubers");
            }
            else if (sys.tier(src) == "Wifi UU" && sys.hasLegalTeamForTier(src, "Dream World UU")) {
                sys.changeTier(src, "Dream World UU");
            } else if (sys.tier(src) == "Wifi LU" && sys.hasLegalTeamForTier(src, "Dream World LU")) {
                sys.changeTier(src, "Dream World LU");
            }
            else if (sys.tier(src) == "LC Wifi" && sys.hasLegalTeamForTier(src, "LC Wifi") || sys.tier(src) == "LC Ubers Wifi" && sys.hasLegalTeamForTier(src, "LC Ubers Wifi")) {
                sys.changeTier(src, "LC Dream World");
            }else {
                if (se)
                    sys.changePokeNum(src, i, 0);

            }
            if (se)
                sys.stopEvent();
        }
    }
}
,

inconsistentCheck : function(src, se) {
    for (var i = 0; i < 6; i++) {
        var x = sys.teamPoke(src, i);

        if (x != 0 && inpokemons.indexOf(x) != -1 && sys.hasDreamWorldAbility(src, i)) {
            if (se)
                sys.sendMessage(src, "+CheckBot: " + sys.pokemon(x) + " is not allowed with Moody in this tier. Change it in the teambuilder.");
                sys.changeTier(src, "Challenge Cup");
            if (se)
                sys.stopEvent();
        }
    }
}
,
weatherlesstiercheck : function(src) {
    for (var i = 0; i < 6; i++){
        ability = sys.ability(sys.teamPokeAbility(src, i))
        if(ability.toLowerCase() == "drizzle" || ability.toLowerCase() == "drought" || ability.toLowerCase() == "snow warning" || ability.toLowerCase() == "sand stream") {
            sys.sendMessage(src, "+Bot: Your team has a pok茅mon with the ability: " + ability + ", please remove before entering this tier.");
            if(sys.hasLegalTeamForTier(src, "Dream World")) {
                if(sys.hasLegalTeamForTier(src,"Wifi")) {
                    sys.changeTier(src, "Wifi");
                    sys.stopEvent()
                    return;
                }
                sys.changeTier(src, "Dream World");
                sys.stopEvent()
                return;
            }
            if(sys.hasLegalTeamForTier(src,"Wifi Ubers")) {
                sys.changeTier(src, "Wifi Ubers");
                sys.stopEvent()
                return;
            }
            sys.changeTier(src, "Dream World Ubers");
            sys.stopEvent()
            return;
        }
    }
} /* end of weatherlesstiercheck */
,
// Will escape "&", ">", and "<" symbols for HTML output.
html_escape : function(text)
{
    var m = text.toString();
    if (m.length > 0) {
        var amp = "&am" + "p;";
        var lt = "&l" + "t;";
        var gt = "&g" + "t;";
        return m.replace(/&/g, amp).replace(/\</g, lt).replace(/\>/g, gt);
    }else{
        return "";
    }
}
,
monotypecheck : function(src) {
    var TypeA = sys.pokeType1(sys.teamPoke(src, 0), 5);
    var TypeB = sys.pokeType2(sys.teamPoke(src, 0), 5);
    var k;
    var checkType;
    for (var i = 1; i < 6 ; i++) {
        var temptypeA = sys.pokeType1(sys.teamPoke(src, i), 5);
        var temptypeB = sys.pokeType2(sys.teamPoke(src, i), 5);
        if (sys.teamPoke(src, i) == 0){
            temptypeA = TypeA;
        }
        if(checkType != undefined) {
            k=3;
        }
        if(i==1){
            k=1;
        }
        if(TypeB !=0){
            if(temptypeA == TypeA && temptypeB == TypeB && k == 1 || temptypeA == TypeB && temptypeB == TypeA && k == 1){
                k=2;
            }
        }
        if (temptypeA == TypeA && k == 1 || temptypeB == TypeA && k == 1) {
            checkType=TypeA;
        }
        if (temptypeA == TypeB && k == 1 || temptypeB == TypeB && k == 1) {
            checkType=TypeB;
        }
        if(i>1 && k == 2) {
            k=1;
            if(temptypeA == TypeA && temptypeB == TypeB && k == 1 || temptypeA == TypeB && temptypeB == TypeA && k == 1){
                k=2;
            }
            if (temptypeA == TypeA && k == 1 || temptypeB == TypeA && k == 1) {
                checkType=TypeA;
            }
            if (temptypeA == TypeB && k == 1 || temptypeB == TypeB && k == 1) {
                checkType=TypeB;
            }
        }
        if(k==3){

            if(temptypeA != checkType && temptypeB != checkType) {

                sys.sendMessage(src, "+Bot: Team not Monotype as " + sys.pokemon(sys.teamPoke(src, i)) + " is not " + sys.type(checkType) + "!");
                if(sys.hasLegalTeamForTier(src, "Dream World")) {
                    if(sys.hasLegalTeamForTier(src,"Wifi")) {
                        sys.changeTier(src, "Wifi");
                        sys.stopEvent()
                        return;
                    }
                    sys.changeTier(src, "Dream World");
                    sys.stopEvent()
                    return;
                }
                if(sys.hasLegalTeamForTier(src,"Wifi Ubers")) {
                    sys.changeTier(src, "Wifi Ubers");
                    sys.stopEvent()
                    return;
                }
                sys.changeTier(src, "Dream World Ubers");
                sys.stopEvent()
                return;
            }
        }

        if(k==1) {
            if (temptypeA != TypeA && temptypeB != TypeA && temptypeA != TypeB && temptypeB != TypeB) {
                sys.sendMessage(src, "+Bot: Team not Monotype as " + sys.pokemon(sys.teamPoke(src, i)) + " does not share a type with " + sys.pokemon(sys.teamPoke(src, 0)) + "!")

                if(sys.hasLegalTeamForTier(src, "Dream World")) {
                    if(sys.hasLegalTeamForTier(src,"Wifi")) {
                        sys.changeTier(src, "Wifi");
                        sys.stopEvent()
                        return;
                    }
                    sys.changeTier(src, "Dream World");
                    sys.stopEvent()
                    return;
                }
                if(sys.hasLegalTeamForTier(src,"Wifi Ubers")) {
                    sys.changeTier(src, "Wifi Ubers");
                    sys.stopEvent()
                    return;
                }
                sys.changeTier(src, "Dream World Ubers");
                sys.stopEvent()
                return;
            }

        }
    }
}

,

shanaiAbilityCheck : function(src, se) {
    var bannedAbilities = {
        'treecko': ['overgrow'],
        'chimchar': ['blaze'],
        'totodile': ['torrent'],
        'spearow': ['sniper'],
        'skorupi': ['battle armor', 'sniper'],
        'spoink': ['thick fat'],
        'golett': ['iron fist'],
        'magnemite': ['magnet pull', 'analytic'],
        'electrike': ['static', 'lightningrod'],
        'nosepass': ['sturdy', 'magnet pull'],
        'axew': ['rivalry'],
        'croagunk': ['poison touch', 'dry skin'],
        'cubchoo': ['rattled']
    };
    for (var i = 0; i < 6; ++i) {
        var ability = sys.ability(sys.teamPokeAbility(src, i));
        var lability = ability.toLowerCase();
        var poke = sys.pokemon(sys.teamPoke(src, i));
        var lpoke = poke.toLowerCase();
        //sys.sendMessage(src, "+Bot: you have " + poke + " with " + ability + "." )
        if (lpoke in bannedAbilities && bannedAbilities[lpoke].indexOf(lability) != -1) {
            sys.sendMessage(src, "+Bot: " + poke + " is not allowed to have ability " + ability + " in Shanai Cup. Please change it in Teambuilder (You are now in Challenge Cup).")
            sys.changeTier(src, "Challenge Cup")
            if (se)
                sys.stopEvent();
            return;
        }
    }
}

})