<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://bf2tech.uturista.pt/index.php?action=history&amp;feed=atom&amp;title=Scripts%3ABF2Admin</id>
	<title>Scripts:BF2Admin - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://bf2tech.uturista.pt/index.php?action=history&amp;feed=atom&amp;title=Scripts%3ABF2Admin"/>
	<link rel="alternate" type="text/html" href="https://bf2tech.uturista.pt/index.php?title=Scripts:BF2Admin&amp;action=history"/>
	<updated>2026-08-06T00:33:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://bf2tech.uturista.pt/index.php?title=Scripts:BF2Admin&amp;diff=110&amp;oldid=prev</id>
		<title>Pireax: Created page with &quot;{{wip}}  This script so far, should read a file for a list of administrators listed by their profileID. This administrator can then use chat commands to kick and ban players....&quot;</title>
		<link rel="alternate" type="text/html" href="https://bf2tech.uturista.pt/index.php?title=Scripts:BF2Admin&amp;diff=110&amp;oldid=prev"/>
		<updated>2018-06-22T15:27:51Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{wip}}  This script so far, should read a file for a list of administrators listed by their profileID. This administrator can then use chat commands to kick and ban players....&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{wip}}&lt;br /&gt;
&lt;br /&gt;
This script so far, should read a file for a list of administrators listed by their profileID. This administrator can then use chat commands to kick and ban players.&lt;br /&gt;
&lt;br /&gt;
Last Update: 16:01, 10 Jul 2005 (CST)&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Documentation  ==&lt;br /&gt;
&lt;br /&gt;
Can be found in the [[Scripts:BF2Admin:Docs|BF2Admin Docs Page]]&lt;br /&gt;
&lt;br /&gt;
== Changes  ==&lt;br /&gt;
&lt;br /&gt;
* Added sa_add_admin &amp;lt;player&amp;gt; &amp;lt;permissions&amp;gt; which will write new admins to the users.cfg,&lt;br /&gt;
* Added pub_id &amp;lt;player&amp;gt; which print the profileID of a player to the requesters console,&lt;br /&gt;
* Corrected the playername matching function to ignore case, e.g. &amp;quot;sa_kick dan bad guy&amp;quot; will kick a player with the name like FSR|Danni&lt;br /&gt;
* Added sa_rcon &amp;lt;rconcmd&amp;gt; &amp;lt;args&amp;gt; to allow rcon commands to be executed, the results are not reported back.&lt;br /&gt;
* Made the permissions work&lt;br /&gt;
* Added configuration system&lt;br /&gt;
* Added squad/ping kicker&lt;br /&gt;
* Added immunity perm&lt;br /&gt;
&lt;br /&gt;
== To Do  ==&lt;br /&gt;
&lt;br /&gt;
* Reserved Slot for administrators,&lt;br /&gt;
* Rewrite the autobalancer to prioritze team switches,&lt;br /&gt;
* Administrator immunity from TKPunish&lt;br /&gt;
* Documentation (yeah right =P)&lt;br /&gt;
&lt;br /&gt;
== Requests?  ==&lt;br /&gt;
&lt;br /&gt;
* Using key hash instead of player name as auth method. --Wizzler 19:50, 7 Jul 2005 (MDT)&lt;br /&gt;
&amp;#039;&amp;#039;Actually, this method is nicer, as it ties the user back to their GameSpy ID and not to a certain install of BF2.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Bugs?  ==&lt;br /&gt;
&lt;br /&gt;
* ...&lt;br /&gt;
* ...&lt;br /&gt;
* ... &lt;br /&gt;
&lt;br /&gt;
== Files  ==&lt;br /&gt;
&lt;br /&gt;
File: bf2admin.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Ingame Administration System (BF2Admin)&lt;br /&gt;
#&lt;br /&gt;
# Author: Danni (webmaster@animelab.com)&lt;br /&gt;
# Clan: Fallen Soldiers Reborn&lt;br /&gt;
#&lt;br /&gt;
# http://www.fsrgaming.com&lt;br /&gt;
# http://www.animelab.com&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# 100% Copyleft. Use at will but...&lt;br /&gt;
# If you reuse or modify this code you must credit me and&lt;br /&gt;
# the clan FSR. OR ELSE! &amp;gt;:D&lt;br /&gt;
#&lt;br /&gt;
# WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!&lt;br /&gt;
#&lt;br /&gt;
# THIS MODULE IS NOT YET APPROVED FOR USE ON RANKED SERVERS!&lt;br /&gt;
# WE ARE NOT RESPONSIBLE FOR YOUR SERVER BEING DELISTED!&lt;br /&gt;
# PLEASE CHECK WITH EA FIRST BEFORE USING THIS MODULE ON A RANKED SERVER!&lt;br /&gt;
#&lt;br /&gt;
# WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#       Special thanks        why?&lt;br /&gt;
#     _________________________________________________________________&lt;br /&gt;
#&lt;br /&gt;
#    Greeze            Inspiration from SayKick.py&lt;br /&gt;
#    DICE            tk_punish.py and other BF2 python sources&lt;br /&gt;
#    (unknown)        gui_log.pyw a VERY helpfull tool!&lt;br /&gt;
#    Everyone at BF2TIW    http://bf2.fun-o-matic.org/index.php/Main_Page&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import re&lt;br /&gt;
import bf2&lt;br /&gt;
import bf2.PlayerManager&lt;br /&gt;
import bf2.Timer&lt;br /&gt;
import host&lt;br /&gt;
from bf2 import g_debug&lt;br /&gt;
import bf2admincmd&lt;br /&gt;
import bf2adminkickers&lt;br /&gt;
&lt;br /&gt;
# Dictionaries. Duh!&lt;br /&gt;
pdict = { }&lt;br /&gt;
rcmd = { }&lt;br /&gt;
pcmd = { }&lt;br /&gt;
pinfo = { }&lt;br /&gt;
rinfo = { }&lt;br /&gt;
config = { }&lt;br /&gt;
log = None&lt;br /&gt;
&lt;br /&gt;
# Logging Levels&lt;br /&gt;
L_NONE         = 0&lt;br /&gt;
L_INFO         = 1&lt;br /&gt;
L_WARNING     = 2&lt;br /&gt;
L_ERROR     = 3&lt;br /&gt;
L_DEBUG        = 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class AdminData:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.admin = 0&lt;br /&gt;
        self.perms = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class PlayerData:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.lastupdate = 0&lt;br /&gt;
        self.lastupdate = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### PlayerObject Extensions.&lt;br /&gt;
&lt;br /&gt;
def getPlayerPerms(self):&lt;br /&gt;
    return self.adminData.perms&lt;br /&gt;
&lt;br /&gt;
def isAdmin(self):&lt;br /&gt;
    return self.adminData.admin&lt;br /&gt;
&lt;br /&gt;
def sendMessage(self, message):&lt;br /&gt;
    host.sgl_sendTextMessage(self.index, 12, 1, message, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bf2.PlayerManager.Player.isAdmin = isAdmin&lt;br /&gt;
bf2.PlayerManager.Player.getPerms = getPlayerPerms&lt;br /&gt;
bf2.PlayerManager.Player.sendMessage = sendMessage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def addChatCommand(command, function, perm, usage):&lt;br /&gt;
    rcmd[command] = function&lt;br /&gt;
    rinfo[command] = (perm, usage)&lt;br /&gt;
&lt;br /&gt;
def addPublicChatCommand(command, function, usage):&lt;br /&gt;
    pcmd[command] = function&lt;br /&gt;
    pinfo[command] = usage&lt;br /&gt;
&lt;br /&gt;
def setConfig(var, val):&lt;br /&gt;
    config[var] = val&lt;br /&gt;
&lt;br /&gt;
def getConfig(var):&lt;br /&gt;
    if config.has_key(var):&lt;br /&gt;
        return config[var]&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def out(level, string):&lt;br /&gt;
    global log&lt;br /&gt;
    LOGLEVEL = (&amp;#039;[NONE]&amp;#039;, &amp;#039;[INFO]&amp;#039;, &amp;#039;[WARN]&amp;#039;, &amp;#039;[ERROR]&amp;#039;, &amp;#039;[DEBUG]&amp;#039;)&lt;br /&gt;
    if not config.has_key(&amp;#039;logging&amp;#039;):&lt;br /&gt;
        config[&amp;#039;logging&amp;#039;] = 2&lt;br /&gt;
    if not config.has_key(&amp;#039;loglevel&amp;#039;):&lt;br /&gt;
        config[&amp;#039;loglevel&amp;#039;] = 3&lt;br /&gt;
&lt;br /&gt;
    string = LOGLEVEL[level] + &amp;#039; &amp;#039; + string&lt;br /&gt;
    if level &amp;lt;= config[&amp;#039;loglevel&amp;#039;]:&lt;br /&gt;
        if config[&amp;#039;logging&amp;#039;] &amp;gt;= 1:&lt;br /&gt;
            print string&lt;br /&gt;
        if config[&amp;#039;logging&amp;#039;] &amp;gt;= 2:&lt;br /&gt;
            sendAdminMessage(string)&lt;br /&gt;
        if config[&amp;#039;logging&amp;#039;] &amp;gt;= 3:&lt;br /&gt;
            log.write(string + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def loadConfig():&lt;br /&gt;
    fn = &amp;#039;admin/bf2admin.cfg&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        cfg = open(fn, &amp;#039;r&amp;#039;)&lt;br /&gt;
        lineNo = 0&lt;br /&gt;
&lt;br /&gt;
        p = re.compile(&amp;#039;(.*?):\s(.*?)&amp;#039;, re.IGNORECASE)&lt;br /&gt;
&lt;br /&gt;
        for line in cfg:&lt;br /&gt;
            lineNo += 1&lt;br /&gt;
            if line.strip() != &amp;#039;&amp;#039; and line.strip() != &amp;#039;\n&amp;#039;:&lt;br /&gt;
                m = p.match(line)&lt;br /&gt;
                if m:&lt;br /&gt;
                    config[m.group(1)] = m.group(2)&lt;br /&gt;
&lt;br /&gt;
    except IOError, detail:&lt;br /&gt;
        out (L_WARNING, &amp;#039;couldn\&amp;#039;t read &amp;quot;%s&amp;quot;: %s&amp;#039; % (fn, detail))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
def saveConfig():&lt;br /&gt;
    fn = &amp;#039;admin/bf2admin.cfg&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        cfg = open(fn, &amp;#039;w&amp;#039;)&lt;br /&gt;
        lineNo = 0&lt;br /&gt;
&lt;br /&gt;
        keys = config.keys()&lt;br /&gt;
        keys.sort()&lt;br /&gt;
        for key in keys:&lt;br /&gt;
            cfg.write(str(key) + &amp;#039;: &amp;#039; + str(config[key]) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    except IOError, detail:&lt;br /&gt;
        out(L_WARNING, &amp;#039;couldn\&amp;#039;t write &amp;quot;%s&amp;quot;: %s&amp;#039; % (fn, detail))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sendAdminMessage(message):&lt;br /&gt;
    for tp in bf2.playerManager.getPlayers():&lt;br /&gt;
        if tp.adminData.admin:&lt;br /&gt;
            host.sgl_sendTextMessage(playerId, 12, 1, message, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def findPlayerFromString(playpart):&lt;br /&gt;
    for tp in bf2.playerManager.getPlayers():&lt;br /&gt;
        name = tp.getName()&lt;br /&gt;
        playpart = playpart.lower()&lt;br /&gt;
        name = name.lower()&lt;br /&gt;
        if name.find(playpart) != -1:&lt;br /&gt;
            return tp&lt;br /&gt;
    return&lt;br /&gt;
&lt;br /&gt;
def findPlayerNameFromString(playpart):&lt;br /&gt;
    for tp in bf2.playerManager.getPlayers():&lt;br /&gt;
        name = tp.getName()&lt;br /&gt;
        playpart = playpart.lower()&lt;br /&gt;
        name = name.lower()&lt;br /&gt;
        if name.find(playpart) != -1:&lt;br /&gt;
            return tp.getName()&lt;br /&gt;
    return&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
    global log&lt;br /&gt;
    out(L_INFO, &amp;#039;initializing BF2Admin script&amp;#039;)&lt;br /&gt;
    loadConfig()&lt;br /&gt;
    parseUsers()&lt;br /&gt;
    host.registerHandler(&amp;#039;PlayerConnect&amp;#039;, onPlayerConnect, 1)&lt;br /&gt;
    host.registerHandler(&amp;#039;PlayerDisconnect&amp;#039;, onPlayerDisconnect, 1)&lt;br /&gt;
    host.registerHandler(&amp;#039;ChatMessage&amp;#039;, onChatMessage, 1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    fn = &amp;#039;admin/logs/bf2admin.log&amp;#039;&lt;br /&gt;
    try:&lt;br /&gt;
        log = open(fn, &amp;#039;a&amp;#039;)&lt;br /&gt;
   &lt;br /&gt;
    except IOError, detail:&lt;br /&gt;
        out(L_WARNING, &amp;#039;couldn\&amp;#039;t open &amp;quot;%s&amp;quot;: %s&amp;#039; % (fn, detail))&lt;br /&gt;
&lt;br /&gt;
    bf2admincmd.init()&lt;br /&gt;
    bf2adminkickers.init()&lt;br /&gt;
&lt;br /&gt;
def stripmessage(text):&lt;br /&gt;
    text = text.replace(&amp;quot;HUD_TEXT_CHAT_TEAM&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    text = text.replace(&amp;quot;HUD_TEXT_CHAT_SQUAD&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    text = text.replace(&amp;quot;HUD_CHAT_DEADPREFIX&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    return text&lt;br /&gt;
&lt;br /&gt;
def onChatMessage(playerid, text, channel, flags):&lt;br /&gt;
    player = bf2.playerManager.getPlayerByIndex(playerid)&lt;br /&gt;
    text = stripmessage(text)&lt;br /&gt;
    cmdList = text.split(&amp;#039; &amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    if len(cmdList) &amp;gt; 1 and playerid != -1:&lt;br /&gt;
        cmd = cmdList[0]&lt;br /&gt;
        cmdList[0:1] = []&lt;br /&gt;
        args = string.join(cmdList,&amp;#039; &amp;#039;)&lt;br /&gt;
        try:&lt;br /&gt;
            if player.adminData.admin and rinfo[cmd]:&lt;br /&gt;
                if player.adminData.perms.find(rinfo[cmd][0]) == -1:&lt;br /&gt;
                    player.sendMessage(player.index, &amp;#039;BF2Admin:  You have no access to that command&amp;#039;)&lt;br /&gt;
                else:&lt;br /&gt;
                    rcmd[cmd](player, args)&lt;br /&gt;
        except Exception, detail:&lt;br /&gt;
            out(L_DEBUG, &amp;#039;Run-time error:&amp;#039; + detail)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            if pcmd[cmd] and pinfo[cmd]:&lt;br /&gt;
                pcmd[cmd](player, args)&lt;br /&gt;
        except Exception, detail:&lt;br /&gt;
            out(L_DEBUG, &amp;#039;Run-time error:&amp;#039; + detail)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def onPlayerConnect(player):&lt;br /&gt;
    player.adminData = AdminData()&lt;br /&gt;
    if pdict[str(player.getProfileId())]:&lt;br /&gt;
        player.adminData.admin = 1&lt;br /&gt;
        player.adminData.perms = str(pdict[str(player.getProfileId())])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# This is just in case a playerslot is reused and not initalized correctly.&lt;br /&gt;
# and yes I have seen it happen in other games =P&lt;br /&gt;
&lt;br /&gt;
def onPlayerDisconnect(player):&lt;br /&gt;
    player.adminData = AdminData()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parses the config file, if it&amp;#039;s there&lt;br /&gt;
def parseUsers():&lt;br /&gt;
    def boolFromString (str):&lt;br /&gt;
        if str in [&amp;#039;True&amp;#039;, &amp;#039;true&amp;#039;, &amp;#039;1&amp;#039;]:&lt;br /&gt;
            return True&lt;br /&gt;
        elif value in [&amp;#039;False&amp;#039;, &amp;#039;false&amp;#039;, &amp;#039;0&amp;#039;]:&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            raise ValueError&lt;br /&gt;
&lt;br /&gt;
    fn = &amp;#039;admin/users.cfg&amp;#039;&lt;br /&gt;
    try:&lt;br /&gt;
&lt;br /&gt;
    # users.cfg format&lt;br /&gt;
    # Note: playername is purly so the maintainer can tell who a line is for&lt;br /&gt;
    #&lt;br /&gt;
    #&lt;br /&gt;
    # profileID    &amp;quot;playername&amp;quot;    &amp;quot;permissions&amp;quot;    &amp;quot;reserved&amp;quot;    &amp;quot;reserved&amp;quot; // Comment&lt;br /&gt;
    #&lt;br /&gt;
&lt;br /&gt;
        cfg = open(fn, &amp;#039;r&amp;#039;)&lt;br /&gt;
        lineNo = 0&lt;br /&gt;
&lt;br /&gt;
        # and now for some of that RegEx magic. ^_^&lt;br /&gt;
&lt;br /&gt;
        #            profileid    name     perms      resv     resv&lt;br /&gt;
        p = re.compile(&amp;#039;\s*?([0-9]*?)\s\&amp;quot;(.*?)\&amp;quot;\s&amp;quot;(.*?)\&amp;quot;\s&amp;quot;(.*?)\&amp;quot;\s&amp;quot;(.*?)\&amp;quot;&amp;#039;, re.IGNORECASE)&lt;br /&gt;
&lt;br /&gt;
        for line in cfg:&lt;br /&gt;
            lineNo += 1&lt;br /&gt;
            if line.strip() != &amp;#039;&amp;#039; and line.strip() != &amp;#039;\n&amp;#039;:&lt;br /&gt;
                m = p.match(line)&lt;br /&gt;
                if m:&lt;br /&gt;
                    pdict[m.group(1)] = m.group(3)&lt;br /&gt;
                   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    except IOError, detail:&lt;br /&gt;
        out(L_WARNING, &amp;#039;couldn\&amp;#039;t read &amp;quot;%s&amp;quot;: %s&amp;#039; % (fn, detail))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File: bf2admincmd.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Ingame Administration System (BF2Admin)&lt;br /&gt;
#&lt;br /&gt;
# Author: Danni (webmaster@animelab.com)&lt;br /&gt;
# Clan: Fallen Soldiers Reborn&lt;br /&gt;
#&lt;br /&gt;
# http://www.fsrgaming.com&lt;br /&gt;
# http://www.animelab.com&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# 100% Copyleft. Use at will but...&lt;br /&gt;
# If you reuse or modify this code you must credit me and&lt;br /&gt;
# the clan FSR. OR ELSE! &amp;gt;:D&lt;br /&gt;
#&lt;br /&gt;
# WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!&lt;br /&gt;
#&lt;br /&gt;
# THIS MODULE IS NOT YET APPROVED FOR USE ON RANKED SERVERS!&lt;br /&gt;
# WE ARE NOT RESPONSIBLE FOR YOUR SERVER BEING DELISTED!&lt;br /&gt;
# PLEASE CHECK WITH EA FIRST BEFORE USING THIS MODULE ON A RANKED SERVER!&lt;br /&gt;
#&lt;br /&gt;
# WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#       Special thanks        why?&lt;br /&gt;
#     _________________________________________________________________&lt;br /&gt;
#&lt;br /&gt;
#    Greeze            Inspiration from SayKick.py&lt;br /&gt;
#    DICE            tk_punish.py and other BF2 python sources&lt;br /&gt;
#    (unknown)        gui_log.pyw a VERY helpfull tool!&lt;br /&gt;
#    Everyone at BF2TIW    http://bf2.fun-o-matic.org/index.php/Main_Page&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import re&lt;br /&gt;
import bf2&lt;br /&gt;
import host&lt;br /&gt;
import bf2.PlayerManager&lt;br /&gt;
import bf2admin&lt;br /&gt;
from bf2 import g_debug&lt;br /&gt;
# Logging Levels&lt;br /&gt;
L_NONE         = 0&lt;br /&gt;
L_INFO         = 1&lt;br /&gt;
L_WARNING     = 2&lt;br /&gt;
L_ERROR     = 3&lt;br /&gt;
L_DEBUG        = 4&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
    bf2admin.out(L_INFO, &amp;#039;initializing BF2AdminCmd script&amp;#039;)&lt;br /&gt;
    bf2admin.addChatCommand(&amp;#039;sa_kick&amp;#039;,    sa_kick,    &amp;#039;k&amp;#039;,    &amp;#039;sa_kick &amp;lt;player&amp;gt; &amp;lt;reason&amp;gt;   -   Kick a player&amp;#039;)&lt;br /&gt;
    bf2admin.addChatCommand(&amp;#039;sa_ban&amp;#039;,    sa_ban,        &amp;#039;b&amp;#039;,    &amp;#039;sa_ban &amp;lt;player&amp;gt; &amp;lt;length&amp;gt; &amp;lt;reason&amp;gt;   -   Ban a player&amp;#039;)&lt;br /&gt;
    bf2admin.addChatCommand(&amp;#039;sa_bankey&amp;#039;,    sa_bankey,    &amp;#039;b&amp;#039;,    &amp;#039;sa_bankey &amp;lt;player&amp;gt; &amp;lt;length&amp;gt; &amp;lt;reason&amp;gt;   -   Ban a player by CD-Key&amp;#039;)&lt;br /&gt;
    bf2admin.addChatCommand(&amp;#039;sa_rcon&amp;#039;,    sa_rcon,    &amp;#039;r&amp;#039;,    &amp;#039;sa_rcon &amp;lt;command&amp;gt; &amp;lt;args&amp;gt; ...   -   Send and rcon command&amp;#039;)&lt;br /&gt;
    bf2admin.addChatCommand(&amp;#039;sa_add_admin&amp;#039;,    sa_add_admin,    &amp;#039;f&amp;#039;,    &amp;#039;sa_add_admin &amp;lt;player&amp;gt; &amp;lt;permissions&amp;gt; ...   -   Add an administrator&amp;#039;)&lt;br /&gt;
    bf2admin.addChatCommand(&amp;#039;sa_save&amp;#039;,    sa_save,    &amp;#039;f&amp;#039;,    &amp;#039;sa_save &amp;lt;config&amp;gt;   -   Save the configuration&amp;#039;)&lt;br /&gt;
    bf2admin.addChatCommand(&amp;#039;sa_set&amp;#039;,    sa_set,        &amp;#039;f&amp;#039;,    &amp;#039;sa_set &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;  -   Change a configuration option&amp;#039;)&lt;br /&gt;
    bf2admin.addChatCommand(&amp;#039;sa_get&amp;#039;,    sa_get,        &amp;#039;f&amp;#039;,    &amp;#039;sa_get &amp;lt;key&amp;gt;  -   Print a configuration option&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    bf2admin.addPublicChatCommand(&amp;#039;pub_id&amp;#039;,     pub_id,     &amp;#039;pub_id &amp;lt;player&amp;gt;   -   Retreave a players ProfileId&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sa_kick(issuer, args):&lt;br /&gt;
    argv = args.split(&amp;#039; &amp;#039;)&lt;br /&gt;
    playername = bf2admin.findPlayerNameFromString(argv[0])&lt;br /&gt;
    player = bf2admin.findPlayerFromString(argv[0])&lt;br /&gt;
    argv[0:1] = []&lt;br /&gt;
    reason = string.join(argv, &amp;#039; &amp;#039;)&lt;br /&gt;
    if playername:&lt;br /&gt;
        if player.getPerms().find(&amp;#039;i&amp;#039;) != -1:&lt;br /&gt;
            issuer.sendMessage(&amp;#039;BF2Admin: &amp;#039; + playername + &amp;#039; is immune from that command&amp;#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            host.rcon_invoke(&amp;#039;game.sayAll &amp;quot;BF2Admin: &amp;#039; + playername + &amp;#039; was kicked: &amp;#039; + reason + &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
            host.rcon_invoke(&amp;#039;admin.kickPlayer &amp;quot;&amp;#039; + playername + &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sa_ban(issuer, args):&lt;br /&gt;
    argv = args.split(&amp;#039; &amp;#039;)&lt;br /&gt;
    if not argv[2]:&lt;br /&gt;
        issuer.sendMessage(&amp;quot;usage: sa_ban &amp;lt;player&amp;gt; &amp;lt;length&amp;gt; &amp;lt;reason&amp;gt;&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    playername = bf2admin.findPlayerFromString(argv[0])&lt;br /&gt;
    player = bf2admin.findPlayerFromString(argv[0])&lt;br /&gt;
    length = int(argv[1])&lt;br /&gt;
    argv[0:2] = []&lt;br /&gt;
    reason = string.join(argv, &amp;#039; &amp;#039;)&lt;br /&gt;
    if playername:&lt;br /&gt;
        if player.getPerms().find(&amp;#039;i&amp;#039;) != -1:&lt;br /&gt;
            issuer.sendMessage(&amp;#039;BF2Admin: &amp;#039; + playername + &amp;#039; is immune from that command&amp;#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            host.rcon_invoke(&amp;#039;game.sayAll &amp;quot;BF2Admin: &amp;#039; + playername + &amp;#039; was banned: &amp;#039; + reason + &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
            host.rcon_invoke(&amp;#039;admin.banPlayer &amp;#039; + player.index + &amp;#039; &amp;#039; + length)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sa_bankey(issuer, args):&lt;br /&gt;
    argv = args.split(&amp;#039; &amp;#039;)&lt;br /&gt;
    if not argv[2]:&lt;br /&gt;
        issuer.sendMessage(&amp;quot;usage: sa_bankey &amp;lt;player&amp;gt; &amp;lt;length&amp;gt; &amp;lt;reason&amp;gt;&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    playername = bf2admin.findPlayerFromString(argv[0])&lt;br /&gt;
    player = bf2admin.findPlayerFromString(argv[0])&lt;br /&gt;
    length = int(argv[1])&lt;br /&gt;
    argv[0:2] = []&lt;br /&gt;
    reason = string.join(argv, &amp;#039; &amp;#039;)&lt;br /&gt;
    if playername:&lt;br /&gt;
        if player.getPerms().find(&amp;#039;i&amp;#039;) != -1:&lt;br /&gt;
            issuer.sendMessage(&amp;#039;BF2Admin: &amp;#039; + playername + &amp;#039; is immune from that command&amp;#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            host.rcon_invoke(&amp;#039;game.sayAll &amp;quot;BF2Admin: &amp;#039; + playername + &amp;#039;\&amp;#039;s CD-KEY was banned: &amp;#039; + reason + &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
            host.rcon_invoke(&amp;#039;admin.banPlayerKey &amp;#039; + player.index + &amp;#039; &amp;#039; + length)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sa_save(issuer, args):&lt;br /&gt;
    bf2admin.saveConfig()&lt;br /&gt;
    issuer.sendMessage(&amp;#039;BF2Admin: Configuration Saved&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
def sa_set(issuer, args):&lt;br /&gt;
    argv = args.split(&amp;#039; &amp;#039;)&lt;br /&gt;
    bf2admin.setConfig(argv[0], argv[1])&lt;br /&gt;
&lt;br /&gt;
def sa_get(issuer, args):&lt;br /&gt;
    issuer.sendMessage(&amp;#039;BF2Admin: &amp;#039; + str(args) + &amp;#039;: &amp;#039; + str(bf2admin.getConfig(args)))&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
def sa_add_admin(issuer, args):&lt;br /&gt;
    # sa_add_admin playerName permissions&lt;br /&gt;
    argv = args.split(&amp;#039; &amp;#039;)&lt;br /&gt;
    playername = bf2admin.findPlayerNameFromString(argv[0])&lt;br /&gt;
    player = bf2admin.findPlayerFromString(argv[0])&lt;br /&gt;
    profileId = player.getProfileId()&lt;br /&gt;
    if player.getPerms():&lt;br /&gt;
        issuer.sendMessage(&amp;#039;BF2Admin: &amp;#039; + playername + &amp;#039; is already an administrator. Please edit the users.cfg file manualy to change permissions&amp;#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        file = open(&amp;#039;admin/users.cfg&amp;#039;, &amp;#039;a&amp;#039;)&lt;br /&gt;
        file.write(&amp;#039;    &amp;#039; + str(profileId) + &amp;#039;    &amp;quot;&amp;#039; + playername + &amp;#039;&amp;quot;    &amp;quot;&amp;#039; + argv[1] +&amp;#039;&amp;quot;    &amp;quot;&amp;quot;    &amp;quot;&amp;quot;\n&amp;#039;)&lt;br /&gt;
        file.close()&lt;br /&gt;
        issuer.sendMessage(&amp;#039;BF2Admin: &amp;#039; + playername + &amp;#039; added as an administrator.&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sa_rcon(issuer, args):&lt;br /&gt;
    argv = args.split(&amp;#039; &amp;#039;)&lt;br /&gt;
    argv[0:1] = []&lt;br /&gt;
    reason = string.join(argv, &amp;#039; &amp;#039;)&lt;br /&gt;
    res = host.rcon_invoke(args)&lt;br /&gt;
    issuer.sendMessage(&amp;#039;BF2Admin: rcon command issued&amp;#039;)   &lt;br /&gt;
    for line in res.split(&amp;#039;\n&amp;#039;):&lt;br /&gt;
        issuer.sendMessage(line)   &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def pub_id(issuer, args):&lt;br /&gt;
    argv = args.split(&amp;#039; &amp;#039;)&lt;br /&gt;
    tp = bf2admin.findPlayerFromString(argv[0])   &lt;br /&gt;
    if tp:&lt;br /&gt;
        issuer.sendMessage(&amp;#039;BF2Admin: Name: &amp;#039; + str(tp.getName()) + &amp;#039;        ProfileId: &amp;#039; + str(tp.getProfileId()))&lt;br /&gt;
    else:&lt;br /&gt;
        issuer.sendMessage(&amp;#039;BF2Admin: Error: Could not find a player with that name&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def pub_help(issuer, args):&lt;br /&gt;
    argv = args.split(&amp;#039; &amp;#039;)&lt;br /&gt;
    tp = bf2admin.findPlayerFromString(argv[0])   &lt;br /&gt;
    if tp:&lt;br /&gt;
        issuer.sendMessage(&amp;#039;BF2Admin: Name: &amp;#039; + str(tp.getName()) + &amp;#039;        ProfileId: &amp;#039; + str(tp.getProfileId()))&lt;br /&gt;
    else:&lt;br /&gt;
        issuer.sendMessage(&amp;#039;BF2Admin: Error: Could not find a player with that name&amp;#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File: bf2adminkickers.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Ingame Administration System (BF2Admin)&lt;br /&gt;
#&lt;br /&gt;
# Author: Danni (webmaster@animelab.com)&lt;br /&gt;
# Clan: Fallen Soldiers Reborn&lt;br /&gt;
#&lt;br /&gt;
# http://www.fsrgaming.com&lt;br /&gt;
# http://www.animelab.com&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# 100% Copyleft. Use at will but...&lt;br /&gt;
# If you reuse or modify this code you must credit me and&lt;br /&gt;
# the clan FSR. OR ELSE! &amp;gt;:D&lt;br /&gt;
#&lt;br /&gt;
# WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!&lt;br /&gt;
#&lt;br /&gt;
# THIS MODULE IS NOT YET APPROVED FOR USE ON RANKED SERVERS!&lt;br /&gt;
# WE ARE NOT RESPONSIBLE FOR YOUR SERVER BEING DELISTED!&lt;br /&gt;
# PLEASE CHECK WITH EA FIRST BEFORE USING THIS MODULE ON A RANKED SERVER!&lt;br /&gt;
#&lt;br /&gt;
# WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#       Special thanks        why?&lt;br /&gt;
#     _________________________________________________________________&lt;br /&gt;
#&lt;br /&gt;
#    Greeze            Inspiration from SayKick.py&lt;br /&gt;
#    DICE            tk_punish.py and other BF2 python sources&lt;br /&gt;
#    (unknown)        gui_log.pyw a VERY helpfull tool!&lt;br /&gt;
#    Everyone at BF2TIW    http://bf2.fun-o-matic.org/index.php/Main_Page&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import re&lt;br /&gt;
import bf2&lt;br /&gt;
import bf2.PlayerManager&lt;br /&gt;
import bf2.Timer&lt;br /&gt;
import host&lt;br /&gt;
from bf2 import g_debug&lt;br /&gt;
import bf2admin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gamestatus = None&lt;br /&gt;
ten_secs = None&lt;br /&gt;
sixty_secs = None&lt;br /&gt;
&lt;br /&gt;
bf2.PlayerManager.Player.pingWarnings = 0&lt;br /&gt;
bf2.PlayerManager.Player.squadWarnings = 0&lt;br /&gt;
bf2.PlayerManager.Player.detectedPing = []&lt;br /&gt;
bf2.PlayerManager.Player.pingSamples = 0&lt;br /&gt;
bf2.PlayerManager.Player.actuallyPlaying = False&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    def resetPlayer(p):&lt;br /&gt;
        p.pingWarnings = 0&lt;br /&gt;
        p.squadWarnings = 0&lt;br /&gt;
        p.detectedPing = []&lt;br /&gt;
        p.pingSamples = 0&lt;br /&gt;
        p.actuallyPlaying = False&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def init():&lt;br /&gt;
        # defaults&lt;br /&gt;
        if not bf2admin.getConfig(&amp;#039;pk_enabled&amp;#039;):&lt;br /&gt;
            bf2admin.setConfig(&amp;#039;pk_enabled&amp;#039;, 1)&lt;br /&gt;
        if not bf2admin.getConfig(&amp;#039;sk_enabled&amp;#039;):&lt;br /&gt;
            bf2admin.setConfig(&amp;#039;sk_enabled&amp;#039;, 1)&lt;br /&gt;
   &lt;br /&gt;
        if not bf2admin.getConfig(&amp;#039;pk_samples&amp;#039;):&lt;br /&gt;
            bf2admin.setConfig(&amp;#039;pk_samples&amp;#039;, 12) # two minuites of samples&lt;br /&gt;
        if not bf2admin.getConfig(&amp;#039;pk_warnings&amp;#039;):&lt;br /&gt;
            bf2admin.setConfig(&amp;#039;pk_warnings&amp;#039;, 3)&lt;br /&gt;
        if not bf2admin.getConfig(&amp;#039;pk_maxping&amp;#039;):&lt;br /&gt;
            bf2admin.setConfig(&amp;#039;pk_maxping&amp;#039;, 1)&lt;br /&gt;
        if not bf2admin.getConfig(&amp;#039;sk_warnings&amp;#039;):&lt;br /&gt;
            bf2admin.setConfig(&amp;#039;sk_warnings&amp;#039;, 3)&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
        host.registerHandler(&amp;#039;PlayerConnect&amp;#039;, onPlayerConnect)&lt;br /&gt;
        host.registerHandler(&amp;#039;PlayerDisconnect&amp;#039;, onPlayerDisconnect)&lt;br /&gt;
        host.registerHandler(&amp;#039;PlayerSpawn&amp;#039;, onPlayerSpawn)&lt;br /&gt;
        host.registerHandler(&amp;#039;PlayerDeath&amp;#039;, onPlayerSpawn)&lt;br /&gt;
        host.registerGameStatusHandler(onGameStatusChanged)&lt;br /&gt;
        enableTimers()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def enableTimers():&lt;br /&gt;
        global ten_secs&lt;br /&gt;
        global sixty_secs&lt;br /&gt;
&lt;br /&gt;
        if not ten_secs:&lt;br /&gt;
            ten_secs = bf2.Timer(ten_seconds, 10, 1)&lt;br /&gt;
        ten_secs.setRecurring(10)&lt;br /&gt;
        if not sixty_secs:&lt;br /&gt;
            sixty_secs = bf2.Timer(sixty_seconds, 60, 1)&lt;br /&gt;
        sixty_secs.setRecurring(60)&lt;br /&gt;
           &lt;br /&gt;
    def ten_seconds(data):&lt;br /&gt;
        # ping kick&lt;br /&gt;
        enableTimers()&lt;br /&gt;
   &lt;br /&gt;
           &lt;br /&gt;
           &lt;br /&gt;
   &lt;br /&gt;
    def sixty_seconds(data):&lt;br /&gt;
        enableTimers()&lt;br /&gt;
        for tp in bf2.playerManager.getPlayers():&lt;br /&gt;
            if bf2admin.getConfig(&amp;#039;pk_enabled&amp;#039;) and tp.actuallyPlaying:&lt;br /&gt;
                if tp.getPing() &amp;gt; bf2admin.getConfig(&amp;#039;pk_maxping&amp;#039;):&lt;br /&gt;
                    if tp.pingWarnings &amp;lt; bf2admin.getConfig(&amp;#039;pk_warnings&amp;#039;):&lt;br /&gt;
                        tp.pingWarnings += 1&lt;br /&gt;
                        tp.sendMessage(&amp;#039;BF2Admin: WARNING &amp;#039; + str(tp.pingWarnings) + &amp;#039;/&amp;#039; + str(bf2admin.getConfig(&amp;#039;pk_warnings&amp;#039;)) +&amp;#039;! YOUR PING IS TOO HIGH! YOU WILL BE REMOVED IF IT DOES NOT FALL BELOW &amp;#039; + str(bf2admin.getConfig(&amp;#039;pk_maxping&amp;#039;)) + &amp;#039;!&amp;#039;)&lt;br /&gt;
                    else:&lt;br /&gt;
                        host.rcon_invoke(&amp;#039;game.sayAll &amp;quot;BF2Admin: &amp;#039; + tp.getName() + &amp;#039; was kicked due to high ping!&amp;#039;)&lt;br /&gt;
                        host.rcon_invoke(&amp;#039;admin.kickPlayer &amp;quot;&amp;#039; + tp.getName() + &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
                else:&lt;br /&gt;
                    tp.pingWarnings = 0&lt;br /&gt;
   &lt;br /&gt;
            if bf2admin.getConfig(&amp;#039;sk_enabled&amp;#039;) and tp.actuallyPlaying:       &lt;br /&gt;
                if not tp.isCommander() and tp.getSquadId() == 0:&lt;br /&gt;
                    if tp.squadWarnings &amp;lt; bf2admin.getConfig(&amp;#039;sk_warnings&amp;#039;):&lt;br /&gt;
                        tp.squadWarnings += 1&lt;br /&gt;
                        tp.sendMessage(&amp;#039;BF2Admin: WARNING &amp;#039; + str(tp.squadWarnings) + &amp;#039;/&amp;#039; + str(bf2admin.getConfig(&amp;#039;sk_warnings&amp;#039;)) +&amp;#039;! JOIN OR CREATE A SQUAD OR YOU WILL BE KICKED!&amp;#039;)&lt;br /&gt;
                    else:&lt;br /&gt;
                        host.rcon_invoke(&amp;#039;game.sayAll &amp;quot;BF2Admin: &amp;#039; + tp.getName() + &amp;#039; was kicked for not joining a squad!&amp;#039;)&lt;br /&gt;
                        host.rcon_invoke(&amp;#039;admin.kickPlayer &amp;quot;&amp;#039; + tp.getName() + &amp;#039;&amp;quot;&amp;#039;)   &lt;br /&gt;
           &lt;br /&gt;
    def onPlayerSpawn(p, vehicle):&lt;br /&gt;
        enableTimers()&lt;br /&gt;
        p.actuallyPlaying = 1&lt;br /&gt;
   &lt;br /&gt;
    def onPlayerDeath(p, vehicle):&lt;br /&gt;
        p.actuallyPlaying = 1&lt;br /&gt;
           &lt;br /&gt;
    def onPlayerConnect(player):&lt;br /&gt;
        enableTimers()&lt;br /&gt;
        resetPlayer(player)&lt;br /&gt;
   &lt;br /&gt;
    def onPlayerDisconnect(player):&lt;br /&gt;
        enableTimers()&lt;br /&gt;
        resetPlayer(player)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def onGameStatusChanged(status):&lt;br /&gt;
        gamestatus = status&lt;br /&gt;
       &lt;br /&gt;
        if gamestatus == bf2.GameStatus.EndGame:&lt;br /&gt;
            for tp in bf2.playerManager.getPlayers():&lt;br /&gt;
                tp.actuallyPlaying = 0&lt;br /&gt;
               &lt;br /&gt;
&lt;br /&gt;
except Exception, detail:&lt;br /&gt;
    print &amp;#039;Error! &amp;#039; + detail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File: users.cfg&lt;br /&gt;
&lt;br /&gt;
This file should be placed in the ./admin/ directory in the main BF2 directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# users.cfg # Administrator configuration file  # users.cfg format # Note: playername is purly so the maintainer can tell who a line is for # # profileID	&amp;quot;playername&amp;quot;	&amp;quot;permissions&amp;quot;	&amp;quot;reserved&amp;quot;	&amp;quot;reserved&amp;quot; // Comment   	44773626	&amp;quot;FSR|Danni&amp;quot;	&amp;quot;abcdefghijklmnopqrstuvwxyz1234567890&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; // Main Admin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pireax</name></author>
	</entry>
</feed>