def status_duel(self, bot: Bot, source: User, **rest: Any) -> None: """ Whispers you the current status of your active duel requests/duel targets How to use: !duelstatus """ with DBManager.create_session_scope() as db_session: msg: List[str] = [] if source.id in self.duel_requests: duelling = User.find_by_id(db_session, self.duel_requests[source.id]) if duelling: msg.append( f"You have a duel request for {self.duel_request_price[source.id]} points by {duelling}" ) if source.id in self.duel_targets: challenger = User.find_by_id(db_session, self.duel_targets[source.id]) if challenger: msg.append( f"You have a pending duel request from {challenger} for {self.duel_request_price[self.duel_targets[source.id]]} points" ) if len(msg) > 0: bot.whisper(source, ". ".join(msg)) else: bot.whisper( source, "You have no duel request or duel target. Type !duel USERNAME POT to duel someone!" )
def show_emote(self, bot: Bot, source: User, args: Dict[str, Any], **rest: Any) -> bool: emote_instances = args["emote_instances"] if len(emote_instances) <= 0: # No emotes in the given message bot.whisper(source, "No valid emotes were found in your message.") return False first_emote = emote_instances[0].emote # request to show emote is ignored but return False ensures user is refunded tokens/points if not self.is_emote_allowed(first_emote.code): return False bot.websocket_manager.emit( "new_emotes", { "emotes": [first_emote.jsonify()], "opacity": self.settings["emote_opacity"], "persistence_time": self.settings["emote_persistence_time"], "scale": self.settings["emote_onscreen_scale"], }, ) if self.settings["success_whisper"]: bot.whisper(source, f"Successfully sent the emote {first_emote.code} to the stream!") return True
def get_duel_stats(bot: Bot, source: User, **rest: Any) -> None: """ Whispers the users duel winratio to the user """ if source.duel_stats is None: bot.whisper(source, "You have no recorded duels.") return True bot.whisper( source, f"duels: {source.duel_stats.duels_total} winrate: {source.duel_stats.winrate:.2f}% streak: {source.duel_stats.current_streak} profit: {source.duel_stats.profit}", )
def add_link_whitelist(self, bot: Bot, source, message, **rest) -> bool: parts = message.split(" ") try: for link in parts: self.whitelist_url(link) AdminLogManager.post("Whitelist link added", source, link) except: log.exception("Unhandled exception in add_link") bot.whisper(source, "Some error occurred white adding your links") return False bot.whisper(source, "Successfully added your links") return True
def decline_duel(self, bot: Bot, source: User, **options: Any) -> None: """ Declines any active duel requests you've received. How to use: !decline """ if source.id not in self.duel_targets: bot.whisper(source, "You are not being challenged to a duel") return with DBManager.create_session_scope() as db_session: requestor = User.find_by_id(db_session, self.duel_targets[source.id]) if not requestor: bot.whisper( source, "Your challenge never existed, don't ask me what happened!" ) return bot.whisper(source, f"You have declined the duel vs {requestor}") bot.whisper(requestor, f"{source} declined the duel challenge with you.") del self.duel_targets[source.id] del self.duel_requests[requestor.id] del self.duel_request_price[requestor.id] del self.duel_begin_time[requestor.id]
def cancel_duel(self, bot: Bot, source: User, **rest: Any) -> None: """ Cancel any duel requests you've sent. How to use: !cancelduel """ if source.id not in self.duel_requests: bot.whisper(source, "You have not sent any duel requests") return with DBManager.create_session_scope() as db_session: challenged = User.find_by_id(db_session, self.duel_requests[source.id]) if not challenged: bot.whisper(source, "Could not find the user you challenged??") return bot.whisper(source, f"You have cancelled the duel vs {challenged}") del self.duel_targets[challenged.id] del self.duel_request_price[source.id] del self.duel_begin_time[source.id] del self.duel_requests[source.id]
def add_link_blacklist(self, bot: Bot, source, message, **rest) -> bool: options, new_links = self.parse_link_blacklist_arguments(message) if options is False: return False if new_links: parts = new_links.split(" ") try: for link in parts: if len(link) > 1: self.blacklist_url(link, **options) AdminLogManager.post("Blacklist link added", source, link) bot.whisper(source, "Successfully added your links") return True except: log.exception("Unhandled exception in add_link_blacklist") bot.whisper(source, "Some error occurred while adding your links") return False else: bot.whisper(source, "Usage: !add link blacklist LINK") return False
def accept_duel(self, bot: Bot, source: User, **rest: Any) -> None: """ Accepts any active duel requests you've received. How to use: !accept """ if source.id not in self.duel_targets: bot.whisper(source, "You are not being challenged to a duel by anyone.") return with DBManager.create_session_scope() as db_session: requestor = User.find_by_id(db_session, self.duel_targets[source.id]) if not requestor: bot.whisper( source, "The user who challenged you is gone, I don't know where they went!" ) return duel_price = self.duel_request_price[self.duel_targets[source.id]] if not source.can_afford(duel_price) or not requestor.can_afford( duel_price): bot.whisper( source, f"Your duel request with {requestor} was cancelled due to one of you not having enough points.", ) bot.whisper( requestor, f"Your duel request with {source} was cancelled due to one of you not having enough points.", ) del self.duel_requests[requestor.id] del self.duel_request_price[requestor.id] del self.duel_begin_time[requestor.id] del self.duel_targets[source.id] return source.points -= duel_price requestor.points -= duel_price winning_pot = int(duel_price * (1.0 - self.settings["duel_tax"] / 100)) participants = [source, requestor] winner = random.choice(participants) participants.remove(winner) loser = participants.pop() winner.points += duel_price winner.points += winning_pot # Persist duel statistics winner.duel_stats.won(winning_pot) loser.duel_stats.lost(duel_price) arguments = { "winner": winner.name, "loser": loser.name, "total_pot": duel_price, "extra_points": winning_pot, } if duel_price > 0: message = self.get_phrase("message_won_points", **arguments) if duel_price >= 500 and self.settings["show_on_clr"]: bot.websocket_manager.emit( "notification", {"message": f"{winner} won the duel vs {loser}"}) else: message = self.get_phrase("message_won", **arguments) bot.say(message) del self.duel_requests[requestor.id] del self.duel_request_price[requestor.id] del self.duel_begin_time[requestor.id] del self.duel_targets[source.id] HandlerManager.trigger("on_duel_complete", winner=winner, loser=loser, points_won=winning_pot, points_bet=duel_price)
def initiate_duel(self, bot: Bot, source: User, message: str, **rest: Any) -> bool: """ Initiate a duel with a user. You can also bet points on the winner. By default, the maximum amount of points you can spend is 420. How to use: !duel USERNAME POINTS_TO_BET """ if message is None: return False max_pot = self.settings["max_pot"] msg_split = message.split() input = msg_split[0] with DBManager.create_session_scope() as db_session: user = User.find_by_user_input(db_session, input) if user is None: # No user was found with this username return False duel_price = 0 if len(msg_split) > 1: try: duel_price = int(msg_split[1]) if duel_price < 0: return False if duel_price > max_pot: duel_price = max_pot except ValueError: pass if source.id in self.duel_requests: currently_duelling = User.find_by_id( db_session, self.duel_requests[source.id]) if currently_duelling is None: del self.duel_requests[source.id] return False bot.whisper( source, f"You already have a duel request active with {currently_duelling}. Type !cancelduel to cancel your duel request.", ) return False if user == source: # You cannot duel yourself return False if user.last_active is None or ( utils.now() - user.last_active) > timedelta(minutes=5): bot.whisper( source, "This user has not been active in chat within the last 5 minutes. Get them to type in chat before sending another challenge", ) return False if not user.can_afford(duel_price) or not source.can_afford( duel_price): bot.whisper( source, f"You or your target do not have more than {duel_price} points, therefore you cannot duel for that amount.", ) return False if user.id in self.duel_targets: challenged_by = User.find_by_id(db_session, self.duel_requests[user.id]) bot.whisper( source, f"This person is already being challenged by {challenged_by}. Ask them to answer the offer by typing !deny or !accept", ) return False self.duel_targets[user.id] = source.id self.duel_requests[source.id] = user.id self.duel_request_price[source.id] = duel_price self.duel_begin_time[source.id] = utils.now() bot.whisper( user, f"You have been challenged to a duel by {source} for {duel_price} points. You can either !accept or !deny this challenge.", ) bot.whisper(source, f"You have challenged {user} for {duel_price} points") return True