change_name_badge.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import os
  2. from dotenv import load_dotenv
  3. import discord
  4. from discord.ext import commands, tasks
  5. from discord.commands import Option
  6. from discord.commands import slash_command
  7. import configparser
  8. import time
  9. import mysql.connector
  10. import json
  11. ## Note: to use this script on a other server you need to change the SQL querys. It is deactivatable in the config.cfg file.
  12. class changedcname(commands.Cog):
  13. def __init__(self, bot: discord.Bot):
  14. self.bot = bot
  15. def _load_config(self):
  16. config = configparser.ConfigParser()
  17. configFilePath = r'config.cfg'
  18. config.read(configFilePath)
  19. return config
  20. @commands.Cog.listener()
  21. async def on_ready(self):
  22. self.change_name_badge.start()
  23. @tasks.loop(minutes=15)
  24. async def change_name_badge(self):
  25. config = self._load_config()
  26. enable_change_dc_name = config.getboolean("Role Management", "enable_change_dc_name", fallback=False)
  27. if not enable_change_dc_name:
  28. return
  29. # Load .env file for the gameserver database
  30. load_dotenv()
  31. dbhost = os.getenv("HOST2")
  32. dbname = os.getenv("NAME2")
  33. dbpsswd = os.getenv("PASSWORD2")
  34. dbdb = os.getenv("DATABASE2")
  35. guild_id = os.getenv("SERVER")
  36. if not all([dbhost, dbname, dbpsswd, dbdb, guild_id]):
  37. print("Fehler: Mindestens eine .env Variable fehlt!")
  38. return
  39. guild = self.bot.get_guild(int(guild_id))
  40. if not guild:
  41. print("Server (Guild) nicht gefunden.")
  42. return
  43. # Database initialization
  44. try:
  45. conn = mysql.connector.connect(
  46. host=dbhost, user=dbname, password=dbpsswd, database=dbdb,
  47. charset='utf8mb4', collation='utf8mb4_unicode_ci'
  48. )
  49. cursor = conn.cursor()
  50. except Exception as e:
  51. print(f"Datenbankverbindung fehlgeschlagen: {e}")
  52. return
  53. cursor.execute("""
  54. SELECT
  55. ny_groups_meta.internal_identifier,
  56. players.charinfo,
  57. users.discord
  58. FROM ny_groups_meta
  59. JOIN players ON ny_groups_meta.character_identifier = players.citizenid
  60. JOIN users ON players.userId = users.userId
  61. ORDER BY ny_groups_meta.internal_identifier
  62. """)
  63. rows = cursor.fetchall()
  64. cursor.close()
  65. conn.close()
  66. #remove dublicates
  67. valid_users = {}
  68. blacklisted_ids = set()
  69. for badge, char_data, discord_str in rows:
  70. if not discord_str:
  71. continue
  72. discord_id_parts = discord_str.split(":")
  73. user_id = None
  74. for part in discord_id_parts:
  75. if part.isdigit():
  76. user_id = int(part)
  77. break
  78. if not user_id:
  79. continue
  80. #skip dublictated users
  81. if user_id in blacklisted_ids:
  82. continue
  83. if user_id in valid_users:
  84. del valid_users[user_id]
  85. blacklisted_ids.add(user_id)
  86. continue
  87. #build the name from charinfo
  88. firstname, lastname = "", ""
  89. if char_data:
  90. try:
  91. char_dict = json.loads(char_data)
  92. firstname = char_dict.get("firstname", "")
  93. lastname = char_dict.get("lastname", "")
  94. except (json.JSONDecodeError, KeyError, TypeError):
  95. pass
  96. target_nick = f"[{badge}] {firstname} {lastname}".strip()
  97. if len(target_nick) > 32:
  98. target_nick = target_nick[:32]
  99. valid_users[user_id] = target_nick
  100. #rename funktion on the discord server
  101. print(f"Aktualisiere {len(valid_users)} User. Duplikate ignoriert: {len(blacklisted_ids)}")
  102. for user_id, target_nick in valid_users.items():
  103. member = guild.get_member(user_id)
  104. if member:
  105. if member.display_name != target_nick:
  106. try:
  107. await member.edit(nick=target_nick)
  108. except discord.Forbidden:
  109. pass
  110. except Exception as e:
  111. print(f"Fehler beim Ändern des Namens von User {user_id}: {e}")
  112. def setup(bot: discord.Bot):
  113. bot.add_cog(changedcname(bot))