main.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. import os
  2. from dotenv import load_dotenv
  3. import discord
  4. from discord.ext import commands
  5. from discord.commands import Option
  6. from discord.commands import slash_command
  7. from datetime import datetime
  8. import configparser
  9. intents = discord.Intents.default()
  10. intents.message_content = True
  11. intents.members = True
  12. intents.guilds = True
  13. intents.reactions = True
  14. client = discord.Client(intents=intents)
  15. #------#
  16. #Load .env file
  17. load_dotenv()
  18. token = os.getenv("TOKEN")
  19. if token is None:
  20. raise ValueError("TOKEN not found in .env file")
  21. debug_guilds_up = []
  22. server_token = os.getenv("SERVER").split(",")
  23. for i in range(len(server_token)):
  24. debug_guilds_up.append(int(server_token[i]))
  25. #------#
  26. #ConfigParser
  27. config = configparser.RawConfigParser()
  28. configFilePath = r'Pycord/VPD_BOT/config.cfg'
  29. config.read_file(open(configFilePath))
  30. title_rules = config.get('Reactionroles Rules', 'tile_rules')
  31. role_rules = config.get('Reactionroles Rules', 'rules_role')
  32. channel_rules = config.get('Reactionroles Rules', 'channel_rules')
  33. message_rules = config.get('Reactionroles Rules', 'message_rules')
  34. emoji_rules = config.get('Reactionroles Rules', 'rules_emoji')
  35. channel_log = config.get('Logs', 'channel_log')
  36. channel_banlog = config.get('Logs', 'ban_log')
  37. #------#
  38. #Initialize Bot
  39. bot = commands.Bot(
  40. command_prefix=commands.when_mentioned_or("!"),
  41. description="VicePD Bot",
  42. intents=intents,
  43. debug_guilds=debug_guilds_up if debug_guilds_up else None
  44. )
  45. async def load_extensions():
  46. for filename in os.listdir("cogs"):
  47. if filename.endswith(".py"):
  48. await bot.load_extension(f"cogs.{filename[:-3]}")
  49. class Admin(commands.Cog):
  50. def __init__(self, bot):
  51. self.bot = bot
  52. #---------------------------------#
  53. #Bot Online Console
  54. @bot.event
  55. async def on_ready():
  56. print(f"{bot.user} ist online")
  57. if bot.guilds:
  58. channel = discord.utils.get(bot.guilds[0].channels, id=int(channel_log))
  59. if channel:
  60. await channel.send(f"{bot.user} ist online")
  61. await load_extensions()
  62. #---------------------------------------------------------------------------------------#
  63. #DONT Touch anything above this line, unless you know what you are doing!#
  64. #---------------------------------------------------------------------------------------#
  65. #---------------------------------#
  66. ## Greet
  67. @bot.slash_command(description="Greet a User")
  68. async def greet(ctx, user: str = Option(discord.User, "The user, you want to greet")):
  69. await ctx.respond(f"Hello {user.mention}")
  70. #---------------------------------#
  71. #---------------------------------#
  72. ## Say
  73. @bot.slash_command(description="Let the bot send a message")
  74. async def say(
  75. ctx,
  76. text: str = Option(description="Input the text you want to send"),
  77. channel_input: discord.TextChannel = Option(description="Select the channel,where you want to send the message.")
  78. ):
  79. channel= discord.utils.get(ctx.guild.channels, id = int(channel_input[2:-1]))
  80. await channel.send(text)
  81. await ctx.respond("Message sent", ephemeral=True)
  82. #---------------------------------#
  83. #---------------------------------#
  84. ## Userinfo
  85. @bot.slash_command(name="userinfo", description="Show informations of a user from this server")
  86. async def userinfo(
  87. ctx,
  88. user: str = Option(discord.User, "Select User"),
  89. ):
  90. if user is None:
  91. user = ctx.author
  92. elif user not in ctx.guild.members:
  93. await ctx.respond("The selected user is not a member on this Server!", ephemeral=True)
  94. return
  95. elif user == bot.user:
  96. await ctx.respond(f"This is me - the {bot.user}", ephemeral=True)
  97. return
  98. embed = discord.Embed(
  99. title=f"Information about *{user.name}*",
  100. description=f"Here you see all details about {user.mention}",
  101. color=discord.Color.blue()
  102. )
  103. time = discord.utils.format_dt(user.created_at, "R")
  104. embed.add_field(name="Account creation date", value=time, inline=False)
  105. if len(user.roles) >= 2:
  106. embed.add_field(name="Roles", value=", ".join([role.mention for role in user.roles if role.name != "@everyone"]), inline=False)
  107. else:
  108. embed.add_field(name="Roles", value="User has no roles", inline=False)
  109. embed.add_field(name="Server join date", value=discord.utils.format_dt(user.joined_at, "R"), inline=False)
  110. embed.add_field(name="User ID", value=user.id)
  111. embed.set_thumbnail(url=user.display_avatar.url)
  112. embed.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
  113. embed.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
  114. await ctx.respond(embed=embed)
  115. #---------------------------------#
  116. #_________________________________#
  117. #BAN SYSTEM
  118. #---------------------------------#
  119. ##Ban
  120. @bot.slash_command(name="ban", description="Ban a user from this Server")
  121. async def ban(
  122. ctx,
  123. user: Option(discord.User, description = "Select User", required=True), # type: ignore
  124. reason: Option(str, description = "Reason for the ban", default="No reason provided") # type: ignore
  125. ):
  126. if not ctx.author.guild_permissions.ban_members:
  127. await ctx.respond("Error: You don't have the permission to ban Members!", ephemeral=True)
  128. return
  129. if user == bot.user:
  130. await ctx.respond("Error: I can't ban myself!", ephemeral=True)
  131. return
  132. if user == ctx.author:
  133. await ctx.respond("Error: You can't ban yourself!", ephemeral=True)
  134. return
  135. channel= discord.utils.get(ctx.guild.channels, id = int(channel_banlog))
  136. embed = discord.Embed(
  137. title=f"Ban of **{user.name}**",
  138. description=f"User {user.mention} has been banned from the Server",
  139. color=discord.Color.red()
  140. )
  141. time = discord.utils.format_dt(datetime.now(), "f")
  142. embed.add_field(name="Ban Date", value=time, inline=False)
  143. embed.add_field(name="Moderator", value=f"{ctx.author}", inline=False)
  144. embed.add_field(name="Reason", value=reason, inline=False)
  145. embed.add_field(name="User ID", value=user.id)
  146. embed.set_thumbnail(url=user.display_avatar.url)
  147. embed.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
  148. embed.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
  149. try:
  150. await ctx.guild.ban(user, reason=reason)
  151. await ctx.respond(f"User {user.mention} has been banned from this Server!", ephemeral=True)
  152. await channel.send(embed=embed)
  153. except discord.Forbidden:
  154. await ctx.respond("Error: I don't have permission to ban this user.", ephemeral=True)
  155. except discord.HTTPException as e:
  156. await ctx.respond(f"Error: Could not ban User {user.mention}. Reason: {e}", ephemeral=True)
  157. except Exception as e:
  158. await ctx.respond(f"Unexpected error: {e}", ephemeral=True)
  159. #---------------------------------#
  160. #Unban
  161. @bot.slash_command(name="unban", description="Unban a user from this Server")
  162. async def ban(
  163. ctx,
  164. user: Option(discord.User, description = "Insert User ID", required=True), # type: ignore
  165. reason: Option(str, description = "Reason for the unbanning", default="No reason provided") # type: ignore
  166. ):
  167. if not ctx.author.guild_permissions.ban_members:
  168. await ctx.respond("Error: You don't have the permission to unban Members!", ephemeral=True)
  169. return
  170. if user == bot.user:
  171. await ctx.respond("Error: I can't unban myself!", ephemeral=True)
  172. return
  173. if user == ctx.author:
  174. await ctx.respond("Error: You can't unban yourself!", ephemeral=True)
  175. return
  176. if user in ctx.guild.members:
  177. await ctx.respond("Error: This user is not banned!", ephemeral=True)
  178. return
  179. channel= discord.utils.get(ctx.guild.channels, id = int(channel_banlog))
  180. embed = discord.Embed(
  181. title=f"Unban of **{user.name}**",
  182. description=f"User {user.mention} was unbanned from this server.",
  183. color=discord.Color.green()
  184. )
  185. time = discord.utils.format_dt(datetime.now(), "f")
  186. embed.add_field(name="Unban Date", value=time, inline=False)
  187. embed.add_field(name="Moderator", value=f"{ctx.author}", inline=False)
  188. embed.add_field(name="Reason", value=reason, inline=False)
  189. embed.add_field(name="User ID", value=user.id)
  190. embed.set_thumbnail(url=user.display_avatar.url)
  191. embed.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
  192. embed.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
  193. try:
  194. await ctx.guild.unban(user, reason=reason)
  195. await ctx.respond(f"User {user.mention} is now unbanned!", ephemeral=True)
  196. await channel.send(embed=embed)
  197. except discord.Forbidden:
  198. await ctx.respond("Error: I don't have permission to unban this user.", ephemeral=True)
  199. except discord.HTTPException as e:
  200. await ctx.respond(f"Error: Could not unban User {user.mention}. Reason: {e}", ephemeral=True)
  201. except Exception as e:
  202. await ctx.respond(f"Unexpected error: {e}", ephemeral=True)
  203. #---------------------------------#
  204. #_________________________________#
  205. #---------------------------------#
  206. #Kick
  207. @bot.slash_command(name="kick", description="Kick a user from this Server")
  208. async def ban(
  209. ctx,
  210. user: Option(discord.User, description = "Select User", required=True), # type: ignore
  211. reason: Option(str, description = "Reason for the ban", default="No reason provided") # type: ignore
  212. ):
  213. if not ctx.author.guild_permissions.kick_members:
  214. await ctx.respond("Error: You don't have the permission to kick Members!", ephemeral=True)
  215. return
  216. if user == bot.user:
  217. await ctx.respond("Error: I can't kick myself!", ephemeral=True)
  218. return
  219. if user == ctx.author:
  220. await ctx.respond("Error: You can't kick yourself!", ephemeral=True)
  221. return
  222. try:
  223. await ctx.guild.kick(user, reason=reason)
  224. await ctx.respond(f"User {user.mention} has been kick from this Server!", ephemeral=True)
  225. except discord.Forbidden:
  226. await ctx.respond("Error: I don't have permission to kick this user.", ephemeral=True)
  227. except discord.HTTPException as e:
  228. await ctx.respond(f"Error: Could not kick User {user.mention}. Reason: {e}", ephemeral=True)
  229. except Exception as e:
  230. await ctx.respond(f"Unexpected error: {e}", ephemeral=True)
  231. #---------------------------------#
  232. #reaction role system
  233. """@bot.slash_command(name="reaction_role", description="React to verify yourself and get the role")
  234. async def reaction_role(ctx):
  235. role= discord.utils.get(ctx.guild.roles, id = int(role_rules))
  236. embed = discord.Embed(
  237. title= title_rules,
  238. description=f"React to accept the rules and get the {role} role.",
  239. color=discord.Color.red()
  240. )
  241. if not ctx.author.guild_permissions.administrator:
  242. await ctx.respond("Error: You don't have the permission to do that!", ephemeral=True)
  243. return
  244. message = await ctx.channel.send(embed=embed)
  245. await message.add_reaction("✅")
  246. await ctx.respond("Message sent", ephemeral=True)"""
  247. #------------------------------------------------------------#
  248. @bot.event
  249. async def on_raw_reaction_add(payload):
  250. """
  251. Wird ausgeführt, wenn eine Reaktion hinzugefügt wird.
  252. """
  253. # 1. Prüfen, ob die Reaktion auf die richtige Nachricht gesetzt wurde
  254. if payload.message_id != message_rules:
  255. return
  256. # 2. Prüfen, ob es das richtige Emoji ist
  257. if str(payload.emoji) != emoji_rules:
  258. return
  259. # 4. Das Member (User) Objekt holen
  260. # payload.member ist in 'on_raw_reaction_add' verfügbar
  261. member = payload.member
  262. if member is None:
  263. return
  264. # Ignorieren, wenn der Bot selbst reagiert (optional, aber gute Praxis)
  265. if member.bot:
  266. return
  267. # 5. Die Rolle holen
  268. role = payload.guild.get_role(role_rules)
  269. if role is None:
  270. print(f"Fehler: Rolle mit ID {role_rules} wurde nicht gefunden.")
  271. return
  272. # 6. Rolle vergeben
  273. try:
  274. await member.add_roles(role)
  275. print(f"Rolle '{role.name}' an {member.name} vergeben.")
  276. # Optional: User per DM benachrichtigen
  277. # await member.send(f"Du hast die Rolle **{role.name}** erhalten!")
  278. except discord.Forbidden:
  279. print("Fehler: Der Bot hat keine Berechtigung, Rollen zu verwalten (Manage Roles fehlt oder Rolle ist zu hoch).")
  280. except Exception as e:
  281. print(f"Ein Fehler ist aufgetreten: {e}")
  282. #---------------------------------#
  283. #rules message
  284. @bot.slash_command(name="message_rules", description = "DONT USE!!")
  285. async def message_rules(
  286. ctx,
  287. ):
  288. if not ctx.author.guild_permissions.administrator:
  289. await ctx.respond("Error: You don't have the permission to do that!", ephemeral=True)
  290. return
  291. role= discord.utils.get(ctx.guild.roles, id = int(role_rules))
  292. embed = discord.Embed(
  293. title= title_rules,
  294. description=f"React to accept the rules and get the {role} role.",
  295. color=discord.Color.red()
  296. )
  297. channel= discord.utils.get(ctx.guild.channels, id = int(channel_rules))
  298. await channel.send(embed=embed)
  299. await ctx.respond("Message sent", ephemeral=True)
  300. #---------------------------------#
  301. #Run function
  302. bot.run(token)
  303. #---------------------------------#