def show_top(update: Update, context: CallbackContext): default_words = _db.find_all() try: words = _eval_filter(default_words, _get_pred(context)) except (ValueError, TypeError) as err: logger.exception(err) words = default_words top = "\n".join( [f"{w['word']}: {w['count']}" for w in words[:DEFAULT_TOP_LIMIT]]) result = context.bot.send_message( chat_id=update.effective_chat.id, text=f"```\n{top}\n```", disable_notification=True, parse_mode=telegram.ParseMode.MARKDOWN, ) cleanup_queue_update( context.job_queue, update.message, result, 600, remove_cmd=True, remove_reply=False, )
def _longest(update: Update, context: CallbackContext): message = "🍆 🔝🔟 best known lengths 🍆: \n\n" n = 1 for col in _db.get_best_n(10): username = _get_username(col) message += f"{n} → {username}\n" n += 1 result: Optional[Message] = context.bot.send_message( update.effective_chat.id, message, disable_notification=True, ) cleanup_queue_update( context.job_queue, update.message, result, 120, remove_cmd=True, remove_reply=False, )
def show_active_hussars(update: Update, context: CallbackContext): hussars = _db.find_all() message = "No hussars in da club 😒" restricted_hussars = [] for hussar in hussars: chat_member = context.bot.get_chat_member( update.effective_chat.id, hussar.get("_id") ) if chat_member.status == ChatMember.RESTRICTED: restricted_hussars.append(hussar) if len(restricted_hussars) > 0: message = "Right meow in da club ☠️:\n" for hussar in restricted_hussars: message += f"{choice(HONORED_HUSSARS_EMOJIS)} {_get_username(hussar)} \n" result = context.bot.send_message(update.effective_chat.id, message) cleanup_queue_update( context.job_queue, update.message, result, 120, remove_cmd=True, remove_reply=False, )
def coc(update: Update, context: CallbackContext): result = context.bot.send_message(update.effective_chat.id, f"Please behave! {COC_LINK}") cleanup_queue_update( context.job_queue, update.message, result, 600, remove_cmd=True, remove_reply=False, )
def wipe_hussars(update: Update, context: CallbackContext): _db.remove_all() logger.info("all hussars was removed from DB") result = update.message.reply_text("👍", disable_notification=True) cleanup_queue_update( context.job_queue, update.message, result, 120, remove_cmd=True, remove_reply=False, )
def ban(update: Union[str, Update], context: CallbackContext): user: User = update.message.reply_to_message.from_user chat_id = update.effective_chat.id if user and chat_id: result = context.bot.send_message( chat_id, f"Пользователь {user.name} был забанен") cleanup_queue_update( context.job_queue, update.message, result, 600, remove_cmd=True, remove_reply=False, )
def infect_admin(update: Update, context: CallbackContext): infect_user: User = update.message.reply_to_message.from_user _db.add(infect_user) _db.infect(infect_user.id) result = update.message.reply_text( f"{update.effective_user.full_name} опрокинул колбу с коронавирусом на {infect_user.full_name}" ) cleanup_queue_update( context.job_queue, update.message, result, 600, remove_cmd=True, remove_reply=False, )
def satisfy_GDPR(update: Update, context: CallbackContext): user: User = update.effective_user _db.remove(user.id) logger.info("%s was removed from DB", user.full_name) result = update.message.reply_text("ok, boomer 😒", disable_notification=True) cleanup_queue_update( context.job_queue, update.message, result, 120, remove_cmd=True, remove_reply=False, )
def roll(update: Update, context: CallbackContext): if update.message is None: return user: User = update.effective_user result: Optional[Message] = None # check if hussar already exist or create new one existing_user = _db.find(user_id=user.id) if existing_user is None: _db.add(user=user) is_shot, shots_remained = _shot(context) shot_result = "he is dead!" if is_shot else "miss!" logger.info( "user: %s[%s] is rolling and... %s", user.full_name, user.id, shot_result ) if is_shot: # todo: https://github.com/vldc-hq/vldc-bot/issues/93 # if bot can't restrict user, user should be passed into towel-mode like state mute_min = get_mute_minutes(shots_remained) result = context.bot.send_message( update.effective_chat.id, f"💥 boom! {user.full_name} 😵 [{mute_min // 60}h mute]", ) mute_user_for_time(update, context, user, timedelta(minutes=mute_min)) _db.dead(user.id, mute_min) else: # lucky one _db.miss(user.id) result = context.bot.send_message( update.effective_chat.id, f"{user.full_name}: {get_miss_string(shots_remained)}", ) cleanup_queue_update( context.job_queue, update.message, result, 120, remove_cmd=True, remove_reply=False, )
def random_cough(bot: Bot, queue: JobQueue): users = _db.find_all() message = "" for user in users: # todo: move "_get_username" to commons full_name = _get_username(user) if random() <= RANDOM_COUGH_UNINFECTED_CHANCE: message += f"{full_name} чихнул в пространство \n" if message: result = bot.send_message(get_group_chat_id(), message) cleanup_queue_update( queue, None, result, 30, remove_cmd=True, remove_reply=False )
def kozula(update: Update, context: CallbackContext): usd_rate = _get_usd_rate() kozula_rates = [ f"{KOZULA_RATE}₽", f"${round(KOZULA_RATE / usd_rate, 2)}" if usd_rate is not None else "", ] result = context.bot.send_message( update.effective_chat.id, f"Текущий курс Козули: {' | '.join(filter(bool, kozula_rates))}", ) cleanup_queue_update( queue=context.job_queue, cmd=update.message, result=result, seconds=300, remove_reply=True, )
def mute_self(update: Update, context: CallbackContext): user: User = update.effective_user mute_user_for_time(update, context, user, timedelta(days=1)) self_mute_messages = [ f"Да как эта штука работает вообще, {user.name}?", f"Не озоруй, {user.name}, мало ли кто увидит", f"Зловив {user.name} на вила!", f"Насилие порождает насилие, {user.name}", f"Опять ты, {user.name}!", ] result = update.message.reply_text(choice(self_mute_messages)) cleanup_queue_update( context.job_queue, update.message, result, 600, remove_cmd=True, remove_reply=False, )
def _length(update: Update, context: CallbackContext): user: User = update.effective_user result: Optional[Message] = None if update.effective_message is not None: result = update.effective_message.reply_text( f"Your telegram id length is {len(str(user.id))} 🍆 ({str(user.id)})" ) _db.add(user) cleanup_queue_update( context.job_queue, update.message, result, 120, remove_cmd=True, remove_reply=False, )
def _version(update: Update, context: CallbackContext): """Show a current version of bot""" version = _get_version_from_pipfile() logger.info("current ver.: %s", version) chat_id = update.effective_chat.id result = context.bot.send_message( chat_id, f"~=~~=~=~=_ver.:{version}_~=~=~=[,,_,,]:3\n\n" f"{_get_skills_hints(skills)}", ) cleanup_queue_update( context.job_queue, update.message, result, 120, )
def cough(update: Update, context: CallbackContext): user: User = update.effective_user if update.message.reply_to_message is None: result = update.message.reply_text(f"{user.full_name} чихнул в пространство") cleanup_queue_update( context.job_queue, update.message, result, 600, remove_cmd=True, remove_reply=False, ) return reply_user: User = update.message.reply_to_message.from_user result = update.message.reply_text( f"{user.full_name} чихнул на {reply_user.full_name}" ) cleanup_queue_update( context.job_queue, update.message, result, 600, remove_cmd=True, remove_reply=False, ) if _db.is_user_infected(user.id): infect_user_masked_condition( reply_user, COUGH_INFECTION_CHANCE_MASKED, COUGH_INFECTION_CHANCE_UNMASKED, context, )
def show_hussars(update: Update, context: CallbackContext): """Show leader board, I believe it should looks like smth like: Hussars leader board ==================================================== time in club | attempts | deaths | hussar ------------------ + -------- + ------ + ----------- 2 days, 15:59:54 | 6 | 6 | egregors 15:59:59 | 1 | 1 | getjump ---------------------------------------------------- """ # CSS is awesome! # todo: # need to find out how to show board for mobile telegram as well board = ( f"{'Hussars leader board'.center(52)}\n" f"{''.rjust(51, '=')}\n" f"{'time in club'.center(18)} " f"| {'attempts'.center(8)} " f"| {'deaths'.center(6)} " f"| {'hussar'.center(11)} " f"\n" f"{''.ljust(18, '-')} + {''.ljust(8, '-')} + {''.ljust(6, '-')} + {''.ljust(11, '-')}\n" ) hussars = _db.find_all() hussars_length = len(hussars) for hussar in hussars: username = _get_username(hussar) board += ( f"{str(timedelta(seconds=(hussar['total_time_in_club']))).ljust(18)} " f"| {str(hussar['shot_counter']).ljust(8)} " f"| {str(hussar['dead_counter']).ljust(6)} " f"| {username.ljust(15)}\n" ) board += f"{''.rjust(51, '-')}" try: board_image, board_image_path = from_text_to_image(board, hussars_length) except (ValueError, RuntimeError, OSError) as ex: logger.error("Cannot get image from text, hussars error: %s", ex) return result: Optional[Message] = None if hussars_length <= HUSSARS_LIMIT_FOR_IMAGE: result = context.bot.send_photo( chat_id=update.effective_chat.id, photo=board_image, disable_notification=True, ) else: result = context.bot.send_document( chat_id=update.effective_chat.id, document=board_image, disable_notification=True, ) cleanup_queue_update( context.job_queue, update.message, result, 600, remove_cmd=True, remove_reply=False, ) os.remove(board_image_path)