Source code for interface

"""
	Basically the user interface for ScalyMUCK.

	Copyright (c) 2013 Robert MacGregor
	This software is licensed under the GNU General
	Public License version 3. Please refer to gpl.txt 
	for more information.
"""

import string
import logging
import importlib
import inspect

from blinker import signal

import modloader
import permissions
from game import exception, settings

logger = logging.getLogger('Mods')
[docs]class Interface: """ Client-Server interface class. The interface class is exactly how it sounds; it's what the users interact with directly when connected to the ScalyMUCK server, with an exception being the login screen for simplicity and security. """ world = None config = None session = None server = None permissions = None workdir = '' modloader = None pre_message = signal('pre_message_sent') post_message = signal('post_message_sent')
[docs] def __init__(self, config=None, world=None, workdir='', session=None, server=None): """ Initializes an instance of the ScalyMUCK Client-Server interface class. The interface class is created internallu by the ScalyMUCK server. The server passes in an active instance of game.Settings and game.World for the interface to talk to when loading mods as the configuration is used to load relevant config files for the mods and is passed in while the instance of game.World is assigned to each module so that they may access the game world. Keyword arguments: config -- An instance of Settings that is to be used to load relevant configuration data. world -- An instance of the World to pass over to every initialized modification. workdir -- The current working directory of the application. This should be an absolute path to application/. session -- A working session object that points to the active database. server -- The very instance of the ScalyMUCK server. """ self.logger = logging.getLogger('Mods') self.world = world self.workdir = workdir self.config = config self.session = session self.server = server self.permissions = permissions.Permissions(workdir=workdir) self.modloader = modloader.ModLoader(world=world, interface=self, session=session, workdir=workdir, permissions=self.permissions) self.modloader.load(config.get_index('LoadedMods', str))
[docs] def parse_command(self, sender=None, input=None): """ Called internally by the ScalyMUCK server. When a user sends a string of data to the server for processing and have passed the initial authentification stage, that string of data is passed in here by the server for processing. This function is what actually performs the command lookups in the loaded command database. Keyword arguments: sender -- The instance of Player that has trying to invoke a command. input -- The text that the Player happened to send. """ returns = self.pre_message.send(None, sender=sender, input=input) intercept_input = False for set in returns: if (set[1] is True): intercept_input = True break data = string.split(input, ' ') command = string.lower(data[0]) command_data = self.modloader.find_command(command) if (intercept_input is False and command_data is not None): try: privilege = command_data['privilege'] if (privilege == 1 and sender.is_admin is False): sender.send('You must be an administrator.') return elif (privilege == 2 and sender.is_sadmin is False): sender.send('You must be a super administrator.') return elif (privilege == 3 and sender.is_owner is False): sender.send('You must be the owner of the server.') return # You're not trying to do something you shouldn't be? Good. command_func = command_data['command'] command_func(sender=sender, input=input[len(command)+1:], arguments=data[1:len(data)]) except exception.ModApplicationError as e: line_one = 'An error has occurred while executing the command: %s' % (command) line_two = 'From modification: %s' % (self.commands[command]['modification']) line_three = 'Error Condition: ' line_four = str(e) self.logger.error(line_one) self.logger.error(line_two) self.logger.error(line_three) self.logger.error(line_four) sender.send(line_one) sender.send(line_two) sender.send(line_three) sender.send(line_four) sender.send('Please report this incident to your server administrator immediately.') elif (intercept_input is False and command != ''): sender.send('I do not know what it is to "%s".' % (command)) self.post_message.send(None, sender=sender, input=input)