def power(self, me, victim): if me.undead == True: return Mailbox().respond( "You're undead! You can't use your powers!", me.channel) if me.uses > 0 and me.frozen == False: if me.id == victim.id: return Mailbox().respond( "Whether suicide is an option or not is for you to find out. However, it is not in this game. Try again, please.", me.channel) for player in Game_Control().participants: if player.id == victim.id and player.role.name not in [ "Spectator", "Dead" ]: mail = Mailbox().log( "The **Barber** <@{}> has chosen to assassinate". format(me.id)) if player.souls > 0: mail.log_add( " <@{}>, a soulless **{}** who happened to have a soul protecting them." .format(player.id, player.role.name)) mail.respond( "Though you thought you had cut up your target nicely enough, it seems they have somehow survived! Too bad...", me.channel) return mail if player.role.name == "Immortal": mail.log_add( " <@{}>. This failed, as the **Immortal** does not die to a mere **Barber**." .format(player.id)) mail.respond( "Though you thought you had cut up your target nicely enough, it seems they have somehow survived! Too bad...", me.channel) return mail mail.log_add(" <@{}>, the town's favourite **{}**.") mail.story(barber_kill_story(me.id, player.id)) mail.spam(">kill <@{}> {} 1".format( player.id, player.emoji)) return mail return Mailbox().respond( "Hmmm, it seems like I wasn't able to find the person you were looking for, sorry.", me.channel) return Mailbox().respond( "Sorry, bud! Now is not the time to use your powers!", me.channel)
def power(self, me, victim): if me.undead == True: return Mailbox().respond( "I'm sorry, man! Aura Tellers lose their powers once they turn undead!", me.channel) if me.uses > 0: if me.id == victim.id: return Mailbox().respond( "I'm sorry, buddy! Suicide is not an option. Choose again!", me.channel) for player in Game_Control().participants: if victim.id == player.id and player.role.name not in [ "Spectator", "Dead" ]: me.uses += -1 if player.role.name in [ "Werewolf", "Bloody Butcher", "Hell Hound", "Infected Wolf", "Sacred Wolf", "White Werewolf", "Wolf's Cub" ]: mail = Mailbox().respond( "{} - <@{}> appears to you as a **Threat**!". format(player.emoji, player.id), me.channel) mail.respond( "This means they're part of the wolf pack!", me.channel) return mail.log( "The **Aura Teller** <@{}> has inspected <@{}>, a **{}**, and discovered them as a threat!" .format(me.id, player.id, player.role.name)) Mailbox().respond( "{} - <@{}> does **not** appear to you as a threat.". format(player.emoji, player.id), me.channel) return mail.log( "The **Aura Teller** <@{0}> has inspected <@{1}>. As <@{1}> is a **{2}**, they did not appear as a threat to them." .format(me.id, player.id, player.role.name)) return Mailbox().respond( "Sorry, who could tell that I couldn't find your target?", me.channel) return Mailbox().respond( "Sorry, buddy. You can't use your powers right now.", me.channel)
def start_game(): """This function is triggered at the start of the game. If successful, the function returns a Mailbox. If unsuccessful, the function still returns a Mailbox, but will also confirm the error in the console.""" # Make sure there isn't already a game going on! if dy.get_stage() != "NA": print("ERROR: According to " + dy.dynamic_config + ", there's already a game going on!") return Mailbox().respond( "I'm sorry! A game cannot be started while there's another one going on already!" ) # Choose the roles out of the given role-pool role_pool = [] for choice in view_roles(): for i in range(choice.amount): role_pool.append(choice.role) if len(db.player_list()) > len(role_pool): print( "The game cannot be started while there are less roles available than that there are participants signed up." ) return Mailbox().respond("Not enough roles to distribute available!", True) # If there are enough roles available, make a selection, evaluate the selection, and, if accepted, distribute the roles. if not pos.valid_distribution(role_pool, True): return Mailbox().respond( "I am sorry, but I cannot use an invalid distribution to start the game!", True) answer = Mailbox(True) attempts = 0 while attempts < 1000: attempts += 1 chosen_roles = random.sample(role_pool, len(db.player_list())) if pos.valid_distribution(chosen_roles, True) == True: answer.create_cc("Graveyard", 0, [], [], True) answer.create_cc("Market", 0, [], [], True) answer.create_cc("Reporter", 0, [], [], True) # Assign the roles to all users. user_list = db.player_list() for i in range(len(user_list)): user_id = user_list[i] user_role = chosen_roles[i] db_set(user_id, 'role', user_role) db_set(user_id, 'fakerole', user_role) db_set(user_id, 'channel', config.game_log) answer.log( "{} - <@{}> has received the role of the `{}`!".format( db_get(user_id, 'emoji'), user_id, user_role)) answer.dm( "This message is giving you your role for season `{}` of the *Werewolves* game.\n\n" .format(config.season), user_id) answer.dm_add('Your role is `{}`.\n\n'.format(user_role)) answer.dm_add( "**You are not allowed to share a screenshot of this message!** " ) answer.dm_add( "You can claim whatever you want about your role, but you may under **NO** " ) answer.dm_add( "circumstances show this message in any way to any other participants.\n" ) answer.dm_add( "We hope you are happy with the role you gained, and we hope you'll enjoy the game as much as we do.\n\n" ) answer.dm_add("Good luck... 🌕") if user_role in pos.personal_secrets: answer.create_sc(user_id, user_role) if user_role in pos.shared_secrets: answer.add_to_sc(user_id, user_role) if user_role == "Cult Member": answer.add_to_sc(user_id, "Cult Leader") if user_role in pos.wolf_pack: answer.add_to_sc(user_id, "Werewolf") if user_role == "Bloody Butcher": answer.add_to_sc(user_id, "Butcher") if user_role == "Devil": answer.add_to_sc(user_id, "Demon") if user_role == "Vampire": answer.add_to_sc(user_id, "Undead") if user_role == "Witch": db_set(user_id, 'uses', 3) answer.story( 'The current distribution is {}'.format(chosen_roles)) # TODO answer.story( 'I know, I know. That looks ugly as hell. We\'re trying to make it look good!' ) if "Flute Player" in chosen_roles: answer.create_cc("Flute_Victims", 0, [], [], True) # If the four horsemen are part of the game, assign numbers to all players. if "Horseman" in chosen_roles: nothorse_table = [ user_id for user_id in db.player_list() if db_get(user_id, 'role') != 'Horseman' ] horse_table = [ user_id for user_id in db.player_list() if db_get(user_id, 'role') == 'Horseman' ] nothorse_table.shuffle() horse_table.shuffle() for i in range(4): db_set(horse_table[i], 'horseman', i + 1) for i in range(16): db_set(nothorse_table[i], 'horseman', (i % 4) + 1) # Reset the day timer dy.reset_day() dy.set_stage('Night') return answer.respond( "Very well! The game will start tomorrow morning.") answer.respond("Timeout reached! Your distribution is too crazy!", True) return answer
def process(message, isGameMaster = False): user_id = message.author.id message_channel = message.channel.id user_role = db_get(user_id,'role') '''testcc''' # This function is merely a temporary one, to test if the cc creation command is working properly. if is_command(message,['cc','testcc','test_cc']): members = check.users(message) if len(message.content.split(' ')) == 1 or members == False: msg = "**Incorrect syntax:** `" + prefix + "cc <name> <user> <user> <user> ...`\n\nExample: `" + prefix + "cc the_cool_ones @Randium#6521`" msg += "\n\nThe bot understands both mentions and emojis linked to players." return [Mailbox().respond(msg,True)] name = message.content.split(' ')[1] return [Mailbox().create_cc(name,user_id,members)] if is_command(message,['cc','testcc','test_cc'],True): msg = "**Usage:** `" + prefix + "cc <name> <user> <user> <user> ...`\n\nExample: `" + prefix + "cc the_cool_ones @Randium#6521`" msg += "\n\nThe bot understands both mentions and emojis linked to players." return [Mailbox().respond(msg,True)] # ============================================================= # # GAME MASTERS # # ============================================================= if isGameMaster == True: '''addrole''' # Before the game starts, a list of roles is kept track of. # That list is the list of roles that will be dealt among the participants. # If the list is greater than the amount of participants, some random roles will be left out. # The game cannot start as long as this list is incomplete. if is_command(message,['addrole']): # TODO return todo() if is_command(message,['addrole'],True): # TODO return todo() '''assign''' # This command is used at the start of the game to assign all roles. # This will actually set their "fakerole" value, which will be transferred to their actual role once the game starts. if is_command(message,['assign']): role = check.roles(message,1)[0] user = check.users(message,1)[0] if role == False: return [Mailbox().respond("No role provided! Please provide us with a role!")] if user == False: return [Mailbox().respond("No user found! Please provide us with a user!")] db_set(user,'role',role) return [Mailbox().spam("You have successfully given <@{}> the role of the `{}`!".format(user,role))] if is_command(message,['assign'],True): msg = "**Usage:** `" + prefix + "assign <user> <role>`\n\nExample: `" + prefix msg += "assign @Randium#6521 Innocent`\nGame Master only command" return [Mailbox().spam(msg)] '''day''' # This command is used to initialize the day. if is_command(message,['day']): # TODO return todo() if is_command(message,['day'],True): # TODO return todo() '''open_signup''' # This command is started when a new game can be started. # Make sure the bot has reset itself beforehand. if is_command(message,['open_signup']): # TODO return todo() if is_command(message,['open_signup'],True): # TODO return todo() '''whois''' # This command reveals the role of a player. # To prevent spoilers, the response isn't made in the message's channel, but rather in the bot spam channel. if is_command(message,['whois']): user_table = check.users(message) identities = Mailbox() if user_table == False: return [Mailbox().respond("**ERROR:** No user provided!")] for user in user_table: emoji = db_get(user,'emoji') role = db_get(user,'role') if emoji == None or role == None: identities.spam("**ERROR:** Could not find user <@{}> in database.".format(user)) else: msg = "{} - <@{}> has the role of the `{}`!".format(emoji,user,role) identities.spam(msg) return [identities] if is_command(message,['whois'],True): msg = "**Usage:** `" + prefix + "whois <user1> <user2> ...`\n\n" msg += "Example: `" + prefix + "whois @Randium#6521`\nGame Master only command" return [Mailbox().respond(msg,True)] # ============================================================= # # PARTICIPANTS # # ============================================================= if isParticipant(user_id): '''add''' # This command allows users to add users to a conspiracy. # This command will not trigger if the user doesn't own the conspiracy channel. if is_command(message,['add']): members_to_add = check.users(message) if members_to_add == False: return [Mailbox().respond("I am sorry! I couldn't find the user you were looking for!",True)] if is_owner(user_id,message.channel.id) == False: return [Mailbox().respond("I\'m sorry, you can only use this in conspiracy channels where you are the owner!")] command = Mailbox() for x in members_to_add: command.edit_cc(x,channel_id,1) return [command.respond("Insert Randium's comment here")] if is_command(message,['add'],True): # TODO return todo() '''cc''' # This command allows users to create a conspiracy channel. if is_command(message, ['cc']): if len(message.content.split(' ')) < 2: return [Mailbox().respond("**Invalid syntax:**\n\n`" + prefix + "cc <name> <user1> <user2> <user3> ...`\n\n**Example:** `" + prefix + "cc the_cool_guys @Randium#6521`")] channel_members = check.users(message) if channel_members == False: channel_members = [] if user_id not in channel_members: channel_members.append(user_id) num_cc_owned = int(db_get(user_id,'ccs')) if num_cc_owned >= max_cc_per_user: answer = Mailbox().dm("You have reached the amount of conspiracy channels one may own!", user_id) return answer.dm("If you want more conspiracy channels, please request permission from one of the Game Masters.", user_id) db_set(user_id,'ccs',number_cc_owned + 1) return Mailbox.create_cc(message.content.split(' ')[1], user_id, channel_members) if is_command(message,['cc'],True): # TODO return todo() '''info''' # This command allows users to view information about a conspiracy channel. # Says the user must be in a cc if they're not. if is_command(message,['info']): guild = message.channel.guild try: owner_id = channel_get(message.channel.id,'owner') except: return[Mailbox().respond('Sorry, but it doesn\'t look like you\'re in a CC! If you are, please alert a Game Master as soon as possible.')] if owner_id != None: owner_object = guild.get_member(int(owner_id)) embed = Embed(color=0x00cdcd, title='Conspiracy Channel Info') if owner_object != None and owner_id != None: embed.add_field(name='Channel Owner', value='<@' + owner_id + '>') embed.set_thumbnail(url=owner_object.avatar_url) elif owner_id == None: return [Mailbox().respond('Sorry, but it doesn\'t look like you\'re in a CC! If you are, please alert a Game Master as soon as possible.')] else: try: owner_name = db_get(owner_id,'name') if str(owner_name) == 'None': owner_name = 'Sorry, an error was encountered. Please alert a Game Master.' except: owner_name == 'Sorry, an error was encountered. Please alert a Game Master.' embed.add_field(name='Channel Owner', value=owner_name) embed.add_field(name='Channel Name', value=message.channel.name) embed.add_field(name='Participants', value='[Bob Roberts], [Dummy], [Randium], [BenTechy66], [Ed588]') embed.set_footer(text='Conspiracy Channel Information requested by ' + message.author.nick) return [Mailbox().embed(embed, message.channel.id)] if is_command(message,['info'],True): # TODO return todo() '''myrole''' # This command sends the user's role back to them in a DM. if is_command(message,['myrole']): return [Mailbox().dm("Your role is **{}**.".format(db_get(message.author.id,'role')), message.author.id,False,[db_get(message.author.id,'emoji')])] if is_command(message,['myrole'],True): # TODO return todo() '''remove''' # This command removes a given user from a conspiracy channel. # A user should not get removed if they're the channel owner. if is_command(message,['remove']): members_to_remove = check.users(message) if is_owner(user_id,channel_id) == False: return [Mailbox().respond("I\'m sorry, but you cannot use this command over here!")] command = Mailbox() for x in members_to_remove: if is_owner(x,channel_id) == True: return [Mailbox().respond("The owner of a CC can\'t be removed! Please try again.")] command.edit_cc(x,channel_id,0) return [command.respond("Insert Randium's comment here")] if is_command(message,['remove'],True): # TODO return todo() # ======================================================= # ROLE SPECIFIC COMMANDS # ======================================================= if personal_channel(user_id,message_channel) == True: '''give_amulet''' # This command can be executed by everyone, but only in one channel. # That's the amulet channel. # To be worked out how exactly. if is_command(message,['give_amulet']): # TODO return todo() if is_command(message,['give_amulet'],True): # TODO return todo() '''assassinate''' # Assassin's command; kill a victim if is_command(message,['assassinate','kill']) and user_role == "Assassin": # TODO return todo() if is_command(message,['assassinate','kill'],True) and user_role == "Assassin": # TODO return todo() '''aura''' # The command for aura tellers if is_command(message,['aura','tell','vision']) and user_role == "Aura Teller": # TODO return todo() if is_command(message,['aura','tell','vision'],True) and user_role == "Aura Teller": # TODO return todo() '''barber_kill''' # Barber kill - to assassinate a victim during the day if is_command(message,['assassinate','barber_kill','cut']) and user_role == "Barber": # TODO return todo() if is_command(message,['assassinate','barber_kill','cut'],True) and user_role == "Barber": # TODO return todo() '''seek''' # Crowd seeker's power if is_command(message,['crowd','seek']) and user_role == "Crowd Seeker": # TODO return todo() if is_command(message,['crowd','seek'],True) and user_role == "Crowd Seeker": # TODO return todo() '''kiss''' # Cupid's power to fall in love with someone. if is_command(message,['kiss','love','shoot']) and user_role == "Cupid": # TODO return todo() if is_command(message,['kiss','love','shoot'],True) and user_role == "Cupid": # TODO return todo() '''follow''' # The command that allows the dog to choose a side. if is_command(message,['bark','become','choose','follow']) and user_role == "Dog": # TODO return todo() if is_command(message,['bark','become','choose','follow'],True) and user_role == "Dog": # TODO return todo() '''execute''' # This command allows the executioner to choose a replacement target. if is_command(message,['choose','execute']) and user_role == "Executioner": # TODO return todo() if is_command(message,['choose','execute'],True) and user_role == "Executioner": # TODO return todo() '''undoom''' # The Exorcist's command. if is_command(message,['exercise','exorcise','undoom']) and user_role == "Exorcist": # TODO return todo() if is_command(message,['exercise','exorcise','undoom'],True) and user_role == "Exorcist": # TODO return todo() '''inspect''' # The fortune teller's command. if is_command(message,['forsee','inspect','see','tell']) and user_role == "Fortune Teller": # TODO return todo() if is_command(message,['forsee','inspect','see','tell'],True) and user_role == "Fortune Teller": # TODO return todo() '''silence''' # Grandma's command. if is_command(message,['knit','knot','silence']) and user_role == "Grandma": # TODO return todo() if is_command(message,['knit','knot','silence'],True) and user_role == "Grandma": # TODO return todo() '''hook''' # The hooker's command if is_command(message,['f**k','hook','sleep']) and user_role == "Hooker": # TODO return todo() if is_command(message,['f**k','hook','sleep'],True) and user_role == "Hooker": # TODO return todo() '''hunt''' # The huntress' command. Used to keep track of whom will be shot. if is_command(message,['hunt','shoot']) and user_role == "Huntress": # TODO return todo() if is_command(message,['hunt','shoot'],True) and user_role == "Huntress": # TODO return todo() '''unfreeze''' # The innkeeper's command if is_command(message,['melt','unfreeze']) and user_role == "Innkeeper": # TODO return todo() if is_command(message,['melt','unfreeze'],True) and user_role == "Innkeeper": # TODO return todo() '''copy''' # The Look-Alike's command if is_command(message,['copy','imitate','mirror','resemble']) and user_role == "Look-Alike": # TODO return todo() if is_command(message,['copy','imitate','mirror','resemble'],True) and user_role == "Look-Alike": # TODO return todo() '''holify''' # The Priest's command if is_command(message,['holify','sacrify','water']) and user_role == "Priest": # TODO return todo() if is_command(message,['holify','sacrify','water'],True) and user_role == "Priest": # TODO return todo() '''purify''' # The Priestess' command if is_command(message,['heal','light','purify','sacrify']) and user_role == "Priestess": # TODO return todo() if is_command(message,['heal','light','purify','sacrify'],True) and user_role == "Priestess": # TODO return todo() '''threaten''' # The Raven's command if is_command(message,['threaten','raven']) and user_role == "Raven": # TODO return todo() if is_command(message,['threaten','raven'],True) and user_role == "Raven": # TODO return todo() '''reveal''' # The Royal Knight's command if is_command(message,['end','prevent','reveal','stop']) and user_role == "Royal Knight": # TODO return todo() if is_command(message,['end','prevent','reveal','stop'],True) and user_role == "Royal Knight": # TODO return todo() '''life''' # The witch' command to use her life potion if is_command(message,['heal','life','save']) and user_role == "Witch": # TODO return todo() if is_command(message,['heal','life','save'],True) and user_role == "Witch": # TODO return todo() '''death''' # The witch' command to use her death potion if is_command(message,['death','kill','murder','poison']) and user_role == "Witch": # TODO return todo() if is_command(message,['death','kill','murder','poison'],True) and user_role == "Witch": # TODO return todo() '''çurse''' # The curse caster's command if is_command(message,['cast','corrupt','curse']) and user_role == "Curse Caster": # TODO return todo() if is_command(message,['cast','corrupt','curse'],True) and user_role == "Curse Caster": # TODO return todo() '''infect''' # The infected wolf's command if is_command(message,['cough','infect','sneeze','turn']) and user_role == "Infected Wolf": # TODO return todo() if is_command(message,['cough','infect','sneeze','turn'],True) and user_role == "Infected Wolf": # TODO return todo() '''devour''' # The Lone wolf's command if is_command(message,['chew','devour','eat','kill','munch']) and user_role == "Lone Wolf": # TODO return todo() if is_command(message,['chew','devour','eat','kill','munch'],True) and user_role == "Lone Wolf": # TODO return todo() '''disguise''' # The tanner's command if is_command(message,['change','cloth','disguise','hide']) and user_role == "Tanner": # TODO return todo() if is_command(message,['change','cloth','disguise','hide'],True) and user_role == "Tanner": # TODO return todo() '''inspect''' # The Warlock's command if is_command(message,['forsee','inspect','see','tell']) and user_role == "Priestess": # TODO return todo() if is_command(message,['forsee','inspect','see','tell'],True) and user_role == "Priestess": # TODO return todo() '''devour''' # The white werewolf's command if is_command(message,['chew','devour','eat','kill','munch']) and user_role == "White Werewolf": # TODO return todo() if is_command(message,['chew','devour','eat','kill','munch'],True) and user_role == "White Werewolf": # TODO return todo() '''wager''' # The devil's command if is_command(message,['choose','wager']) and user_role == "Devil": # TODO return todo() if is_command(message,['choose','wager'],True) and user_role == "Devil": # TODO return todo() '''enchant''' # The flute player's command if is_command(message,['enchant','flute']) and user_role == "Flute Player": # TODO return todo() if is_command(message,['enchant','flute'],True) and user_role == "Flute Player": # TODO return todo() '''unite''' # The horseman's command if is_command(message,['apocalypse','clean','unite']) and user_role == "Horseman": # TODO return todo() if is_command(message,['apocalypse','clean','unite'],True) and user_role == "Horseman": # TODO return todo() '''guess''' # The ice king's command to add a guess about a user to their list. # Note that this command could/should be usable at any time, as long as the submit command isn't if is_command(message,['add','guess','freeze']) and user_role == "Ice King": # TODO return todo() if is_command(message,['add','guess','freeze'],True) and user_role == "Ice King": # TODO return todo() '''submit''' # The ice king's command to submit the list of people of whom they have guessed their roles. if is_command(message,['guess_that','freeze_all','submit']) and user_role == "Ice King": # TODO return todo() if is_command(message,['guess_that','freeze_all','submit'],True) and user_role == "Ice King": # TODO return todo() '''powder''' # Powder a player if is_command(message,['creeper','powder']) and user_role == "Pyromancer": # TODO return todo() if is_command(message,['creeper','powder'],True) and user_role == "Pyromancer": # TODO return todo() '''abduct''' # To kidnap players if is_command(message,['abduct','add','kidnap','swamp']) and user_role == "The Thing": # TODO return todo() if is_command(message,['abduct','add','kidnap','swamp'],True) and user_role == "The Thing": # TODO return todo() '''create_swamp''' # To create a new swamp with all victims if is_command(message,['abduct_all','create_swamp','start_cliche_horror_movie']) and user_role == "The Thing": # TODO return todo() if is_command(message,['abduct_all','create_swamp','start_cliche_horror_movie'],True) and user_role == "The Thing": # TODO return todo() # ============================================================= # # EVERYONE # # ============================================================= '''age''' # Allows users to set their age. if is_command(message,['age']): # TODO return todo() if is_command(message,['age'],True): # TODO return todo() '''profile''' # This command allows one to view their own profile # When giving another player's name, view that player's profile if is_command(message,['profile']): # TODO return todo() if is_command(message,['profile'],True): # TODO return todo() '''signup''' # This command signs up the player with their given emoji, assuming there is no game going on. if is_command(message,['signup']): emojis = check.emojis(message) choice_emoji = "" if emojis == False: msg = "**Incorrect syntax:** `" + prefix + "signup <emoji>`\n\nExample: `" + prefix + "signup :smirk:`" return [Mailbox().respond(msg,True)] for emoji in emojis: if emoji_to_player(emoji) == None: choice_emoji = emoji break if isParticipant(user_id,True,True): if choice_emoji == "": return [Mailbox().respond("You are already signed up with the {} emoji! Also, your emoji was occupied.".format(db_get(user_id,'emoji')),True)] db_set(user_id,'emoji',choice_emoji) reaction = Mailbox().respond("You have successfully changed your emoji to the {} emoji!".format(choice_emoji)) return [reaction.spam("<@{}> has changed their emoji to the {} emoji.".format(user_id,choice_emoji))] if emoji == "": if len(choice_emojis) == 1: return [Mailbox().respond("I am sorry! Your chosen emoji was already occupied.",True)] return [Mailbox().respond("I am sorry, but all of your given emojis were already occupied! Such bad luck.",True)] signup(user_id,message.author.name,choice_emoji) reaction = Mailbox().respond("You have successfully signed up with the {} emoji!".format(choice_emoji)) return [reaction.spam("<@{}> has signed up with the {} emoji.".format(user_id,choice_emoji))] # Help command if is_command(message,['signup'],True): msg = "**Usage:** `" + prefix + "signup <emoji>`\n\nExample: `" + prefix + "signup :smirk:`" return [Mailbox().respond(msg,True)] if message.content.startswith(prefix): return [Mailbox().respond("Sorry bud, couldn't find what you were looking for.",True)] return []
def take_shot(message): global deadies global winners global challenger global acceptant global game_channel global bullet_number global bullet global timeout global rigged user = message.author channel = message.channel # Start a game. if challenger == None: for deadie in deadies: if deadie.user == user: return Mailbox().respond( "Sorry, bud. Ya can't play if you're dead.", True) challenger = user game_channel = channel timeout = time.time() return Mailbox().respond( "<@{}> has grabbed the pistol and loaded a bullet in it! Who wants to play a dangerous game?" .format(user.id)) # Redirect wrong channel if game_channel != channel: return Mailbox().respond( "I'm sorry! There's currently a game going on in <#{}>, go check it out!" .format(game_channel.id), True) # Do not play game with yourself if acceptant == None and user == challenger: return Mailbox().respond( "Not so fast! Wait for someone to accept your challenge!") # Accept a challenged game if acceptant == None and user != challenger: for deadie in deadies: if deadie.user == user: return Mailbox().respond( "Sorry, bud. Ya can't play if you're dead.", True) acceptant = user timeout = time.time() bullet = random.randint(1, 6) bullet_number = 0 return Mailbox().respond( "You take the pistol, give it a turn, then hand the pistol over to <@{}>! They will start!" .format(challenger.id)) # Ignore non-participating players if user not in [challenger, acceptant]: for deadie in deadies: if deadie.user == user: return Mailbox().respond( "You attempted to grab the pistol, but then you realised you were already dead!", True) return Mailbox().respond( "The pistol was out of your reach. You failed to grab it.", True) # Hold the other from shooting twice. if user == acceptant: return Mailbox().respond( "It\'s not your turn! Wait for <@{}> to finish.".format( challenger.id)) # Let the user shoot if user == challenger: bullet_number += 1 if bullet == bullet_number: user = None victim = None for player in winners: if player.user == acceptant: user = player if player.user == challenger: victim = player winners.remove(victim) if victim == None: victim = Ruser(challenger) if user == None: user = Ruser(acceptant) winners.append(user) if random.random() < 0.9 and not rigged: user.kill(victim) deadies.append(victim) answer = Mailbox().respond( "You pull the trigger, and your brains get splattered all over the place.", False, ['💀']) answer.respond("**{} WINS!**".format(user.user.display_name)) else: rigged = False answer = Mailbox().respond( "As you pull the trigger, you hear a **BANG**! But you only feel an empty shelf bop against your head." ) answer.respond("Erm... that's awkward.") challenger = None acceptant = None game_channel = None bullet_number = 0 bullet = 0 timeout = 0 return answer switch = challenger challenger = acceptant acceptant = switch timeout = time.time() return Mailbox().respond( "You pull the trigger, and you hear a small **CLICK!** It's <@{}>'s turn now." .format(challenger.id)) return Mailbox().spam( "I got a strange event during the Russian Roulette! Can somebody check this out?" ).respond( "**ERROR:** Invalid if-statwments. Please report this to the Game Masters!" )
def surrender(need_for_check=True, user=None): global deadies global winners global challenger global acceptant global game_channel global bullet_number global bullet global timeout if need_for_check: if time.time() - timeout < 600: return Mailbox() if challenger == None: return Mailbox() if user != None and user != challenger: return Mailbox() if acceptant == None: if user == None: if time.time() - timeout > 600: answer = Mailbox().msg( "It has taken too long for anyone to accept your challenge, <@{}>! If you're still here, please rejoin the challenge." .format(challenger.id), game_channel.id) challenger = None game_channel = None return answer return Mailbox() game_channel = None challenger = None game_channel = None return Mailbox().respond( "<@{}> fired the round in the air, and put down the gun. Let's play this game later!" .format(user.id)) print('Game reset!') # Reset the game user = None victim = None for player in winners: if player.user == acceptant: user = player if player.user == challenger: victim = player if victim == None: victim = Ruser(challenger) winners.append(victim) if user == None: user = Ruser(acceptant) winners.append(user) update_roulette_score(user.user.id, len(user)) update_roulette_score(victim.user.id, len(victim)) answer = Mailbox().respond( "It seems like <@{}> has chickened out! Boo!".format(victim.user.id), False, ['🍅']) answer.respond("**<@{}> WINS!**".format(user.user.id)) challenger = None acceptant = None game_channel = None bullet_number = 0 bullet = 0 timeout = 0 return answer
def process(message, isGameMaster=False, isAdmin=False, isPeasant=False): user_id = message.author.id message_channel = message.channel.id help_msg = "**List of commands:**\n" args = message.content.split(' ') # ============================================================= # # BOT COMMANDS # # ============================================================= if isPeasant == True: pass # ============================================================= # # ADMINISTRATOR # # ============================================================= if isAdmin == True: help_msg += "\n __Admin commands:__\n" elif is_command(message, ['delete_category','start']): return [Mailbox().respond(PERMISSION_MSG.format("Administrator"), True)] # ============================================================= # # GAME MASTERS # # ============================================================= if isGameMaster == True: help_msg += "\n__Game Master commands:__\n" if is_command(message, ['userinv','userinventory']): target = check.users(message) if not target: return [Mailbox().respond("**INVALID SYNTAX:**\nNo target provided!",True)] answer = Mailbox().spam("**__<@{}>'S BALANCE__**".format(target[0])) for item in items.jget("items"): if has_item(target[0],item["code"]): answer.spam_add('\n{}x - **'.format(has_item(target[0],item["code"],False)) + item["name"] + '**') return [answer] if is_command(message, ['userinv','userinventory'], True): return todo() help_msg += "`" + prefix + "userinv` - View a user's inventory.\n" elif is_command(message, []): return [Mailbox().respond(PERMISSION_MSG.format("Game Master"), True)] # ============================================================= # # PARTICIPANTS # # ============================================================= if isParticipant(user_id): help_msg += "\n__Participant commands:__\n" user_undead = int(db_get(user_id,'undead')) elif is_command(message, []): return [Mailbox().respond(PERMISSION_MSG.format("Participant"), True)] # ============================================================= # # EVERYONE # # ============================================================= help_msg += '\n\n' '''buy''' if is_command(message, ['buy']): number = check.numbers(message) if not number: return [Mailbox().dm("No amount provided! Please provide me with a number!",True)] answer = [Mailbox().dm(shop.buy(user_id,number[0],message.author.name),user_id)] if is_command(message, ['buy'], True): msg = "**Usage:** Buy an item from the shop.\n\n`" + prefix + "buy <n>`\n\n" msg += "**Example:** `" + prefix + "buy 1`" return [Mailbox().respond(msg,True)] help_msg += "`" + prefix + "buy` - Buy item from the shop.\n" '''inventory''' if is_command(message, ['inv','inventory','bal','balance']): answer = Mailbox().dm("**__YOUR CURRENT BALANCE__**",user_id) for item in items.jget("items"): if has_item(user_id,item["code"]): answer.dm_add('\n{}x - **'.format(has_item(user_id,item["code"],False)) + item["name"] + '**') return [answer] if is_command(message, ['inv','inventory','bal','balance'], True): return todo() help_msg += "`" + prefix + "inventory` - View your inventory.\n" '''sell''' if is_command(message, ['sell']): number = check.numbers(message) if not number: return [Mailbox().dm("No amount provided! Please provide me with a number!",True)] answer = [Mailbox().dm(shop.sell(user_id,number[0],message.author.name),user_id)] if is_command(message, ['sell'], True): msg = "**Usage:** Sell an item from the shop.\n\n`" + prefix + "sell <n>`\n\n" msg += "**Example:** `" + prefix + "sell 1`" return [Mailbox().respond(msg,True)] help_msg += "`" + prefix + "sell` - Buy item from the shop.\n" '''shop''' if is_command(message, ['shop']): answer = Mailbox() for msg in shop.get_market_message(): answer.respond(msg,True) return answer if is_command(message, ['shop']): msg = "**Usage:** View the Devil Bot's shop.\n\n`" + prefix + "shop`" return [Mailbox().respond(msg,True)] help_msg += "`" + prefix + "shop` - View the Devil's shop." help_msg += "\n\n__Item specific commands:__" '''attack''' if is_command(message, ['attack', 'dagger', 'kill']): pass # TODO '''disguise''' if is_command(message,['disguise','dis']): return [use_item(103,message)] if is_command(message,['disguise','dis'],True): msg = "**Usage:** Disguise a participant.\n\n`" + prefix + "disguise @Randium#6521 Innocent`\n\n" msg += "This command can only be used by participants. You can disguise yourself." return [Mailbox().respond(msg,True)] help_msg += "`" + prefix + "disguise` - Disguise a participant.\n" '''hide''' if is_command(message,['hide']): return [use_item(100,message)] if is_command(message,['disguise','dis'],True): msg = "**Usage:** Disguise a participant.\n\n`" + prefix + "disguise @Randium#6521 Innocent`\n\n" msg += "This command can only be used by participants. You can disguise yourself." return [Mailbox().respond(msg,True)] help_msg += "`" + prefix + "hide` - Become invisible for the night.\n" # -------------------------------------------------------------- # HELP # -------------------------------------------------------------- help_msg += "\n\n*If you have any more questions, feel free to ask any of the Game Masters!*" '''help''' if is_command(message,['help']) and is_command(message,['help'],True) == False: return [Mailbox().respond(help_msg,True)] if is_command(message,['help'],True): answer = Mailbox().respond("Hey there! `" + prefix + "help` will give you a list of commands that you can use.") answer.respond_add("\nIf you have any questions, feel free to ask any of the Game Masters!") return [answer] if message.content.startswith(prefix): return [Mailbox().respond("Sorry bud, couldn't find what you were looking for.", True)] return []