def start_server(): """ Main entry point for the application """ locale.set_default_locale("en_US") locale.load_translations("locale") if options.autostart_game: app.settings["game_started"] = True app.settings["history_callback"].start() if options.use_bots: app.settings["score_bots_callback"].start() # Setup server object if options.ssl: server = HTTPServer( app, ssl_options={"certfile": options.certfile, "keyfile": options.keyfile}, xheaders=options.x_headers, ) else: server = HTTPServer(app, xheaders=options.x_headers) try: sockets = netutil.bind_sockets(options.listen_port, options.listen_interface) except (OSError, IOError) as err: logging.error("Problem binding socket to port %s", str(options.listen_port)) if err.errno == 13: pypath = sys.executable if os_path.islink(pypath): pypath = os_path.realpath(pypath) logging.error( "Possible Fix: sudo setcap CAP_NET_BIND_SERVICE=+eip %s", pypath ) elif err.errno == 98: logging.error( "The port may be in use by an existing service. RTB already running?" ) else: logging.error(err) sys.exit() server.add_sockets(sockets) if options.debug: logging.warn( "%sDebug mode is enabled; DO NOT USE THIS IN PRODUCTION%s" % (bold + R, W) ) if options.autostart_game: logging.info("The game is about to begin, good hunting!") try: Scoreboard.update_gamestate(app) except OperationalError as err: if "Table definition has changed" in str(err): logging.info("Table definitions have changed -restarting RootTheBox.") return "restart" else: logging.error("There was a problem starting RootTheBox. Error: " + str(err)) try: io_loop.start() except KeyboardInterrupt: sys.stdout.write("\r" + WARN + "Shutdown Everything!\n") except: logging.exception("Main i/o loop threw exception") finally: io_loop.stop() _exit(0)
def create_team(self): """ Admins can create teams manually """ try: name = self.get_argument("team_name", "") if Team.by_name(name) is not None: raise ValidationError("Team already exists") team = Team() team.name = self.get_argument("team_name", "") team.motto = self.get_argument("motto", "") if not self.config.banking: team.money = 0 level_0 = GameLevel.by_number(0) if not level_0: level_0 = GameLevel.all()[0] team.game_levels.append(level_0) self.dbsession.add(team) self.dbsession.commit() # Avatar avatar_select = self.get_argument("team_avatar_select", "") if avatar_select and len(avatar_select) > 0: team._avatar = avatar_select elif hasattr(self.request, "files") and "avatar" in self.request.files: team.avatar = self.request.files["avatar"][0]["body"] self.dbsession.add(team) self.dbsession.commit() Scoreboard.update_gamestate(self) self.redirect("/admin/users") except ValidationError as error: self.render("admin/create/team.html", errors=[str(error)])
def on_message(self, message): """ We ignore messages if there are more than 1 every 3 seconds """ if self.application.settings["freeze_scoreboard"]: self.write_message("pause") elif datetime.now() - self.last_message > timedelta(seconds=3): self.last_message = datetime.now() Scoreboard.update_gamestate(self) self.write_message(Scoreboard.now(self))
def get(self, *args, **kargs): user = self.get_current_user() if scoreboard_visible(user): Scoreboard.update_gamestate(self) self.render("scoreboard/summary.html", timer=self.timer()) elif not user: self.redirect("/login") else: self.render("public/404.html")
def create_user(self): """ Add user to the database """ if User.by_handle(self.get_argument("handle", "")) is not None: raise ValidationError("This handle is already registered") if self.get_argument("pass1", "") != self.get_argument("pass2", ""): raise ValidationError("Passwords do not match") user = User() user.handle = self.get_argument("handle", "") user.password = self.get_argument("pass1", "") user.bank_password = self.get_argument("bpass", "") user.name = self.get_argument("playername", "") user.email = self.get_argument("email", "") team = self.get_team() self.dbsession.add(user) self.dbsession.add(team) self.dbsession.commit() # Avatar avatar_select = self.get_argument("user_avatar_select", "") if avatar_select and len(avatar_select) > 0: user._avatar = avatar_select elif hasattr(self.request, "files") and "avatar" in self.request.files: user.avatar = self.request.files["avatar"][0]["body"] team.members.append(user) if not options.teams: if avatar_select and len(avatar_select) > 0: team._avatar = avatar_select elif hasattr(self.request, "files") and "avatar" in self.request.files: team.avatar = self.request.files["avatar"][0]["body"] self.dbsession.add(user) self.dbsession.add(team) self.dbsession.commit() Scoreboard.update_gamestate(self) self.event_manager.user_joined_team(user) # Chat if self.chatsession: self.chatsession.create_user(user, self.get_argument("pass1", "")) return user
def get(self, *args, **kargs): user = self.get_current_user() try: page = int(self.get_argument("page", 1)) display = int(self.get_argument("count", 50)) except ValueError: page = 1 display = 50 if scoreboard_visible(user): teamcount = Scoreboard.update_gamestate(self) self.render( "scoreboard/summary.html", timer=self.timer(), hide_scoreboard=self.application.settings["hide_scoreboard"], page=page, display=display, teamcount=teamcount, ) elif not user: self.redirect("/login") else: self.render("public/404.html")