From c0381a7bf47d584258f254d76fc6b8cc473f1442 Mon Sep 17 00:00:00 2001 From: urlbot Date: Tue, 16 Dec 2014 08:48:03 +0100 Subject: [PATCH] all plugins: cleanup, early return, use argv0 instead of data --- plugins.py | 346 ++++++++++++++++++++++++++++------------------------- 1 file changed, 180 insertions(+), 166 deletions(-) diff --git a/plugins.py b/plugins.py index 2317718..862c8a3 100644 --- a/plugins.py +++ b/plugins.py @@ -139,55 +139,46 @@ def command_command(args): return { 'name': 'command', 'desc': 'lists commands', - 'args': ('data', 'reply_user', 'cmd_list'), + 'args': ('argv0', 'reply_user', 'cmd_list'), 'ratelimit_class': RATE_GLOBAL } - if 'command' in args['data']: - logger('plugin', 'sent command list') - return { - 'msg': args['reply_user'] + ': known commands: ' + str(args['cmd_list']).strip('[]') - } + if 'command' != args['argv0'] and 'commands' != args['argv0']: + return + + logger('plugin', 'sent command list') + return { + 'msg': args['reply_user'] + ': known commands: ' + str(args['cmd_list']).strip('[]') + } def command_help(args): if 'register' == args: return { 'name': 'help', 'desc': 'print help for a command', - 'args': ('data', 'reply_user', 'cmd_list'), + 'args': ('argv0', 'argv1', 'reply_user', 'cmd_list'), 'ratelimit_class': RATE_GLOBAL } - cmd = None - flag = False + if 'help' != args['argv0']: + return - for word in args['data'].split(): - if True == flag: - cmd = word - break - - if 'help' == word: - flag = True - - if False == flag: # no match on 'help' - return None - - if None == cmd: + if None == args['argv1']: logger('plugin', 'empty help request, sent all commands') - args['data'] += 'command' # this is a little hacky... + args['argv0'] = 'command' # this is a little hacky... return command_command(args) - if not cmd in [p['name'] for p in plugins['command']]: - logger('plugin', 'no help found for %s' % cmd) + if not args['argv1'] in [p['name'] for p in plugins['command']]: + logger('plugin', 'no help found for %s' % args['argv1']) return { - 'msg': args['reply_user'] + ': no such command: %s' % cmd + 'msg': args['reply_user'] + ': no such command: %s' % args['argv1'] } for p in plugins['command']: - if cmd == p['name']: - logger('plugin', 'sent help for %s' % cmd) + if args['argv1'] == p['name']: + logger('plugin', 'sent help for %s' % args['argv1']) return { - 'msg': args['reply_user'] + ': help for %s: %s' % (cmd, p['desc']) + 'msg': args['reply_user'] + ': help for %s: %s' % (args['argv1'], p['desc']) } @@ -196,157 +187,175 @@ def command_version(args): return { 'name': 'version', 'desc': 'prints version', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'reply_user'), 'ratelimit_class': RATE_GLOBAL } - if 'version' in args['data']: - logger('plugin', 'sent version string') - return { - 'msg': args['reply_user'] + (''': I'm running ''' + VERSION) - } + if 'version' != args['argv0']: + return + + logger('plugin', 'sent version string') + return { + 'msg': args['reply_user'] + (''': I'm running ''' + VERSION) + } def command_klammer(args): if 'register' == args: return { 'name': 'klammer', 'desc': 'prints an anoying paper clip aka. Karl Klammer', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'reply_user'), 'ratelimit_class': RATE_GLOBAL } - if 'klammer' in args['data']: - logger('plugin', 'sent karl klammer') - return { - 'msg': ( - args['reply_user'] + r''': _, Was moechten''', - args['reply_user'] + r''': ( _\_ Sie tun?''', - args['reply_user'] + r''': \0 O\ ''', - args['reply_user'] + r''': \\ \\ [ ] ja ''', - args['reply_user'] + r''': \`' ) [ ] noe''', - args['reply_user'] + r''': `'' ''' - ) - } + if 'klammer' != args['argv0']: + return + + logger('plugin', 'sent karl klammer') + return { + 'msg': ( + args['reply_user'] + ',', + r''' _, Was moechten''', + r'''( _\_ Sie tun?''', + r''' \0 O\ ''', + r''' \\ \\ [ ] ja ''', + r''' \`' ) [ ] noe''', + r''' `'' ''' + ) + } def command_unicode(args): if 'register' == args: return { 'name': 'unikot', 'desc': 'prints an unicode string', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'reply_user'), 'ratelimit_class': RATE_GLOBAL } - if 'unikot' in args['data']: - logger('plugin', 'sent some unicode') - return { - 'msg': ( - args['reply_user'] + ''': ┌────────┐''', - args['reply_user'] + ''': │Unicode!│''', - args['reply_user'] + ''': └────────┘''' - ) - } + if 'unikot' != args['argv0']: + return + + logger('plugin', 'sent some unicode') + return { + 'msg': ( + args['reply_user'] + ''', here's some''', + '''┌────────┐''', + '''│Unicode!│''', + '''└────────┘''' + ) + } def command_source(args): if 'register' == args: return { 'name': 'source', 'desc': 'prints git URL', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'reply_user'), 'ratelimit_class': RATE_GLOBAL } - if 'source' in args['data']: - logger('plugin', 'sent source URL') - return { - 'msg': 'My source code can be found at %s' % conf('src-url') - } + if 'source' != args['argv0']: + return + + logger('plugin', 'sent source URL') + return { + 'msg': 'My source code can be found at %s' % conf('src-url') + } def command_dice(args): if 'register' == args: return { 'name': 'dice', 'desc': 'rolls a dice', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'reply_user'), 'ratelimit_class': RATE_INTERACTIVE } - if 'dice' in args['data']: - if args['reply_user'] in conf('enhanced-random-user'): - rnd = 0 # this might confuse users. good. - logger('plugin', 'sent random (enhanced)') - else: - rnd = random.randint(1, 6) - logger('plugin', 'sent random') + if 'dice' != args['argv0']: + return - dice_char = ['◇', '⚀', '⚁', '⚂', '⚃', '⚄', '⚅'] - return { - 'msg': 'rolling a dice for %s: %s (%d)' % (args['reply_user'], dice_char[rnd], rnd) - } + if args['reply_user'] in conf('enhanced-random-user'): + rnd = 0 # this might confuse users. good. + logger('plugin', 'sent random (enhanced)') + else: + rnd = random.randint(1, 6) + logger('plugin', 'sent random') + + dice_char = ['◇', '⚀', '⚁', '⚂', '⚃', '⚄', '⚅'] + return { + 'msg': 'rolling a dice for %s: %s (%d)' % (args['reply_user'], dice_char[rnd], rnd) + } def command_uptime(args): if 'register' == args: return { 'name': 'uptime', 'desc': 'prints uptime', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'reply_user'), 'ratelimit_class': RATE_GLOBAL } - if 'uptime' in args['data']: - u = int(conf('uptime') + time.time()) - plural_uptime = 's' - plural_request = 's' + if 'uptime' != args['argv0']: + return - if 1 == u: - plural_uptime = '' - if 1 == conf('request_counter'): - plural_request = '' + u = int(conf('uptime') + time.time()) + plural_uptime = 's' + plural_request = 's' - logger('plugin', 'sent statistics') - return { - 'msg': args['reply_user'] + (''': happily serving for %d second%s, %d request%s so far.''' % (u, plural_uptime, conf('request_counter'), plural_request)) - } + if 1 == u: + plural_uptime = '' + if 1 == conf('request_counter'): + plural_request = '' + + logger('plugin', 'sent statistics') + return { + 'msg': args['reply_user'] + (''': happily serving for %d second%s, %d request%s so far.''' % (u, plural_uptime, conf('request_counter'), plural_request)) + } def command_ping(args): if 'register' == args: return { 'name': 'ping', 'desc': 'sends pong', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'reply_user'), 'ratelimit_class': RATE_INTERACTIVE } - if 'ping' in args['data']: - rnd = random.randint(0, 3) # 1:4 - if 0 == rnd: - msg = args['reply_user'] + ''': peng (You're dead now.)''' - logger('plugin', 'sent pong (variant)') - elif 1 == rnd: - msg = args['reply_user'] + ''': I don't like you, leave me alone.''' - logger('plugin', 'sent pong (dontlike)') - else: - msg = args['reply_user'] + ''': pong''' - logger('plugin', 'sent pong') + if 'ping' != args['argv0']: + return - return { - 'msg': msg - } + rnd = random.randint(0, 3) # 1:4 + if 0 == rnd: + msg = args['reply_user'] + ''': peng (You're dead now.)''' + logger('plugin', 'sent pong (variant)') + elif 1 == rnd: + msg = args['reply_user'] + ''': I don't like you, leave me alone.''' + logger('plugin', 'sent pong (dontlike)') + else: + msg = args['reply_user'] + ''': pong''' + logger('plugin', 'sent pong') + + return { + 'msg': msg + } def command_info(args): if 'register' == args: return { 'name': 'info', 'desc': 'prints info message', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'reply_user'), 'ratelimit_class': RATE_GLOBAL } - if 'info' in args['data']: - logger('plugin', 'sent long info') - return { - 'msg': args['reply_user'] + (''': I'm a bot, my job is to extract tags from posted URLs. In case I'm annoying or for further questions, please talk to my master %s. I'm rate limited and shouldn't post more than %d messages per %d seconds. To make me exit immediately, highlight me with 'hangup' in the message (emergency only, please). For other commands, highlight me with 'command'.''' % (conf('bot_owner'), conf('hist_max_count'), conf('hist_max_time'))) - } + if 'info' != args['argv0']: + return + + logger('plugin', 'sent long info') + return { + 'msg': args['reply_user'] + (''': I'm a bot, my job is to extract <title> tags from posted URLs. In case I'm annoying or for further questions, please talk to my master %s. I'm rate limited and shouldn't post more than %d messages per %d seconds. To make me exit immediately, highlight me with 'hangup' in the message (emergency only, please). For other commands, highlight me with 'command'.''' % (conf('bot_owner'), conf('hist_max_count'), conf('hist_max_time'))) + } def command_teatimer(args): if 'register' == args: @@ -357,90 +366,93 @@ def command_teatimer(args): 'ratelimit_class': RATE_GLOBAL } - if 'teatimer' == args['argv0']: - steep = conf('tea_steep_time') + if 'teatimer' != args['argv0']: + return - if None != args['argv1']: - try: - steep = int(args['argv1']) - except Exception as e: - return { - 'msg': args['reply_user'] + ': error when parsing int(%s): %s' % ( - args['argv1'], str(e) - ) - } - - ready = time.time() + steep + steep = conf('tea_steep_time') + if None != args['argv1']: try: - logger('plugin', 'tea timer set to %s' % time.strftime('%F.%T', time.localtime(ready))) - except ValueError as e: + steep = int(args['argv1']) + except Exception as e: return { - 'msg': args['reply_user'] + ': time format error: ' + str(e) + 'msg': args['reply_user'] + ': error when parsing int(%s): %s' % ( + args['argv1'], str(e) + ) } - register_event(ready, send_reply, (args['reply_user'] + ': Your tea is ready!', args['msg_obj'])) + ready = time.time() + steep + try: + logger('plugin', 'tea timer set to %s' % time.strftime('%F.%T', time.localtime(ready))) + except ValueError as e: return { - 'msg': args['reply_user'] + ': Tea timer set to %s' % time.strftime( - '%F.%T', time.localtime(ready) - ) + 'msg': args['reply_user'] + ': time format error: ' + str(e) } +# FIXME: this is currently broken because the msg_obj gets modified by the very +# first reply and can't be reused to .reply() with another message + register_event(ready, send_reply, (args['reply_user'] + ': Your tea is ready!', args['msg_obj'])) + + return { + 'msg': args['reply_user'] + ': Tea timer set to %s' % time.strftime( + '%F.%T', time.localtime(ready) + ) + } + def command_decode(args): if 'register' == args: return { 'name': 'decode', 'desc': 'prints the long description of an unicode character', - 'args': ('data', 'reply_user'), + 'args': ('argv0', 'argv1', 'reply_user'), 'ratelimit_class': RATE_GLOBAL } - if not 'decode' in args['data']: + if 'decode' != args['argv0']: return - d = args['data'].split() - - if 4 == len(d): - char = d[3][0] - char_esc = str(char.encode('unicode_escape'))[3:-1] - logger('plugin', 'decode called for %s' % char) - - try: - uni_name = unicodedata.name(char) - except Exception as e: - logger('plugin', 'decode(%s) failed: %s' % (char, str(e))) - return { - 'msg': args['reply_user'] + ": can't decode %s (%s): %s" % (char, char_esc, str(e)) - } - - return { - 'msg': args['reply_user'] + ': %s (%s) is called "%s"' % (char, char_esc, uni_name) - } - else: + if None == args['argv1']: return { 'msg': args['reply_user'] + ': usage: decode {single character}' } + char = args['argv1'] + char_esc = str(char.encode('unicode_escape'))[3:-1] + logger('plugin', 'decode called for %s' % char) + + try: + uni_name = unicodedata.name(char) + except Exception as e: + logger('plugin', 'decode(%s) failed: %s' % (char, str(e))) + return { + 'msg': args['reply_user'] + ": can't decode %s (%s): %s" % (char, char_esc, str(e)) + } + + return { + 'msg': args['reply_user'] + ': %s (%s) is called "%s"' % (char, char_esc, uni_name) + } + def command_show_blacklist(args): if 'register' == args: return { 'name': 'show-blacklist', 'desc': 'show the current URL blacklist, optionally filtered', - 'args': ('data', 'reply_user', 'argv1'), + 'args': ('argv0', 'reply_user', 'argv1'), 'ratelimit_class': RATE_GLOBAL } - if 'show-blacklist' in args['data']: - logger('plugin', 'sent URL blacklist') + if 'show-blacklist' != args['argv0']: + return - return { - 'msg': [ - args['reply_user'] + ': URL blacklist: ' + b - for b in conf('url_blacklist') - if not args['argv1'] or args['argv1'] in b - ] - } + logger('plugin', 'sent URL blacklist') + + return { + 'msg': [args['reply_user'] + ': URL blacklist: '] + [ + b for b in conf('url_blacklist') + if not args['argv1'] or args['argv1'] in b + ] + } def usersetting_get(args): blob = conf_load() @@ -534,16 +546,18 @@ def command_cake(args): # return { # 'name': 'dummy', # 'desc': 'dummy description', -# 'args': ('data', 'reply_user'), +# 'args': ('argv0', 'reply_user'), # 'ratelimit_class': RATE_GLOBAL # } # -# if 'dummy' in args['data']: -# logger('plugin', 'dummy plugin called') +# if 'dummy' != args['argv0']: +# return # -# return { -# 'msg': args['reply_user'] + ': dummy plugin called' -# } +# logger('plugin', 'dummy plugin called') +# +# return { +# 'msg': args['reply_user'] + ': dummy plugin called' +# } def command_else(args): logger('plugin', 'sent short info')