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})
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})
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)
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)
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)
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)
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
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})
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")
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)
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})
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
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)
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)
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))
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)
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})
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)
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)
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})
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()
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)
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)
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
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
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)
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)
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
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})
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)
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)
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)
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
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
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)
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
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
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()
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)
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)
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)
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))
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)
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
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))
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)
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)
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
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)
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)})
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)
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)