logs.py 11 KB

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