logs.py 10 KB

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