async def end(self, winner): self._check_match() if self._match.countdown_active: self._match.cancel_countdown() logger.warning("Match ended while countdown is still active") bets = self._match.finish(winner=winner, basebet=self.basebet, min_points=self.min_points) logger.debug("Finished bet eid=%s" % self._event.id) match = self._match event = self._event self._match = None self._event = None await dispatch(self, "on_end", match=match, event=event, bets=bets, winner=winner)
async def start(self, event, timeout=None): if self.match_active: #raise BettingError("Already have active match") logger.error( "Already have active, canceling it and force starting new match" ) try: await self.cancel() except: logger.exception() targets = set(event.team_ids) self._match = BettingMatch(targets) self._event = event timeout = timeout or self.countdown_timeout countdown = self._match.start_countdown(timeout) logger.debug("Start betting on eid=%s" % event.id) await dispatch(self, "on_start", match=self._match, event=self._event) asyncio.ensure_future( self._run_countdown(countdown, match=self._match, event=self._event))
def _maybe_update_active(self): old_active = self.active new_active = self.select_active(self.all) self.active = new_active if old_active != new_active: logger.debug("(filter) active changed %s => %s" % (old_active, new_active)) return old_active, new_active
async def _run_countdown(self, countdown_future, **event_kwargs): async with self._countdown_lock: await dispatch(self, "on_countdown_start", **event_kwargs) try: await countdown_future except CountdownCancelled: logger.debug("Countdown was cancelled eid") await dispatch(self, "on_countdown_cancel", **event_kwargs) else: logger.debug("Finished countdown eid=%s" % self._event.id) await dispatch(self, "on_countdown_end", **event_kwargs)
async def bet(self, user, target, amount): self._check_match() self._match.place_bet(user, target, amount) logger.debug("User %s placed bet %d on target %s" % (user, amount, target)) await dispatch(self, "on_bet", match=self._match, event=self._event, user=user, target=target, amount=amount)
def _calc_returns(self, basebet, winner): total_bet = sum(b.amount for b in self.bets.values()) + basebet total_win = sum(b.amount for b in self.bets.values() if b.target == winner) for uid, bet in self.bets.items(): if bet.target == winner: # jos tähän haaraan mennään niin välttämättä total_win>0 # XXX: roundin sijasta olis myös mahollista tallentaa pisteet floattina bet.ret = round(total_bet * (bet.amount / total_win)) else: bet.ret = 0 logger.debug("%s: %d => %d" % (bet.user, bet.amount, bet.ret))
async def cancel(self): if not self.match_active: return self._match.cancel() logger.debug("Cancelled bet eid=%s" % self._event.id) match = self._match event = self._event self._match = None self._event = None await dispatch(self, "on_cancel", match=match, event=event)
def setup_filters(app, config): if "FANTSU_FILTERS" not in config: return app["filters"] = {} for name, v in config["FANTSU_FILTERS"].items(): if isinstance(v, dict): flt = prio(flt_from_dict(v)) elif isinstance(v, list): flt = flt_from_list(v) else: flt = v app["filters"][name] = flt app["judging"].add_filter(flt) logger.debug("Named filters available: %s" % list(app["filters"]))
def place_bet(self, user, target, amount, check_countdown=True): if check_countdown and not self.countdown_active: raise BettingError("Can't place a bet now") if target not in self.targets: raise BettingError("Invalid target: %s (Expected one of: %s)" % (target, self.targets)) if amount == 0: logger.debug("Skipping 0 bet [uid=%s]" % user.id) return self.remove_bet(user) user.allocate_points(amount) ret = Bet(user, target, amount) self.bets[user.id] = ret return ret
def main(**kwargs): app = web.Application() conf = {} exec(open(kwargs["config"]).read(), conf) debug = kwargs["debug"] or conf.get("DEBUG", False)\ or os.environ.get("FLASK_ENV", "") == "debug" app["debug"] = debug handler = ClickHandler() handler.setFormatter( ClickFormatter( fmt="%(asctime)s %(levelname)-8s %(name)-10s %(message)s", datefmt="%d.%m.%Y %H:%M")) logging.basicConfig(level=debug and logging.DEBUG or logging.INFO, handlers=[handler]) if sys.stderr.isatty(): click.echo("".join([ click.style(" F ", bg="magenta", bold=True), click.style(" A ", bg="green", bold=True), click.style(" N ", bg="red", bold=True), click.style(" T ", bg="yellow", bold=True), click.style(" S ", bg="cyan", bold=True), click.style(" U ", bg="magenta", bold=True), ]), err=True) if debug: logging.getLogger("sqlalchemy.engine").setLevel(logging.DEBUG) logger.debug("Running in debug mode!") else: logging.getLogger("aiohttp").setLevel(logging.WARNING) configure(app, conf) host = kwargs["host"] or conf.get("FANTSU_HOST", "0.0.0.0") port = kwargs["port"] or conf.get("FANTSU_PORT", 8080) logger.info("Running on %s:%d" % (host, port)) web.run_app(app, print=None, host=host, port=port)