Example #1
0
def export_file(request):
    """
    Export game world files.
    """
    def file_iterator(file, chunk_size=512):
        while True:
            c = file.read(chunk_size)
            if c:
                yield c
            else:
                # remove temp file
                file.close()
                break

    response = http.HttpResponseNotModified()

    # get data's zip
    try:
        zipfile = tempfile.TemporaryFile()
        exporter.export_zip_all(zipfile)
        zipfile.seek(0)

        filename = time.strftime("worlddata_%Y%m%d_%H%M%S.zip",
                                 time.localtime())
        response = http.StreamingHttpResponse(file_iterator(zipfile))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="%s"' % filename
    except Exception, e:
        zipfile.close()
        message = "Can't export world: %s" % e
        logger.log_tracemsg(message)
        return render(request, 'fail.html', {"message": message})
Example #2
0
    def func(self):
        "Open a locked exit."
        caller = self.caller

        if not self.args:
            caller.msg({"alert": _("You should unlock something.")})
            return

        obj = caller.search_dbref(self.args, location=caller.location)
        if not obj:
            caller.msg({"alert": _("Can not find this exit.")})
            return

        try:
            # Unlock the exit.
            if not caller.unlock_exit(obj):
                caller.msg({"alert": _("Can not open this exit.") % obj.name})
                return
        except Exception as e:
            caller.msg({"alert": _("Can not open this exit.")})
            logger.log_tracemsg("Can not open exit %s: %s" % (obj.name, e))
            return

        # The exit may have different appearance after unlocking.
        # Send the lastest appearance to the caller.
        appearance = obj.get_appearance(caller)
        caller.msg({"look_obj": appearance})
Example #3
0
    def die(self, killers):
        """
        The monster is killed. Reborn in settings.NPC_REBORN_CD seconds.
        """
        try:
            super(MudderyMonster, self).die(killers)
            
            # delete itself and notify its location
            location = self.location

            if settings.NPC_REBORN_CD <= 0:
                # Can not reborn.
                delete_object(self.dbref)
            else:
                # Remove from its location.
                self.move_to(None, quiet=True, to_none=True)
                # Set reborn timer.
                TICKER_HANDLER.add(self, settings.NPC_REBORN_CD, hook_key="reborn")

            if location:
                for content in location.contents:
                    if content.has_player:
                        content.show_location()
        except Exception, e:
            logger.log_tracemsg("die error: %s" % e)
Example #4
0
    def func(self, args, request):
        file_obj = request.FILES.get("file", None)

        if not file_obj:
            raise MudderyError(ERR.missing_args, 'Missing data files.')

        fullname = file_obj.name
        filename, ext_name = os.path.splitext(fullname)
        table_name = args.get("table", None)

        if not table_name:
            table_name = filename

        file_type = ""
        if ext_name:
            file_type = ext_name[1:].lower()

        with tempfile.NamedTemporaryFile() as fp:
            try:
                for chunk in file_obj.chunks():
                    fp.write(chunk)
                importer.import_data_file(fp, table_name=table_name, file_type=file_type)
            except Exception, e:
                logger.log_tracemsg("Upload error: %s" % e.message)
                raise MudderyError(ERR.upload_error, e.message)
Example #5
0
    def die(self, killers):
        """
        The monster is killed. Reborn in settings.NPC_REBORN_CD seconds.
        """
        try:
            super(MudderyMonster, self).die(killers)

            # delete itself and notify its location
            location = self.location

            if self.reborn_cd <= 0:
                # Can not reborn.
                delete_object(self.dbref)
            else:
                # Remove from its location.
                self.move_to(None, quiet=True, to_none=True)
                # Set reborn timer.
                TICKER_HANDLER.add(self.reborn_cd, self.reborn)

            if location:
                for content in location.contents:
                    if content.has_player:
                        content.show_location()
        except Exception, e:
            logger.log_tracemsg("die error: %s" % e)
Example #6
0
def export_file(request):
    """
    Export game world files.
    """
    def file_iterator(file, chunk_size=512):
        while True:
            c = file.read(chunk_size)
            if c:
                yield c
            else:
                # remove temp file
                file.close()
                break

    response = http.HttpResponseNotModified()

    # get data's zip
    try:
        zipfile = tempfile.TemporaryFile()
        exporter.export_zip_all(zipfile)
        zipfile.seek(0)

        filename = time.strftime("worlddata_%Y%m%d_%H%M%S.zip", time.localtime())
        response = http.StreamingHttpResponse(file_iterator(zipfile))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="%s"' % filename
    except Exception, e:
        zipfile.close()
        message = "Can't export world: %s" % e
        logger.log_tracemsg(message)
        return render(request, 'fail.html', {"message": message})
Example #7
0
    def func(self):
        "Take off an equipment."
        caller = self.caller

        if not self.args:
            caller.msg({"alert": _("You should take off something.")})
            return

        obj = caller.search_dbref(self.args, location=caller)
        if not obj:
            # If the caller does not have this equipment.
            caller.msg({"alert": _("You don't have this equipment.")})
            return

        try:
            # Take off the equipment.
            caller.take_off_equipment(obj)
        except MudderyError as e:
            caller.msg({"alert": str(e)})
            return
        except Exception as e:
            caller.msg({"alert": _("Can not take off this equipment.")})
            logger.log_tracemsg("Can not take off %s: %s" %
                                (obj.get_data_key(), e))
            return

        # Send lastest status to the player.
        message = {"alert": _("Taken off!")}
        caller.msg(message)
Example #8
0
    def func(self):
        "Cast a skill."
        caller = self.caller

        if not caller.is_alive():
            caller.msg({"alert": LS("You are died.")})
            return

        if not self.args:
            caller.msg({"alert": LS("You should select a skill to cast.")})
            return

        skill_key = None
        if isinstance(self.args, basestring):
            # If the args is a skill's key.
            skill_key = self.args
        else:
            # If the args is skill's key and target.
            if not "skill" in self.args:
                caller.msg({"alert": LS("You should select a skill to cast.")})
                return
            skill_key = self.args["skill"]

        # Get target
        target = None
        if "target" in self.args:
            target = caller.search(self.args["target"])

        try:
            # Prepare to cast this skill.
            caller.prepare_skill(skill_key, target)
        except Exception, e:
            caller.msg({"alert": LS("Can not cast this skill.")})
            logger.log_tracemsg("Can not cast skill %s: %s" % (skill_key, e))
            return
Example #9
0
def apply_changes(request):
    """
    Apply the game world's data.
    """
    try:
        # load system localized strings
        importer.import_system_localized_strings(settings.LANGUAGE_CODE)

        # reload localized strings
        LOCALIZED_STRINGS_HANDLER.reload()

        # rebuild the world
        build_all()

        # send client settings
        CLIENT_SETTINGS.reset()
        text = json.dumps({"settings": CLIENT_SETTINGS.all_values()})
        SESSIONS.announce_all(text)

        # restart the server
        SESSIONS.announce_all(" Server restarting ...")
        SESSIONS.server.shutdown(mode='reload')
    except Exception, e:
        message = "Can't build world: %s" % e
        logger.log_tracemsg(message)
        return render(request, 'fail.html', {"message": message})
Example #10
0
    def func(self, args, request):
        try:
            # reload system data
            # import_syetem_data()

            # reload localized strings
            # LOCALIZED_STRINGS_HANDLER.reload()

            # rebuild the world
            build_all()

            # send client settings
            client_settings = GAME_SETTINGS.get_client_settings()
            text = json.dumps({"settings": client_settings})
            SESSIONS.announce_all(text)

            # restart the server
            SESSIONS.announce_all("Server restarting ...")
            SESSIONS.portal_restart_server()
        except Exception as e:
            message = "Can not build the world: %s" % e
            logger.log_tracemsg(message)
            raise MudderyError(ERR.build_world_error, message)

        return success_response("success")
Example #11
0
    def func(self, args, request):
        file_obj = request.FILES.get("file", None)

        if not file_obj:
            raise MudderyError(ERR.missing_args, 'Missing icon files.')

        file_type = args["type"]
        filename = file_obj.name
        path = os.path.join(settings.MEDIA_ROOT, settings.IMAGE_PATH, file_type)
        filepath = os.path.join(path, filename)
        exist = False

        if not os.path.exists(filepath):

            if not os.path.exists(path):
                # If does not exist, create one.
                os.makedirs(path)

            # save file
            fp = None
            try:
                fp = open(filepath, "wb+")
                for chunk in file_obj.chunks():
                    fp.write(chunk)
                fp.flush()
            except Exception, e:
                if fp:
                    fp.close()
                logger.log_tracemsg("Upload error: %s" % e.message)
                raise MudderyError(ERR.upload_error, e.message)
Example #12
0
    def func(self):
        "Use an object."
        caller = self.caller

        if not caller.is_alive():
            caller.msg({"alert": _("You are died.")})
            return

        if not self.args:
            caller.msg({"alert": _("You should use something.")})
            return

        obj = caller.search_dbref(self.args, location=caller)
        if not obj:
            # If the caller does not have this object.
            caller.msg({"alert": _("You don't have this object.")})
            return

        result = ""
        try:
            # Use the object and get the result.
            result = caller.use_object(obj)
        except Exception as e:
            ostring = "Can not use %s: %s" % (obj.get_data_key(), e)
            logger.log_tracemsg(ostring)

        # Send result to the player.
        if not result:
            result = _("No result.")
        caller.msg({"alert": result})
Example #13
0
    def func(self):
        "Use an object."
        caller = self.caller

        if not caller.is_alive():
            caller.msg({"alert": _("You are died.")})
            return

        if not self.args:
            caller.msg({"alert": _("You should discard something.")})
            return

        obj = caller.search_dbref(self.args, location=caller)
        if not obj:
            # If the caller does not have this object.
            caller.msg({"alert": _("You don't have this object.")})
            return

        # remove used object
        try:
            caller.remove_object(obj.get_data_key(), 1)
        except Exception as e:
            caller.msg({"alert": _("Can not discard this object.")})
            logger.log_tracemsg("Can not discard object %s: %s" %
                                (obj.get_data_key(), e))
            return
Example #14
0
def view_form(request):
    try:
        view = get_view(request)
        if view.is_valid():
            return view.view_form()
    except Exception, e:
        logger.log_tracemsg("Invalid view request: %s" % e)
Example #15
0
def quit_form(form_name, request):
    """
    Quit a form without saving.
    Args:
        request: http request

    Returns:
        HttpResponse
    """
    request_data = request.POST

    if "_referrer" in request_data:
        referrer = request_data.get("_referrer")
        if referrer:
            return HttpResponseRedirect(referrer)

    try:
        pos = request.path.rfind("/")
        if pos > 0:
            url = request.path[:pos] + "/list.html"
            if "_page" in request_data:
                page = request_data.get("_page")
                url += "?_page=" + str(page)
            return HttpResponseRedirect(url)
    except Exception, e:
        logger.log_tracemsg("quit form error: %s" % e)
Example #16
0
    def after_data_loaded(self):
        """
        Set data_info to the object.
        """
        super(MudderyRoom, self).after_data_loaded()

        self.peaceful = getattr(self.system, "peaceful", False)

        self.position = None
        try:
            # set position
            position = getattr(self.system, "position", None)
            if position:
                self.position = ast.literal_eval(position)
        except Exception as e:
            logger.log_tracemsg("load position error: %s" % e)

        # get background
        self.background = None
        resource = getattr(self.system, "background", None)
        if resource:
            try:
                resource_info = IMAGE_RESOURCES.get(resource)
                self.background = {
                    "resource": resource_info.resource,
                    "width": resource_info.image_width,
                    "height": resource_info.image_height
                }
            except Exception as e:
                logger.log_tracemsg("Load background %s error: %s" %
                                    (resource, e))
Example #17
0
def quit_list(request):
    """
    Quit a list.

    "editor/category/form/list.html" => "editor/category.html"

    Args:
        request: http request

    Returns:
        HttpResponse
    """
    request_data = request.POST

    if "_referrer" in request_data:
        referrer = request_data.get("_referrer")
        if referrer:
            return HttpResponseRedirect(referrer)

    try:
        pos = request.path.rfind("/")
        pos = request.path.rfind("/", 0, pos)
        if pos > 0:
            url = request.path[:pos] + ".html"
            return HttpResponseRedirect(url)
    except Exception, e:
        logger.log_tracemsg("quit list error: %s" % e)
Example #18
0
def apply_changes(request):
    """
    Apply the game world's data.
    """
    try:
        # reload localized strings
        LOCALIZED_STRINGS_HANDLER.reload()

        # rebuild the world
        build_all()

        # send client settings
        CLIENT_SETTINGS.reset()
        client_settings = CLIENT_SETTINGS.all_values()
        client_settings["game_name"] = GAME_SETTINGS.get("game_name")
        client_settings["show_social_box"] = not GAME_SETTINGS.get("solo_mode")
        text = json.dumps({"settings": client_settings})
        SESSIONS.announce_all(text)

        # restart the server
        SESSIONS.announce_all(" Server restarting ...")
        SESSIONS.server.shutdown(mode='reload')
    except Exception, e:
        message = "Can't build world: %s" % e
        logger.log_tracemsg(message)
        return render(request, 'fail.html', {"message": message})
Example #19
0
    def func(self, args, request):
        if ('table' not in args):
            raise MudderyError(ERR.missing_args, 'Missing the table name.')

        table_name = args['table']
        file_type = args.get("type", "csv")

        writer_class = writers.get_writer(file_type)
        if not writer_class:
            raise MudderyError(ERR.download_error,
                               "Unknown file type: %s" % file_type)

        # Get tempfile's name.
        temp_name = tempfile.mktemp()
        exporter.export_file(temp_name, table_name, file_type)
        fp = open(temp_name, "rb")
        try:
            filename = table_name + "." + writer_class.file_ext
            return file_response(fp, filename)
        except Exception as e:
            if fp:
                fp.close()
            logger.log_tracemsg("Download error: %s" % e)
            raise MudderyError(ERR.download_error,
                               "Download file error: %s" % e)
Example #20
0
    def func(self):
        """
        Give up a quest.

        Returns:
            None
        """
        caller = self.caller
        if not caller:
            return

        if not self.args:
            caller.msg({"alert": _("You should give up a quest.")})
            return

        quest_key = self.args

        try:
            # Give up the quest.
            caller.quest_handler.give_up(quest_key)
        except MudderyError as e:
            caller.msg({"alert": str(e)})
            return
        except Exception as e:
            caller.msg({"alert": _("Can not give up this quest.")})
            logger.log_tracemsg("Can not give up quest %s: %s" %
                                (quest_key, e))
            return

        # Send lastest status to the player.
        message = {"alert": _("Given up!")}
        caller.msg(message)
Example #21
0
def export_js_localized_strings(request):
    """
    Export all unlicalized strings in files.
    """
    response = http.HttpResponseNotModified()

    try:
        # write to a file
        file = tempfile.TemporaryFile()
        
        # get strings
        strings = utils.all_unlocalized_js_strings(True)

        for s in strings:
            file.write('"%s": "",\n' % s)

        file.seek(0)
        filename = time.strftime("strings_%Y%m%d_%H%M%S.js", time.localtime())
        response = http.StreamingHttpResponse(utils.file_iterator(file))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="%s"' % filename
    except Exception, e:
        message = "Can't export game data: %s" % e
        logger.log_tracemsg(message)

        file.close()
        return render(request, 'fail.html', {"message": message})
Example #22
0
def create_normal_player(session, playername, password):
    """
    Create a new player.
    """
    # sanity checks
    if not re.findall('^[\w. @+-]+$',
                      playername) or not (0 < len(playername) <= 32):
        # this echoes the restrictions made by django's auth
        # module (except not allowing spaces, for convenience of
        # logging in).
        string = "\n\r Playername can max be 32 characters or fewer. Letters, spaces, digits and @/./+/-/_ only."
        session.msg({"alert": string})
        return
    # strip excessive spaces in playername
    playername = re.sub(r"\s+", " ", playername).strip()
    if PlayerDB.objects.filter(username__iexact=playername):
        # player already exists (we also ignore capitalization here)
        session.msg({
            "alert":
            _("Sorry, there is already a player with the name '%s'.") %
            playername
        })
        return
    # Reserve playernames found in GUEST_LIST
    if settings.GUEST_LIST and playername.lower() in (
            guest.lower() for guest in settings.GUEST_LIST):
        string = "\n\r That name is reserved. Please choose another Playername."
        session.msg({"alert": string})
        return

    if not re.findall('^[\w. @+-]+$', password) or not (3 < len(password)):
        string = "\n\r Password should be longer than 3 characers. Letters, spaces, digits and @\.\+\-\_ only." \
                 "\nFor best security, make it longer than 8 characters. You can also use a phrase of" \
                 "\nmany words if you enclose the password in quotes."
        session.msg({"alert": string})
        return

    # Check IP and/or name bans
    bans = ServerConfig.objects.conf("server_bans")
    if bans and (any(tup[0] == playername.lower()
                     for tup in bans) or any(tup[2].match(session.address)
                                             for tup in bans if tup[2])):
        # this is a banned IP or name!
        string = "{rYou have been banned and cannot continue from here." \
                 "\nIf you feel this ban is in error, please email an admin.{x"
        session.msg({"alert": string})
        session.execute_cmd('{"cmd":"quit","args":""}')
        return

    # everything's ok. Create the new player account.
    new_player = None
    try:
        new_player = create_player(playername, password)
    except Exception, e:
        # We are in the middle between logged in and -not, so we have
        # to handle tracebacks ourselves at this point. If we don't,
        # we won't see any errors at all.
        session.msg(
            {"alert": _("There was an error creating the Player: %s" % e)})
        logger.log_tracemsg()
Example #23
0
    def func(self):
        "Use an object."
        caller = self.caller

        if not caller.is_alive():
            caller.msg({"alert":_("You are died.")})
            return

        if not self.args:
            caller.msg({"alert":_("You should use something.")})
            return

        obj = caller.search(self.args, location=caller)
        if not obj:
            # If the caller does not have this object.
            caller.msg({"alert":_("You don't have this object.")})
            return

        result = ""
        try:
            # Use the object and get the result.
            result = caller.use_object(obj)
        except Exception, e:
            ostring = "Can not use %s: %s" % (obj.get_data_key(), e)
            logger.log_tracemsg(ostring)
Example #24
0
    def quit_form(self):
        """
        Quit a form without saving.

        Returns:
            HttpResponse
        """
        self.parse_request()

        try:
            # Back to record list.
            # Parse list's url from the request path.
            pos = self.request.path.rfind("/")
            if pos > 0:
                url = self.request.path[:pos] + "/list.html"

                args = ""
                if self.page:
                    args += "_page=" + str(self.page)

                area = self.request_data.get("location", None)
                if not area:
                    area = self.request_data.get("_area", None)
                if area:
                    if args:
                        args += "&"
                    args += "_area=" + area

                if args:
                    url += "?" + args

                return HttpResponseRedirect(url)
        except Exception, e:
            logger.log_tracemsg("Quit form error: %s" % e)
Example #25
0
    def func(self):
        "Use an object."
        caller = self.caller

        if not caller.is_alive():
            caller.msg({"alert":_("You are died.")})
            return

        if not self.args:
            caller.msg({"alert":_("You should discard something.")})
            return

        obj = caller.search(self.args, location=caller)
        if not obj:
            # If the caller does not have this object.
            caller.msg({"alert":_("You don't have this object.")})
            return

        # remove used object
        try:
            caller.remove_object(obj.get_data_key(), 1)
        except Exception, e:
            caller.msg({"alert": _("Can not discard this object.")})
            logger.log_tracemsg("Can not discard object %s: %s" % (obj.get_data_key(), e))
            return
Example #26
0
    def match_condition(self, condition, caller, obj, **kwargs):
        """
        Check a condition.

        Args:
            condition: (string) a condition expression
            caller: (object) statement's caller
            obj: (object) caller's current target

        Returns:
            (boolean) the result of the condition
        """
        if not condition:
            return True

        # calculate functions first
        exec_string = exec_condition(self.condition_func_set, condition,
                                     caller, obj, **kwargs)

        try:
            # do condition
            result = eval(exec_string)
        except Exception, e:
            logger.log_tracemsg("Exec condition error:%s %s" % (condition, e))
            return False
Example #27
0
    def data_out(self, text=None, **kwargs):
        """
        Send Evennia -> User
        Convert to JSON.
        """
        options = None
        if "options" in kwargs:
            options = kwargs.get("options", None)

        if options is None:
            options = {}
            kwargs["options"] = {}

        raw = options.get("raw", False)
        context = kwargs.get("context", "")

        if raw:
            out_text = text
        else:
            try:
                out_text = json.dumps({"data": text, "context": context})
            except Exception as e:
                out_text = json.dumps({"data": {"err": "There is an error occurred while outputing messages."}})
                logger.log_tracemsg("json.dumps failed: %s" % e)

        # set raw=True
        kwargs["options"].update({"raw": True, "client_raw": True})

        return super(ServerSession, self).data_out(text=out_text, **kwargs)
Example #28
0
def view_form(request):
    try:
        view = get_view(request)
        if view.is_valid():
            return view.view_form()
    except Exception, e:
        logger.log_tracemsg("Invalid view request: %s" % e)
Example #29
0
    def use_object(self, obj, number=1):
        """
        Use an object.

        Args:
            obj: (object) object to use
            number: (int) number to use

        Returns:
            result: (string) the description of the result
        """
        if not obj:
            return LS("Can not find this object.")

        if obj.db.number < number:
            return LS("Not enough number.")

        # take effect
        try:
            result, used = obj.take_effect(self, number)
            if used > 0:
                # remove used object
                obj_list = [{"object": obj.get_data_key(), "number": used}]
                self.remove_objects(obj_list)
            return result
        except Exception, e:
            ostring = "Can not use %s: %s" % (obj.get_data_key(), e)
            logger.log_tracemsg(ostring)
Example #30
0
    def func(self):
        "Cast a skill."
        caller = self.caller

        if not caller.is_alive():
            caller.msg({"alert":_("You are died.")})
            return

        if not self.args:
            caller.msg({"alert":_("You should select a skill to cast.")})
            return

        skill_key = None
        if isinstance(self.args, basestring):
            # If the args is a skill's key.
            skill_key = self.args
        else:
            # If the args is skill's key and target.
            if not "skill" in self.args:
                caller.msg({"alert":_("You should select a skill to cast.")})
                return
            skill_key = self.args["skill"]

        # Get target
        target = None
        if "target" in self.args:
            target = caller.search(self.args["target"])

        try:
            # Prepare to cast this skill.
            caller.prepare_skill(skill_key, target)
        except Exception, e:
            caller.msg({"alert":_("Can not cast this skill.")})
            logger.log_tracemsg("Can not cast skill %s: %s" % (skill_key, e))
            return
Example #31
0
def export_js_localized_strings(request):
    """
    Export all unlicalized strings in files.
    """
    response = http.HttpResponseNotModified()

    try:
        # write to a file
        file = tempfile.TemporaryFile()

        # get strings
        strings = utils.all_unlocalized_js_strings(True)

        for s in strings:
            file.write('"%s": "",\n' % s)

        file.seek(0)
        filename = time.strftime("strings_%Y%m%d_%H%M%S.js", time.localtime())
        response = http.StreamingHttpResponse(utils.file_iterator(file))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="%s"' % filename
    except Exception, e:
        message = "Can't export game data: %s" % e
        logger.log_tracemsg(message)

        file.close()
        return render(request, 'fail.html', {"message": message})
Example #32
0
def export_game_data(request):
    """
    Export game world files.
    """
    response = http.HttpResponseNotModified()
    file_type = request.GET.get("file_type", None)

    # get data's zip
    zipfile = None
    try:
        zipfile = tempfile.TemporaryFile()
        exporter.export_zip_all(zipfile, file_type)
        zipfile.seek(0)

        filename = time.strftime("worlddata_%Y%m%d_%H%M%S.zip",
                                 time.localtime())
        response = http.StreamingHttpResponse(file_iterator(zipfile))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="%s"' % filename
    except Exception, e:
        message = "Can't export game data: %s" % e
        logger.log_tracemsg(message)

        zipfile.close()
        return render(request, 'fail.html', {"message": message})
Example #33
0
    def use_object(self, obj, number=1):
        """
        Use an object.

        Args:
            obj: (object) object to use
            number: (int) number to use

        Returns:
            result: (string) the description of the result
        """
        if not obj:
            return _("Can not find this object.")

        if obj.db.number < number:
            return _("Not enough number.")

        # take effect
        try:
            result, used = obj.take_effect(self, number)
            if used > 0:
                # remove used object
                self.remove_object(obj.get_data_key(), used)
            return result
        except Exception, e:
            ostring = "Can not use %s: %s" % (obj.get_data_key(), e)
            logger.log_tracemsg(ostring)
Example #34
0
    def continue_dialogue(self, npc, dialogue, sentence):
        """
        Continue current dialogue.

        Args:
            npc: (optional) NPC's object.
            dialogue: current dialogue's key.
            sentence: current sentence's ordinal.

        Returns:
            None
        """
        if GAME_SETTINGS.get("auto_resume_dialogues"):
            # Check current dialogue.
            if not self.db.current_dialogue:
                return

            if (dialogue, sentence) not in self.db.current_dialogue["sentences_all"]:
                # Can not find specified dialogue in current dialogues.
                return

        try:
            # Finish current sentence
            DIALOGUE_HANDLER.finish_sentence(self, npc, dialogue, sentence)
        except Exception, e:
            ostring = "Can not finish sentence %s-%s: %s" % (dialogue, sentence, e)
            logger.log_tracemsg(ostring)
Example #35
0
    def continue_dialogue(self, npc, dialogue, sentence):
        """
        Continue current dialogue.

        Args:
            npc: (optional) NPC's object.
            dialogue: current dialogue's key.
            sentence: current sentence's ordinal.

        Returns:
            None
        """
        if GAME_SETTINGS.get("auto_resume_dialogues"):
            # Check current dialogue.
            if not self.db.current_dialogue:
                return

            if (dialogue, sentence) not in self.db.current_dialogue["sentences_all"]:
                # Can not find specified dialogue in current dialogues.
                return

        try:
            # Finish current sentence
            DIALOGUE_HANDLER.finish_sentence(self, npc, dialogue, sentence)
        except Exception, e:
            ostring = "Can not finish sentence %s-%s: %s" % (dialogue, sentence, e)
            logger.log_tracemsg(ostring)
Example #36
0
def list_view(request):
    try:
        if "_back" in request.POST:
            return page_view.quit_list(request)
        else:
            return page_view.view_list(request)
    except Exception, e:
        logger.log_tracemsg("Invalid view request: %s" % e)
Example #37
0
def list_view(request):
    try:
        if "_back" in request.POST:
            return page_view.quit_list(request)
        else:
            return page_view.view_list(request)
    except Exception, e:
        logger.log_tracemsg("Invalid view request: %s" % e)
Example #38
0
    def remove_object(self, obj_key, number, mute=False):
        """
        Remove objects from the inventory.

        Args:
            obj_key: object's key
            number: object's number
            mute: send inventory information

        Returns:
            boolean: success
        """
        objects = self.search_inventory(obj_key)

        # get total number
        sum = 0
        for obj in objects:
            obj_num = obj.get_number()
            sum += obj_num

        if sum < number:
            return False

        # remove objects
        to_remove = number
        try:
            for obj in objects:
                obj_num = obj.get_number()
                if obj_num > 0:
                    if obj_num >= to_remove:
                        obj.decrease_num(to_remove)
                        to_remove = 0
                    else:
                        obj.decrease_num(obj_num)
                        to_remove -= obj_num

                    if obj.get_number() <= 0:
                        # If this object can be removed from the inventor.
                        if obj.can_remove:
                            # if it is an equipment, take off it first
                            if getattr(obj, "equipped", False):
                                self.take_off_equipment(obj)
                            obj.delete()

                if to_remove <= 0:
                    break
        except Exception as e:
            logger.log_tracemsg("Can not remove object %s: %s" % (obj_key, e))
            return False

        if to_remove > 0:
            logger.log_err("Remove object error: %s" % obj_key)
            return False

        if not mute:
            self.show_inventory()

        return True
Example #39
0
    def cast_skill(self, target):
        """
        Cast this skill.

        Args:
            target: (object) skill's target

        Returns:
            (result, cd):
                result: (dict) skill's result
                cd: (dice) skill's cd
        """
        owner = self.db.owner
        time_now = time.time()

        if not self.passive:
            if owner:
                gcd = getattr(owner, "gcd_finish_time", 0)
                if time_now < gcd:
                    owner.msg({"msg": LS("This skill is not ready yet!")})
                    return

            if time_now < self.db.cd_finish_time:
                # skill in CD
                if owner:
                    owner.msg({"msg": LS("This skill is not ready yet!")})
                return

        if not self.function_call:
            logger.log_errmsg("Can not find skill function: %s" %
                              self.get_data_key())
            if owner:
                owner.msg({"msg": LS("Can not cast this skill!")})
            return

        result = {}
        cd = {}
        try:
            # call skill function
            result = self.function_call(owner, target, effect=self.effect)

            if not self.passive:
                # set cd
                time_now = time.time()
                if self.cd > 0:
                    self.db.cd_finish_time = time_now + self.cd

                cd = {
                    "skill": self.get_data_key(),  # skill's key
                    "cd": self.cd
                }  # global cd
        except Exception, e:
            ostring = "Can not cast skill %s: %s" % (self.get_data_key(), e)
            logger.log_tracemsg(ostring)
            if owner:
                owner.msg({"msg": LS("Can not cast this skill!")})
            return
Example #40
0
    def func(self):
        "Implement the command"
        caller = self.caller

        try:
            build_all(caller)
        except Exception, e:
            ostring = "Can't build world: %s" % e
            caller.msg(ostring)
            logger.log_tracemsg(ostring)
Example #41
0
def editor(request):
    """
    World Editor page template loading.
    """
    try:
        name = re.sub(r"^/worlddata/editor/", "", request.path)
        return render(request, name, {"self": request.get_full_path()})
    except Exception, e:
        logger.log_tracemsg(e)
        raise http.Http404
Example #42
0
def editor(request):
    """
    World Editor page template loading.
    """
    try:
        name = re.sub(r"^/worlddata/editor/", "", request.path)
        return render(request, name, {"self": request.get_full_path()})
    except Exception, e:
        logger.log_tracemsg(e)
        raise http.Http404
Example #43
0
    def cast_skill(self, target):
        """
        Cast this skill.

        Args:
            target: (object) skill's target

        Returns:
            (result, cd):
                result: (dict) skill's result
                cd: (dice) skill's cd
        """
        owner = self.db.owner
        time_now = time.time()

        if not self.passive:
            if owner:
                gcd = getattr(owner, "gcd_finish_time", 0)
                if time_now < gcd:
                    owner.msg({"msg": LS("This skill is not ready yet!")})
                    return

            if time_now < self.db.cd_finish_time:
                # skill in CD
                if owner:
                    owner.msg({"msg": LS("This skill is not ready yet!")})
                return

        if not self.function_call:
            logger.log_errmsg("Can not find skill function: %s" % self.get_data_key())
            if owner:
                owner.msg({"msg": LS("Can not cast this skill!")})
            return

        result = {}
        cd = {}
        try:
            # call skill function
            result = self.function_call(owner, target, effect=self.effect)

            if not self.passive:
                # set cd
                time_now = time.time()
                if self.cd > 0:
                    self.db.cd_finish_time = time_now + self.cd

                cd = {"skill": self.get_data_key(), # skill's key
                      "cd": self.cd}                # global cd
        except Exception, e:
            ostring = "Can not cast skill %s: %s" % (self.get_data_key(), e)
            logger.log_tracemsg(ostring)
            if owner:
                owner.msg({"msg": LS("Can not cast this skill!")})
            return
Example #44
0
def create_normal_player(session, playername, password):
    """
    Create a new player.
    """
    # sanity checks
    if not re.findall('^[\w. @+-]+$', playername) or not (0 < len(playername) <= 32):
        # this echoes the restrictions made by django's auth
        # module (except not allowing spaces, for convenience of
        # logging in).
        string = "\n\r Playername can max be 32 characters or fewer. Letters, spaces, digits and @/./+/-/_ only."
        session.msg({"alert":string})
        return
    # strip excessive spaces in playername
    playername = re.sub(r"\s+", " ", playername).strip()
    if AccountDB.objects.filter(username__iexact=playername):
        # player already exists (we also ignore capitalization here)
        session.msg({"alert":_("Sorry, there is already a player with the name '%s'.") % playername})
        return
    # Reserve playernames found in GUEST_LIST
    if settings.GUEST_LIST and playername.lower() in (guest.lower() for guest in settings.GUEST_LIST):
        string = "\n\r That name is reserved. Please choose another Playername."
        session.msg({"alert":string})
        return

    if not re.findall('^[\w. @+-]+$', password) or not (3 < len(password)):
        string = "\n\r Password should be longer than 3 characers. Letters, spaces, digits and @\.\+\-\_ only." \
                 "\nFor best security, make it longer than 8 characters. You can also use a phrase of" \
                 "\nmany words if you enclose the password in quotes."
        session.msg({"alert":string})
        return

    # Check IP and/or name bans
    bans = ServerConfig.objects.conf("server_bans")
    if bans and (any(tup[0]==playername.lower() for tup in bans)
                 or
                 any(tup[2].match(session.address) for tup in bans if tup[2])):
        # this is a banned IP or name!
        string = "{rYou have been banned and cannot continue from here." \
                 "\nIf you feel this ban is in error, please email an admin.{x"
        session.msg({"alert":string})
        session.execute_cmd('{"cmd":"quit","args":""}')
        return

    # everything's ok. Create the new player account.
    new_player = None
    try:
        new_player = create_player(playername, password)
    except Exception, e:
        # We are in the middle between logged in and -not, so we have
        # to handle tracebacks ourselves at this point. If we don't,
        # we won't see any errors at all.
        session.msg({"alert":_("There was an error creating the Player: %s" % e)})
        logger.log_tracemsg()
Example #45
0
 def data_out(self, text=None, **kwargs):
     """
     Send Evennia -> User
     Convert to JSON.
     """
     raw = kwargs.get("raw", False)
     if not raw:
         try:
             text = json.dumps(text)
         except Exception, e:
             text = json.dumps({"err": "There is an error occurred while outputing messages."})
             logger.log_tracemsg("json.dumps failed: %s" % e)
Example #46
0
    def load_data(self):
        """
        Set data_info to the object.
        """
        super(MudderyRoom, self).load_data()

        self.position = None
        try:
            # set position
            if self.dfield.position:
                self.position = ast.literal_eval(self.dfield.position)
        except Exception, e:
            logger.log_tracemsg("load_data error: %s" % e)
Example #47
0
    def func(self, args, request):
        file_obj = request.FILES.get("file", None)

        if not file_obj:
            raise MudderyError(ERR.missing_args, 'Missing zip files.')

        with tempfile.TemporaryFile() as fp:
            try:
                for chunk in file_obj.chunks():
                    fp.write(chunk)
                importer.unzip_resources_all(fp)
            except Exception, e:
                logger.log_tracemsg("Upload error: %s" % e.message)
                raise MudderyError(ERR.upload_error, e.message)
Example #48
0
    def at_init(self):
        """
        Load world data.
        """
        super(MudderyObject, self).at_init()

        # need save before modify m2m fields
        self.save()

        try:
            # Load db data.
            self.load_data()
        except Exception, e:
            logger.log_tracemsg("%s can not load data:%s" % (self.dbref, e))
Example #49
0
    def func(self, args, request):
        # get data's zip
        fp = tempfile.TemporaryFile()
        try:
            exporter.export_resources(fp)
            fp.seek(0)

            filename = time.strftime("resources_%Y%m%d_%H%M%S.zip", time.localtime())
            return file_response(fp, filename)
        except Exception, e:
            if fp:
                fp.close()
            logger.log_tracemsg("Download error: %s" % e.message)
            raise MudderyError(ERR.download_error, "Download file error: %s" % e)
Example #50
0
    def remove_object(self, obj_key, number, mute=False):
        """
        Remove objects from the inventory.

        Args:
            obj_key: object's key
            number: object's number
            mute: send inventory information

        Returns:
            boolean: success
        """
        objects = self.search_inventory(obj_key)

        # get total number
        sum = 0
        for obj in objects:
            obj_num = obj.get_number()
            sum += obj_num

        if sum < number:
            return False

        # remove objects
        to_remove = number
        try:
            for obj in objects:
                obj_num = obj.get_number()
                if obj_num > 0:
                    if obj_num >= to_remove:
                        obj.decrease_num(to_remove)
                        to_remove = 0
                    else:
                        obj.decrease_num(obj_num)
                        to_remove -= obj_num

                    if obj.get_number() <= 0:
                        # If this object can be removed from the inventor.
                        if obj.can_remove:
                            # if it is an equipment, take off it first
                            if getattr(obj, "equipped", False):
                                self.take_off_equipment(obj)
                            obj.delete()

                if to_remove <= 0:
                    break
        except Exception, e:
            logger.log_tracemsg("Can not remove object %s: %s" % (obj_key, e))
            return False
Example #51
0
    def at_init(self):
        """
        Load world data.
        """
        super(MudderyObject, self).at_init()

        self.typeclass_key = None
        self.condition = None
        self.icon = None
        
        try:
            # Load db data.
            self.load_data()
        except Exception, e:
            logger.log_tracemsg("%s can not load data:%s" % (self.dbref, e))
Example #52
0
def apply_changes(request):
    """
    Apply the game world's data.
    """
    try:
        # rebuild the world
        build_all()

        # reload
        SESSIONS.announce_all(" Server restarting ...")
        SESSIONS.server.shutdown(mode='reload')
    except Exception, e:
        ostring = "Can't build world: %s" % e
        logger.log_tracemsg(ostring)
        raise http.HttpResponseServerError(ostring)
Example #53
0
    def quit_form(self):
        """
        Quit a form without saving.

        Returns:
            HttpResponse
        """
        try:
            pos = self.request.path.rfind("/")
            pos = self.request.path.rfind("/", 0, pos)
            if pos > 0:
                url = self.request.path[:pos] + ".html"
                return HttpResponseRedirect(url)
        except Exception, e:
            logger.log_tracemsg("quit list error: %s" % e)
Example #54
0
def import_data_single(request):
    """
    Import the game world from an uploaded zip file.
    """
    response = http.HttpResponseNotModified()
    model_name = request.POST.get("model_name", None)
    upload_file = request.FILES.get("import_data_single", None)

    err_message = None
    if upload_file:
        # Get file type.
        (filename, ext_name) = os.path.splitext(upload_file.name)
        
        # If model name is empty, get model name from filename.
        if not model_name:
            model_name = filename

        # get data handler
        data_handler = DATA_SETS.get_handler(model_name)
        if not data_handler:
            logger.log_tracemsg("Cannot get data handler: %s" % model_name)
            return render(request, 'fail.html', {"message": "Can not import this file."})
            
        file_type = None
        if ext_name:
            file_type = ext_name[1:]

        reader_class = readers.get_reader(file_type)
        if not reader_class:
            return render(request, 'fail.html', {"message": "Can not import this type of file."})

        # Get tempfile's name.
        temp_name = tempfile.mktemp()            
        with open(temp_name, "wb") as temp_file:
            try:
                # Write to a template file.
                for chunk in upload_file.chunks():
                    temp_file.write(chunk)
                temp_file.flush()
                data_handler.import_file(temp_name, file_type=file_type)
            except Exception, e:
                err_message = "Cannot import game data. %s" % e
                logger.log_errmsg(err_message)

        try:
            os.remove(temp_name)
        except:
            pass
Example #55
0
    def after_data_loaded(self):
        """
        Set data_info to the object.
        """
        super(MudderyRoom, self).after_data_loaded()
        
        self.peaceful = getattr(self.dfield, "peaceful", False)

        self.position = None
        try:
            # set position
            position = getattr(self.dfield, "position", None)
            if position:
                self.position = ast.literal_eval(position)
        except Exception, e:
            logger.log_tracemsg("load position error: %s" % e)
Example #56
0
def import_resources_all(request):
    """
    Import resources from an uploaded zip file.
    """
    response = http.HttpResponseNotModified()
    file_obj = request.FILES.get("import_resources_all", None)

    if file_obj:
        with tempfile.TemporaryFile() as zipfile:
            try:
                for chunk in file_obj.chunks():
                    zipfile.write(chunk)
                importer.unzip_resources_all(zipfile)
            except Exception, e:
                logger.log_tracemsg("Cannot import resources: %s" % e)
                return render(request, 'fail.html', {"message": str(e)})
Example #57
0
def add_form(request):
    """
    Edit worlddata.

    Args:
        request:

    Returns:
        None.
    """
    try:
        view = get_view(request)
        if view.is_valid():
            return view.add_form()
    except Exception, e:
        logger.log_tracemsg("Invalid edit request: %s" % e)
Example #58
0
def get_image(request):
    """
    Create an image.

    Args:
        request:

    Returns:

    """
    try:
        image_view = get_image_view(request)
        if image_view.is_valid():
            return image_view.render()
    except Exception, e:
        logger.log_tracemsg("Invalid image request: %s" % e)