logs.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. import discord
  2. from discord.ext import commands
  3. from discord.commands import Option
  4. from discord.commands import slash_command
  5. import configparser
  6. import time
  7. class actionlog(commands.Cog):
  8. def __init__(self, bot: discord.Bot):
  9. self.bot = bot
  10. def _load_config(self):
  11. config = configparser.ConfigParser()
  12. configFilePath = r'config.cfg'
  13. config.read(configFilePath)
  14. return config
  15. def _get_log_channel(self):
  16. config = self._load_config()
  17. log_channel_id = int(config["Logs"]["action_log"])
  18. log_channel = self.bot.get_channel(log_channel_id)
  19. if log_channel is None:
  20. print(f"Log channel with ID {log_channel_id} not found.")
  21. return None
  22. return log_channel
  23. #Deleted Message Log
  24. @commands.Cog.listener()
  25. async def on_message_delete(self, message: discord.Message, moderator: discord.Member):
  26. if message.author.bot:
  27. return
  28. config = self._load_config()
  29. enable_log = config.getboolean("Logs","enable_action_log")
  30. if not enable_log:
  31. return
  32. log_channel = self._get_log_channel()
  33. if log_channel is None:
  34. return
  35. else:
  36. if message.content is None and not message.attachments:
  37. content = "No content available"
  38. elif message.content is None:
  39. content = "Content not available, but there are attachments."
  40. else:
  41. content = message.content
  42. moderator = self.bot.get_user(moderator)
  43. embed = discord.Embed(
  44. title="Message Deleted",
  45. description=f"A message by {message.author.mention} was deleted in {message.channel.mention} by {moderator.mention}.",
  46. color=discord.Color.red(),
  47. timestamp=message.created_at
  48. )
  49. embed.add_field(name="Message Content", value=content[:1024], inline=False)
  50. embed.set_footer(text=f"User ID: {message.author.id} | Message ID: {message.id}")
  51. await log_channel.send(embed=embed)
  52. #Edited Message Log
  53. @commands.Cog.listener()
  54. async def on_message_edit(self, before, after):
  55. config = self._load_config()
  56. enable_log = config.getboolean("Logs","enable_action_log")
  57. if not enable_log:
  58. return
  59. log_channel = self._get_log_channel()
  60. if log_channel is None:
  61. return
  62. if before.author.bot:
  63. return
  64. else:
  65. embed = discord.Embed(
  66. title="Message Edited",
  67. description=f"A message by {before.author.mention} was edited in {before.channel.mention}.",
  68. color=discord.Color.orange(),
  69. timestamp=after.edited_at or discord.utils.utcnow()
  70. )
  71. embed.add_field(name="Before", value=before.content or "No content", inline=False)
  72. embed.add_field(name="After", value=after.content or "No content", inline=False)
  73. embed.set_footer(text=f"User ID: {before.author.id} | Message ID: {before.id}")
  74. await log_channel.send(embed=embed)
  75. #Member Join Log
  76. @commands.Cog.listener()
  77. async def on_member_join(self, member):
  78. config = self._load_config()
  79. enable_log = config.getboolean("Logs","enable_action_log")
  80. if not enable_log:
  81. return
  82. log_channel = self._get_log_channel()
  83. if log_channel is None:
  84. return
  85. embed = discord.Embed(
  86. title="Member Joined",
  87. description=f"{member.mention} has joined the server. Account created at: {member.created_at}",
  88. color=discord.Color.green(),
  89. timestamp=discord.utils.utcnow()
  90. )
  91. embed.set_footer(text=f"User ID: {member.id}")
  92. await log_channel.send(embed=embed)
  93. #Member Leave Log
  94. @commands.Cog.listener()
  95. async def on_member_remove(self, member):
  96. config = self._load_config()
  97. enable_log = config.getboolean("Logs","enable_action_log")
  98. if not enable_log:
  99. return
  100. log_channel = self._get_log_channel()
  101. if log_channel is None:
  102. return
  103. embed = discord.Embed(
  104. title="Member Left",
  105. description=f"{member.mention} has left the server. Joined at: {member.joined_at}",
  106. color=discord.Color.dark_red(),
  107. timestamp=discord.utils.utcnow()
  108. )
  109. embed.set_footer(text=f"User ID: {member.id}")
  110. await log_channel.send(embed=embed)
  111. #Role Update Log
  112. @commands.Cog.listener()
  113. async def on_guild_role_update(self, before, after):
  114. config = self._load_config()
  115. enable_log = config.getboolean("Logs","enable_action_log")
  116. if not enable_log:
  117. return
  118. log_channel = self._get_log_channel()
  119. if log_channel is None:
  120. return
  121. member = after.guild.get_member(after.id) if after.guild else None
  122. moderator = await self.bot.fetch_user(member.id) if member else None
  123. embed = discord.Embed(
  124. title="Role Updated",
  125. description=f"The role **{before.name}** has been updated.",
  126. color=discord.Color.blue(),
  127. timestamp=discord.utils.utcnow()
  128. )
  129. embed.add_field(name="Before", value=f"Name: {before.name}\nColor: {before.color}\nPermissions: {before.permissions}", inline=False)
  130. embed.add_field(name="After", value=f"Name: {after.name}\nColor: {after.color}\nPermissions: {after.permissions}", inline=False)
  131. embed.add_field(name="Made by", value=moderator.mention if moderator else "Unknown", inline=False)
  132. embed.set_footer(text=f"Role ID: {before.id}")
  133. await log_channel.send(embed=embed)
  134. #Role added log
  135. @commands.Cog.listener()
  136. async def on_guild_role_create(self, role):
  137. config = self._load_config()
  138. enable_log = config.getboolean("Logs","enable_action_log")
  139. if not enable_log:
  140. return
  141. log_channel = self._get_log_channel()
  142. if log_channel is None:
  143. return
  144. embed = discord.Embed(
  145. title="Role Created",
  146. description=f"The role **{role.name}** has been created by {role.guild.get_member(role.id).mention if role.guild else 'Unknown'}.",
  147. color=discord.Color.green(),
  148. timestamp=discord.utils.utcnow()
  149. )
  150. embed.set_footer(text=f"Role ID: {role.id}")
  151. await log_channel.send(embed=embed)
  152. #Role deleted log
  153. @commands.Cog.listener()
  154. async def on_guild_role_delete(self, role):
  155. config = self._load_config()
  156. enable_log = config.getboolean("Logs","enable_action_log")
  157. if not enable_log:
  158. return
  159. log_channel = self._get_log_channel()
  160. if log_channel is None:
  161. return
  162. embed = discord.Embed(
  163. title="Role Deleted",
  164. description=f"The role **{role.name}** has been deleted by {role.guild.get_member(role.id).mention if role.guild else 'Unknown'}.",
  165. color=discord.Color.red(),
  166. timestamp=discord.utils.utcnow()
  167. )
  168. embed.set_footer(text=f"Role ID: {role.id}")
  169. await log_channel.send(embed=embed)
  170. #User Role update log
  171. @commands.Cog.listener()
  172. async def on_member_update(self, before, after):
  173. config = self._load_config()
  174. enable_log = config.getboolean("Logs","enable_action_log")
  175. if not enable_log:
  176. return
  177. log_channel = self._get_log_channel()
  178. if log_channel is None:
  179. return
  180. before_roles = set(before.roles)
  181. after_roles = set(after.roles)
  182. added_roles = after_roles - before_roles
  183. removed_roles = before_roles - after_roles
  184. for role in added_roles:
  185. embed = discord.Embed(
  186. title="Role Added",
  187. description=f"The role **{role.name}** has been added to {after.mention} by {after.guild.get_member(after.id).mention if after.guild else 'Unknown'}.",
  188. color=discord.Color.green(),
  189. timestamp=discord.utils.utcnow()
  190. )
  191. embed.set_footer(text=f"User ID: {after.id} | Role ID: {role.id}")
  192. await log_channel.send(embed=embed)
  193. for role in removed_roles:
  194. embed = discord.Embed(
  195. title="Role Removed",
  196. description=f"The role **{role.name}** has been removed from {after.mention} by {after.guild.get_member(after.id).mention if after.guild else 'Unknown'}.",
  197. color=discord.Color.red(),
  198. timestamp=discord.utils.utcnow()
  199. )
  200. embed.set_footer(text=f"User ID: {after.id} | Role ID: {role.id}")
  201. await log_channel.send(embed=embed)
  202. #Server Changes Log
  203. @commands.Cog.listener()
  204. async def on_guild_update(self, before, after):
  205. config = self._load_config()
  206. enable_log = config.getboolean("Logs","enable_action_log")
  207. if not enable_log:
  208. return
  209. log_channel = self._get_log_channel()
  210. if log_channel is None:
  211. return
  212. embed = discord.Embed(
  213. title="Server Updated",
  214. description=f"The server has been updated by {after.guild.get_member(after.id).mention if after.guild else 'Unknown'}.",
  215. color=discord.Color.blue(),
  216. timestamp=discord.utils.utcnow()
  217. )
  218. embed.add_field(name="Before", value=f"Name: {before.name}\nDescription: {before.description}\nOwner: {before.owner}", inline=False)
  219. embed.add_field(name="After", value=f"Name: {after.name}\nDescription: {after.description}\nOwner: {after.owner}", inline=False)
  220. embed.set_footer(text=f"Server ID: {before.id}")
  221. await log_channel.send(embed=embed)
  222. #Voice channel log
  223. @commands.Cog.listener()
  224. async def on_voice_state_update(self, member, before, after):
  225. config = self._load_config()
  226. enable_log = config.getboolean("Logs","enable_action_log")
  227. if not enable_log:
  228. return
  229. log_channel = self._get_log_channel()
  230. if log_channel is None:
  231. return
  232. if before.channel is None and after.channel is not None:
  233. action = "joined"
  234. channel = after.channel
  235. elif before.channel is not None and after.channel is None:
  236. action = "left"
  237. channel = before.channel
  238. elif before.channel is not None and after.channel is not None and before.channel != after.channel:
  239. action = "moved from"
  240. channel = before.channel
  241. else:
  242. return
  243. embed = discord.Embed(
  244. title="Voice State Updated",
  245. description=f"{member.mention} has {action} the voice channel {channel.mention}.",
  246. color=discord.Color.purple(),
  247. timestamp=discord.utils.utcnow()
  248. )
  249. embed.set_footer(text=f"User ID: {member.id}")
  250. await log_channel.send(embed=embed)
  251. def setup(bot: discord.Bot):
  252. bot.add_cog(actionlog(bot))