Exemple #1
0
    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)
Exemple #2
0
    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))
Exemple #3
0
    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
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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))
Exemple #7
0
    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)
Exemple #8
0
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"]))
Exemple #9
0
    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
Exemple #10
0
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)