from flask import current_app from ownchatbot.db import get_db, is_cool from ownchatbot.owncast_com import send_chat from ownchatbot.reward_handlers import run_script, add_to_queue, add_to_vote, add_to_goal, was_goal_reached, goal_reached, is_reward_active, check_vote, all_active_goals, goal_left from ownchatbot.user_handlers import spend_points, get_users_points, refund_points, get_all_users_with_user_id def porps(points): # Pluralize points based on the number of points if points == 1: num = 'point' else: num = 'points' return f'{points} {num}' def mas(time_diff): # Convert time difference decimal number to minutes and seconds minutes = int(time_diff) seconds = (time_diff - minutes) * 60 seconds = round(seconds) if minutes > 1: mnum = 'minutes' else: mnum = 'minute' if seconds > 1: snum = 'seconds' else: snum = 'second' if minutes == 0: return f'{seconds} {snum}' else: return f'{minutes} {mnum} and {seconds} {snum}' def do_reward(message, user_id): # Parse the chat command db = get_db() for user in get_all_users_with_user_id(db, user_id): username = user[1] prefix = current_app.config['PREFIX'] split_message = message[1:].split(maxsplit=1) reward = split_message[0] if len(split_message) == 1: # If it's a goal contribution, split the command and the contribution contribution = None else: contribution = split_message[1] if reward not in current_app.config['REWARDS']: # Check if it's a command or a reward send_chat(f'{username}, \"{prefix}{reward}\" is not a chat command or a reward. Check your spelling?') return if not is_reward_active(reward): # If reward isn't active, say so send_chat(f'Sorry, {username}. \"{prefix}{reward}\" is not currently an active reward.') return reward_type = current_app.config['REWARDS'][reward]['type'] points = get_users_points(db, user_id) if reward_type == 'goal': # If it's a goal contribution, do the thing if int(contribution) > goal_left(db, reward): # If they're contributing more than they need to, contribution = goal_left(db, reward) # only spend what is needed to reach the goal. if goal_reached(db, reward): send_chat(f'{username}, we already completed this goal.') elif not contribution: send_chat(f'{username}, you didn\'t tell me how many points you want to contribute.') elif int(contribution) > points: send_chat(f'{username}, you don\'t have enough points.') elif int(contribution) < 0: send_chat(f'{username}, you can\'t contribute negative points.') elif int(contribution) == 0: send_chat(f'{username}, you can\'t contribute zero points.') elif add_to_goal(db, user_id, reward, int(contribution)): send_chat(f'{username} contributed {porps(contribution)} to the \"{prefix}{reward}\" goal.') if was_goal_reached(db, reward): send_chat(f'\"{prefix}{reward}\" target reached! 🎉') else: send_chat(f'Couldn\'t contribute to the \"{prefix}{reward}\" goal for {username}, for some highly technical reason.') return price = current_app.config['REWARDS'][reward]['price'] # Do they have enough points? if not points or points < price: send_chat(f'{username}, you don\'t have enough points for \"{prefix}{reward}\".') return if reward_type == 'vote': # If it's a vote, do the thing if check_vote(db, reward, user_id): # See if viewer already voted send_chat(f'{username}, you already voted for \"{prefix}{reward}\".') else: if add_to_vote(db, reward, user_id) and spend_points(db, user_id, price): send_chat(f'{username} voted for \"{prefix}{reward}\" for {porps(price)}.') else: send_chat(f'Couldn\'t vote for \"{prefix}{reward}\" for {username}, for some highly technical reason.') elif reward_type == 'redeem': # If it's a redeem, do the thing if is_cool(reward)[0]: # Is there an active cool down? if (add_to_queue(db, user_id, reward) and spend_points(db, user_id, price)): send_chat(f'{username} redeemed \"{prefix}{reward}\" for {porps(price)}.') else: send_chat(f'Couldn\'t redeem \"{prefix}{reward}\"for {username}, for some highly technical reason.') else: hot_time = is_cool(reward)[1] send_chat(f'Couldn\'t redeem \"{prefix}{reward}\"for {username}.
That reward has {mas(hot_time)} left to cool down.') elif reward_type == 'special': # If it's a special, do the thing if is_cool(reward)[0]: # Is there an active cool down? script_cmd = current_app.config['REWARDS'][reward]['cmd'] script_ran = run_script(reward, script_cmd) used_points = spend_points(db, user_id, price) if (script_ran and used_points): send_chat(f'{username} redeemed \'{prefix}{reward}\' for {porps(price)}.') else: refund_points(db, user_id, price) send_chat(f'Couldn\'t redeem \"{prefix}{reward}\"for {username}, for some highly technical reason.') else: hot_time = is_cool(reward)[1] send_chat(f'Couldn\'t redeem \"{prefix}{reward}\"for {username}.
That reward has {mas(hot_time)} left to cool down.') else: # If we can't find the reward, say so send_chat(f'\"{prefix}{reward}\", {username}? No such reward.') def help_message(): prefix = current_app.config['PREFIX'] message = f'You get {current_app.config["POINTS_AWARD"]} points for every {current_app.config["POINTS_INTERVAL"]} seconds you\'re in chat.
\ You can see your points, the rewards queue, and other helpful information by clicking on the \"Points Rewards\" button.

\ Chat commands:
\ {prefix}help to see this help message.
\ {prefix}points to see your points.
\ {prefix}rewards to see a list of currently active rewards.
' send_chat(message)