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)
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
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, )
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
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
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