瀏覽代碼

Implement add_admin(), add_owner(), better comparison for User.

tags/v0.1^2
Ben Kurtovic 12 年之前
父節點
當前提交
0892cf6bd2
共有 1 個文件被更改,包括 38 次插入5 次删除
  1. +38
    -5
      earwigbot/config/permissions.py

+ 38
- 5
earwigbot/config/permissions.py 查看文件

@@ -58,6 +58,16 @@ class PermissionsDB(object):
except KeyError:
return False

def _set_rank(self, user, rank):
"""Add a User to the database under a given rank."""
try:
self._data[rank].append(user)
except KeyError:
self._data[rank] = [user]
query = "INSERT INTO users VALUES (?, ?, ?, ?)"
with sqlite.connect(self._dbfile) as conn, self._db_access_lock:
conn.execute(query, (user.nick, user.ident, user.host, rank))

def load(self):
"""Load permissions from an existing database, or create a new one."""
query = "SELECT user_nick, user_ident, user_host, user_rank FROM users"
@@ -80,6 +90,14 @@ class PermissionsDB(object):
"""Return ``True`` if the given user is a bot owner, else ``False``."""
return self._is_rank(_User(nick, ident, host), rank=self.OWNER)

def add_admin(self, nick="*", ident="*", host="*"):
"""Add an nick/ident/host combo to the bot admins list."""
return self._set_rank(_User(nick, ident, host), rank=self.ADMIN)

def add_owner(self, nick="*", ident="*", host="*"):
"""Add a nick/ident/host combo to the bot owners list."""
return self._set_rank(_User(nick, ident, host), rank=self.OWNER)

class _User(object):
"""A class that represents an IRC user for the purpose of testing rules."""
def __init__(self, nick, ident, host):
@@ -97,13 +115,28 @@ class _User(object):
return "{0}!{1}@{2}".format(self.nick, self.ident, self.host)

def __eq__(self, user):
if self.nick == user.nick or (self.nick == "*" or user.nick == "*"):
if self.ident == user.ident or (self.ident == "*" or
user.ident == "*"):
if self.host == user.host or (self.host == "*" or
user.host == "*"):
if self._compare(self.nick, user.nick):
if self._compare(self.ident, user.ident):
if self._compare(self.host, user.host):
return True
return False

def __ne__(self, user):
return not self == user

def _compare(self, field1, field2):
if field1 == "*" or field2 == "*":
return True
if "*" in field1:
regex = re.escape(field1).replace(r"\*", r".*?") + "$"
if re.match(regex, field2, re.I):
if "*" in field2:
regex = re.escape(field2).replace(r"\*", r".*?") + "$"
return re.match(regex, field1, re.I)
return True
else:
return False
elif "*" in field2:
regex = re.escape(field2).replace(r"\*", r".*?") + "$"
return re.match(regex, field1, re.I)
return field1 == field2

Loading…
取消
儲存