Changeset 14


Ignore:
Timestamp:
06/21/06 13:01:35 (18 years ago)
Author:
atzm
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/amazonbot/amazonbot.py

    r13 r14  
    8383しお Amazon ぞク゚リを投げるべし 
    8484 
    85         サブクラスには onmsg_HOGEHOGE(self, conn, ev, args) メ゜ッドを䜜るこずでコマンド远加可胜 
     85        サブクラスには onmsg_HOGEHOGE(self, conn, ev, to, args) メ゜ッドを䜜るこずでコマンド远加可胜 
    8686        コマンド曞匏は !HOGEHOGE arg [, arg2, ...] ずなる 
     87        ヘルプはメ゜ッドに docstring を曞けば OK 
    8788        """ 
    8889        def __init__(self): 
     
    109110 
    110111        def on_privmsg(self, c, e): 
    111                 return self.on_pubmsg(c, e) 
    112  
    113         def on_pubmsg(self, c, e): 
     112                return self.on_pubmsg(c, e, to=nm_to_n(e.source())) 
     113 
     114        def on_pubmsg(self, c, e, to=config.get('irc', 'channel')): 
    114115                msg = unicoding(e.arguments()[0]) 
     116 
     117                if __debug__: 
     118                        print >> sys.stderr, 'DEBUG> pubmsg incoming "%s", reply to %s' % (ununicoding(msg, 'euc-jp'), to) 
     119 
    115120                if msg[0] == '!': 
    116121                        words = shlex.split(ununicoding(msg, 'utf-8')[1:]) 
    117122                        method = getattr(self, 'onmsg_%s' % words[0], lambda *arg: False) 
    118                         return method(c, e, words[1:]) # words[0] == command name 
     123                        return method(c, e, to, words[1:]) # words[0] == command name 
    119124 
    120125                _current_time = time.time() 
    121126                if _current_time < self._prev_time + config.get('bot', 'freq', 'int'): 
    122127                        if __debug__: 
    123                                 prev = time.strftime('%y/%m/%d %H:%M:%S', time.localtime(self._prev_time)) 
    124                                 print >> sys.stderr, 'DEBUG> Not expired: prev time is %s' % prev 
     128                                prev = time.strftime('%H:%M:%S', time.localtime(self._prev_time)) 
     129                                go = time.strftime('%H:%M:%S', time.localtime(self._prev_time + config.get('bot', 'freq', 'int'))) 
     130                                print >> sys.stderr, 'DEBUG> Not expired: prev time is %s, be expired at: %s' % (prev, go) 
    125131                        return False 
    126132                self._prev_time = _current_time 
    127133 
    128                 self.silence(msg, c, e) 
     134                self.silence(msg, c, e, to) 
    129135                if self._silent: 
    130136                        return False 
     
    138144                title, url = self.process_keyword(' '.join(nominals)) 
    139145                if title and url: 
    140                         channel = e.target() 
    141146                        content = unicoding(config.get('bot', 'content')) 
    142147                        try: 
     
    148153                                return False 
    149154 
    150                         c.privmsg(channel, message) 
     155                        c.notice(to, message) 
    151156                        return True 
    152157                return False 
     
    154159        ACTIVE_PATTERN = re.compile(unicoding(config.get('bot', 'active_pattern'))) 
    155160        SILENT_PATTERN = re.compile(unicoding(config.get('bot', 'silent_pattern'))) 
    156         def silence(self, msg, c, e): 
    157                 ch = e.target() 
     161        def silence(self, msg, c, e, to): 
    158162                active = self.ACTIVE_PATTERN.search(msg) 
    159163                silent = self.SILENT_PATTERN.search(msg) 
     
    163167                if active: 
    164168                        self._silent = False 
    165                         c.privmsg(ch, ununicoding(config.get('bot', 'thanks'))) 
     169                        c.notice(to, ununicoding(config.get('bot', 'thanks'))) 
    166170                elif silent: 
    167171                        self._silent = True 
    168                         c.privmsg(ch, ununicoding(config.get('bot', 'sorry'))) 
     172                        c.notice(to, ununicoding(config.get('bot', 'sorry'))) 
    169173 
    170174        def process_keyword(self, keyword): 
     
    176180        process_keyword メ゜ッドで Amazon ぞク゚リを投げお結果を返す 
    177181        """ 
     182        _AVAIL_PRODUCT_LINES = { 
     183                'books-jp': '(和曞, default)', 
     184                'books-us': '(掋曞)', 
     185                'music-jp': '(ポピュラヌ音楜)', 
     186                'classical-jp': '(クラシック音楜)', 
     187                'dvd-jp': '(DVD)', 
     188                'vhs-jp': '(ビデオ)', 
     189                'electronics-jp': '(゚レクトロニクス)', 
     190                'kitchen-jp': '(ホヌムキッチン)', 
     191                'software-jp': '(゜フトりェア)', 
     192                'videogames-jp': '(ゲヌム)', 
     193                'magazines-jp': '(雑誌)', 
     194                'toys-jp': '(おもちゃホビヌ)', 
     195        } 
     196 
    178197        def __init__(self): 
    179198                AmazonBotBase.__init__(self) 
     
    182201                return 'AmazonBot by %s, based on python-irclib' % __author__ 
    183202 
    184         def onmsg_isbn(self, c, e, args): 
     203        def onmsg_isbn(self, c, e, to, args): 
    185204                """Syntax: !isbn <ISBN number> 
    186205                """ 
    187                 return self.onmsg_asin(c, e, args) 
    188         def onmsg_asin(self, c, e, args): # FIXME: arg がなかったずきの゚ラヌ凊理を远加するこず 
     206                return self.onmsg_asin(c, e, to, args) 
     207        def onmsg_asin(self, c, e, to, args): 
    189208                """Syntax: !asin <ASIN number> 
    190209                """ 
     
    195214                        data = my_amazon.searchByASIN(args[0]) 
    196215                except my_amazon.AmazonError, err: 
    197                         ch = e.target() 
    198                         c.privmsg(ch, ununicoding(config.get('bot', 'no_products'))) 
     216                        c.notice(to, ununicoding(config.get('bot', 'no_products'))) 
    199217                        if __debug__: 
    200218                                print >> sys.stderr, 'DEBUG> Caught AmazonError in onmsg_asin: %s' % str(err) 
    201219                        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, ...] 
     220                except IndexError, err: 
     221                        c.notice(to, 'Please specify an argument.') 
     222                        return False 
     223 
     224                return self._process_onmsg(c, e, to, data) 
     225 
     226        def onmsg_k(self, c, e, to, args): return self.onmsg_keyword(c, e, to, args) 
     227        def onmsg_keyword(self, c, e, to, args): 
     228                """Syntax: !keyword [-h] [-t type] <keyword1> [, keyword2, ...] 
    207229                """ 
    208                 return self.onmsg_amazon(c, e, args) 
    209         def onmsg_amazon(self, c, e, args): # FIXME: arg がなかったずきの゚ラヌ凊理を远加するこず 
    210                 """Syntax: !amazon [-h] [-t type] keyword1 [, keyword2, ...] 
    211                 """ 
    212                 if __debug__: 
    213                         print >> sys.stderr, 'DEBUG> in amazon command: %s' % str(args) 
     230                if __debug__: 
     231                        print >> sys.stderr, 'DEBUG> in keyword command: %s' % str(args) 
    214232 
    215233                try: 
     
    217235                except getopt.GetoptError, err: 
    218236                        if __debug__: 
    219                                 print >> sys.stderr, 'DEBUG> Caught GetoptError in onmsg_amazon: %s' % str(err) 
    220                         return False 
    221  
    222                 keyword = ' '.join(rest) 
     237                                print >> sys.stderr, 'DEBUG> Caught GetoptError in onmsg_keyword: %s' % str(err) 
     238                        return False 
     239 
     240                keyword = ' '.join(rest).strip() 
    223241                product_line = 'books-jp' 
    224242                for opt, val in options: 
    225243                        if opt in ['-t', '--type']: 
     244                                if val not in self._AVAIL_PRODUCT_LINES.keys(): 
     245                                        c.notice(to, 'Type "%s" is not available.' % val) 
     246                                        return False 
     247 
    226248                                product_line = val 
    227249                                break 
     250 
    228251                        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))) 
     252                                _from = nm_to_n(e.source()) # ログを流しおしたうのでヘルプは盎接送信å 
     253ƒãž 
     254                                c.notice(_from, ununicoding('Available types:')) 
     255 
     256                                for key, val in self._AVAIL_PRODUCT_LINES.iteritems(): 
     257                                        time.sleep(1) # XXX: 連続投皿するず匟かれるこずがあるので暫定察凊 
     258                                        c.notice(_from, ununicoding(' * %s: %s' % (key, val))) 
     259 
    239260                                return True 
     261 
     262                if not keyword: 
     263                        c.notice(to, 'Please specify keywords.') 
     264                        return False 
    240265 
    241266                if __debug__: 
     
    246271                        data = my_amazon.searchByKeyword(keyword, product_line=product_line) 
    247272                except my_amazon.AmazonError, err: 
    248                         ch = e.target() 
    249                         c.privmsg(ch, ununicoding(config.get('bot', 'no_products'))) 
     273                        c.notice(to, ununicoding(config.get('bot', 'no_products'))) 
    250274                        if __debug__: 
    251275                                print >> sys.stderr, 'DEBUG> Caught AmazonError in onmsg_amazon: %s' % str(err) 
    252276                        return False 
    253277 
    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): 
     278                return self._process_onmsg(c, e, to, data) 
     279 
     280        def onmsg_h(self, c, e, to, args): return self.onmsg_help(c, e, to, args) 
     281        def onmsg_help(self, c, e, to, args): 
     282                """Syntax: !help 
     283                """ 
     284                if __debug__: 
     285                        print >> sys.stderr, 'DEBUG> in help command: %s' % str(args) 
     286 
     287                _from = nm_to_n(e.source()) # ログを流しおしたうのでヘルプは盎接送信å 
     288ƒãž 
     289                docs = [] 
     290                for key in dir(self): 
     291                        val = getattr(self, key, '') 
     292                        if __debug__: 
     293                                print >> sys.stderr, 'DEBUG> key=%s, val=%s' % (key, ununicoding(str(val), 'euc-jp')) 
     294 
     295                        if key[:6] != 'onmsg_': 
     296                                continue 
     297 
     298                        doc = val.__doc__ 
     299                        if doc: 
     300                                doc = doc.strip() 
     301                                if not doc: 
     302                                        continue 
     303                                time.sleep(1) # XXX: 連続投皿するず匟かれるっぜいので暫定察凊 
     304                                c.notice(_from, doc) 
     305 
     306                return True 
     307 
     308        def _process_onmsg(self, c, e, to, data): 
    260309                if type(data.Details) is not list: 
    261310                        data.Details = [data.Details] 
     
    264313                title = ununicoding(detail.ProductName) 
    265314                url = ununicoding(detail.URL) 
    266                 channel = config.get('irc', 'channel') 
    267                 c.privmsg(channel, '%(title)s: %(url)s' % locals()) 
     315                c.notice(to, '%(title)s: %(url)s' % locals()) 
    268316 
    269317                return True 
     
    294342        bot = AmazonBot() 
    295343        bot.start() 
     344        print '> Bye ;)' 
Note: See TracChangeset for help on using the changeset viewer.