Example #1
0
def all(update, context):

    # Update Bakchod DB
    bakchod = dao.get_bakchod_by_id(update.message.from_user.id)

    if bakchod is None:
        bakchod = Bakchod.fromUpdate(update)
        logger.info("Looks like we have a new Bakchod! - {}", bakchod.__dict__)

    bakchod = update_bakchod(bakchod, update)

    # Update Group DB
    group = dao.get_group_by_id(update.message.chat.id)

    if group is None:
        group = Group.fromUpdate(update)
        logger.info("Looks like we have a new Group! - {}", group.__dict__)

    update_group(group, bakchod, update)

    # Log this
    logger.info(
        "[default.all] b.username='******' b.rokda={} g.title='{}'",
        util.extract_pretty_name_from_bakchod(bakchod),
        bakchod.rokda,
        group.title,
    )

    handle_bakchod_modifiers(update, context, bakchod)

    handle_dice_rolls(update, context)

    handle_message_matching(update, context)
Example #2
0
def get_random_bakchod(group_id):

    random_bakchod = None

    group = dao.get_group_by_id(group_id)

    if group is not None:

        members = group.members

        random_index = random.randint(0, len(members) - 1)
        random_bakchod_id = members[random_index]
        random_bakchod = dao.get_bakchod_by_id(random_bakchod_id)

    return random_bakchod
Example #3
0
def status_update(update, context):

    group = dao.get_group_by_id(update.message.chat.id)

    if group is None:
        group = Group.fromUpdate(update)

    # Handle new_chat_title
    new_chat_title = update.message.new_chat_title

    if new_chat_title is not None:
        group.title = new_chat_title
        logger.info("[status_update] new_chat_title g.title={}", group.title)
        dao.insert_group(group)

    # Handle new_chat_member
    new_chat_members = update.message.new_chat_members

    if new_chat_members is not None:
        for new_member in new_chat_members:
            bakchod = Bakchod(new_member.id, new_member.username,
                              new_member.first_name)
            dao.insert_bakchod(bakchod)

            if bakchod.id not in group.members:
                group.members.append(bakchod.id)
                dao.insert_group(group)

                logger.info(
                    "[status_update] new_chat_member g.title={} b.username={}",
                    group.title,
                    bakchod.username,
                )

    # Handle left_chat_member
    left_chat_member = update.message.left_chat_member

    if left_chat_member is not None:
        group.members.remove(left_chat_member.id)
        dao.insert_group(group)

        logger.info(
            "[status_update] left_chat_member g.title={} b.username={}",
            group.title,
            left_chat_member.username,
        )
Example #4
0
def get_random_bakchod(group_id):

    random_bakchod = None

    group = dao.get_group_by_id(group_id)

    if group is not None:

        collected_bakchods = []

        # loop through the member ids and store the bakchod objects
        for member_id in group.members:

            bakchod = dao.get_bakchod_by_id(member_id)

            if bakchod is not None:

                if bakchod.lastseen is not None:

                    try:
                        bakchod.lastseen = ciso8601.parse_datetime(bakchod.lastseen)
                        collected_bakchods.append(bakchod)
                    except Exception as e:
                        logger.error(
                            "Caught Error in roll.get_random_bakchod - {} \n {}",
                            e,
                            traceback.format_exc(),
                        )

        # sort the bakchods by lastseen
        collected_bakchods.sort(key=lambda r: r.lastseen, reverse=True)

        # only care about the x% of the lastseen
        relevant_section = math.ceil(0.15 * len(collected_bakchods))

        # pick a random bakchod from the relevant section
        index = random.randint(0, relevant_section)

        random_bakchod = collected_bakchods[index]

    return random_bakchod
Example #5
0
def gamble(bakchod_id, chat_id, update):

    bakchod = dao.get_bakchod_by_id(bakchod_id)

    if bakchod is None:
        bakchod = Bakchod.fromUpdate(update)
        dao.insert_bakchod(bakchod)

    can_gamble, response = can_bakchod_gamble(bakchod)

    if can_gamble:

        # Get a random_bakchod from the same Group
        group = dao.get_group_by_id(chat_id)
        random_bakchod = get_random_bakchod(group, bakchod_id)

        response, bakchod, random_bakchod = gamble_engine(
            bakchod, random_bakchod)

        # Update History
        try:
            history = bakchod.history
        except:
            history = {}

        history["gamble"] = datetime.datetime.now()
        bakchod.history = history

        # Update gambler bakchod
        dao.insert_bakchod(bakchod)

        # Update random_bakchod
        if random_bakchod.id != 0:
            dao.insert_bakchod(random_bakchod)

    return response
Example #6
0
def handle_dice_rolls(dice_value, update, context):

    try:

        metrics.rolls_attempted.inc()

        logger.info("[roll] handle_dice_rolls dice_value={}", dice_value)

        # Extract Group ID
        group_id = get_group_id_from_update(update)
        if group_id is None:
            logger.info("[roll] dice roll was not in a group... skipping")
            return

        # Get current roll based on group_id
        current_roll = dao.get_roll_by_id(group_id)
        if current_roll is None:
            logger.info("[roll] current_roll was a None... skipping")
            return

        # Check whether roll already a winrar
        if current_roll["winrar"] is not None:
            logger.info("[roll] current_roll already has a winrar... skipping")
            return

        # Check roll expiry
        roll_expiry = ciso8601.parse_datetime(current_roll["expiry"])
        if roll_expiry <= datetime.datetime.now():
            logger.info("[roll] current_roll has expired... skipping")
            return

        # Check and update roll history
        roller = dao.get_bakchod_by_id(update.message.from_user.id)
        history = roller.history

        if history is None:
            history = {}

        five_min_ago = datetime.datetime.now() - datetime.timedelta(minutes=5)

        if not DEBUG:
            if "roll" in history:
                last_time_rolled = ciso8601.parse_datetime(history["roll"])
                if last_time_rolled > five_min_ago:
                    logger.info("[roll] rolled too soon... skipping")
                    update.message.reply_text(
                        "You can only roll once every 5 mins... Ignoring this roll!"
                    )
                    return
        else:
            logger.debug("[roll] DEBUG is True... ignoring time check")

        history["roll"] = datetime.datetime.now()
        roller.history = history
        dao.insert_bakchod(roller)

        # Check roll outcome
        roll_number = int(current_roll["roll_number"])

        if dice_value == roll_number:

            metrics.rolls_won.inc()

            # Handle roll winrar
            winrar_bakchod = dao.get_bakchod_by_id(update.message.from_user.id)

            logger.info(
                "[roll] We got a winrar! bakchod={} roll_number={} group_id={}",
                util.extract_pretty_name_from_bakchod(winrar_bakchod),
                roll_number,
                group_id,
            )

            current_roll["winrar"] = winrar_bakchod.id
            current_roll["expiry"] = datetime.datetime.now() + datetime.timedelta(
                hours=1
            )

            # Update roll in DB
            dao.insert_roll(
                current_roll["group_id"],
                current_roll["rule"],
                current_roll["roll_number"],
                current_roll["victim"],
                current_roll["winrar"],
                current_roll["expiry"],
            )

            # Add roll effect to victims modifiers
            victim = dao.get_bakchod_by_id(current_roll["victim"])
            modifiers = victim.modifiers

            if current_roll["rule"] == "mute_user":

                if "censored" in modifiers:
                    censored_modifier = modifiers["censored"]
                else:
                    censored_modifier = {}

                if "group_ids" not in censored_modifier:
                    censored_modifier["group_ids"] = []

                censored_modifier["group_ids"].append(group_id)

                modifiers["censored"] = censored_modifier

            elif current_roll["rule"] == "auto_mom":

                if "auto_mom" in modifiers:
                    auto_mom_modifier = modifiers["auto_mom"]
                else:
                    auto_mom_modifier = {}

                if "group_ids" not in auto_mom_modifier:
                    auto_mom_modifier["group_ids"] = []

                auto_mom_modifier["group_ids"].append(group_id)

                modifiers["auto_mom"] = auto_mom_modifier

            elif current_roll["rule"] == "kick_user":

                try:

                    logger.info(
                        "[roll] Kicking User - group_id={} victim.id={}",
                        group_id,
                        victim.id,
                    )
                    context.bot.send_message(
                        chat_id=update.message.chat_id,
                        text="BYEEEEEEEEEEEE "
                        + util.extract_pretty_name_from_bakchod(victim),
                    )

                    # refer to https://python-telegram-bot.readthedocs.io/en/stable/telegram.bot.html#telegram.Bot.kick_chat_member
                    ban_until = datetime.datetime.now() + datetime.timedelta(seconds=31)
                    context.bot.kick_chat_member(
                        chat_id=group_id, user_id=victim.id, until_date=ban_until
                    )

                    # remove the victim from group members list
                    group = dao.get_group_by_id(group_id)
                    group.members.remove(victim.id)
                    dao.insert_group(group)

                except Exception as e:
                    logger.error(
                        "[roll] Caught Error in kick Bakchod - {} \n {}",
                        e,
                        traceback.format_exc(),
                    )
                    context.bot.send_message(
                        chat_id=update.message.chat_id,
                        text="Looks like I'm not able to kick user... Please check the Group permissions!",
                    )
                    return

            victim.modifiers = modifiers
            dao.insert_bakchod(victim)

            response = "<b>WINRAR!!!</b> {}".format(generate_pretty_roll(current_roll))
            update.message.reply_text(text=response, parse_mode=telegram.ParseMode.HTML)

            # Schedule callback for resetting roll effects in 1 hour
            context.job_queue.run_once(
                reset_roll_effects, 3600, context=update.message.chat_id
            )

    except Exception as e:
        logger.error(
            "Caught Error in roll.handle_dice_rolls - {} \n {}",
            e,
            traceback.format_exc(),
        )

    return