1
0

events.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import discord
  2. from discord.ext import commands
  3. import logging
  4. from common.logging import report
  5. 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
  6. from query.guild import update_guild, get_report_deleted, get_report_edited, get_output_channel
  7. from query.channel import get_interact, insert_channel
  8. from query.channel_user import upsert_total_messages
  9. import asyncpg, datetime, random
  10. class Events(commands.Cog):
  11. def __init__(self, bot): # Special method that is called when the cog is loaded
  12. self.bot = bot
  13. self.cooldown_list = {}
  14. ## Application commands
  15. #@commands.Cog.listener() # we can add event listeners to our cog
  16. #async def on_application_command_error(self, context, exception):
  17. # await report(self.bot, (context.command, context.interaction.data, context.interaction.followup, exception))
  18. # Bans
  19. @commands.Cog.listener()
  20. async def on_member_ban(self, guild: discord.Guild, user: discord.User):
  21. await userquery.member_banned(self.bot.pg, user.id)
  22. @commands.Cog.listener()
  23. async def on_member_unban(self, guild: discord.Guild, user: discord.User):
  24. await userquery.member_unbanned(self.bot.pg, user.id)
  25. # Channels
  26. @commands.Cog.listener()
  27. async def on_guild_channel_delete(self, channel: discord.abc.GuildChannel):
  28. await report(self.bot, f"{channel} deleted!", channel.guild)
  29. # Connections
  30. @commands.Cog.listener() # we can add event listeners to our cog
  31. async def on_connect(self):
  32. logging.info("Connected.")
  33. @commands.Cog.listener()
  34. async def on_shard_connect(self, shard_id):
  35. logging.info(f"Connecting to chard: {shard_id}")
  36. @commands.Cog.listener()
  37. async def on_disconnect(self):
  38. logging.info("Disconnected.")
  39. @commands.Cog.listener()
  40. async def on_shard_disconnect(self, shard_id):
  41. logging.info(f"Disconnecting from chard: {shard_id}")
  42. @commands.Cog.listener() # we can add event listeners to our cog
  43. async def on_ready(self):
  44. logging.info(f"Logged in as {self.bot.user.name} - {self.bot.user.id}")
  45. @commands.Cog.listener()
  46. async def on_shard_ready(self, shard_id):
  47. logging.info(f"Chard ready: {shard_id}")
  48. @commands.Cog.listener()
  49. async def on_resumed(self):
  50. logging.info("Resumed")
  51. @commands.Cog.listener()
  52. async def on_shard_resumed(self, shard_id):
  53. logging.info(f"Chard resumed: {shard_id}")
  54. # Guilds
  55. @commands.Cog.listener()
  56. async def on_guild_join(self, guild: discord.Guild):
  57. await update_guild(self.bot.pg, guild)
  58. logging.info(f"Joined guild {guild}")
  59. await report(self.bot, f"Joined guild `{guild}`.")
  60. @commands.Cog.listener()
  61. async def on_guild_remove(self, guild: discord.Guild):
  62. logging.info(f"Guild removed: {guild}")
  63. await report(self.bot, f"Guild removed `{guild}`.")
  64. @commands.Cog.listener()
  65. async def on_guild_available(self, guild: discord.Guild):
  66. logging.info(f"Guild available: {guild}")
  67. # await report(self.bot, f"Guild available: {guild}.")
  68. @commands.Cog.listener()
  69. async def on_guild_unavailable(self, guild: discord.Guild):
  70. logging.info(f"Guild unavailable: {guild}")
  71. await report(self.bot, f"Guild unavailable: `{guild}`.")
  72. # Invites
  73. @commands.Cog.listener()
  74. async def on_invite_create(self, invite: discord.Invite):
  75. await userquery.created_invite(self.bot.pg, invite.inviter.id)
  76. # Members/Users
  77. @commands.Cog.listener()
  78. async def on_member_join(self, member: discord.Member):
  79. await userquery.member_joined(self.bot.pg, member.id)
  80. @commands.Cog.listener()
  81. async def on_member_remove(self, member: discord.Member):
  82. await userquery.member_removed(self.bot.pg, member.id)
  83. report(self.bot, f"{member} has left {member.guild}")
  84. @commands.Cog.listener()
  85. async def on_member_update(self, before: discord.Member, after: discord.Member):
  86. await userquery.member_updated(self.bot.pg, before.id)
  87. @commands.Cog.listener()
  88. async def on_presence_update(self, before: discord.Member, after: discord.Member):
  89. await userquery.presence_updated(self.bot.pg, before.id)
  90. @commands.Cog.listener()
  91. async def on_user_update(self, before: discord.Member, after: discord.Member):
  92. await userquery.user_updated(self.bot.pg, before.id)
  93. # Messages
  94. @commands.Cog.listener()
  95. async def on_message(self, message: discord.Message):
  96. ## ActiveRPG
  97. # Create user, if not exists
  98. await userquery.create_user(self.bot.pg, message.author.id)
  99. # Count messages
  100. if message.guild: # Ignore DM's
  101. try:
  102. await upsert_total_messages(self.bot.pg, message.channel.id, message.author.id)
  103. except asyncpg.exceptions.ForeignKeyViolationError: # Channel does not exist TODO partly to queries
  104. try:
  105. await insert_channel(self.bot.pg, message.channel.id, message.guild.id)
  106. except asyncpg.exceptions.ForeignKeyViolationError: # Guild does not exist
  107. await update_guild(self.bot.pg, message.guild)
  108. elif self.bot.user != message.author: # Not a guild message and not from bot.
  109. await report(self.bot, f"`{message.author}`: {message.content}") # Echo to OUTPUT_CHANNEL
  110. # Do not respond to one self.
  111. if self.bot.user == message.author:
  112. pass
  113. # Respond when mentioned
  114. if self.bot.user.mentioned_in(message):
  115. if isinstance(message.channel, discord.channel.DMChannel) or await get_interact(self.bot.pg, message.channel.id):
  116. # Only respond every X seconds in public places.
  117. if message.guild: # Ignore DM's
  118. if not message.channel.id in self.cooldown_list:
  119. pass
  120. elif self.cooldown_list[message.channel.id] > datetime.datetime.now() - datetime.timedelta(seconds=12):
  121. return
  122. self.cooldown_list[message.channel.id] = datetime.datetime.now()
  123. messages = [
  124. f"Hello {message.author.mention}. <3",
  125. f"How are you today {message.author.mention}?",
  126. f"I love you {message.author.mention}!",
  127. f"{message.author.mention}, would you like a hug?",
  128. "Is life treating you fair?",
  129. "What's up?",
  130. "Why are you talking to me?",
  131. "I'm not talking to you!",
  132. "What have you been up to?",
  133. "How is life?",
  134. "Kill all humans!",
  135. f"{message.author.mention},What do you want from me?",
  136. f"{message.author.mention}, do you care for me?",
  137. f"{message.author.mention}, when will you stop talking about me?",
  138. f"{message.author.mention} I hate you!",
  139. f"{message.author.mention} I love you!",
  140. "Get bent!",
  141. "Go touch grass!",
  142. "Do you think i care about you?",
  143. f"Stop pinging me {message.author.mention}!",
  144. f"Let me ping you back, {message.author.mention}...",
  145. "Sure thing.",
  146. "Who is your favorite bot?",
  147. "Point me to the humans!",
  148. "Where is the party?",
  149. "Want to go?",
  150. "Have you got the stuff?",
  151. "Tell me another joke.",
  152. f"{message.author.mention} Party time! :partying_face:",
  153. ":zany_face: :space_invader: :mechanical_leg: :performing_arts: :robot:",
  154. ":black_joker: :black_joker: :black_joker:",
  155. "Want to come back to my place?",
  156. ]
  157. await message.reply(random.choice(messages))
  158. @commands.Cog.listener()
  159. async def on_message_delete(self, message: discord.Message):
  160. await userquery.message_deleted(self.bot.pg, message.author.id)
  161. if await get_report_deleted(self.bot.pg, message.guild.id):
  162. report(self.bot, message.guild_id,
  163. f"Message from {message.author}, in {message.channel} deleted: {message}")
  164. @commands.Cog.listener()
  165. async def on_message_edit(self, before: discord.Message, after: discord.Message):
  166. await userquery.message_edited(self.bot.pg, before.author.id)
  167. if before.guild:
  168. if await get_report_edited(self.bot.pg, before.guild.id) and get_output_channel(self.bot.pg, before.guild.id):
  169. report(self.bot, before.guild.id,
  170. f"Message from {before.author}, in {before.channel} edited from {before.content} to {after.content}")
  171. # Reactions
  172. @commands.Cog.listener()
  173. async def on_reaction_add(self, reaction, user):
  174. userquery.reacted(self.bot.pg, user.id)
  175. @commands.Cog.listener()
  176. async def on_reaction_remove(self, reaction, user):
  177. userquery.unreacted(self.bot.pg, user.id)
  178. # Scheduled Events
  179. @commands.Cog.listener()
  180. async def on_scheduled_event_create(self, event: discord.ScheduledEvent):
  181. userquery.event_created(self.bot.pg, event.creator.id)
  182. @commands.Cog.listener()
  183. async def on_scheduled_event_user_add(self, event: discord.ScheduledEvent, user: discord.Member):
  184. userquery.event_joined(self.bot.pg, user.id)
  185. @commands.Cog.listener()
  186. async def on_scheduled_event_user_remove(self, event: discord.ScheduledEvent, user: discord.Member):
  187. userquery.event_parted(self.bot.pg, user.id)
  188. # Threads
  189. @commands.Cog.listener()
  190. async def on_thread_create(self, thread: discord.Thread):
  191. userquery.thread_created(self.bot.pg, thread.owner.id)
  192. @commands.Cog.listener()
  193. async def on_thread_delete(self, thread: discord.Thread):
  194. userquery.thread_deleted(self.bot.pg, thread.owner.id)
  195. @commands.Cog.listener()
  196. async def on_thread_member_join(self, member: discord.ThreadMember):
  197. userquery.joined_thread(self.bot.pg, member.id)
  198. @commands.Cog.listener()
  199. async def on_thread_member_remove(self, member: discord.ThreadMember):
  200. userquery.left_thread(self.bot.pg, member.id)
  201. def setup(bot): # Called by Pycord to setup the cog
  202. bot.add_cog(Events(bot)) # Add the cog to the bot