talk-0.001/
talk-0.001/CVS/
talk-0.001/talklib/CVS/
"""This file contains one class, Command, which is instanced whenever
a command is typed into the talker"""

import time,re

class Command:

    def __init__(self,session,msg):
        '''Set up initial variables, parse the command, update timestamp
        and execute it''' 
        self.session = session
        self.user = self.session.user
        self.get_cmd_and_args(msg)
        self.user.time = time.time()
        self.execute_command()
        
    def get_cmd_and_args(self,msg):
        '''Parses the command. Sets command, args and a variable
        called rawargs, which is the args un-strip()ped.

        It first checks if the command is alphanumeric or symbolic (by
        its first char) and uses a different regexp to parse each. The
        symbolic commands are all one char in length atm, but this is
        likely to change in the future.'''
        if msg[0].isalnum():
            pattern = re.compile(r'^(\w+)(.*)$')
        else:
            pattern = re.compile(r'^(.)(.*)$')        
        result = pattern.match(msg)
        rawcommand = result.group(1)
        self.command = result.group(1).strip().lower()
        self.rawargs = result.group(2)
        self.args = self.rawargs.strip()

    def execute_command(self):
        '''This is the function that decides what command is in
        self.command and executes the appropriate method for it. It
        uses a dispatcher function, with some special cases for the
        aliases of each command. Thanks to Robin Munn on
        comp.lang.python for the idea.'''       
    	special_cases = {
            "'": self.do_say,
            '"': self.do_say,
            ';': self.do_emote,
            ':': self.do_emote,
            '~': self.do_think,
            ')': self.do_sing
	}
        if special_cases.has_key(self.command):
            special_cases[self.command]()
        elif hasattr(self,'do_' + self.command):
            getattr(self,'do_' + self.command)()
        else:
            self.do_ERROR()
        
    def do_ERROR(self):
        'This command executed when unknown command typed'
        self.session.send_user(
            "I'm sorry, I don't know how to %s. I'm very primitive." %
            self.command)

    def do_who(self):
        '''This command iterates over all the users and displays them
        to the user who typed the command'''
        users = self.session.allusers.userdict
        self.session.send_user("-WHO (name, idle time)-")
        for user in users:
            str = "%s, " % users[user].name
            str += `int(time.time() - users[user].time)`
            self.session.send_user(str)
        self.session.send_user("-----------------------")

    def do_say(self):
        'The basic "say" command'
        if self.args == "":
            self.session.send_user("Format: say <line>")
            return
        if self.args.endswith('?'): typeofsay = 'asks'
        elif self.args.endswith('!'): typeofsay = 'exclaims'
        else: typeofsay = 'says'
        self.session.send_all("%s %s '%s'" % (self.user.name,typeofsay,
                                              self.args))

    def do_emote(self):
        'Emote is something like "Owl waves"'
        if self.args == "":
            self.session.send_user("Format: emote <action>")
            return
        if self.rawargs[0] in ";:":
            self.args = self.args[1:]
            self.do_pemote()
            return
        if not self.args[0] in "',":
            self.args = " " + self.args
        self.session.send_all("%s%s" % (self.user.name, self.args))

    def do_pemote(self):
        "This is an emote with 's , eg \"Owl's computer is slow\""
        if self.args == "":
            self.session.send_user("Format: pemote <action>")
            return
        self.session.send_all("%s's %s" % (self.user.name, self.args))


    def do_think(self):
        'Self explanatory :)'
        if self.args == "":
            self.session.send_user("Format: think <thought>")
            return
        self.session.send_all("%s thinks . o O ( %s )" %
                              (self.user.name, self.args))

    def do_sing(self):
        'This too :)'
        if self.args == "":
            self.session.send_user("Format: sing <lyrics>")
            return
        self.session.send_all("%s sings o/~ %s o/~" % (self.user.name,
                                                       self.args))

    def do_hug(self):
        '''This code will be abstracted into a more generalised
        "social" command later'''
        if self.args == "":
            self.session.send_user("Format: hug <username>")
            return
        users = self.session.allusers.userdict
        usertyped = self.args.strip().lower()
        if usertyped in users:
            self.session.send_all("%s extends arms and hugs %s" %
                                  (self.user.name, users[usertyped].name))
        else:
            self.session.send_user("I can't find anyone called %s." %
                                   self.args)