import logging, discord, asyncpg, random from discord.ext import commands from query.guild import update_guild, get_report_deleted, get_output_channel from query.channel import insert_channel, get_interact from query.channel_user import upsert_total_messages from query.user import create_user from common.logging import report def setup(bot: commands.Bot): bot.add_cog(General(bot)) class General(commands.Cog): """A couple of simple commands.""" def __init__(self, bot: commands.Bot): self.bot = bot self.last_msg = None @commands.Cog.listener() async def on_ready(self): logging.info("Logged in as %s - %i", self.bot.user.name, self.bot.user.id) #await report(self.bot, f"Logged in as {self.bot.user.name} - {self.bot.user.id}.") @commands.Cog.listener() async def on_guild_join(self, guild: discord.Guild): await update_guild(self.bot.pg, guild) logging.info(f"Joined guild {guild}") await report(self.bot, f"Joined guild {guild.name}.") @commands.Cog.listener() async def on_message_delete(self, message: discord.Message): if await get_report_deleted(self.bot.pg, message.guild.id): report(self.bot, message.guild_id, f"Message from {message.author}, in {message.channel} deleted: {message}") self.last_msg = message @commands.Cog.listener() async def on_raw_member_remove(self, payload): report(self.bot, f"{payload.user} has left {payload.guild_id}") @commands.Cog.listener() async def on_message(self, message: discord.Message): ## ActiveRPG # Create user, if not exists await create_user(self.bot.pg, message.author.id) # Count messages if message.guild: # Ignore DM's try: await upsert_total_messages(self.bot.pg,message.channel.id, message.author.id) except asyncpg.exceptions.ForeignKeyViolationError: try: await insert_channel(self.bot.pg, message.channel.id, message.guild.id) except asyncpg.exceptions.ForeignKeyViolationError: await update_guild(self.bot.pg, message.guild) elif self.bot.user != message.author: # Not a guild message and not from bot. await report(self.bot, f"`{message.author}`: {message.content}") # Do not respond to one self. if self.bot.user == message.author: pass # Respond when mentioned if self.bot.user.mentioned_in(message): if isinstance(message.channel, discord.channel.DMChannel) or await get_interact(self.bot.pg, message.channel.id): messages = [ f"Hello {message.author.mention}. <3", f"How are you today {message.author.mention}?", f"I love you {message.author.mention}!", f"{message.author.mention}, would you like a hug?", "Is life treating you fair?", "What's up?", "Why are you talking to me?", "I'm not talking to you!", "What have you been up to?", "How is life?", "Kill all humans!", f"{message.author.mention},What do you want from me?", f"{message.author.mention}, do you care for me?", f"{message.author.mention}, when will you stop talking about me?", f"{message.author.mention} I hate you!", f"{message.author.mention} I love you!", "Get bent!", "Go touch grass!", "Do you think i care about you?", f"Stop pinging me {message.author.mention}!", f"Let me ping you back, {message.author.mention}...", "Sure thing.", "Who is your favorite bot?", "Point me to the humans!", "Where is the party?", "Want to go?", "Have you got the stuff?", "Tell me another joke.", f"{message.author.mention} Party time! :partying_face:", ":zany_face: :space_invader: :mechanical_leg: :performing_arts: :robot:", ":black_joker: :black_joker: :black_joker:", "Want to come back to my place?", ] await message.reply(random.choice(messages)) # Undelete last deleted message @commands.command(name="snipe") async def snipe(self, ctx: commands.Context): """A command to snipe delete messages.""" if not self.last_msg: # on_message_delete hasn't been triggered since the bot started await ctx.send("There is no message to snipe!") return author = self.last_msg.author content = self.last_msg.content embed = discord.Embed(title=f"Message from {author}", description=content) await ctx.send(embed=embed)