From 23c1dffa101536889dd6bcef198233ee980add7f Mon Sep 17 00:00:00 2001 From: "Sean B. Palmer" Date: Sun, 2 Mar 2008 11:16:25 +0000 Subject: [PATCH] Fixed some .u stuff, added .bytes, and made Ctrl+C work. --- __init__.py | 20 +++++++++++++++++++- modules/codepoints.py | 42 ++++++++++++++++++++++++++++++++---------- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/__init__.py b/__init__.py index 8137683..752fd02 100755 --- a/__init__.py +++ b/__init__.py @@ -7,9 +7,26 @@ Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ """ -import sys, time, threading +import sys, os, time, threading, signal import bot +class Watcher(object): + # Cf. http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496735 + def __init__(self): + self.child = os.fork() + if self.child != 0: + self.watch() + + def watch(self): + try: os.wait() + except KeyboardInterrupt: + self.kill() + sys.exit() + + def kill(self): + try: os.kill(self.child, signal.SIGKILL) + except OSError: pass + def run_phenny(config): if hasattr(config, 'delay'): delay = config.delay @@ -19,6 +36,7 @@ def run_phenny(config): p = bot.Phenny(config) p.run(config.host) + Watcher() while True: connect(config) if not isinstance(delay, int): break diff --git a/modules/codepoints.py b/modules/codepoints.py index f2eb862..89ea078 100755 --- a/modules/codepoints.py +++ b/modules/codepoints.py @@ -11,7 +11,8 @@ import re, unicodedata from itertools import islice def about(u, cp=None, name=None): - if cp is None: cp = ord(u) + if cp is None: + cp = ord(u) if name is None: try: name = unicodedata.name(u) except ValueError: @@ -65,16 +66,27 @@ def codepoint_extended(arg): def u(phenny, input): arg = input.bytes[3:] + # phenny.msg('#inamidst', '%r' % arg) + if not arg: + return phenny.reply('You gave me zero length input.') - ascii = True - for c in arg: - if ord(c) >= 0x80: - ascii = False + # @@ space + if set(arg.upper()) - set( + 'ABCDEFGHIJKLMNOPQRSTUVWYXYZ0123456789- .?+*{}[]\\/^$'): + printable = False + else: printable = True - if ascii: - if set(arg.upper()) - set('ABCDEFGHIJKLMNOPQRSTUVWXYZ '): - extended = True - else: extended = False + if printable: + extended = False + for c in '.?+*{}[]\\/^$': + if c in arg: + extended = True + break + + if len(arg) == 4: + try: u = unichr(int(arg, 16)) + except ValueError: pass + else: return phenny.say(about(u)) if extended: # look up a codepoint with regexp @@ -84,6 +96,8 @@ def u(phenny, input): phenny.say(result) elif (i == 2) and (len(results) > 3): phenny.say(result + ' [...]') + if not results: + phenny.reply('Sorry, no results') else: # look up a codepoint freely result = codepoint_simple(arg) @@ -97,7 +111,15 @@ def u(phenny, input): for u in text: phenny.say(about(u)) # look up more than three podecoints - elif len(text) <= 8: + elif len(text) <= 10: phenny.reply(' '.join('U+%04X' % ord(c) for c in text)) else: phenny.reply('Sorry, your input is too long!') u.commands = ['u'] + +def bytes(phenny, input): + b = input.bytes + phenny.reply('%r' % b[b.find(' ') + 1:]) +bytes.commands = ['bytes'] + +if __name__ == '__main__': + print __doc__.strip()