diff --git a/PackageInfo/packages.py b/PackageInfo/packages.py index 1f50b31..69c37c0 100644 --- a/PackageInfo/packages.py +++ b/PackageInfo/packages.py @@ -11,6 +11,9 @@ # GNU General Public License for more details. # ### +import exceptions +import warnings +warnings.filterwarnings("ignore", "apt API not stable yet", exceptions.FutureWarning) import commands, os, apt from email import FeedParser @@ -33,11 +36,12 @@ class Apt: -o"Dir::etc::sourcelist=%s/%%s.list"\\ -o"Dir::State::status=%s/%%s.status"\\ -o"Dir::Cache=%s/cache"\\ + -o"APT::Architecture=i386"\\ %%s %%s""" % tuple([self.aptdir]*4) self.aptfilecommand = """apt-file -s %s/%%s.list -c %s/apt-file/%%s -l search %%s""" % tuple([self.aptdir]*2) def find(self, pkg, checkdists, filelookup=True): - _pkg = ''.join([x for x in pkg.strip().split(None,1)[0] if x.isalnum or x in '.-_+']) + _pkg = ''.join([x for x in pkg.strip().split(None,1)[0] if x.isalnum() or x in '.-_+']) distro = checkdists if len(pkg.strip().split()) > 1: distro = ''.join([x for x in pkg.strip().split(None,2)[1] if x.isalnum or x in '.-_+']) @@ -56,6 +60,9 @@ class Apt: if data[0] == 'E:': # No files in the cache dir self.log.error("Please run the 'update_apt_file' script") return "Cache out of date, please contact the administrator" + if data[0] == "Use" and data[1] == "of": + url = "http://packages.ubuntu.com/search?searchon=contents&keywords=%s&mode=&suite=%s&arch=any" % (urllib.quote(pkg),distro) + return url if len(data) > 5: return "File %s found in %s (and %d others)" % (pkg, ', '.join(data[:5]), len(data)-5) return "File %s found in %s" % (pkg, ', '.join(data)) @@ -69,7 +76,7 @@ class Apt: def info(self, pkg, checkdists): _pkg = ''.join([x for x in pkg.strip().split(None,1)[0] if x.isalnum() or x in '.-_+']) - distro = None + distro = checkdists if len(pkg.strip().split()) > 1: distro = ''.join([x for x in pkg.strip().split(None,2)[1] if x.isalnum() or x in '-._+']) if not distro: diff --git a/PackageInfo/plugin.py b/PackageInfo/plugin.py index a0ee875..d4271ed 100644 --- a/PackageInfo/plugin.py +++ b/PackageInfo/plugin.py @@ -40,13 +40,13 @@ import os import packages reload(packages) -+def get_user(msg): -+ try: -+ user = ircdb.users.getUser(msg.prefix) -+ except: -+ return False -+ return user -+ +def get_user(msg): + try: + user = ircdb.users.getUser(msg.prefix) + except: + return False + return user + class PackageInfo(callbacks.Plugin): """Lookup package information via apt-cache/apt-file""" @@ -104,118 +104,65 @@ class PackageInfo(callbacks.Plugin): find = wrap(find, ['text', optional('text')]) - def addressed(self, irc, msg, channel): - nick = irc.nick - prefixChars=self.registryValue("prefixchar", channel) - nicks=None - prefixStrings=None - whenAddressedByNick=None - whenAddressedByNickAtEnd=None - - def get(group): - if ircutils.isChannel(target): - group = group.get(target) - return group() - def stripPrefixStrings(payload): - for prefixString in prefixStrings: - if payload.startswith(prefixString): - payload = payload[len(prefixString):].lstrip() - return payload - - (target, payload) = msg.args - if not payload: - return '' - if prefixChars is None: - prefixChars = get(conf.supybot.reply.whenAddressedBy.chars) - if whenAddressedByNick is None: - whenAddressedByNick = get(conf.supybot.reply.whenAddressedBy.nick) - if whenAddressedByNickAtEnd is None: - r = conf.supybot.reply.whenAddressedBy.nick.atEnd - whenAddressedByNickAtEnd = get(r) - if prefixStrings is None: - prefixStrings = get(conf.supybot.reply.whenAddressedBy.strings) - for string in prefixStrings: - if payload.startswith(string): - return stripPrefixStrings(payload) - if payload[0] in prefixChars: - return payload[1:].strip() - if nicks is None: - nicks = get(conf.supybot.reply.whenAddressedBy.nicks) - nicks = map(ircutils.toLower, nicks) + def privmsg(self, irc, msg, user): + text = msg.args[1] + release = self.__getRelease(irc, None, channel, False) + if text[0] == self.registryValue("prefixchar"): + text = text[1:] + if user and text[0] in str(conf.supybot.reply.whenAddressedBy.get('chars')): + return + if text[:4] == "find": + irc.reply(self.Apt.find(text[4:].strip(), release)) else: - nicks = list(nicks) - nicks.insert(0, ircutils.toLower(nick)) - if ircutils.nickEqual(target, nick): - payload = stripPrefixStrings(payload) - while payload and payload[0] in prefixChars: - payload = payload[1:].lstrip() - return payload - elif whenAddressedByNick: - for nick in nicks: - lowered = ircutils.toLower(payload) - if lowered.startswith(nick): - try: - (maybeNick, rest) = payload.split(None, 1) - toContinue = False - while not ircutils.isNick(maybeNick, strictRfc=True): - if maybeNick[-1].isalnum(): - toContinue = True - break - maybeNick = maybeNick[:-1] - if toContinue: - continue - if ircutils.nickEqual(maybeNick, nick): - return rest - else: - continue - except ValueError: - continue - elif whenAddressedByNickAtEnd and lowered.endswith(nick): - rest = payload[:-len(nick)] - possiblePayload = rest.rstrip(' \t,;') - if possiblePayload != rest: - return possiblePayload - if conf.supybot.reply.whenNotAddressed(): - return payload + irc.reply(self.Apt.info(text[4:].strip(), release)) + + def chanmsg(self, irc, msg, user): + channel = self.__getChannel(msg.args[0]) + text = msg.args[1] + release = self.__getRelease(irc, None, channel, False) + if text[0] != self.registryValue("prefixchar", channel): + return + text = text[1:] + if not text[:4] in ("find", "info"): + return + if text[:4] == "find": + irc.reply(self.Apt.find(text[4:].strip(), release)) else: - return '' + irc.reply(self.Apt.info(text[4:].strip(), release)) def doPrivmsg(self, irc, msg): - channel = self.__getChannel(msg.args[0]) - if not channel and get_user(msg): - return - if not self.registryValue("enabled", channel): - return - release = self.__getRelease(irc, None, channel, False) - if not release: - return if chr(1) in msg.args[1]: # CTCP return - - text = self.addressed(irc, msg, channel) - if not text: + channel = self.__getChannel(msg.args[0]) + if not self.registryValue("enabled", channel): return - if msg.args[1][0] in str(conf.supybot.reply.whenAddressedBy.get('chars')): + user = get_user(msg) + if channel: + self.chanmsg(irc, msg, user) + elif user: return - if text.lower()[:4] not in ("find", "info"): - return - - if text.lower()[:4] == "find": - irc.reply(self.Apt.find(text[4:].strip(), self.registryValue("defaultRelease", channel))) - else: - irc.reply(self.Apt.info(text[4:].strip(), self.registryValue("defaultRelease", channel))) + self.privmsg(irc, msg, user) def inFilter(self, irc, msg): if not conf.supybot.get("defaultIgnore"): return msg - if msg.command == "PRIVMSG" and msg.args[0].lower() == irc.nick.lower(): - recipient, text = msg.args - channel = self.__getChannel(msg.args[0]) - new_text = self.addressed(irc, msg, channel) - if new_text: - if(irc.nick.lower() == msg.args[0]): - irc = callbacks.ReplyIrcProxy(irc, msg) - self.doPrivmsg(irc, msg) + if msg.command != "PRIVMSG": + return msg + text = msg.args[1] + user = get_user(msg) + if user: + return msg + channel = self.__getChannel(msg.args[0]) + if channel: + if text[:5] not in ("!info", "!find", "@info", "@find"): + return msg + else: + if text[:5] in ("info ", "find ", "!info", "!find", "@info", "@find"): + irc = callbacks.ReplyIrcProxy(irc, msg) + self.doPrivmsg(irc, msg) + else: + return msg + return msg Class = PackageInfo diff --git a/PackageInfo/update_apt b/PackageInfo/update_apt index 2b3d32f..537ca58 100755 --- a/PackageInfo/update_apt +++ b/PackageInfo/update_apt @@ -1,6 +1,6 @@ #!/bin/bash -DIR=/home/stdin/bot/data/apt +DIR=/home/bot/data/apt for DIST in "$DIR"/*.list; do test -h $DIST && continue @@ -11,5 +11,6 @@ for DIST in "$DIR"/*.list; do apt-get -qq -o "Dir::State::Lists=$DIR/$DIST" \ -o "Dir::etc::sourcelist=$DIR/$DIST.list" \ -o "Dir::State::status=$DIR/$DIST.status" \ - -o "Dir::Cache=$DIR/cache" update + -o "Dir::Cache=$DIR/cache \ + -o "APT::Architecture=i386" update done diff --git a/PackageInfo/update_apt_file b/PackageInfo/update_apt_file index ac052e1..1587376 100755 --- a/PackageInfo/update_apt_file +++ b/PackageInfo/update_apt_file @@ -1,6 +1,11 @@ #!/bin/bash -DIR=/home/stdin/bot/data/apt +if [ -x "$(which apt-file)" ]; then + echo "Please install apt-file" + exit 1 +fi + +DIR=/home/bot/data/apt for DIST in "$DIR"/*.list; do test -h $DIST && continue