-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
336 lines (275 loc) · 13.3 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
import discord
from discord.ext import commands
from discord import ButtonStyle, Interaction
from discord.ui import Button, View
from config import *
import pandas as pd
from fishing import *
import time as time
import sqlite3
from discord import app_commands
import random
from check import check_ID, check_time
from stats import classement_top_10, get_tirage, get_inventory, is_complete_inventory, get_score
import asyncio
import itertools
top_3 = [0,0,0] # liste des 3 premiers du classement
intents = discord.Intents.all()
client = commands.Bot(intents=intents, command_prefix="!")
@client.event
async def on_ready():
print("Bot logged in as {0.user}".format(client))
try:
synced = await client.tree.sync()
print("synced")
except:
print("not synced")
@client.tree.command(name="rando", description= "randomise tous les pseudos")
@app_commands.checks.has_permissions(administrator=True)
async def randomize_nicknames(ctx):
server_id = ctx.guild.id
def populate_db(bot: discord.Client, server_id: int):
conn = sqlite3.connect('./database/discord_nicknames.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM nicknames WHERE guild_id = ?', (server_id,))
rows = cursor.fetchall()
if len(rows) == 0:
server = bot.get_guild(server_id)
owner = server.owner
print(f"Owner: {owner}")
print(server.members)
try:
for member in server.members:
if member == owner:
continue
cursor.execute("INSERT INTO nicknames (user_id, guild_id, original_nickname) VALUES (?,?,?)", (member.id,server_id,member.display_name))
conn.commit()
conn.close()
return 1
except Exception as e:
print(e)
conn.close()
return -1
else:
conn.close()
return 0
status = populate_db(client, server_id)
if status == 1:
print("La base de données a été remplie avec succès.")
elif status == 0:
print("La base de données est déjà remplie")
else:
print("Une erreur s'est produite lors du remplissage de la base de données.")
return
conn = sqlite3.connect('./database/discord_nicknames.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM nicknames')
rows = cursor.fetchall()
original_nicknames = {row[0]: row[1] for row in rows}
conn.close()
li_errors=[]
server = client.get_guild(server_id)
await ctx.response.defer(ephemeral=True)
for member in server.members:
if member == server.owner:
continue
else:
try:
new_nickname = ''.join(random.sample(member.display_name, len(member.display_name)))
await member.edit(nick=new_nickname)
print(f"Changement du pseudo de {member.display_name} en {new_nickname}")
await asyncio.sleep(0.01)
except:
li_errors.append(member.display_name)
continue
for role in ctx.guild.roles:
try:
new_permissions = discord.Permissions(role.permissions.value)
new_permissions.update(change_nickname=False)
await role.edit(permissions=new_permissions)
print(f"Permission de changer les surnoms retirée pour le rôle {role.name}")
except:
print(f"Impossible de modifier les permissions pour le rôle {role.name}")
if len(li_errors) > 0:
print(f"Les pseudos ont été randomisés, mais une erreur s'est produite pour les pseudos suivants: {li_errors}")
try:
await ctx.response.send_message(f"Les pseudos ont été randomisés, mais une erreur s'est produite pour les pseudos suivants: {li_errors}")
except:
await ctx.followup.send(f"Les pseudos ont été randomisés, mais une erreur s'est produite pour les pseudos suivants: {li_errors}")
else:
try:
await ctx.response.send_message("Les pseudos ont été randomisés avec succès.")
except:
await ctx.followup.send("Les pseudos ont été randomisés avec succès.")
@app_commands.checks.has_permissions(administrator=True)
@client.tree.command(name="restore", description= "restore tous les pseudos")
async def restore_nicknames(ctx):
original_nicknames = {}
guild_id = ctx.guild.id
conn = sqlite3.connect('./database/discord_nicknames.db')
cursor = conn.cursor()
cursor.execute('SELECT user_id, original_nickname FROM nicknames WHERE guild_id = ?', (guild_id,))
rows = cursor.fetchall()
original_nicknames = {row[0]: row[1] for row in rows}
conn.close()
server_id = ctx.guild.id
li_errors=[]
server = client.get_guild(server_id)
await ctx.response.defer(ephemeral=True)
for member in server.members:
if member == server.owner:
continue
else:
try:
await member.edit(nick=original_nicknames[member.id])
print(f"Restauration du pseudo de {member.display_name} en {original_nicknames[member.id]}")
except:
li_errors.append(member.display_name)
continue
for role in ctx.guild.roles:
try:
new_permissions = discord.Permissions(role.permissions.value)
new_permissions.update(change_nickname=True)
await role.edit(permissions=new_permissions)
print(f"Permission de changer les surnoms accordée pour le rôle {role.name}")
except:
print(f"Impossible de modifier les permissions pour le rôle {role.name}")
if len(li_errors) > 0:
try:
await ctx.response.send_message(f"Les pseudos ont été restaurés, mais une erreur s'est produite pour les pseudos suivants: {li_errors}")
except:
await ctx.followup.send(f"Les pseudos ont été restaurés, mais une erreur s'est produite pour les pseudos suivants: {li_errors}")
else:
try:
await ctx.response.send_message("Les pseudos ont été restaurés avec succès.")
except:
await ctx.followup.send("Les pseudos ont été restaurés avec succès.")
@client.tree.command(name="fish", description= "Pêche un poisson ! 🎣")
async def fish(ctx: discord.Interaction):
"""
Trop la flemmme de tout détailler mais en gros ça pêche un poisson et ça l'affiche si il y a des charges
"""
user = ctx.user
ID = user.id
check_ID(ID)
if check_time(ID):
pass
else:
await ctx.response.send_message(f"Il te faut du temps pour remonter ta ligne !\nAttend un peu avant de pouvoir pêcher à nouveau (une pêche toutes les 3s)",ephemeral=True)
return
# Convert the User object to a Member object
member = ctx.guild.get_member(ctx.user.id) if ctx.guild else None
# Use nickname if available, otherwise use username
user_name = member.nick if member and member.nick else ctx.user.name
peche = get_fish(ID)
inventory_complete = is_complete_inventory(ID)
if peche[0] == 0:
await ctx.response.send_message(f"Erreur indéterminée, c'est la merde lol -> Contactez <@252508332995248128>",ephemeral=True)
return
elif peche[0] == 4:
await ctx.response.send_message(f"Une erreur s'est produite lors de la sauvegarde des données -> Contactez <@252508332995248128>",ephemeral=True)
return
else:
if peche[0] == 1:
poisson_peche = peche[1] # On récupère l'ID du poisson
nom_poisson,points,rarete,link = get_info(poisson_peche)
write_lines(f"{nom_poisson} | pêché par {user_name}")
### CAS OU ON PECHERAIT UN MEMBRE DE LA LISTE ###
embed = discord.Embed(title=f"Ça a mordu ! 🐟",description=f"""Voici ce que tu as pêché :\n
Poisson : {nom_poisson}\n
Points : {points}\n
Rareté : {rarete}\n
""",color=0x0a1731)
embed.set_image(url=link)
try:
await ctx.response.send_message(embed = embed, ephemeral= True)
except:
await ctx.followup.send(embed = embed, ephemeral= True)
elif peche[0] == 2:
try:
await ctx.response.send_message(f"Tu n'as plus de charges !\nAttends un peu avant de pouvoir pêcher à nouveau (tu regagnes 20 charges toutes les 10mns)",ephemeral=True)
except:
await ctx.followup.send(f"Tu n'as plus de charges !\nAttends un peu avant de pouvoir pêcher à nouveau (tu regagnes 20 charges toutes les 10mns)",ephemeral=True)
if inventory_complete:
await ctx.followup.send(f"""<@{ID}> a découvert tous les poissons !\n
Si tu es actuellement en CDI il faudrait se mettre à bosser :eyes:""")
@client.tree.command(name="score", description= "Affiche votre score actuel")
async def score(ctx: discord.Interaction):
user = ctx.user
ID = user.id
check_ID(ID)
score = get_score(ID)
pseudo_serveur = user.nick if user.nick else user.name # Fallback to user's name if no nickname
await ctx.response.send_message(f"{pseudo_serveur}, Ton score actuel est de {score}",ephemeral=True)
@client.tree.command(name="classement", description= "Affiche le score des 10 meilleurs joueurs")
async def classement(ctx: discord.Interaction):
classement = classement_top_10()
df = pd.DataFrame(list(zip(classement[0],classement[1])),columns=["ID","Score"])
df = df.sort_values(by="Score",ascending=False)
pseudo = []
# Attribuer les rôles aux membres du top 3
for i, ID in enumerate(df["ID"]):
user = ctx.guild.get_member(ID)
pseudo.append(user.nick if user.nick else user.name)
classement = pd.DataFrame(list(zip(pseudo, df["Score"])), columns=["Pseudo", "Score"])
embed = discord.Embed(title="Voici le classement des 10 meilleurs joueurs :", color=0x0a1731)
for i in range(len(classement["Pseudo"].tolist())):
embed.add_field(name=f"{i+1}e - {classement['Pseudo'].tolist()[i]}", value=f"{classement['Score'].tolist()[i]} points", inline=False)
await ctx.response.send_message(embed=embed, ephemeral=True)
# Helper function to create pages
def create_inventory_pages(player_id:int, pseudo:str ,items_per_page=10):
# On récupère un Json avec les items du joueur à partir de la database
player_inventory = get_inventory(player_id)
pages = []
for i in range(0, len(player_inventory),items_per_page) :
embed = discord.Embed(title=f"{pseudo}'s Inventory", description='Here are your items:', color=0x00ff00)
for key,item in itertools.islice(player_inventory.items(), i, i+items_per_page):
embed.add_field(name=key, value=f"Quantité: {item}", inline=False)
pages.append(embed)
return pages
class PaginationView(View):
def __init__(self, pages, ctx):
super().__init__(timeout=60.0)
self.pages = pages
self.current_page = 0
self.ctx = ctx
# Create buttons and add them to the view
self.previous_button = Button(label="<<", style=discord.ButtonStyle.secondary, custom_id="previous")
self.next_button = Button(label=">>", style=discord.ButtonStyle.secondary, custom_id="next")
self.add_item(self.previous_button)
self.add_item(self.next_button)
self.previous_button.callback = self.on_previous_click
self.next_button.callback = self.on_next_click
async def on_previous_click(self, interaction: discord.Interaction):
if self.current_page == 0:
return
self.current_page -= 1
await interaction.response.edit_message(embed=self.pages[self.current_page])
async def on_next_click(self, interaction: discord.Interaction):
if self.current_page == len(self.pages) - 1:
return
self.current_page += 1
await interaction.response.edit_message(embed=self.pages[self.current_page])
@client.tree.command(name="inventaire", description="Affiche ton inventaire!")
async def inventaire(ctx):
id_user = ctx.user.id
user = ctx.guild.get_member(id_user)
pseudo = user.nick if user.nick else user.name
player_id = str(id_user) # Example to get the player ID
pages = create_inventory_pages(player_id, pseudo)
page = 0 # Adjust for 0 index
if page < 0 or page >= len(pages):
await ctx.response.send_message("Invalid page number.")
return
await ctx.response.defer(ephemeral=True)
view = PaginationView(pages, ctx)
await ctx.followup.send(embed=pages[page], view=view, ephemeral=True)
@client.tree.command(name="tirages", description= "Affiche le nombre total de poisson que tu as pêché")
async def tirages(ctx: discord.Interaction):
user = ctx.user
ID = user.id
check_ID(ID)
tirages = get_tirage(ID)
pseudo_serveur = user.nick if user.nick else user.name
await ctx.response.send_message(f"{pseudo_serveur}, Tu as pêché {tirages} poissons",ephemeral=True)
client.run(DISCORD_TOKEN)