Skip to content

Commit 4fda89d

Browse files
authored
Added new features
1 parent 70aa5b7 commit 4fda89d

File tree

3 files changed

+224
-99
lines changed

3 files changed

+224
-99
lines changed

app.py

Lines changed: 223 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,223 @@
1-
import nextcord
2-
import asyncio
3-
from nextcord.ext import commands
4-
import os
5-
import sys
6-
7-
ascii_art = r"""
8-
9-
__ __ ______ __ __ ______ ______ __ __ ______ __
10-
/\ \_\ \ /\ __ \ /\_\_\_\ /\ == \ /\ __ \ /\ "-.\ \ /\ ___\ /\ \
11-
\ \ __ \ \ \ __ \ \/_/\_\/_ \ \ _-/ \ \ __ \ \ \ \-. \ \ \ __\ \ \ \____
12-
\ \_\ \_\ \ \_\ \_\ /\_\/\_\ \ \_\ \ \_\ \_\ \ \_\\"\_\ \ \_____\ \ \_____\
13-
\/_/\/_/ \/_/\/_/ \/_/\/_/ \/_/ \/_/\/_/ \/_/ \/_/ \/_____/ \/_____/
14-
15-
16-
"""
17-
18-
def clear_screen():
19-
os.system('cls' if os.name == 'nt' else 'clear')
20-
21-
def center_text(text):
22-
terminal_width = os.get_terminal_size().columns
23-
return text.center(terminal_width)
24-
25-
def center_ascii_art(ascii_art):
26-
lines = ascii_art.split("\n")
27-
return "\n".join([center_text(line) for line in lines])
28-
29-
def display_menu():
30-
clear_screen()
31-
# Apply lime color to ASCII art
32-
print(f"\033[1;32m{center_ascii_art(ascii_art)}\033[0m")
33-
print(center_text("\n\n"))
34-
print(f"\033[1;32m{center_text('1. List servers the bot is in.')}\033[0m")
35-
print(f"\033[1;32m{center_text('2. Exit.')}\033[0m\n")
36-
print(f"\033[31m{center_text('---------------------------------------------------------------------------')}\033[0m")
37-
print(center_text(""))
38-
39-
async def main_menu():
40-
while True:
41-
display_menu()
42-
print(f"\033[1;36m{center_text(f'Logged in as: {bot.user}')}\033[0m")
43-
print(f"\033[1;36m{center_text(f'Bot is in {len(bot.guilds)} servers.')}\033[0m")
44-
45-
sys.stdout.write(f"\033[1;36m> \033[0m")
46-
sys.stdout.flush()
47-
48-
choice = input()
49-
50-
if choice == "":
51-
continue
52-
53-
if choice == "1":
54-
await list_servers()
55-
elif choice == "2":
56-
print(f"\033[1;36m{center_text('Exiting...')}\033[0m")
57-
await bot.close()
58-
break
59-
else:
60-
print(f"\033[1;36m{center_text('Invalid choice. Please try again.')}\033[0m")
61-
62-
async def list_servers():
63-
clear_screen()
64-
print(f"\n\033[1;36m{center_text('Servers the bot is in:')}\033[0m")
65-
for i, guild in enumerate(bot.guilds):
66-
print(center_text(f"{i + 1}. {guild.name}"))
67-
68-
try:
69-
server_number = int(input(f"\033[1;36m{center_text('Enter the number of the server to leave (or 0 to cancel): ')}\033[0m"))
70-
if server_number == 0:
71-
print(f"\033[1;36m{center_text('Action cancelled.')}\033[0m")
72-
return
73-
74-
selected_guild = bot.guilds[server_number - 1]
75-
confirm = input(f"\033[1;36m{center_text(f'Are you sure you want the bot to leave {selected_guild.name}? (yes/no): ')}\033[0m").lower()
76-
77-
if confirm == "yes":
78-
await selected_guild.leave()
79-
print(f"\033[1;36m{center_text(f'The bot has left {selected_guild.name}.')}\033[0m")
80-
else:
81-
print(f"\033[1;36m{center_text('Action cancelled.')}\033[0m")
82-
83-
except (ValueError, IndexError):
84-
print(f"\033[1;36m{center_text('Invalid input. Please try again.')}\033[0m")
85-
86-
intents = nextcord.Intents.default()
87-
intents.message_content = True
88-
89-
bot = commands.Bot(command_prefix="!", intents=intents)
90-
91-
@bot.event
92-
async def on_ready():
93-
clear_screen()
94-
await main_menu()
95-
96-
with open("token.txt", "r") as token_file:
97-
bot_token = token_file.read().strip()
98-
99-
bot.run(bot_token)
1+
import nextcord
2+
import asyncio
3+
from nextcord.ext import commands
4+
import os
5+
import sys
6+
import re
7+
8+
ascii_art = r"""
9+
10+
__ __ ______ __ __ ______ ______ __ __ ______ __
11+
/\ \_\ \ /\ __ \ /\_\_\_\ /\ == \ /\ __ \ /\ "-.\ \ /\ ___\ /\ \
12+
\ \ __ \ \ \ __ \ \/_/\_\/_ \ \ _-/ \ \ __ \ \ \ \-. \ \ \ __\ \ \ \____
13+
\ \_\ \_\ \ \_\ \_\ /\_\/\_\ \ \_\ \ \_\ \_\ \ \_\\"\_\ \ \_____\ \ \_____\
14+
\/_/\/_/ \/_/\/_/ \/_/\/_/ \/_/ \/_/\/_/ \/_/ \/_/ \/_____/ \/_____/
15+
Made by: @haxmc (Thanks for using <3)
16+
17+
"""
18+
19+
def clear_screen():
20+
os.system('cls' if os.name == 'nt' else 'clear')
21+
22+
def center_text(text):
23+
terminal_width = os.get_terminal_size().columns
24+
return text.center(terminal_width)
25+
26+
def center_ascii_art(ascii_art):
27+
lines = ascii_art.split("\n")
28+
return "\n".join([center_text(line) for line in lines])
29+
30+
def display_menu():
31+
clear_screen()
32+
print(f"\033[1;32m{center_ascii_art(ascii_art)}\033[0m")
33+
print(center_text("\n\n"))
34+
print(f"\033[1;32m{center_text('1. List servers the bot is in.')}\033[0m")
35+
print(f"\033[1;32m{center_text('2. Get an invite link to a server.')}\033[0m")
36+
print(f"\033[1;32m{center_text('3. Purge all servers except whitelisted ones.')}\033[0m")
37+
print(f"\033[1;32m{center_text('4. Whitelist a server.')}\033[0m")
38+
print(f"\033[1;32m{center_text('5. Remove a server from whitelist.')}\033[0m")
39+
print(f"\033[1;32m{center_text('6. Create a role in a server.')}\033[0m")
40+
print(f"\033[1;32m{center_text('7. Refresh the data.')}\033[0m")
41+
print(f"\033[1;32m{center_text('8. Exit.')}\033[0m\n")
42+
print(f"\033[31m{center_text('---------------------------------------------------------------------------')}\033[0m")
43+
print(center_text(""))
44+
45+
async def refresh_data():
46+
clear_screen()
47+
print(f"\033[1;36m{center_text('Refreshing data...')}\033[0m")
48+
await bot.change_presence(activity=nextcord.Game(name="Refreshing..."))
49+
guilds = [guild async for guild in bot.fetch_guilds()]
50+
print(f"\033[1;36m{center_text(f'Refreshed data: {len(guilds)} servers.')}\033[0m")
51+
await bot.change_presence(activity=None)
52+
53+
async def main_menu():
54+
while True:
55+
display_menu()
56+
print(f"\033[1;36m{center_text(f'Logged in as: {bot.user}')}\033[0m")
57+
print(f"\033[1;36m{center_text(f'Bot is in {len(bot.guilds)} servers.')}\033[0m")
58+
59+
sys.stdout.write(f"\033[1;36m> \033[0m")
60+
sys.stdout.flush()
61+
62+
choice = input()
63+
64+
if choice == "":
65+
continue
66+
67+
if choice == "1":
68+
await list_servers()
69+
elif choice == "2":
70+
await get_invite_link()
71+
elif choice == "3":
72+
await purge_servers()
73+
elif choice == "4":
74+
await whitelist_server()
75+
elif choice == "5":
76+
await remove_from_whitelist()
77+
elif choice == "6":
78+
await create_role()
79+
elif choice == "7":
80+
await refresh_data()
81+
elif choice == "8":
82+
print(f"\033[1;36m{center_text('Exiting...')}\033[0m")
83+
await bot.close()
84+
break
85+
else:
86+
print(f"\033[1;36m{center_text('Invalid choice. Please try again.')}\033[0m")
87+
88+
async def list_servers():
89+
clear_screen()
90+
print(f"\n\033[1;36m{center_text('Servers the bot is in:')}\033[0m")
91+
for i, guild in enumerate(bot.guilds):
92+
print(center_text(f"{i + 1}. {guild.name}"))
93+
try:
94+
server_number = int(input(f"\033[1;36m{center_text('Enter the number of the server to leave (or 0 to cancel): ')}\033[0m"))
95+
if server_number == 0:
96+
print(f"\033[1;36m{center_text('Action cancelled.')}\033[0m")
97+
return
98+
selected_guild = bot.guilds[server_number - 1]
99+
confirm = input(f"\033[1;36m{center_text(f'Are you sure you want the bot to leave {selected_guild.name}? (yes/no): ')}\033[0m").lower()
100+
if confirm == "yes":
101+
await selected_guild.leave()
102+
print(f"\033[1;36m{center_text(f'The bot has left {selected_guild.name}.')}\033[0m")
103+
else:
104+
print(f"\033[1;36m{center_text('Action cancelled.')}\033[0m")
105+
except (ValueError, IndexError):
106+
print(f"\033[1;36m{center_text('Invalid input. Please try again.')}\033[0m")
107+
108+
async def whitelist_server():
109+
clear_screen()
110+
print(f"\n\033[1;36m{center_text('Servers the bot is in:')}\033[0m")
111+
for i, guild in enumerate(bot.guilds):
112+
print(center_text(f"{i + 1}. {guild.name}"))
113+
try:
114+
server_number = int(input(f"\033[1;36m{center_text('Enter the number of the server to whitelist (or 0 to cancel): ')}\033[0m"))
115+
if server_number == 0:
116+
print(f"\033[1;36m{center_text('Action cancelled.')}\033[0m")
117+
return
118+
selected_guild = bot.guilds[server_number - 1]
119+
confirm = input(f"\033[1;36m{center_text(f'Are you sure you want to whitelist {selected_guild.name}? (yes/no): ')}\033[0m").lower()
120+
if confirm == "yes":
121+
whitelisted_servers = load_whitelisted_servers()
122+
if any(guild_id == selected_guild.id for guild_id, _ in whitelisted_servers):
123+
print(f"\033[1;36m{center_text(f'{selected_guild.name} is already whitelisted.')}\033[0m")
124+
return
125+
sanitized_name = re.sub(r'[^a-zA-Z0-9 ]', '', selected_guild.name)
126+
with open("whitelisted_servers.txt", "a") as whitelist_file:
127+
whitelist_file.write(f"{selected_guild.id} - {sanitized_name}\n")
128+
print(f"\033[1;36m{center_text(f'{selected_guild.name} has been whitelisted.')}\033[0m")
129+
else:
130+
print(f"\033[1;36m{center_text('Action cancelled.')}\033[0m")
131+
except (ValueError, IndexError):
132+
print(f"\033[1;36m{center_text('Invalid input. Please try again.')}\033[0m")
133+
134+
async def remove_from_whitelist():
135+
clear_screen()
136+
print(f"\n\033[1;36m{center_text('Whitelisted servers:')}\033[0m")
137+
whitelisted_servers = load_whitelisted_servers()
138+
if not whitelisted_servers:
139+
print(f"\033[1;36m{center_text('No whitelisted servers.')}\033[0m")
140+
return
141+
for i, (guild_id, guild_name) in enumerate(whitelisted_servers):
142+
print(center_text(f"{i + 1}. {guild_name}"))
143+
try:
144+
server_number = int(input(f"\033[1;36m{center_text('Enter the number of the server to remove from whitelist (or 0 to cancel): ')}\033[0m"))
145+
if server_number == 0:
146+
print(f"\033[1;36m{center_text('Action cancelled.')}\033[0m")
147+
return
148+
selected_guild = whitelisted_servers[server_number - 1]
149+
confirm = input(f"\033[1;36m{center_text(f'Are you sure you want to remove {selected_guild[1]} from whitelist? (yes/no): ')}\033[0m").lower()
150+
if confirm == "yes":
151+
whitelisted_servers.remove(selected_guild)
152+
save_whitelisted_servers(whitelisted_servers)
153+
print(f"\033[1;36m{center_text(f'{selected_guild[1]} has been removed from whitelist.')}\033[0m")
154+
else:
155+
print(f"\033[1;36m{center_text('Action cancelled.')}\033[0m")
156+
except (ValueError, IndexError):
157+
print(f"\033[1;36m{center_text('Invalid input. Please try again.')}\033[0m")
158+
159+
def load_whitelisted_servers():
160+
whitelisted_servers = []
161+
if os.path.exists("whitelisted_servers.txt"):
162+
with open("whitelisted_servers.txt", "r") as whitelist_file:
163+
lines = whitelist_file.readlines()
164+
for line in lines:
165+
line = line.strip()
166+
if line and " - " in line:
167+
guild_id, guild_name = line.split(" - ")
168+
whitelisted_servers.append((int(guild_id), guild_name))
169+
return whitelisted_servers
170+
171+
def save_whitelisted_servers(whitelisted_servers):
172+
with open("whitelisted_servers.txt", "w") as whitelist_file:
173+
for guild_id, guild_name in whitelisted_servers:
174+
whitelist_file.write(f"{guild_id} - {guild_name}\n")
175+
176+
async def purge_servers():
177+
whitelisted_servers = load_whitelisted_servers()
178+
clear_screen()
179+
print(f"\n\033[1;36m{center_text('Purging servers, keeping whitelisted ones...')}\033[0m")
180+
for guild in bot.guilds:
181+
if not any(guild.id == whitelisted_id for whitelisted_id, _ in whitelisted_servers):
182+
await guild.leave()
183+
print(f"\033[1;36m{center_text(f'Left server: {guild.name}')}\033[0m")
184+
else:
185+
print(f"\033[1;36m{center_text(f'Keeping server: {guild.name}')}\033[0m")
186+
187+
async def create_role():
188+
clear_screen()
189+
print(f"\n\033[1;36m{center_text('Servers the bot is in:')}\033[0m")
190+
for i, guild in enumerate(bot.guilds):
191+
print(center_text(f"{i + 1}. {guild.name}"))
192+
try:
193+
server_number = int(input(f"\033[1;36m{center_text('Enter the number of the server to create role in: ')}\033[0m"))
194+
selected_guild = bot.guilds[server_number - 1]
195+
role_name = input(f"\033[1;36m{center_text('Enter the role name: ')}\033[0m")
196+
role_color = input(f"\033[1;36m{center_text('Enter the role color (hex format): ')}\033[0m")
197+
user_id = int(input(f"\033[1;36m{center_text('Enter the user ID to assign the role: ')}\033[0m"))
198+
199+
role = await selected_guild.create_role(name=role_name, color=nextcord.Color(int(role_color, 16)), reason="Role creation via bot")
200+
member = selected_guild.get_member(user_id)
201+
if member:
202+
await member.add_roles(role)
203+
print(f"\033[1;36m{center_text(f'Role {role_name} created and assigned to user {member.name}.')}\033[0m")
204+
else:
205+
print(f"\033[1;36m{center_text('User not found in the server.')}\033[0m")
206+
except (ValueError, IndexError):
207+
print(f"\033[1;36m{center_text('Invalid input. Please try again.')}\033[0m")
208+
209+
intents = nextcord.Intents.default()
210+
intents.message_content = True
211+
212+
bot = commands.Bot(command_prefix="!", intents=intents)
213+
214+
@bot.event
215+
async def on_ready():
216+
clear_screen()
217+
print(f"\033[1;36m{center_text(f'Logged in as: {bot.user}')}\033[0m")
218+
await main_menu()
219+
220+
with open("token.txt", "r") as token_file:
221+
bot_token = token_file.read().strip()
222+
223+
bot.run(bot_token)

banned_servers.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0

whitelisted_servers.txt

Whitespace-only changes.

0 commit comments

Comments
 (0)