Changeset 10 for trunk/amazonbot


Ignore:
Timestamp:
06/20/06 14:03:50 (18 years ago)
Author:
atzm
Message:

freq

Location:
trunk/amazonbot
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/amazonbot/amazonbot.ini.sample

    r9 r10  
    99 
    1010[bot] 
     11freq = 120 
    1112nick = amazonbot 
    1213content = そんなアナタにこれがオススメ 
    1314thanks = ありがずう 
    1415sorry = 正盎すたんかった 
     16bye = さようならたた䌚う日たで 
    1517active_pattern = ごめん|ゎメン|すたん|スマン|すいたせん 
    1618silent_pattern = 邪魔|じゃた|ゞャマ|うる(さい|せヌ)|だたれ 
  • trunk/amazonbot/amazonbot.py

    r9 r10  
    1010import re 
    1111import sys 
     12import time 
    1213import random 
    1314import MeCab 
     15import nkf 
    1416 
    1517from ircbot import SingleServerIRCBot 
     
    2931 
    3032def uniq(sequence): 
     33        """リストから重耇を取り陀く (順番が狂うので泚意) 
     34        """ 
    3135        return list(set(sequence)) 
    3236 
     37def unicoding(text): 
     38        """text を匷制的に unicode オブゞェクトに倉換 
     39        """ 
     40        if type(text) is unicode: 
     41                return text 
     42        return unicode(nkf.nkf('-w', text), 'utf-8') 
     43 
     44def ununicoding(text, encoding='iso-2022-jp'): 
     45        """text を指定された encoding で゚ンコヌドしraw str に匷制倉換 
     46        """ 
     47        if type(text) is not unicode: 
     48                return unicoding(text).encode(encoding) 
     49        return text.encode(encoding) 
     50 
    3351def mecab_parse(text): 
     52        """MeCab を䜿っお圢æ 
     53‹çŽ è§£æžã—固有名詞ず䞀般名詞だけを抜出する 
     54        """ 
    3455        def choice_nominal(wlist): 
    3556                res = [] 
     
    3758                        wtypes = wtype.split('-') 
    3859                        if '固有名詞' in wtypes or ('名詞' in wtypes and '䞀般' in wtypes): 
    39                                 res.append(word) 
     60                                res.append(unicoding(word)) 
    4061                return res 
    4162 
     63        text = ununicoding(text, 'utf-8') 
    4264        result = [] 
    4365        tag = MeCab.Tagger('-Ochasen') 
     
    5274 
    5375class AmazonBotBase(SingleServerIRCBot): 
     76        """アマゟンボットのベヌスクラス 
     77        こい぀単䜓では受け取ったメッセヌゞの圢æ 
     78‹çŽ è§£æžãšåè©žæŠœå‡ºãŸã§ã—かやらない 
     79        サブクラスで process_keyword を実裠
     80しお Amazon ぞク゚リを投げるべし 
     81        """ 
    5482        def __init__(self): 
    5583                _server = [(config.get('irc', 'server'), config.get('irc', 'port', 'int'))] 
    5684                _nick = config.get('bot', 'nick') 
    5785 
     86                self._prev_time = time.time() 
    5887                self._silent = False 
    5988                SingleServerIRCBot.__init__(self, _server, _nick, _nick) 
    6089 
    61         def get_version(self): 
    62                 return 'AmazonBot by %s, based on python-irclib' % __author__ 
     90        def start(self): 
     91                try: 
     92                        SingleServerIRCBot.start(self) 
     93                except KeyboardInterrupt: 
     94                        self.die(ununicoding(config.get('bot', 'bye'))) 
    6395 
    6496        def on_welcome(self, c, e): 
    6597                c.join(config.get('irc', 'channel')) 
    6698                if __debug__: 
    67                         print >> sys.stderr, '* Joined %s' % config.get('irc', 'channel') 
     99                        print >> sys.stderr, 'DEBUG> Joined %s' % config.get('irc', 'channel') 
    68100 
    69101        def on_nicknameinuse(self, c, e): 
     
    74106 
    75107        def on_pubmsg(self, c, e): 
    76                 try: 
    77                         msg = unicode(e.arguments()[0], 'iso-2022-jp') 
    78                 except UnicodeError: 
     108                if time.time() > self._prev_time + config.get('bot', 'freq', 'int'): 
    79109                        if __debug__: 
    80                                 print >> sys.stderr, 'ERR: incoming message encoding failed: %s' % e.arguments() 
     110                                prev = time.strftime('%y/%m/%d %H:%M:%S', time.localtime(self._prev_time)) 
     111                                print >> sys.stderr, 'DEBUG> Not expired: prev time is %s' % prev 
    81112                        return False 
     113 
     114                msg = unicoding(e.arguments()[0]) 
    82115 
    83116                self.silence(msg, c, e) 
     
    85118                        return False 
    86119 
    87                 nominals = mecab_parse(msg.encode('utf-8')) 
     120                nominals = mecab_parse(msg) 
    88121                if not nominals: 
     122                        if __debug__: 
     123                                print >> sys.stderr, "DEBUG> Couldn't find nominal words" 
    89124                        return False 
    90125 
     
    92127                if title and url: 
    93128                        channel = e.target() 
    94  
    95                         content = unicode(config.get('bot', 'content'), 'utf-8') 
    96                         title = title 
    97  
     129                        content = unicoding(config.get('bot', 'content')) 
    98130                        try: 
    99                                 message = ('%(content)s: %(title)s %(url)s' % locals()).encode('iso-2022-jp') 
     131                                message = ununicoding(': '.join([content, title, url])) 
    100132                        except UnicodeError: 
    101                                 if __debug__: 
    102                                         print >> sys.stderr, 'ERR: my message encoding failed: ' 
    103                                         print >> sys.stderr, ' * content> %s' % content 
    104                                         print >> sys.stderr, ' * title> %s' % title 
    105                                         print >> sys.stderr, ' * url> %s' % url 
    106133                                return False 
     134                                # なぜかたたに unicode オブゞェクトを iso-2022-jp で゚ンコヌドできない 
    107135 
    108136                        c.privmsg(channel, message) 
    109  
    110137                        return True 
    111  
    112138                return False 
    113139 
    114         ACTIVE_PATTERN = re.compile(config.get('bot', 'active_pattern')) 
    115         SILENT_PATTERN = re.compile(config.get('bot', 'silent_pattern')) 
     140        ACTIVE_PATTERN = re.compile(unicoding(config.get('bot', 'active_pattern'))) 
     141        SILENT_PATTERN = re.compile(unicoding(config.get('bot', 'silent_pattern'))) 
    116142        def silence(self, msg, c, e): 
    117143                ch = e.target() 
    118                 active = self.ACTIVE_PATTERN.search(msg.encode('utf-8')) 
    119                 silent = self.SILENT_PATTERN.search(msg.encode('utf-8')) 
     144                active = self.ACTIVE_PATTERN.search(msg) 
     145                silent = self.SILENT_PATTERN.search(msg) 
    120146                if __debug__: 
    121                         print >> sys.stderr, 'ACTIVE_PATTERN: %s, SILENT_PATTERN: %s' % (str(active), str(silent)) 
     147                        print >> sys.stderr, 'DEBUG> ACT_PATT: %s, SIL_PATT: %s' % (str(active), str(silent)) 
    122148 
    123149                if active: 
    124150                        self._silent = False 
    125                         c.privmsg(ch, unicode(config.get('bot', 'thanks'), 'utf-8').encode('iso-2022-jp')) 
     151                        c.privmsg(ch, ununicoding(config.get('bot', 'thanks'))) 
    126152                elif silent: 
    127153                        self._silent = True 
    128                         c.privmsg(ch, unicode(config.get('bot', 'sorry'), 'utf-8').encode('iso-2022-jp')) 
     154                        c.privmsg(ch, ununicoding(config.get('bot', 'sorry'))) 
    129155 
    130156        def process_keyword(self, keyword): 
     
    132158 
    133159class AmazonBot(AmazonBotBase): 
     160        """アマゟンボットの実裠
     161クラス 
     162        process_keyword メ゜ッドで Amazon ぞク゚リを投げお結果を返す 
     163        """ 
    134164        def __init__(self): 
    135165                AmazonBotBase.__init__(self) 
    136166 
     167        def get_version(self): 
     168                return 'AmazonBot by %s, based on python-irclib' % __author__ 
     169 
    137170        def process_keyword(self, keyword): 
     171                keyword = ununicoding(keyword, 'utf-8') 
     172                if __debug__: 
     173                        print >> sys.stderr, 'DEBUG> KEYWORD: %s' % ununicoding(keyword, 'euc-jp') 
     174 
    138175                try: 
    139176                        data = my_amazon.searchByBlended(keyword) 
    140177                        if type(data.ProductLine) is not type([]): 
    141178                                data.ProductLine = [data.ProductLine] 
    142                 except my_amazon.AmazonError: 
     179                except my_amazon.AmazonError, e: 
     180                        if __debug__: 
     181                                print >> sys.stderr, 'DEBUG> Caught AmazonError: %s' % str(e) 
    143182                        return [None, None] 
    144183 
     
    146185                detail = random.choice(product_line.ProductInfo.Details) 
    147186 
    148                 url = getattr(detail, 'URL', None) 
    149                 product_name = getattr(detail, 'ProductName', None) 
     187                url = unicoding(getattr(detail, 'URL', None)) 
     188                product_name = unicoding(getattr(detail, 'ProductName', None)) 
    150189 
    151190                return [product_name, url] 
Note: See TracChangeset for help on using the changeset viewer.