Limnoria/plugins/Amazon.py
2003-12-02 07:38:18 +00:00

289 lines
11 KiB
Python

#!/usr/bin/env python
###
# Copyright (c) 2002, Jeremiah Fincher
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
"""
Amazon module, to use Amazon's Web Services. Currently only does ISBN lookups.
"""
__revision__ = "$Id$"
import getopt
import plugins
import amazon
import conf
import utils
import privmsgs
import callbacks
def configure(onStart, afterConnect, advanced):
# This will be called by setup.py to configure this module. onStart and
# afterConnect are both lists. Append to onStart the commands you would
# like to be run when the bot is started; append to afterConnect the
# commands you would like to be run when the bot has finished connecting.
from questions import expect, anything, something, yn
print 'To use Amazon\'s Web Services, you must have a license key.'
if yn('Do you have a license key?') == 'y':
key = anything('What is it?')
onStart.append('load Amazon')
onStart.append('amazon licensekey %s' % key)
else:
print 'You\'ll need to get a key before you can use this plugin.'
print 'You can apply for a key at http://www.amazon.com/webservices'
class Amazon(callbacks.Privmsg):
threaded = True
def _genResults(self, reply, attribs, items, url):
results = {}
res = []
for item in items:
try:
for k,v in attribs.iteritems():
results[v] = getattr(item, k, 'unknown')
if isinstance(results[v], amazon.Bag):
results[v] = getattr(results[v], k[:-1], 'unknown')
if not isinstance(results[v], basestring):
results[v] = utils.commaAndify(results[v])
if not url:
results['url'] = ''
else:
results['url'] = ' <%s>' % results['url']
s = reply % results
s.encode('utf-8')
res.append(str(s))
except amazon.AmazonError, e:
self.log.warning(str(e))
return res
def licensekey(self, irc, msg, args):
"""<key>
Sets the license key for using Amazon Web Services. Must be set before
any other commands in this module are used.
"""
key = privmsgs.getArgs(args)
amazon.setLicense(key)
irc.reply(msg, conf.replySuccess)
licensekey = privmsgs.checkCapability(licensekey, 'admin')
def isbn(self, irc, msg, args):
"""[--url] <isbn>
Returns the book matching the given ISBN number. If --url is
specified, a link to amazon.com's page for the book will also be
returned.
"""
opts = ['url']
(optlist, rest) = getopt.getopt(args, '', opts)
url = False
for (option, argument) in optlist:
option = option.lstrip('-')
if option == 'url':
url = True
isbn = privmsgs.getArgs(rest)
isbn = isbn.replace('-', '').replace(' ', '')
attribs = {'ProductName' : 'title',
'Manufacturer' : 'publisher',
'Authors' : 'author',
'URL' : 'url'
}
s = '"%(title)s", written by %(author)s; published by '\
'%(publisher)s.%(url)s'
try:
book = amazon.searchByKeyword(isbn)
res = self._genResults(s, attribs, book, url)
if res:
irc.reply(msg, utils.commaAndify(res))
return
except amazon.AmazonError, e:
pass
irc.reply(msg, 'No book was found with that ISBN.')
def author(self, irc, msg, args):
"""[--url] <author>
Returns a list of books written by the given author. If --url is
specified, a link to amazon.com's page for the book will also be
returned.
"""
opts = ['url']
(optlist, rest) = getopt.getopt(args, '', opts)
url = False
for (option, argument) in optlist:
option = option.lstrip('-')
if option == 'url':
url = True
author = privmsgs.getArgs(rest)
self.log.info(author)
attribs = {'ProductName' : 'title',
'Manufacturer' : 'publisher',
'Authors' : 'author',
'URL' : 'url'
}
s = '"%(title)s", written by %(author)s; published by '\
'%(publisher)s.%(url)s'
try:
books = amazon.searchByAuthor(author)
res = self._genResults(s, attribs, books, url)
if res:
irc.reply(msg, utils.commaAndify(res))
return
except amazon.AmazonError, e:
pass
irc.reply(msg, 'No books were found by that author.')
def artist(self, irc, msg, args):
"""[--url] [--{music,classical}] <artist>
Returns a list of items by the given artist. If --url is specified, a
link to amazon.com's page for the match will also be returned. The
search defaults to using --music.
"""
products = ['music', 'classical']
opts = ['url']
(optlist, rest) = getopt.getopt(args, '', products + opts)
url = False
product = ''
for (option, argument) in optlist:
option = option.lstrip('-')
if option == 'url':
url = True
if option in products:
product = option
product = product or 'music'
artist = privmsgs.getArgs(rest)
attribs = {'ProductName' : 'title',
'Manufacturer' : 'publisher',
'Artists' : 'artist',
'Media' : 'media',
'URL' : 'url'
}
s = '"%(title)s" (%(media)s), by %(artist)s; published by '\
'%(publisher)s.%(url)s'
try:
items = amazon.searchByArtist(artist, product_line=product)
res = self._genResults(s, attribs, items, url)
if res:
irc.reply(msg, utils.commaAndify(res))
return
except amazon.AmazonError, e:
pass
irc.reply(msg, 'No items were found by that artist.')
def actor(self, irc, msg, args):
"""[--url] [--{dvd,vhs,video}] <actor>
Returns a list of items starring the given actor. If --url is
specified, a link to amazon.com's page for the match will also be
returned. The search defaults to using --dvd.
"""
products = ['dvd', 'video', 'vhs']
opts = ['url']
(optlist, rest) = getopt.getopt(args, '', products + opts)
url = False
product = ''
for (option, argument) in optlist:
option = option.lstrip('-')
if option == 'url':
url = True
if option in products:
product = option
product = product or 'dvd'
actor = privmsgs.getArgs(rest)
attribs = {'ProductName' : 'title',
'Manufacturer' : 'publisher',
'MpaaRating' : 'mpaa',
'Media' : 'media',
'ReleaseDate' : 'date',
'URL' : 'url'
}
s = '"%(title)s" (%(media)s), rated %(mpaa)s; released '\
'%(date)s; published by %(publisher)s.%(url)s'
try:
items = amazon.searchByActor(actor, product_line=product)
res = self._genResults(s, attribs, items, url)
if res:
irc.reply(msg, utils.commaAndify(res))
return
except amazon.AmazonError, e:
pass
irc.reply(msg, 'No items were found starring that actor.')
def manufacturer(self, irc, msg, args):
""" [--url] \
[--{pc-hardware,kitchen,electronics,videogames,software,photo}] \
<manufacturer>
Returns a list of items by the given manufacturer. If --url is
specified, a link to amazon.com's page for the match will also be
returned. The search defaults to using --pc-hardware.
"""
products = ['electronics', 'kitchen', 'videogames', 'software',
'photo', 'pc-hardware']
opts = ['url']
(optlist, rest) = getopt.getopt(args, '', products + opts)
self.log.info(rest)
url = False
product = ''
for (option, argument) in optlist:
option = option.lstrip('-')
if option == 'url':
url = True
if option in products:
product = option
product = product or 'pc-hardware'
manufacturer = privmsgs.getArgs(rest)
attribs = {'ProductName' : 'title',
'Catalog' : 'catalog',
'Manufacturer' : 'manufacturer',
'URL' : 'url'
}
s = '"%(title)s" (%(catalog)s), by %(manufacturer)s.%(url)s'
try:
items = amazon.searchByManufacturer(manufacturer,
product_line=product)
res = self._genResults(s, attribs, items, url)
if res:
irc.reply(msg, utils.commaAndify(res))
return
except amazon.AmazonError, e:
pass
irc.reply(msg, 'No items were found by that manufacturer.')
Class = Amazon
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: