def generate_pretty_roll(roll): pretty_roll = None victim = dao.get_bakchod_by_id(roll["victim"]) try: if roll["winrar"] is None: pretty_roll = "Roll a {} to {} {}!".format( roll["roll_number"], pretty_roll_rule(roll["rule"]), util.extract_pretty_name_from_bakchod(victim), ) else: winrar = dao.get_bakchod_by_id(roll["winrar"]) try: roll_expiry = ciso8601.parse_datetime(roll["expiry"]) except Exception as e: roll_expiry = roll["expiry"] now = datetime.datetime.now() td = roll_expiry - now if roll["rule"] == "kick_user": pretty_roll = "{} won by rolling a {}! {} has been kicked from this group!".format( util.extract_pretty_name_from_bakchod(winrar), roll["roll_number"], util.extract_pretty_name_from_bakchod(victim), ) else: pretty_roll = "{} won by rolling a {}! {} is now {} for {}".format( util.extract_pretty_name_from_bakchod(winrar), roll["roll_number"], util.extract_pretty_name_from_bakchod(victim), pretty_roll_rule(roll["rule"]), util.pretty_time_delta(td.total_seconds()), ) except Exception as e: logger.error( "Caught Error in roll.generate_pretty_roll - {} \n {}", e, traceback.format_exc(), ) return pretty_roll
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 handle(update, context): util.log_chat("reset", update) try: # Extract query... query = update.message.text query = query.split(" ") target = None if not util.is_admin(update.message.from_user["id"]): return # Request includes the username as a mention if update.message.entities: for entity in update.message.entities: if entity.type == "text_mention" and entity.user is not None: target = dao.get_bakchod_by_id(entity.user.id) # Last attempt... try to lookup username in DB if target is None: receiver_username = query[1] # Remove the "@" prefix if receiver_username.startswith("@"): receiver_username = receiver_username[1:] target = dao.get_bakchod_by_username(receiver_username) if target is not None: logger.info("[reset] target={}", util.extract_pretty_name_from_bakchod(target)) target.modifiers = {} dao.insert_bakchod(target) update.message.reply_text( "Reset - " + util.extract_pretty_name_from_bakchod(target)) return except Exception as e: logger.error( "Caught Error in reset.handle - {} \n {}", e, traceback.format_exc(), )
def generate_about_response(bakchod): about_response = "*About " + util.extract_pretty_name_from_bakchod( bakchod) + ":* \n" about_response = about_response + "~ ID: `{}` \n".format(bakchod.id) about_response = about_response + "~ ₹okda: `{}` \n".format( round(bakchod.rokda, 2)) return about_response
def reset_roll_effects(context: telegram.ext.CallbackContext): # Get group_id group_id = context.job.context # Get relevant roll based on group_id roll = dao.get_roll_by_id(group_id) # Get victim's Bakchod victim = dao.get_bakchod_by_id(roll["victim"]) logger.info( "[roll] Resetting roll effects for {} in group={}", util.extract_pretty_name_from_bakchod(victim), group_id, ) # Reset victim's modifiers if roll["rule"] == "mute_user": censored_modifiers = victim.modifiers["censored"] if censored_modifiers is not None: censored_modifiers["group_ids"].remove(group_id) victim.modifiers["censored"] = censored_modifiers elif roll["rule"] == "auto_mom": auto_mom_modifiers = victim.modifiers["auto_mom"] if auto_mom_modifiers is not None: auto_mom_modifiers["group_ids"].remove(group_id) victim.modifiers["auto_mom"] = auto_mom_modifiers dao.insert_bakchod(victim) # Post reset message response = "Roll Modifiers for {} are now removed!".format( util.extract_pretty_name_from_bakchod(victim) ) context.bot.send_message( group_id, text=response, ) return
def handle(update, context): util.log_chat("rokda", update) if update.message.reply_to_message: bakchod_id = update.message.reply_to_message.from_user["id"] else: bakchod_id = update.message.from_user["id"] bakchod = dao.get_bakchod_by_id(bakchod_id) if bakchod is not None: response = "💰" + util.extract_pretty_name_from_bakchod( bakchod) + " has " + str(round(bakchod.rokda, 2)) + " ₹okda!" logger.info("[rokda] Sending response " + response) update.message.reply_text(response) else: logger.info("[rokda] Couldn't find user") file_id = "CAADAwADrQADnozgCI_qxocBgD_OFgQ" sticker_to_send = file_id update.message.reply_sticker(sticker=sticker_to_send)
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
def handle_bakchod_modifiers(update, context, bakchod): bot = context.bot modifiers = bakchod.modifiers group_id = util.get_group_id_from_update(update) try: # Handle censored modifier if "censored" in modifiers.keys(): if modifiers["censored"]: censored_modifer = modifiers["censored"] if (censored_modifer["enabled"] and group_id is not None and group_id in censored_modifer["group_ids"]): logger.info( "[modifiers] censoring {}", util.extract_pretty_name_from_bakchod(bakchod), ) try: bot.delete_message( chat_id=update.message.chat_id, message_id=update.message.message_id, ) except Exception as e: logger.error( "Caught Error in censoring Bakchod - {} \n {}", e, traceback.format_exc(), ) bot.send_message( chat_id=update.message.chat_id, text= "Looks like I'm not able to delete messages... Please check the Group permissions!", ) return # Handle auto_mom modifier if "auto_mom" in modifiers.keys(): if modifiers["auto_mom"]: auto_mom_modifier = modifiers["auto_mom"] if group_id is not None and group_id in auto_mom_modifier[ "group_ids"]: if random.random() > 0.5: logger.info( "[modifiers] auto_mom - victim={} message={}", util.extract_pretty_name_from_bakchod(bakchod), update.message.text, ) response = mom.joke_mom(update.message.text, "Chaddi", True) update.message.reply_text(response) return except Exception as e: logger.error( "Caught Error in default.handle_bakchod_modifiers - {} \n {}", e, traceback.format_exc(), ) return
def handle(update, context): try: util.log_chat("daan", update) # Extract query... query = update.message.text query = query.split(" ") if len(query) < 2: update.message.reply_text( text="Haat chutiya! Syntax is `/daan @username 786`", parse_mode=ParseMode.MARKDOWN, ) return # Extract Sender by ID sender = dao.get_bakchod_by_id(update.message.from_user["id"]) if sender is None: sender = Bakchod.fromUpdate(update) dao.insert_bakchod(sender) # Extract Receiver receiver = None if update.message.reply_to_message: # Request is a reply to message... Extract receiver from ID receiver = dao.get_bakchod_by_id( update.message.reply_to_message.from_user["id"] ) # Donation can be the rest of the message donation = query[1:] else: # Request includes the username as a mention if update.message.entities: for entity in update.message.entities: if entity.type == "text_mention" and entity.user is not None: receiver = dao.get_bakchod_by_id(entity.user.id) # Last attempt... try to lookup username in DB if receiver is None: receiver_username = query[1] # Remove the "@" prefix if receiver_username.startswith("@"): receiver_username = receiver_username[1:] receiver = dao.get_bakchod_by_username(receiver_username) # Donation can be the rest of the message donation = query[2:] # Handle if receiver could be extracted if receiver is None: if receiver_username: update.message.reply_text(receiver_username + "??? Who dat???") return else: update.message.reply_text("Kisko daan do be????") return # Parse Daan amount try: daan = float("".join(donation)) daan = round(daan, 2) daan = abs(daan) except Exception as e: update.message.reply_text("Kitna ₹okda be???") return logger.info( "[daan] sender={} receiver={} daan={}", util.extract_pretty_name_from_bakchod(sender), util.extract_pretty_name_from_bakchod(receiver), daan, ) if (sender.rokda - daan) < 0: update.message.reply_text("Gareeb saale! You don't have enough ₹okda!") return if sender.id == receiver.id: file_id = "CAADAwADrQADnozgCI_qxocBgD_OFgQ" sticker_to_send = file_id update.message.reply_sticker(sticker=sticker_to_send) return # Commit Daan transaction to DB sender.rokda = sender.rokda - daan dao.insert_bakchod(sender) receiver.rokda = receiver.rokda + daan dao.insert_bakchod(receiver) daan_id = shortuuid.uuid() dao.insert_daan( daan_id, sender.id, receiver.id, daan, str(datetime.datetime.now()) ) update.message.reply_text( text="{} gave {} 🤲 a daan of {} ₹okda! 🎉 \n Daan ID - <code>{}</code>".format( util.extract_pretty_name_from_bakchod(sender), util.extract_pretty_name_from_bakchod(receiver), daan, daan_id, ), parse_mode=ParseMode.HTML, ) return except Exception as e: logger.error( "Caught Error in daan.handle - {} \n {}", e, traceback.format_exc(), )