async def on_message_edit(before, after): if before.author == client.user: # We don't want to respond to our own edits return if before.content == after.content: # Ensure it wasn't just a pin return #stats.increment_stat("messages_edited", 1) #stats.increment_user_stat(before.author.id, "messages_edited", 1) if before.id != after.id: db.add_trash_message(after.id,after.channel.id) #check role of sender isGameMaster = False isAdmin = False isPeasant = False try: if after.guild == client.get_channel(int(config.game_log)).guild: role_table = [y.id for y in after.guild.get_member(after.author.id).roles] if game_master in role_table: isGameMaster = True if administrator in role_table: isAdmin = True if peasant in role_table and after.author.bot == True: isPeasant = True except Exception: pass await process_message(after,process(after,isGameMaster,isAdmin,isPeasant))
async def on_message(message): # we do not want the bot to reply to itself if message.author == client.user: #stats.increment_stat("bot_messages_sent", 1) return #stats.increment_stat("messages_sent", 1) #stats.increment_user_stat(message.author.id, "messages_sent", 1) # Add trash messages db.add_trash_message(message.id,message.channel.id) #check role of sender isGameMaster = False isAdmin = False isPeasant = False if message.guild == client.get_channel(int(config.game_log)).guild: try: role_table = [y.id for y in message.guild.get_member(message.author.id).roles] except Exception: print('Unable to acquire role_table from {}'.format(message.author.display_name)) else: if game_master in role_table: isGameMaster = True if administrator in role_table: isAdmin = True if peasant in role_table and message.author.bot == True: isPeasant = True await process_message(message,process(message,isGameMaster,isAdmin,isPeasant))
async def on_message(message): # we do not want the bot to reply to itself if message.author == client.user: return gamelog_channel = client.get_channel(int(config.game_log)) botspam_channel = client.get_channel(int(config.bot_spam)) storytime_channel = client.get_channel(int(config.story_time)) # Check if the message author has the Game Master role isGameMaster = False if message.guild == gamelog_channel.guild: if game_master in [y.id for y in message.guild.get_member(message.author.id).roles]: isGameMaster = True isAdmin = False if message.guild == gamelog_channel.guild: if administrator in [y.id for y in message.guild.get_member(message.author.id).roles]: isAdmin = True result = process(message,isGameMaster,isAdmin) temp_msg = [] for mailbox in result: if mailbox.evaluate_polls == True: for poll in db.get_all_polls(): # poll.msg_table -> list of message ids # poll.blamed -> name of killer # poll.purpose -> the reason of the kill poll_channel = client.get_channel(int(poll.channel)) if poll_channel == None: await botspam_channel.send("We got a problem! Could you send these results to the appropriate channel, please?") poll_channel = botspam_channel user_table = [] for msg in poll.msg_table: poll_msg = await poll_channel.get_message(msg) for emoji in poll_msg.reactions: users = await emoji.users().flatten() for person in users: if db.isParticipant(person.id): user_table.append([person.id,emoji.emoji]) log, result, chosen_emoji = count_votes(user_table,poll.purpose) await gamelog_channel.send(log) await poll_channel.send(result) chosen_one = db.emoji_to_player(chosen_emoji) if chosen_emoji != '' and chosen_one != None: if poll.purpose == 'lynch': db.add_kill(chosen_one,'Innocent') elif poll.purpose == 'Mayor': # TODO: give Mayor role and add data to dynamic.json pass elif poll.purpose == 'Reporter': # TODO: give Reporter role and add data to dynamic.json pass elif poll.purpose == 'wolf': db.add_kill(chosen_one,'Werewolf',db.random_wolf()) elif poll.purpose == 'cult': db.add_kill(chosen_one,'Cult Leader',db.random_cult()) elif poll.purpose == 'thing': # TODO: kill poor victim pass for element in mailbox.gamelog: msg = await gamelog_channel.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.botspam: msg = await botspam_channel.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.storytime: msg = await storytime_channel.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.answer: msg = await message.channel.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.channel: if element.embed: if element.destination == "spam": msg = await botspam_channel.send(embed=element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) else: msg = await client.get_channel(int(element.destination)).send(embed=element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) else: msg = await client.get_channel(int(element.destination)).send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.player: member = client.get_user(element.destination) if member == None: await message.channel.send("Couldn't send a DM to <@{}>!".format(element.destination)) await botspam_channel.send("<@{}> has attempted to send a DM to <@{}>, but failed, because we couldn't find the specified user via `get_user`.".format(message.author.id,element.destination)) else: msg = await member.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.oldchannels: # element.channel - channel to be edited; # element.victim - person's permission to be changed; # element.number - type of setting to set to: # 0 - no access (no view, no type) # 1 - access (view + type) # 2 - frozen (view, no type) # 3 - abducted (no view, no type) # 4 - dead (dead role?) # 0 -> read = False # 1 -> read = True # 2 -> give frozen (if they don't have it yet) # 3 -> read = False # 4 -> give dead role + remove participant role # 5 -> mute # 6 -> also mute, no read channel = client.get_channel(element.channel) user = client.get_user(element.victim) main_guild = botspam_channel.guild member = main_guild.get_member(element.victim) await remove_all_game_roles(member) if element.number == 0: await channel.set_permissions(user, read_messages=False, send_messages=False) await member.add_roles(get_role(main_guild.roles, config.participant), reason="Updating CC Permissions") elif element.number == 1: await channel.set_permissions(user, read_messages=True, send_messages=True) await member.add_roles(get_role(main_guild.roles, config.participant), reason="Updating CC Permissions") elif element.number == 2: await channel.set_permissions(user, read_messages=True, send_messages=False) await member.add_roles(get_role(main_guild.roles, config.frozen_participant), reason="Updating CC Permissions") elif element.number == 3: await channel.set_permissions(user, read_messages=False, send_messages=False) await member.add_roles(get_role(main_guild.roles, config.participant), reason="Updating CC Permissions") elif element.number == 4: await channel.set_permissions(user, read_messages=True, send_messages=False) await member.add_roles(get_role(main_guild.roles, config.dead_participant), reason="Updating CC Permissions") elif element.number == 5: await channel.set_permissions(user, read_messages=True, send_messages=False) await member.add_roles(get_role(main_guild.roles, config.participant), reason="Updating CC Permissions") elif element.number == 6: await channel.set_permissions(user, read_messages=False, send_messages=False) await member.add_roles(get_role(main_guild.roles, config.participant), reason="Updating CC Permissions") elif element.number == 7: await channel.set_permissions(user, read_messages=False, send_messages=False) await member.add_roles(get_role(main_guild.roles, config.dead_participant), reason="Updating CC Permissions") elif element.number == 8: await channel.set_permissions(user, read_messages=False, send_messages=False) await member.add_roles(get_role(main_guild.roles, config.suspended), reason="Updating CC Permissions") else: await msg.channel.send('Something went wrong! Please contact a Game Master.') return if db.isParticipant(element.victim,True,True): db.set_user_in_channel(element.channel,element.victim,element.number) for element in mailbox.newchannels: # element.name - name of the channel; # element.owner - owner of the channel; # element.members - members of the channel # element.settlers - members for whom this shall become their home channel # # @Participant - no view + type # @dead Participant - view + no type # @everyone - no view + no type # All you need to do is create a channel where only the channel owner has access. # The other members are given access through another Mailbox. # You could make the work easier if you also posted a cc channel message already over here. if ' ' not in element.name: main_guild = botspam_channel.guild # Find the guild we're in if element.owner not in element.members: element.members.append(element.owner) for buddy in element.settlers: if buddy not in element.members: msg = """**Warning:** I'm adding settlers to a channel!\nThis is should not be a problem, \ but it does at least indicate a flaw in the bot's code. Please, report this to the Game Masters!""" await client.get_channel(message.channel).send(msg) element.members.append(buddy) viewers = [] frozones = [] abductees = [] deadies = [] for user in element.members: member = main_guild.get_member(user) if member == None: await message.author.send("It doesn't seem like <@{}> is part of the server! I am sorry, I can't add them to your **conspiracy channel**.".format(user)) elif db.isParticipant(user,False,True) == True: if int(db_get(user,'abducted')) == 1: abductees.append(member) elif int(db_get(user,'frozen')) == 1: frozones.append(member) elif db.isParticipant(user,False,False) == False: deadies.append(member) else: viewers.append(member) else: deadies.append(member) intro_msg = creation_messages.cc_intro([v.id for v in viewers]) # Role objects (based on ID) roles = main_guild.roles # Roles from the guild game_master_role = discord.utils.find(lambda r: r.id == game_master, roles) default_permissions = { main_guild.default_role: discord.PermissionOverwrite(read_messages=False,send_messages=False), game_master_role: discord.PermissionOverwrite(read_messages=True,send_messages=True), client.user: discord.PermissionOverwrite(read_messages=True,send_messages=True), **{ member: discord.PermissionOverwrite(read_messages=True,send_messages=True) for member in viewers }, **{ member: discord.PermissionOverwrite(read_messages=True,send_messages=False) for member in frozones }, **{ member: discord.PermissionOverwrite(read_messages=True,send_messages=False) for member in deadies } } # Create a new category if needed if db.get_category() == None: category = await main_guild.create_category('CC part {}'.format(db.count_categories()), reason='It seems like we couldn\'t use our previous category! Don\'t worry, I just created a new one.') db.add_category(category.id) else: category = main_guild.get_channel(db.get_category()) try: # Create the text channel reason_msg = 'CC requested by ' + message.author.name channel = await main_guild.create_text_channel( name="s{}_{}".format(config.season,element.name), category=category, overwrites=default_permissions, reason=reason_msg) db.add_channel(channel.id,element.owner) await channel.send(intro_msg) # Set all access rules in the database for member in viewers: db.set_user_in_channel(channel.id,member.id,1) for member in frozones: db.set_user_in_channel(channel.id,member.id,2) for member in abductees: db.set_user_in_channel(channel.id,member.id,3) for member in deadies: if db.isParticipant(member.id,True,True) == True: db.set_user_in_channel(channel.id,member.id,4) except Exception as e: # Catch any thrown exceptions and send an error to the user. await message.channel.send('It seems like I\'ve encountered an error! Please let the Game Masters know about this!') await botspam_channel.send("Oi, Game Masters! I got a problem concerning channel creation for ya to fix.") await botspam_channel.send(e) raise e # Send the full log to Buddy1913 and his sketchy VM. # Give the settlers their own happy little residence for buddy in element.settlers: db_set(buddy,"channel",channel.id) else: """This should not happen, but we'll use it, to prevent the bot from purposely causing an error everytime someone attempts to create a channel that contains spaces. 'cause believe me, that happens ALL the time.""" msg = await message.channel.send("I\'m terribly sorry, but you can\'t use spaces in your channel name. Try again!") temp_msg.append(msg) for element in mailbox.polls: # element.channel # element.purpose # element.user_id # element.description msg = element.description + '\n' emoji_table = [] msg_table = [] i = 0 for user in db.poll_list(): if db.isParticipant(int(user[0])): i += 1 msg += user[1] + " - <@" + str(user[0]) + "> " if int(user[2]) + int(user[3]) > 0: if int(user[2]) == 1: msg += "**[FROZEN]** " if int(user[3]) == 1: msg += "**[ABDUCTED] **" else: emoji_table.append(user[1]) if i % 20 == 19: msg = await client.get_channel(element.channel).send(msg) for emoji in emoji_table: await msg.add_reaction(emoji) msg_table.append(msg) msg = '' else: msg += '\n' if msg != '': msg = await client.get_channel(element.channel).send(msg) for emoji in emoji_table: await msg.add_reaction(emoji) msg_table.append(msg) db.add_poll(msg_table,element.purpose,element.channel,element.user_id) await botspam_channel.send("A poll has been created in <#{}>!".format(element.channel)) for element in mailbox.deletecategories: id = element.channel category = client.get_channel(id) if category != None: bot_message = await message.channel.send('Please react with 👍 to confirm deletion of category `' + category.name + '`.\n\nNote: This action will irrevirsibly delete all channels contained within the specified category. Please use with discretion.') await bot_message.add_reaction('👍') def check(reaction, user): return user == message.author and str(reaction.emoji) == '👍' try: reaction, user = await client.wait_for('reaction_add', timeout=30.0, check=check) except asyncio.TimeoutError: await message.channel.send('Confirmation timed out.') else: await message.channel.send('Ok, I\'ll get right on that.\n\n*This might take some time.*') for channel in category.channels: await channel.delete() await category.delete() await message.channel.send('\n:thumbsup: Channels and category deleted') else: await message.channel.send('Sorry, I couldn\'t find that category.') # Delete all temporary messages after "five" seconds. await asyncio.sleep(120) for msg in temp_msg: await msg.delete()
async def on_message(message): # we do not want the bot to reply to itself if message.author == client.user: return gamelog_channel = client.get_channel(int(config.game_log)) botspam_channel = client.get_channel(int(config.bot_spam)) storytime_channel = client.get_channel(int(config.story_time)) # Check if the message author has the Game Master role isGameMaster = False if message.guild == gamelog_channel.guild: if game_master in [y.id for y in message.author.roles]: isGameMaster = True result = process(message, isGameMaster) temp_msg = [] for mailbox in result: for element in mailbox.gamelog: msg = await gamelog_channel.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.botspam: msg = await botspam_channel.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.storytime: msg = await storytime_channel.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.answer: msg = await message.channel.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.channel: if element.embed: msg = await client.get_channel(int(element.destination) ).send(embed=element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) else: msg = await client.get_channel(int(element.destination) ).send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.player: member = client.get_user(element.destination) if member == None: await message.channel.send( "Couldn't send a DM to <@{}>!".format(element.destination)) await botspam_channel.send( "<@{}> has attempted to send a DM to <@{}>, but failed, because we couldn't find the specified user via `get_user`." .format(message.author.id, element.destination)) else: msg = await member.send(element.content) for emoji in element.reactions: await msg.add_reaction(emoji) if element.temporary == True: temp_msg.append(msg) for element in mailbox.oldchannels: # element.channel - channel to be edited; # element.victim - person's permission to be changed; # element.number - type of setting to set to: # 0 - no access (no view, no type) # 1 - access (view + type) # 2 - frozen (view, no type) # 3 - abducted (no view, no type) # 4 - dead (dead role?) # TODO pass for element in mailbox.newchannels: # element.name - name of the channel; # element.owner - owner of the channel; # element.members - members of the channel # element.settlers - members for whom this shall become their home channel # # @Participant - no view + type # @dead Participant - view + no type # @everyone - no view + no type # All you need to do is create a channel where only the channel owner has access. # The other members are given access through another Mailbox. # You could make the work easier if you also posted a cc channel message already over here. if ' ' not in element.name: main_guild = botspam_channel.guild # Find the guild we're in if element.owner not in element.members: element.members.append(element.owner) for buddy in element.settlers: if buddy not in element.members: msg = """**Warning:** I'm adding settlers to a channel!\nThis is should not be a problem, \ but it does at least indicate a flaw in the bot's code. Please, report this to the Game Masters!""" await client.get_channel(message.channel).send(msg) element.members.append(buddy) viewers = [] abductees = [] for member in db.player_list(): if db_get(member, 'abducted') == 1 and member in element.members: abductees.append(member) elif member in element.members or db_get( member, 'role') in [ 'Dead', 'Spectator' ] or int(member) == int(element.owner): if main_guild.get_member(int(member)) != None: viewers.append(main_guild.get_member(int(member))) else: sorry = await message.channel.send( "It doesn't seem like <@{}> is part of this server! I am sorry, I can't add them to your channel." .format(member)) temp_msg.append(sorry) intro_msg = creation_messages.cc_intro([v.id for v in viewers]) # Role objects (based on ID) roles = main_guild.roles # Roles from the guild game_master_role = discord.utils.find( lambda r: r.id == game_master, roles) dead_participant_role = discord.utils.find( lambda r: r.id == dead_participant, roles) frozen_participant_role = discord.utils.find( lambda r: r.id == frozen_participant, roles) default_permissions = { main_guild.default_role: discord.PermissionOverwrite(read_messages=False), frozen_participant_role: discord.PermissionOverwrite(send_messages=False), dead_participant_role: discord.PermissionOverwrite(read_messages=True, send_messages=False), game_master_role: discord.PermissionOverwrite(read_messages=True), client.user: discord.PermissionOverwrite(read_messages=True, send_messages=True), **{ member: discord.PermissionOverwrite(read_messages=True) for member in viewers }, } # Create a new category if needed if db.get_category() == None: category = await main_guild.create_category( 'CC part {}'.format(db.count_categories()), reason= 'It seems like we couldn\'t use our previous category! Don\'t worry, I just created a new one.' ) db.add_category(category.id) else: category = main_guild.get_channel(db.get_category()) try: # Create the text channel reason_msg = 'CC requested by ' + message.author.name channel = await main_guild.create_text_channel( name="s{}_{}".format(config.season, element.name), category=category, overwrites=default_permissions, reason=reason_msg) db.add_channel(channel.id, element.owner) await channel.send(intro_msg) # Set all access rules in the database for victim in abductees: db.set_user_in_channel(channel.id, victim, 3) for user in viewers: if db_get(user.id, 'role') in ['Dead', 'Spectator']: db.set_user_in_channel(channel.id, user.id, 4) elif db_get(user.id, 'frozen') == 1: db.set_user_in_channel(channel.id, user.id, 2) else: db.set_user_in_channel(channel.id, user.id, 1) except Exception as e: # Catch any thrown exceptions and send an error to the user. await message.channel.send( 'It seems like I\'ve encountered an error! Please let the Game Masters know about this!' ) await botspam_channel.send( "Oi, Game Masters! I got a problem concerning channel creation for ya to fix." ) await botspam_channel.send(e) raise e # Send the full log to Buddy1913 and his sketchy VM. # Give the settlers their own happy little residence for buddy in element.settlers: db_set(buddy, "channel", channel.id) else: """This should not happen, but we'll use it, to prevent the bot from purposely causing an error everytime someone attempts to create a channel that contains spaces. 'cause believe me, that happens ALL the time.""" msg = await message.channel.send( "I\'m terribly sorry, but you can\'t use spaces in your channel name. Try again!" ) temp_msg.append(msg) # Delete all temporary messages after "five" seconds. await asyncio.sleep(5) for msg in temp_msg: await msg.delete()