|
|
@@ -0,0 +1,244 @@
|
|
|
+import discord
|
|
|
+from discord.ext import commands
|
|
|
+import logging
|
|
|
+from common.logging import report
|
|
|
+from query import user as userquery # import member_banned, member_unbanned, created_invite, member_joined, member_removed, member_updated, presence_updated, user_updated, create_user, upsert_total_messages
|
|
|
+from query.guild import update_guild, get_report_deleted, get_report_edited, get_output_channel
|
|
|
+from query.channel import get_interact, insert_channel
|
|
|
+from query.channel_user import upsert_total_messages
|
|
|
+import asyncpg, datetime, random
|
|
|
+
|
|
|
+class Events(commands.Cog):
|
|
|
+ def __init__(self, bot): # Special method that is called when the cog is loaded
|
|
|
+ self.bot = bot
|
|
|
+ self.cooldown_list = {}
|
|
|
+
|
|
|
+ ## Application commands
|
|
|
+ #@commands.Cog.listener() # we can add event listeners to our cog
|
|
|
+ #async def on_application_command_error(self, context, exception):
|
|
|
+ # await report(self.bot, (context.command, context.interaction.data, context.interaction.followup, exception))
|
|
|
+
|
|
|
+ # Bans
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_member_ban(self, guild: discord.Guild, user: discord.User):
|
|
|
+ await userquery.member_banned(self.bot.pg, user.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_member_unban(self, guild: discord.Guild, user: discord.User):
|
|
|
+ await userquery.member_unbanned(self.bot.pg, user.id)
|
|
|
+
|
|
|
+ # Channels
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_guild_channel_delete(self, channel: discord.abc.GuildChannel):
|
|
|
+ await report(self.bot, f"{channel} deleted!", channel.guild)
|
|
|
+
|
|
|
+ # Connections
|
|
|
+ @commands.Cog.listener() # we can add event listeners to our cog
|
|
|
+ async def on_connect(self):
|
|
|
+ logging.info("Connected.")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_shard_connect(self, shard_id):
|
|
|
+ logging.info(f"Connecting to chard: {shard_id}")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_disconnect(self):
|
|
|
+ logging.info("Disconnected.")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_shard_disconnect(self, shard_id):
|
|
|
+ logging.info(f"Disconnecting from chard: {shard_id}")
|
|
|
+
|
|
|
+ @commands.Cog.listener() # we can add event listeners to our cog
|
|
|
+ async def on_ready(self):
|
|
|
+ logging.info(f"Logged in as {self.bot.user.name} - {self.bot.user.id}")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_shard_ready(self, shard_id):
|
|
|
+ logging.info(f"Chard ready: {shard_id}")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_resumed(self):
|
|
|
+ logging.info("Resumed")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_shard_resumed(self, shard_id):
|
|
|
+ logging.info(f"Chard resumed: {shard_id}")
|
|
|
+
|
|
|
+ # Guilds
|
|
|
+ @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}`.")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_guild_remove(self, guild: discord.Guild):
|
|
|
+ logging.info(f"Guild removed: {guild}")
|
|
|
+ await report(self.bot, f"Guild removed `{guild}`.")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_guild_available(self, guild: discord.Guild):
|
|
|
+ logging.info(f"Guild available: {guild}")
|
|
|
+ # await report(self.bot, f"Guild available: {guild}.")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_guild_unavailable(self, guild: discord.Guild):
|
|
|
+ logging.info(f"Guild unavailable: {guild}")
|
|
|
+ await report(self.bot, f"Guild unavailable: `{guild}`.")
|
|
|
+
|
|
|
+ # Invites
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_invite_create(self, invite: discord.Invite):
|
|
|
+ await userquery.created_invite(self.bot.pg, invite.inviter.id)
|
|
|
+
|
|
|
+ # Members/Users
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_member_join(self, member: discord.Member):
|
|
|
+ await userquery.member_joined(self.bot.pg, member.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_member_remove(self, member: discord.Member):
|
|
|
+ await userquery.member_removed(self.bot.pg, member.id)
|
|
|
+ report(self.bot, f"{member} has left {member.guild}")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_member_update(self, before: discord.Member, after: discord.Member):
|
|
|
+ await userquery.member_updated(self.bot.pg, before.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_presence_update(self, before: discord.Member, after: discord.Member):
|
|
|
+ await userquery.presence_updated(self.bot.pg, before.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_user_update(self, before: discord.Member, after: discord.Member):
|
|
|
+ await userquery.user_updated(self.bot.pg, before.id)
|
|
|
+
|
|
|
+ # Messages
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_message(self, message: discord.Message):
|
|
|
+ ## ActiveRPG
|
|
|
+ # Create user, if not exists
|
|
|
+ await userquery.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: # Channel does not exist TODO partly to queries
|
|
|
+ try:
|
|
|
+ await insert_channel(self.bot.pg, message.channel.id, message.guild.id)
|
|
|
+ except asyncpg.exceptions.ForeignKeyViolationError: # Guild does not exist
|
|
|
+ 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}") # Echo to OUTPUT_CHANNEL
|
|
|
+
|
|
|
+ # 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):
|
|
|
+
|
|
|
+ # Only respond every X seconds in public places.
|
|
|
+ if message.guild: # Ignore DM's
|
|
|
+ if not message.channel.id in self.cooldown_list:
|
|
|
+ pass
|
|
|
+ elif self.cooldown_list[message.channel.id] > datetime.datetime.now() - datetime.timedelta(seconds=12):
|
|
|
+ return
|
|
|
+ self.cooldown_list[message.channel.id] = datetime.datetime.now()
|
|
|
+
|
|
|
+ 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))
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_message_delete(self, message: discord.Message):
|
|
|
+ await userquery.message_deleted(self.bot.pg, message.author.id)
|
|
|
+ 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}")
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_message_edit(self, before: discord.Message, after: discord.Message):
|
|
|
+ await userquery.message_edited(self.bot.pg, before.author.id)
|
|
|
+ if before.guild:
|
|
|
+ if await get_report_edited(self.bot.pg, before.guild.id) and get_output_channel(self.bot.pg, before.guild.id):
|
|
|
+ report(self.bot, before.guild.id,
|
|
|
+ f"Message from {before.author}, in {before.channel} edited from {before.content} to {after.content}")
|
|
|
+
|
|
|
+ # Reactions
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_reaction_add(self, reaction, user):
|
|
|
+ userquery.reacted(self.bot.pg, user.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_reaction_remove(self, reaction, user):
|
|
|
+ userquery.unreacted(self.bot.pg, user.id)
|
|
|
+
|
|
|
+ # Scheduled Events
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_scheduled_event_create(self, event: discord.ScheduledEvent):
|
|
|
+ userquery.event_created(self.bot.pg, event.creator.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_scheduled_event_user_add(self, event: discord.ScheduledEvent, user: discord.Member):
|
|
|
+ userquery.event_joined(self.bot.pg, user.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_scheduled_event_user_remove(self, event: discord.ScheduledEvent, user: discord.Member):
|
|
|
+ userquery.event_parted(self.bot.pg, user.id)
|
|
|
+
|
|
|
+ # Threads
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_thread_create(self, thread: discord.Thread):
|
|
|
+ userquery.thread_created(self.bot.pg, thread.owner.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_thread_delete(self, thread: discord.Thread):
|
|
|
+ userquery.thread_deleted(self.bot.pg, thread.owner.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_thread_member_join(self, member: discord.ThreadMember):
|
|
|
+ userquery.joined_thread(self.bot.pg, member.id)
|
|
|
+
|
|
|
+ @commands.Cog.listener()
|
|
|
+ async def on_thread_member_remove(self, member: discord.ThreadMember):
|
|
|
+ userquery.left_thread(self.bot.pg, member.id)
|
|
|
+
|
|
|
+
|
|
|
+def setup(bot): # Called by Pycord to setup the cog
|
|
|
+ bot.add_cog(Events(bot)) # Add the cog to the bot
|