Another code dump

This commit is contained in:
Terence Simpson 2009-01-19 22:26:32 +00:00
parent f0e2dffbe2
commit 523cb40ba1
4 changed files with 72 additions and 112 deletions

View File

@ -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:

View File

@ -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

View File

@ -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

View 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