Changeset 12 for trunk/amazonbot


Ignore:
Timestamp:
06/20/06 18:41:29 (18 years ago)
Author:
atzm
Message:

command implemented

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/amazonbot/amazonbot.py

    r11 r12  
    1111import sys 
    1212import time 
     13import shlex 
    1314import random 
     15import getopt 
     16 
    1417import MeCab 
    1518import nkf 
     
    7578class AmazonBotBase(SingleServerIRCBot): 
    7679        """アマゟンボットのベヌスクラス 
    77         こい぀単䜓では受け取ったメッセヌゞの圢æ 
     80        単䜓では受け取ったメッセヌゞの圢æ 
    7881‹çŽ è§£æžãšåè©žæŠœå‡ºãŸã§ã—かやらない 
    7982        サブクラスで process_keyword を実裠
    8083しお Amazon ぞク゚リを投げるべし 
     84 
     85        サブクラスには onmsg_HOGEHOGE(self, conn, ev, args) メ゜ッドを䜜るこずでコマンド远加可胜 
     86        コマンド曞匏は !HOGEHOGE arg [, arg2, ...] ずなる 
    8187        """ 
    8288        def __init__(self): 
     
    106112 
    107113        def on_pubmsg(self, c, e): 
     114                msg = unicoding(e.arguments()[0]) 
     115                if msg[0] == '!': 
     116                        words = shlex.split(ununicoding(msg, 'utf-8')[1:]) 
     117                        method = getattr(self, 'onmsg_%s' % words[0], lambda *arg: False) 
     118                        return method(c, e, words[1:]) # words[0] == command name 
     119 
    108120                _current_time = time.time() 
    109121                if _current_time < self._prev_time + config.get('bot', 'freq', 'int'): 
     
    112124                                print >> sys.stderr, 'DEBUG> Not expired: prev time is %s' % prev 
    113125                        return False 
    114  
    115126                self._prev_time = _current_time 
    116                 msg = unicoding(e.arguments()[0]) 
    117127 
    118128                self.silence(msg, c, e) 
     
    132142                        try: 
    133143                                message = ununicoding(': '.join([content, title, url])) 
    134                         except UnicodeError, e: 
     144                        except UnicodeError, err: 
    135145                                # なぜかたたに unicode オブゞェクトを iso-2022-jp で゚ンコヌドできない 
    136146                                if __debug__: 
    137                                         print >> sys.stderr, 'DEBUG> %s' % str(e) 
     147                                        print >> sys.stderr, 'DEBUG> %s' % str(err) 
    138148                                return False 
    139149 
     
    172182                return 'AmazonBot by %s, based on python-irclib' % __author__ 
    173183 
     184        def onmsg_isbn(self, c, e, args): 
     185                """Syntax: !isbn <ISBN number> 
     186                """ 
     187                return self.onmsg_asin(c, e, args) 
     188        def onmsg_asin(self, c, e, args): 
     189                """Syntax: !asin <ASIN number> 
     190                """ 
     191                if __debug__: 
     192                        print >> sys.stderr, 'DEBUG> in asin command: %s' % str(args) 
     193 
     194                try: 
     195                        data = my_amazon.searchByASIN(args[0]) 
     196                except my_amazon.AmazonError, err: 
     197                        ch = e.target() 
     198                        c.privmsg(ch, ununicoding(config.get('bot', 'no_products'))) 
     199                        if __debug__: 
     200                                print >> sys.stderr, 'DEBUG> Caught AmazonError in onmsg_asin: %s' % str(err) 
     201                        return False 
     202 
     203                return self._process_onmsg(c, e, data) 
     204 
     205        def onmsg_a(self, c, e, args): 
     206                """Syntax: !a [-h] [-t type] keyword1 [, keyword2, ...] 
     207                """ 
     208                return self.onmsg_amazon(c, e, args) 
     209        def onmsg_amazon(self, c, e, args): 
     210                """Syntax: !amazon [-h] [-t type] keyword1 [, keyword2, ...] 
     211                """ 
     212                if __debug__: 
     213                        print >> sys.stderr, 'DEBUG> in amazon command: %s' % str(args) 
     214 
     215                try: 
     216                        options, rest = getopt.getopt(args, 't:h', ['type=', 'help']) 
     217                except getopt.GetoptError, err: 
     218                        if __debug__: 
     219                                print >> sys.stderr, 'DEBUG> Caught GetoptError in onmsg_amazon: %s' % str(err) 
     220                        return False 
     221 
     222                keyword = ' '.join(rest) 
     223                product_line = 'books-jp' 
     224                for opt, val in options: 
     225                        if opt in ['-t', '--type']: 
     226                                product_line = val 
     227                                break 
     228                        elif opt in ['-h', '--help']: 
     229                                available = [ 
     230                                        'books-jp (和曞, default)', 'books-us (掋曞)', 
     231                                        'music-jp (ポピュラヌ音楜)', 'classical-jp (クラシック音楜)', 
     232                                        'dvd-jp (DVD)', 'vhs-jp (ビデオ)', 
     233                                        'electronics-jp (゚レクトロニクス)', 'kitchen-jp (ホヌムキッチン)', 
     234                                        'software-jp (゜フトりェア)', 'videogames-jp (ゲヌム)', 
     235                                        'magazines-jp (雑誌)', 'toys-jp (おもちゃホビヌ)', 
     236                                        ] 
     237                                ch = e.target() 
     238                                c.privmsg(ch, ununicoding('Available types: ' + ', '.join(available))) 
     239                                return True 
     240 
     241                if __debug__: 
     242                        fmt = 'DEBUG> keyword="%s", product_line=%s' 
     243                        print >> sys.stderr, fmt % (ununicoding(keyword, 'euc-jp'), product_line) 
     244 
     245                try: 
     246                        data = my_amazon.searchByKeyword(keyword, product_line=product_line) 
     247                except my_amazon.AmazonError, err: 
     248                        ch = e.target() 
     249                        c.privmsg(ch, ununicoding(config.get('bot', 'no_products'))) 
     250                        if __debug__: 
     251                                print >> sys.stderr, 'DEBUG> Caught AmazonError in onmsg_amazon: %s' % str(err) 
     252                        return False 
     253 
     254                return self._process_onmsg(c, e, data) 
     255 
     256        def onmsg_help(self, c, e, data): 
     257                pass 
     258 
     259        def _process_onmsg(self, c, e, data): 
     260                if type(data.Details) is not list: 
     261                        data.Details = [data.Details] 
     262 
     263                detail = random.choice(data.Details) 
     264                title = ununicoding(detail.ProductName) 
     265                url = ununicoding(detail.URL) 
     266                channel = config.get('irc', 'channel') 
     267                c.privmsg(channel, '%(title)s: %(url)s' % locals()) 
     268 
     269                return True 
     270 
    174271        def process_keyword(self, keyword): 
    175272                keyword = ununicoding(keyword, 'utf-8') 
     
    181278                        if type(data.ProductLine) is not type([]): 
    182279                                data.ProductLine = [data.ProductLine] 
    183                 except my_amazon.AmazonError, e: 
    184                         if __debug__: 
    185                                 print >> sys.stderr, 'DEBUG> Caught AmazonError: %s' % str(e) 
     280                except my_amazon.AmazonError, err: 
     281                        if __debug__: 
     282                                print >> sys.stderr, 'DEBUG> Caught AmazonError: %s' % str(err) 
    186283                        return [None, None] 
    187284 
Note: See TracChangeset for help on using the changeset viewer.