Untitled
unknown
plain_text
3 years ago
15 kB
9
Indexable
# BigBrotherBot(B3) (www.bigbrotherbot.com)
# Plugin for extra admin utilities
# Copyright (C) 2009 Ismael Garrido
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# CHANGELOG
# 29/05/09
# Added !listids , Lists all players IDs
# Changes in cmd_delnotice as suggested by xlr8or
# Bugfixes in notices comands
# 10/04/09
# Changed !pastbans shortcut to !pab
# On connect and on ban only tell number of past bans instead of all history
# 22/03/09
# Renamed to SuperAdmin
# New command !pastbans: see past player bans
# Added functions for manipulating notices
# !listbans changes format: !listbans [<admin>] [<type>]
# !listbans will only show tempbans by default
# 24/02/09
# !listbans now takes (optionally) admin name and shows only bans by that admin
# !allaliases now has optional <detailed> parameter which shows more info on each alias
# 23/02/09
# Changed !slookup to look for aliases containing the substring instead of only exact matches
# New command !listbans (or !lb). Lists all the active bans
# New command !superbaninfo (or !sbaninfo). Gives more information about the ban than !baninfo.
# 21/02/09
# Initial version
__version__ = '1.4.7'
__author__ = 'Ismael'
import b3
import b3.plugin
import b3.events
import datetime
#--------------------------------------------------------------------------------------------------
class SuperadminPlugin(b3.plugin.Plugin):
_adminPlugin = None
_minLevel_sl = None
_minLevel_allalias = None
_minLevel_sban = None
_minLevel_lb = None
_minLevel_notices = None
_minLevel_pastbans = None
_minLevel_listids = None
def startup(self):
"""\
Initialize plugin settings
"""
# get the plugin so we can register commands
self._adminPlugin = self.console.getPlugin('admin')
if not self._adminPlugin:
# something is wrong, can't start without admin plugin
self.error('Could not find admin plugin')
return False
# get the minium level allowed to use this plugin
self.verbose('Getting config options')
self._minLevel_sl = self.config.getint('settings', 'min_level_superlookup')
self._minLevel_allalias = self.config.getint('settings', 'min_level_allaliases')
self._minLevel_sban = self.config.getint('settings', 'min_level_superbaninfo')
self._minLevel_lb = self.config.getint('settings', 'min_level_listbans')
self._minLevel_listids = self.config.getint('settings', 'min_level_listids')
# register our commands
self.verbose('Registering commands')
self._adminPlugin.registerCommand(self, 'superlookup', self._minLevel_sl, self.cmd_superlookup, 'sl')
self._adminPlugin.registerCommand(self, 'aa', self._minLevel_allalias, self.cmd_allaliases, 'aa')
self._adminPlugin.registerCommand(self, 'superbaninfo', self._minLevel_sban, self.cmd_superbaninfo, 'sbaninfo')
self._adminPlugin.registerCommand(self, 'listbans', self._minLevel_lb, self.cmd_listbans, 'lb')
self._adminPlugin.registerCommand(self, 'listids', self._minLevel_listids, self.cmd_listids, 'lids')
self.Load_supernotice()
self.Load_banwatcher()
self.debug('Started')
def onEvent(self, event):
if event.type == b3.events.EVT_CLIENT_AUTH:
self.tell_notices(event.client)
elif event.type == b3.events.EVT_CLIENT_BAN_TEMP or event.type == b3.events.EVT_CLIENT_BAN:
self.tell_bans(event.client)
def Load_banwatcher(self):
self._minLevel_pastbans= self.config.getint('banwatcher', 'min_level_pastbans')
self._adminPlugin.registerCommand(self, 'pastbans', self._minLevel_notices, self.cmd_pastbans, 'pab')
if self.config.getboolean('banwatcher', 'enabled'):
self.registerEvent(b3.events.EVT_CLIENT_BAN)
self.registerEvent(b3.events.EVT_CLIENT_BAN_TEMP)
def get_player_bans(self, client):
cursor = self.console.storage.query(
"""SELECT a.name, p.reason, p.time_expire FROM penalties p, clients a
WHERE a.id = p.admin_id AND (p.type = "tempban" OR p.type = "ban") AND p.client_id = %s """%(client.id))
bans = []
if cursor.rowcount > 0:
while not cursor.EOF:
r = cursor.getRow()
bans.append("^2%s ^7for ^4%s ^7until ^3%s" %(r['name'], r['reason'], self.console.formatTime(r['time_expire'])))
cursor.moveNext()
cursor.close()
return bans
def tell_bans(self, client):
a = self._adminPlugin.getAdmins()
bans = self.get_player_bans(client)
if len(a) > 0 and len(bans) > 0:
for adm in a:
adm.message("^7%s has ^4%s ^7past bans" %(client.name, len(bans)))
def cmd_pastbans(self, data, client, cmd=None):
"""\
<name> - list all player's past bans
"""
if not self.console.storage.status():
cmd.sayLoudOrPM(client, '^7Cannot lookup, database apears to be ^1DOWN')
return False
m = self._adminPlugin.parseUserCmd(data)
if not m:
client.message('^7Invalid parameters')
return False
cid = m[0]
sclient = self._adminPlugin.findClientPrompt(cid, client)
if not sclient:
return
bans = self.get_player_bans(sclient)
if len(bans) == 0:
cmd.sayLoudOrPM(client, "^7%s^7 hasn't been banned" % sclient.exactName)
return True
cmd.sayLoudOrPM(client, "^7%s past bans:" %(sclient.exactName))
for b in bans:
cmd.sayLoudOrPM(client, b)
def Load_supernotice(self):
self._minLevel_notices = self.config.getint('supernotice', 'min_level_supernotice')
self._adminPlugin.registerCommand(self, 'lookupnotices', self._minLevel_notices, self.cmd_lookupnotice, 'lnot')
self._adminPlugin.registerCommand(self, 'deletenotice', self._minLevel_notices, self.cmd_delnotice, 'delnot')
if self.config.getboolean('supernotice', 'lookup_on_login'):
self.registerEvent(b3.events.EVT_CLIENT_AUTH)
def tell_notices(self, client):
a = self._adminPlugin.getAdmins()
notices = self.get_player_notices(client)
if len(a) > 0 and len(notices) > 0:
for adm in a:
adm.message("^7%s has notices:" %(client.name))
for n in notices:
adm.message(n)
def get_player_notices(self, client):
cursor = self.console.storage.query("""SELECT name, reason, p.time_add FROM penalties p, clients a WHERE type = "Notice" AND a.id = p.admin_id AND p.inactive = 0 AND p.client_id = %s """%(client.id))
notices = []
if cursor.rowcount > 0:
i = 1
while not cursor.EOF:
r = cursor.getRow()
notices.append("^7(^1#%s^7)^2%s^7(^3%s^7): ^7%s" % (i, r['name'], self.console.formatTime(r['time_add']), r['reason']))
cursor.moveNext()
i += 1
cursor.close()
return notices
def cmd_delnotice(self, data, client, cmd=None):
"""\
<name> <number> - mark notice <number> as inactive in DB
"""
m = self._adminPlugin.parseUserCmd(data)
if not m:
client.message('^7Invalid parameters')
return False
if not m[0] and m[1]:
client.message('^7Invalid parameters')
return False
cid = m[0]
sclient = self._adminPlugin.findClientPrompt(cid, client)
cursor = self.console.storage.query("""SELECT p.id FROM penalties p WHERE type = "Notice" AND inactive = 0 AND p.client_id = %s """%(sclient.id))
to_delete = int(m[1])
if cursor.rowcount < to_delete:
client.message('^7Number too high!')
return False
_needUpdate = False
if cursor.rowcount > 0:
i = 1
while not cursor.EOF or i > to_delete:
r = cursor.getRow()
if i == to_delete:
# we found the notice, let's build the updateQuery
_needUpdate = True
_updateQuery = 'UPDATE penalties SET inactive=1 WHERE id = %s' %(r['id'])
# We found the correct notice, break out of the loop
break
cursor.moveNext()
i += 1
cursor.close()
if _needUpdate:
c = self.console.storage.query(_updateQuery)
c.close()
cmd.sayLoudOrPM(client, "^7Notice marked inactive")
else:
cmd.sayLoudOrPM(client, "^7Notice not found")
def cmd_lookupnotice(self, data, client, cmd=None):
"""\
<name> - lookup player's notices
"""
if not self.console.storage.status():
cmd.sayLoudOrPM(client, '^7Cannot lookup, database apears to be ^1DOWN')
return False
m = self._adminPlugin.parseUserCmd(data)
if not m:
client.message('^7Invalid parameters')
return False
cid = m[0]
sclient = self._adminPlugin.findClientPrompt(cid, client)
if not sclient:
return
notices = self.get_player_notices(sclient)
if len(notices) == 0:
cmd.sayLoudOrPM(client, '^7%s^7 has no notices' % sclient.exactName)
return True
cmd.sayLoudOrPM(client, '^7%s^7 notices:' %sclient.exactName)
for n in notices:
cmd.sayLoudOrPM(client, n)
def cmd_superlookup(self, data, client, cmd=None):
"""\
<name> - search players that have used or are using that name
"""
if not self.console.storage.status():
cmd.sayLoudOrPM(client, '^7Cannot lookup, database apears to be ^1DOWN')
return False
if not len(data):
client.message('^7You must supply a player to lookup')
return False
#Get all players that are currently using that name
clients = self.console.clients.lookupByName(data)
#Get all players that have used the alias
cursor = self.console.storage.query("""SELECT c.id, c.name, a.time_edit FROM clients c, aliases a WHERE c.id = a.client_id && a.alias LIKE '%%%s%%'"""%(data))
if cursor.rowcount == 0 and len(clients) == 0:
cmd.sayLoudOrPM(client, "No players have used the alias")
return
ids = []
if len(clients) > 0:
cmd.sayLoudOrPM(client, "Players that are currently using %s: " % (data))
for c in clients:
cmd.sayLoudOrPM(client, "^7[^2@%s^7] %s (^3%s^7)" % (c.id, c.exactName, self.console.formatTime(c.timeEdit)))
ids.append(c.id)
else:
cmd.sayLoudOrPM(client, "No players are currently using %s" % (data))
if cursor.rowcount > 0:
cmd.sayLoudOrPM(client, "Players that have used %s: " % (data))
while not cursor.EOF:
msg = ""
r = cursor.getRow()
if not (int(r['id'] ) in ids):
msg += "^7[^2@%s^7] %s (^3%s^7)" % (r['id'], r['name'], self.console.formatTime(r['time_edit']))
cmd.sayLoudOrPM(client, msg)
ids.append(int(r['id']))
cursor.moveNext()
else:
cmd.sayLoudOrPM(client, "No players have used %s" % (data))
cursor.close()
def cmd_allaliases(self, data, client=None, cmd=None):
"""\
<name> [<detailed>] - list all player's aliases (no 10 alias limit), if <detailed> = y alias creation and modification time are shown
"""
if not self.console.storage.status():
cmd.sayLoudOrPM(client, '^7Cannot lookup, database apears to be ^1DOWN')
return False
m = self._adminPlugin.parseUserCmd(data)
if not m:
client.message('^7Invalid parameters')
return False
cid = m[0]
sclient = self._adminPlugin.findClientPrompt(cid, client)
if not sclient:
return
cursor = self.console.storage.query("""SELECT a.alias, a.time_add, a.time_edit, a.num_used FROM aliases a WHERE a.client_id = %s """%(sclient.id))
if cursor.rowcount == 0:
cmd.sayLoudOrPM(client, '^7%s^7 has no aliases' % sclient.exactName)
return True
if not m[1]:
aliases = []
while not cursor.EOF:
r = cursor.getRow()
aliases.append("^7%s" % r['alias'])
cursor.moveNext()
cmd.sayLoudOrPM(client, "^7%s aliases: %s" %(sclient.exactName, ', '.join(aliases)))
else:
cmd.sayLoudOrPM(client, "^7%s aliases:" %(sclient.exactName))
while not cursor.EOF:
r = cursor.getRow()
cmd.sayLoudOrPM(client, "^7%s, added ^3(%s) ^7last ^7modified ^3(%s) ^7used ^3%s ^7times" %(r['alias'], self.console.formatTime(r['time_add']), self.console.formatTime(r['time_edit']), r['num_used']+1))
cursor.moveNext()
cursor.close()
def cmd_superbaninfo(self, data, client=None, cmd=None):
"""\
<name> - Give information about player's active bans
"""
if not self.console.storage.status():
cmd.sayLoudOrPM(client, '^7Cannot lookup, database apears to be ^1DOWN')
return False
m = self._adminPlugin.parseUserCmd(data)
if not m:
client.message('^7Invalid parameters')
return False
sclient = self._adminPlugin.findClientPrompt(m[0], client)
if sclient:
numbans = sclient.numBans
if numbans:
cmd.sayLoudOrPM(client, '^7%s ^7has %s active bans' % (sclient.exactName, numbans))
bans = sclient.bans
for b in bans:
admin = self.console.storage.getClientsMatching({ 'id' : b.adminId })[0].name
cmd.sayLoudOrPM(client, '^7Banned by ^7%s ^7until ^3%s ^7for ^7reason ^7%s' % (admin, self.console.formatTime(b.timeExpire), b.reason))
else:
cmd.sayLoudOrPM(client, '^7%s ^7has no active bans' % sclient.exactName)
def cmd_listbans(self, data, client=None, cmd=None):
"""\
[<name>] [<type>] - list all active bans, if name specified, list all active bans by that admin; type can be 'ban' or 'tempban', tempban is the default.
"""
if not self.console.storage.status():
cmd.sayLoudOrPM(client, '^7Cannot lookup, database apears to be ^1DOWN')
return False
adm = ""
ban = "TempBan"
if data:
m = self._adminPlugin.parseUserCmd(data)
if m[0]:
cid = m[0]
sclient = self._adminPlugin.findClientPrompt(cid, client)
adm = "AND p.admin_id = %s" % sclient.id
if m[1]:
if m[1] == "ban":
ban = "Ban"
elif m[1] == "tempban":
ban = "TempBan"
else:
cmd.sayLoudOrPM(client, "^7Wrong type of ban, must be 'ban' or 'tempban'")
return False
#Get all players that have active bans
cursor = self.console.storage.query("""
SELECT c.id, c.name, p.time_expire, p.reason
FROM penalties p, clients c
WHERE p.client_id = c.id AND
p.inactive = 0 AND
type='%s' AND
p.time_expire >= UNIX_TIMESTAMP() %s""" % (ban, adm))
if cursor.rowcount == 0:
cmd.sayLoudOrPM(client, "No active bans")
return
cmd.sayLoudOrPM(client, "There are %s active bans" % cursor.rowcount)
while not cursor.EOF:
r = cursor.getRow()
msg = "^7[^2@%s^7] %s (until ^3%s^7) ^7for ^7%s" % (r['id'], r['name'], self.console.formatTime(r['time_expire']), r['reason'])
cmd.sayLoudOrPM(client, msg)
cursor.moveNext()
cursor.close()
def cmd_listids(self, data, client, cmd=None):
"""\
[name] - Lists all player's IDs or name's ID
"""
if not self.console.storage.status():
cmd.sayLoudOrPM(client, '^7Cannot lookup, database apears to be ^1DOWN')
return False
m = self._adminPlugin.parseUserCmd(data)
if not m:
clientes = []
for c in self.console.clients.getList():
clientes.append("^7%s: ^2@%d^7" %(c.exactName, c.id))
cmd.sayLoudOrPM(client, ", ".join(clientes))
return True
cid = m[0]
sclient = self._adminPlugin.findClientPrompt(cid, client)
if not sclient:
return
cmd.sayLoudOrPM(client, "^7%s: ^2@%d" % (sclient.exactName, sclient.id))
Editor is loading...